aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2019-11-05 20:07:21 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2019-11-08 00:44:45 +0200
commit46788d1b5bb72f59cc931e54912c81666ce30f84 (patch)
treee3438d1a7f68a9a1518f672a167f57b514cd5679
parent48a719033ee6f1626a8878f66a43ee939dad4c62 (diff)
downloadmeson-46788d1b5bb72f59cc931e54912c81666ce30f84.zip
meson-46788d1b5bb72f59cc931e54912c81666ce30f84.tar.gz
meson-46788d1b5bb72f59cc931e54912c81666ce30f84.tar.bz2
Created the filesystem module.
-rw-r--r--docs/markdown/Fs-module.md31
-rw-r--r--docs/markdown/snippets/fsmodule.md10
-rw-r--r--docs/sitemap.txt1
-rw-r--r--mesonbuild/interpreter.py3
-rw-r--r--mesonbuild/modules/__init__.py17
-rw-r--r--mesonbuild/modules/fs.py59
l---------test cases/common/227 fs module/a_symlink1
-rw-r--r--test cases/common/227 fs module/meson.build21
-rw-r--r--test cases/common/227 fs module/subdir/meson.build1
-rw-r--r--test cases/common/227 fs module/subdir/subdirfile.txt1
-rw-r--r--test cases/common/227 fs module/subprojects/subbie/meson.build9
-rw-r--r--test cases/common/227 fs module/subprojects/subbie/subprojectfile.txt1
-rw-r--r--test cases/common/227 fs module/subprojects/subbie/subsub/meson.build1
-rw-r--r--test cases/common/227 fs module/subprojects/subbie/subsub/subsubfile.txt1
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.