diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2019-11-05 20:07:21 +0200 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2019-11-08 00:44:45 +0200 |
commit | 46788d1b5bb72f59cc931e54912c81666ce30f84 (patch) | |
tree | e3438d1a7f68a9a1518f672a167f57b514cd5679 | |
parent | 48a719033ee6f1626a8878f66a43ee939dad4c62 (diff) | |
download | meson-46788d1b5bb72f59cc931e54912c81666ce30f84.zip meson-46788d1b5bb72f59cc931e54912c81666ce30f84.tar.gz meson-46788d1b5bb72f59cc931e54912c81666ce30f84.tar.bz2 |
Created the filesystem module.
-rw-r--r-- | docs/markdown/Fs-module.md | 31 | ||||
-rw-r--r-- | docs/markdown/snippets/fsmodule.md | 10 | ||||
-rw-r--r-- | docs/sitemap.txt | 1 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 3 | ||||
-rw-r--r-- | mesonbuild/modules/__init__.py | 17 | ||||
-rw-r--r-- | mesonbuild/modules/fs.py | 59 | ||||
l--------- | test cases/common/227 fs module/a_symlink | 1 | ||||
-rw-r--r-- | test cases/common/227 fs module/meson.build | 21 | ||||
-rw-r--r-- | test cases/common/227 fs module/subdir/meson.build | 1 | ||||
-rw-r--r-- | test cases/common/227 fs module/subdir/subdirfile.txt | 1 | ||||
-rw-r--r-- | test cases/common/227 fs module/subprojects/subbie/meson.build | 9 | ||||
-rw-r--r-- | test cases/common/227 fs module/subprojects/subbie/subprojectfile.txt | 1 | ||||
-rw-r--r-- | test cases/common/227 fs module/subprojects/subbie/subsub/meson.build | 1 | ||||
-rw-r--r-- | test cases/common/227 fs module/subprojects/subbie/subsub/subsubfile.txt | 1 |
14 files changed, 156 insertions, 1 deletions
diff --git a/docs/markdown/Fs-module.md b/docs/markdown/Fs-module.md new file mode 100644 index 0000000..e68bf68 --- /dev/null +++ b/docs/markdown/Fs-module.md @@ -0,0 +1,31 @@ +# FS (filesystem) module + +This module provides functions to inspect the file system. It is +available starting with version 0.53.0. + +## File lookup rules + +Non-absolute paths are looked up relative to the directory where the +current `meson.build` file is. + +### exists + +Takes a single string argument and returns true if an entity with that +name exists on the file system. This can be a file, directory or a +special entry such as a device node. + +### is_dir + +Takes a single string argument and returns true if a directory with +that name exists on the file system. This method follows symbolic +links. + +### is_file + +Takes a single string argument and returns true if an file with that +name exists on the file system. This method follows symbolic links. + +### is_symlink + +Takes a single string argument and returns true if the path pointed to +by the string is a symbolic link. diff --git a/docs/markdown/snippets/fsmodule.md b/docs/markdown/snippets/fsmodule.md new file mode 100644 index 0000000..d668b18 --- /dev/null +++ b/docs/markdown/snippets/fsmodule.md @@ -0,0 +1,10 @@ +## A new module for filesystem operations + +The new `fs` module can be used to examine the contents of the current +file system. + +```meson +fs = import('fs') +assert(fs.exists('important_file'), + 'The important file is missing.') +``` diff --git a/docs/sitemap.txt b/docs/sitemap.txt index c2bc610..5c78694 100644 --- a/docs/sitemap.txt +++ b/docs/sitemap.txt @@ -32,6 +32,7 @@ index.md Modules.md CMake-module.md Dlang-module.md + Fs-module.md Gnome-module.md Hotdoc-module.md i18n-module.md diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 6f1f0a7..38e12ea 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -1689,7 +1689,7 @@ class CompilerHolder(InterpreterObject): ModuleState = namedtuple('ModuleState', [ - 'build_to_src', 'subproject', 'subdir', 'current_lineno', 'environment', + 'source_root', 'build_to_src', 'subproject', 'subdir', 'current_lineno', 'environment', 'project_name', 'project_version', 'backend', 'targets', 'data', 'headers', 'man', 'global_args', 'project_args', 'build_machine', 'host_machine', 'target_machine', 'current_node']) @@ -1714,6 +1714,7 @@ class ModuleHolder(InterpreterObject, ObjectHolder): # because the Build object contains dicts and lists. num_targets = len(self.interpreter.build.targets) state = ModuleState( + source_root = self.interpreter.environment.get_source_dir(), build_to_src=mesonlib.relpath(self.interpreter.environment.get_source_dir(), self.interpreter.environment.get_build_dir()), subproject=self.interpreter.subproject, diff --git a/mesonbuild/modules/__init__.py b/mesonbuild/modules/__init__.py index 6b6aa8b..dc3c786 100644 --- a/mesonbuild/modules/__init__.py +++ b/mesonbuild/modules/__init__.py @@ -1,3 +1,20 @@ +# Copyright 2019 The Meson development team + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This file contains the detection logic for external dependencies that +# are UI-related. + import os from .. import build diff --git a/mesonbuild/modules/fs.py b/mesonbuild/modules/fs.py new file mode 100644 index 0000000..61ad917 --- /dev/null +++ b/mesonbuild/modules/fs.py @@ -0,0 +1,59 @@ +# Copyright 2019 The Meson development team + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os + +from . import ExtensionModule +from . import ModuleReturnValue +from ..mesonlib import MesonException + +from ..interpreterbase import stringArgs, noKwargs + +class FSModule(ExtensionModule): + + def __init__(self, interpreter): + super().__init__(interpreter) + self.snippets.add('generate_dub_file') + + @stringArgs + @noKwargs + def exists(self, state, args, kwargs): + if len(args) != 1: + MesonException('method takes exactly one argument.') + test_file = os.path.join(state.source_root, state.subdir, args[0]) + return ModuleReturnValue(os.path.exists(test_file), []) + + def _check(self, check_fun, state, args): + if len(args) != 1: + MesonException('method takes exactly one argument.') + test_file = os.path.join(state.source_root, state.subdir, args[0]) + return ModuleReturnValue(check_fun(test_file), []) + + @stringArgs + @noKwargs + def is_symlink(self, state, args, kwargs): + return self._check(os.path.islink, state, args) + + @stringArgs + @noKwargs + def is_file(self, state, args, kwargs): + return self._check(os.path.isfile, state, args) + + @stringArgs + @noKwargs + def is_dir(self, state, args, kwargs): + return self._check(os.path.isdir, state, args) + +def initialize(*args, **kwargs): + return FSModule(*args, **kwargs) diff --git a/test cases/common/227 fs module/a_symlink b/test cases/common/227 fs module/a_symlink new file mode 120000 index 0000000..25d053a --- /dev/null +++ b/test cases/common/227 fs module/a_symlink @@ -0,0 +1 @@ +meson.build
\ No newline at end of file diff --git a/test cases/common/227 fs module/meson.build b/test cases/common/227 fs module/meson.build new file mode 100644 index 0000000..515b3e2 --- /dev/null +++ b/test cases/common/227 fs module/meson.build @@ -0,0 +1,21 @@ +project('fs module test') + +fs = import('fs') + +assert(fs.exists('meson.build'), 'Existing file reported as missing.') +assert(not fs.exists('nonexisting'), 'Nonexisting file was found.') + +if build_machine.system() != 'windows' and build_machine.system() != 'cygwin' + assert(fs.is_symlink('a_symlink'), 'Symlink not detected.') + assert(not fs.is_symlink('meson.build'), 'Regular file detected as symlink.') +endif + +assert(fs.is_file('meson.build'), 'File not detected as a file.') +assert(not fs.is_file('subprojects'), 'Directory detected as a file.') +assert(not fs.is_file('nonexisting'), 'Bad path detected as a file.') + +assert(fs.is_dir('subprojects'), 'Dir not detected correctly.') +assert(not fs.is_dir('meson.build'), 'File detected as a dir.') +assert(not fs.is_dir('nonexisting'), 'Bad path detected as a dir.') + +subdir('subdir') diff --git a/test cases/common/227 fs module/subdir/meson.build b/test cases/common/227 fs module/subdir/meson.build new file mode 100644 index 0000000..ec6f102 --- /dev/null +++ b/test cases/common/227 fs module/subdir/meson.build @@ -0,0 +1 @@ +assert(fs.exists('subdirfile.txt'), 'Subdir file lookup is broken.') diff --git a/test cases/common/227 fs module/subdir/subdirfile.txt b/test cases/common/227 fs module/subdir/subdirfile.txt new file mode 100644 index 0000000..bcf7cc0 --- /dev/null +++ b/test cases/common/227 fs module/subdir/subdirfile.txt @@ -0,0 +1 @@ +I have no content. diff --git a/test cases/common/227 fs module/subprojects/subbie/meson.build b/test cases/common/227 fs module/subprojects/subbie/meson.build new file mode 100644 index 0000000..55fc286 --- /dev/null +++ b/test cases/common/227 fs module/subprojects/subbie/meson.build @@ -0,0 +1,9 @@ +project('subbie') + +fs = import('fs') + +assert(fs.exists('subprojectfile.txt'), 'Subproject root file not found.') + +subdir('subsub') + +subproject('subbie') diff --git a/test cases/common/227 fs module/subprojects/subbie/subprojectfile.txt b/test cases/common/227 fs module/subprojects/subbie/subprojectfile.txt new file mode 100644 index 0000000..bedb84c --- /dev/null +++ b/test cases/common/227 fs module/subprojects/subbie/subprojectfile.txt @@ -0,0 +1 @@ +I'm not empty. So there's at least that. diff --git a/test cases/common/227 fs module/subprojects/subbie/subsub/meson.build b/test cases/common/227 fs module/subprojects/subbie/subsub/meson.build new file mode 100644 index 0000000..cf9a271 --- /dev/null +++ b/test cases/common/227 fs module/subprojects/subbie/subsub/meson.build @@ -0,0 +1 @@ +assert(fs.exists('subsubfile.txt'), 'Subproject subdir lookup failed.') diff --git a/test cases/common/227 fs module/subprojects/subbie/subsub/subsubfile.txt b/test cases/common/227 fs module/subprojects/subbie/subsub/subsubfile.txt new file mode 100644 index 0000000..2d5120d --- /dev/null +++ b/test cases/common/227 fs module/subprojects/subbie/subsub/subsubfile.txt @@ -0,0 +1 @@ +Thank you for looking inside me. |