diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2020-08-05 23:09:38 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-05 23:09:38 +0300 |
commit | 461cb7d5345d6811547d121078dcb26af9310a35 (patch) | |
tree | 4ee753ea4cf30287cca8a61f5f329e1d6d442cb3 | |
parent | 7db49db67d4aa7582cf46feb7157235e66aa95b1 (diff) | |
parent | f16149cc4985fc1b35bf7b9435de9b9f52431175 (diff) | |
download | meson-461cb7d5345d6811547d121078dcb26af9310a35.zip meson-461cb7d5345d6811547d121078dcb26af9310a35.tar.gz meson-461cb7d5345d6811547d121078dcb26af9310a35.tar.bz2 |
Merge pull request #7527 from mensinda/cnFixExe
cmake: resolve IMPORTED executables in custom commands (fixes #7509)
7 files changed, 55 insertions, 21 deletions
diff --git a/mesonbuild/cmake/interpreter.py b/mesonbuild/cmake/interpreter.py index f404109..9749c4c 100644 --- a/mesonbuild/cmake/interpreter.py +++ b/mesonbuild/cmake/interpreter.py @@ -651,7 +651,7 @@ class ConverterCustomTarget: def __repr__(self) -> str: return '<{}: {} {}>'.format(self.__class__.__name__, self.name, self.outputs) - def postprocess(self, output_target_map: OutputTargetMap, root_src_dir: str, subdir: str, all_outputs: T.List[str]) -> None: + def postprocess(self, output_target_map: OutputTargetMap, root_src_dir: str, subdir: str, all_outputs: T.List[str], trace: CMakeTraceParser) -> None: # Default the working directory to ${CMAKE_CURRENT_BINARY_DIR} if not self.working_dir: self.working_dir = self.current_bin_dir.as_posix() @@ -694,7 +694,18 @@ class ConverterCustomTarget: if not j: continue target = output_target_map.executable(j) - cmd += [target] if target else [j] + if target: + cmd += [target] + continue + elif j in trace.targets: + trace_tgt = trace.targets[j] + if trace_tgt.type == 'EXECUTABLE' and 'IMPORTED_LOCATION' in trace_tgt.properties: + cmd += trace_tgt.properties['IMPORTED_LOCATION'] + continue + mlog.debug('CMake: Found invalid CMake target "{}" --> ignoring \n{}'.format(j, trace_tgt)) + + # Fallthrough on error + cmd += [j] commands += [cmd] self.command = commands @@ -969,7 +980,7 @@ class CMakeInterpreter: object_libs = [] custom_target_outputs = [] # type: T.List[str] for i in self.custom_targets: - i.postprocess(self.output_target_map, self.src_dir, self.subdir, custom_target_outputs) + i.postprocess(self.output_target_map, self.src_dir, self.subdir, custom_target_outputs, self.trace) for i in self.targets: i.postprocess(self.output_target_map, self.src_dir, self.subdir, self.install_prefix, self.trace) if i.type == 'OBJECT_LIBRARY': diff --git a/mesonbuild/cmake/traceparser.py b/mesonbuild/cmake/traceparser.py index a241360..fd16c75 100644 --- a/mesonbuild/cmake/traceparser.py +++ b/mesonbuild/cmake/traceparser.py @@ -269,6 +269,7 @@ class CMakeTraceParser: args = list(tline.args) # Make a working copy # Make sure the exe is imported + is_imported = True if 'IMPORTED' not in args: return self._gen_exception('add_executable', 'non imported executables are not supported', tline) @@ -277,7 +278,7 @@ class CMakeTraceParser: if len(args) < 1: return self._gen_exception('add_executable', 'requires at least 1 argument', tline) - self.targets[args[0]] = CMakeTarget(args[0], 'EXECUTABLE', {}) + self.targets[args[0]] = CMakeTarget(args[0], 'EXECUTABLE', {}, tline=tline, imported=is_imported) def _cmake_add_library(self, tline: CMakeTraceLine): # DOC: https://cmake.org/cmake/help/latest/command/add_library.html diff --git a/test cases/cmake/11 cmake_module_path/cmake/FindSomethingLikePython.cmake b/test cases/cmake/11 cmake_module_path/cmake/FindSomethingLikePython.cmake index 4a189bf..0c663f4 100644 --- a/test cases/cmake/11 cmake_module_path/cmake/FindSomethingLikePython.cmake +++ b/test cases/cmake/11 cmake_module_path/cmake/FindSomethingLikePython.cmake @@ -1,24 +1,9 @@ cmake_policy(VERSION 3.7) -if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.12) - find_package(Python COMPONENTS Interpreter) -else() - find_package(PythonInterp) -endif() - +find_package(Python COMPONENTS Interpreter) if(Python_FOUND OR PYTHONINTERP_FOUND) set(SomethingLikePython_FOUND ON) set(SomethingLikePython_EXECUTABLE ${Python_EXECUTABLE}) - - if(NOT DEFINED Python_VERSION) - set(Python_VERSION ${Python_VERSION_STRING}) - endif() - if(NOT TARGET Python::Interpreter) - add_executable(Python::Interpreter IMPORTED) - set_target_properties(Python::Interpreter PROPERTIES - IMPORTED_LOCATION ${Python_EXECUTABLE} - VERSION ${Python_VERSION}) - endif() else() set(SomethingLikePython_FOUND OFF) endif() diff --git a/test cases/cmake/11 cmake_module_path/meson.build b/test cases/cmake/11 cmake_module_path/meson.build index 2259268..75467e3 100644 --- a/test cases/cmake/11 cmake_module_path/meson.build +++ b/test cases/cmake/11 cmake_module_path/meson.build @@ -1,7 +1,7 @@ # We use Python3 as it's the only thing guaranteed to be available on any platform Meson can run on (unlike Zlib in linuxlike/13 cmake dependency). project('user CMake find_package module using cmake_module_path', - meson_version: '>= 0.50.0') + meson_version: '>= 0.55.0') if not find_program('cmake', required: false).found() error('MESON_SKIP_TEST cmake binary not available.') @@ -15,3 +15,11 @@ endif dependency('SomethingLikePython', required : true, method : 'cmake', cmake_module_path : 'cmake', modules: 'Python::Interpreter') dependency('SomethingLikePython', method : 'cmake', cmake_module_path : ['doesNotExist', 'cmake'], modules: 'Python::Interpreter') + +# Test a custom target with Python::Interpreter in COMMAND +cm = import('cmake') +op = cm.subproject_options() +op.add_cmake_defines({'CMAKE_MODULE_PATH': meson.source_root() / 'cmake'}) +sp = cm.subproject('cmMod', options: op) +main = sp.target('main') +test('main', main) diff --git a/test cases/cmake/11 cmake_module_path/subprojects/cmMod/CMakeLists.txt b/test cases/cmake/11 cmake_module_path/subprojects/cmMod/CMakeLists.txt new file mode 100644 index 0000000..88ba9bc --- /dev/null +++ b/test cases/cmake/11 cmake_module_path/subprojects/cmMod/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 3.5) + +project(cmMod) + +message(STATUS "CMAKE_MODULE_PATH: '${CMAKE_MODULE_PATH}'") + +find_package(SomethingLikePython REQUIRED) + +add_custom_command( + OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/main.c" + COMMAND Python::Interpreter "${CMAKE_CURRENT_SOURCE_DIR}/gen.py" + WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" +) + +add_executable(main "${CMAKE_CURRENT_BINARY_DIR}/main.c") diff --git a/test cases/cmake/11 cmake_module_path/subprojects/cmMod/gen.py b/test cases/cmake/11 cmake_module_path/subprojects/cmMod/gen.py new file mode 100644 index 0000000..5c71646 --- /dev/null +++ b/test cases/cmake/11 cmake_module_path/subprojects/cmMod/gen.py @@ -0,0 +1,9 @@ +with open('main.c', 'w') as fp: + print(''' +#include <stdio.h> + +int main(void) { + printf(\"Hello World\"); + return 0; +} +''', file=fp) diff --git a/test cases/cmake/11 cmake_module_path/test.json b/test cases/cmake/11 cmake_module_path/test.json new file mode 100644 index 0000000..79a2b60 --- /dev/null +++ b/test cases/cmake/11 cmake_module_path/test.json @@ -0,0 +1,5 @@ +{ + "tools": { + "cmake": ">=3.12" + } +} |