From e20f02bfc3d1650e5f0de9ba69c6af593dcb7e31 Mon Sep 17 00:00:00 2001 From: Daniel Mensinger Date: Fri, 12 Jun 2020 12:15:14 +0200 Subject: [PATCH] cmake: Fix handling of path seperators (fixes #7294) --- mesonbuild/cmake/executor.py | 2 +- mesonbuild/dependencies/base.py | 11 ++++++++--- .../cmake_fake1/cmMesonTestF1Config.cmake | 9 +++++++++ .../cmake_fake2/cmMesonTestF2Config.cmake | 9 +++++++++ test cases/linuxlike/13 cmake dependency/meson.build | 2 ++ test cases/linuxlike/13 cmake dependency/test.json | 2 +- 6 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 test cases/linuxlike/13 cmake dependency/cmake_fake1/cmMesonTestF1Config.cmake create mode 100644 test cases/linuxlike/13 cmake dependency/cmake_fake2/cmMesonTestF2Config.cmake diff --git a/mesonbuild/cmake/executor.py b/mesonbuild/cmake/executor.py index 5ca81965eb0b..4933c65593ba 100644 --- a/mesonbuild/cmake/executor.py +++ b/mesonbuild/cmake/executor.py @@ -69,7 +69,7 @@ def __init__(self, environment: Environment, version: str, for_machine: MachineC self.environment.is_cross_build(), 'CMAKE_PREFIX_PATH') if env_pref_path is not None: - env_pref_path = env_pref_path.split(os.pathsep) + env_pref_path = re.split(r':|;', env_pref_path) env_pref_path = [x for x in env_pref_path if x] # Filter out empty strings if not self.prefix_paths: self.prefix_paths = [] diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py index c29d735fd08e..8878e7103ebd 100644 --- a/mesonbuild/dependencies/base.py +++ b/mesonbuild/dependencies/base.py @@ -1154,12 +1154,17 @@ def _get_cmake_info(self): except MesonException: return None + def process_paths(l: T.List[str]) -> T.Set[str]: + l = [x.split(':') for x in l] + l = [x for sublist in l for x in sublist] + return set(l) + # Extract the variables and sanity check them - root_paths = set(temp_parser.get_cmake_var('MESON_FIND_ROOT_PATH')) - root_paths.update(set(temp_parser.get_cmake_var('MESON_CMAKE_SYSROOT'))) + root_paths = process_paths(temp_parser.get_cmake_var('MESON_FIND_ROOT_PATH')) + root_paths.update(process_paths(temp_parser.get_cmake_var('MESON_CMAKE_SYSROOT'))) root_paths = sorted(root_paths) root_paths = list(filter(lambda x: os.path.isdir(x), root_paths)) - module_paths = set(temp_parser.get_cmake_var('MESON_PATHS_LIST')) + module_paths = process_paths(temp_parser.get_cmake_var('MESON_PATHS_LIST')) rooted_paths = [] for j in [Path(x) for x in root_paths]: for i in [Path(x) for x in module_paths]: diff --git a/test cases/linuxlike/13 cmake dependency/cmake_fake1/cmMesonTestF1Config.cmake b/test cases/linuxlike/13 cmake dependency/cmake_fake1/cmMesonTestF1Config.cmake new file mode 100644 index 000000000000..e12aeb99a6c6 --- /dev/null +++ b/test cases/linuxlike/13 cmake dependency/cmake_fake1/cmMesonTestF1Config.cmake @@ -0,0 +1,9 @@ +find_package(ZLIB) + +if(ZLIB_FOUND OR ZLIB_Found) + set(cmMesonTestF1_FOUND ON) + set(cmMesonTestF1_LIBRARIES ${ZLIB_LIBRARY}) + set(cmMesonTestF1_INCLUDE_DIRS ${ZLIB_INCLUDE_DIR}) +else() + set(cmMesonTestF1_FOUND OFF) +endif() diff --git a/test cases/linuxlike/13 cmake dependency/cmake_fake2/cmMesonTestF2Config.cmake b/test cases/linuxlike/13 cmake dependency/cmake_fake2/cmMesonTestF2Config.cmake new file mode 100644 index 000000000000..a7a55d8803dc --- /dev/null +++ b/test cases/linuxlike/13 cmake dependency/cmake_fake2/cmMesonTestF2Config.cmake @@ -0,0 +1,9 @@ +find_package(ZLIB) + +if(ZLIB_FOUND OR ZLIB_Found) + set(cmMesonTestF2_FOUND ON) + set(cmMesonTestF2_LIBRARIES ${ZLIB_LIBRARY}) + set(cmMesonTestF2_INCLUDE_DIRS ${ZLIB_INCLUDE_DIR}) +else() + set(cmMesonTestF2_FOUND OFF) +endif() diff --git a/test cases/linuxlike/13 cmake dependency/meson.build b/test cases/linuxlike/13 cmake dependency/meson.build index 79acc83c4dac..66342d61f666 100644 --- a/test cases/linuxlike/13 cmake dependency/meson.build +++ b/test cases/linuxlike/13 cmake dependency/meson.build @@ -41,6 +41,8 @@ assert(depf2.found() == false, 'Invalid CMake targets should fail') # Try to find cmMesonTestDep in a custom prefix # setup_env.json is used by run_project_tests.py:_run_test to point to ./cmake_pref_env/ depPrefEnv = dependency('cmMesonTestDep', required : true, method : 'cmake') +depPrefEnv1 = dependency('cmMesonTestF1', required : true, method : 'cmake') +depPrefEnv2 = dependency('cmMesonTestF2', required : true, method : 'cmake') # Try to find a dependency with a custom CMake module diff --git a/test cases/linuxlike/13 cmake dependency/test.json b/test cases/linuxlike/13 cmake dependency/test.json index 565713ee60b6..fc29f727da38 100644 --- a/test cases/linuxlike/13 cmake dependency/test.json +++ b/test cases/linuxlike/13 cmake dependency/test.json @@ -1,5 +1,5 @@ { "env": { - "CMAKE_PREFIX_PATH": "@ROOT@/cmake_pref_env" + "CMAKE_PREFIX_PATH": "@ROOT@/cmake_fake1;@ROOT@/cmake_fake2:@ROOT@/cmake_pref_env" } }