cmake: resolve IMPORTED executables in custom commands (fixes #7509)

pull/7618/head
Daniel Mensinger 4 years ago committed by Nirbheek Chauhan
parent 0fc3e456d8
commit 535a2d7285
  1. 17
      mesonbuild/cmake/interpreter.py
  2. 3
      mesonbuild/cmake/traceparser.py
  3. 10
      test cases/cmake/11 cmake_module_path/meson.build
  4. 15
      test cases/cmake/11 cmake_module_path/subprojects/cmMod/CMakeLists.txt
  5. 9
      test cases/cmake/11 cmake_module_path/subprojects/cmMod/gen.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':

@ -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

@ -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)

@ -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")

@ -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)
Loading…
Cancel
Save