From bbe47e61b180c1ce19ecea57ebd852f3434d2207 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=B4me=20Gardou?= Date: Thu, 22 Oct 2020 08:47:06 +0200 Subject: [PATCH] |CMAKE] Use ExternalProject for host-tools build --- CMakeLists.txt | 4 +- .../rostests/tests/spec2def/CMakeLists.txt | 2 +- sdk/cmake/gcc.cmake | 9 +- sdk/cmake/host-tools.cmake | 91 +++++-------------- 4 files changed, 31 insertions(+), 75 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ed703c8145c..e0ffe31e9d6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -95,9 +95,7 @@ if(NOT CMAKE_CROSSCOMPILING) list(APPEND NATIVE_TARGETS rsym pefixup) endif() - export(TARGETS ${NATIVE_TARGETS} FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake NAMESPACE native- ) - configure_file(sdk/cmake/host-tools.in ${CMAKE_BINARY_DIR}/TargetList.cmake) - + install(TARGETS ${NATIVE_TARGETS}) else() # Add host tools target include(sdk/cmake/host-tools.cmake) diff --git a/modules/rostests/tests/spec2def/CMakeLists.txt b/modules/rostests/tests/spec2def/CMakeLists.txt index 9553930a3a4..61ee5fbc309 100644 --- a/modules/rostests/tests/spec2def/CMakeLists.txt +++ b/modules/rostests/tests/spec2def/CMakeLists.txt @@ -1,3 +1,3 @@ add_custom_target(spec2def_test - py -3 ${CMAKE_CURRENT_SOURCE_DIR}/test.py $) + py -3 ${CMAKE_CURRENT_SOURCE_DIR}/test.py $) diff --git a/sdk/cmake/gcc.cmake b/sdk/cmake/gcc.cmake index d20abb20473..216c24c54a4 100644 --- a/sdk/cmake/gcc.cmake +++ b/sdk/cmake/gcc.cmake @@ -213,7 +213,7 @@ elseif(NO_ROSSYM) set(CMAKE_RC_CREATE_SHARED_LIBRARY " ${CMAKE_C_FLAGS} -o ") else() # Normal rsym build - get_target_property(RSYM native-rsym IMPORTED_LOCATION_NOCONFIG) + get_target_property(RSYM native-rsym IMPORTED_LOCATION) set(CMAKE_C_LINK_EXECUTABLE " ${CMAKE_C_FLAGS} -o " @@ -309,11 +309,10 @@ if(NOT ARCH STREQUAL "i386") endif() function(fixup_load_config _target) - get_target_property(PEFIXUP native-pefixup IMPORTED_LOCATION_NOCONFIG) add_custom_command(TARGET ${_target} POST_BUILD - COMMAND "${PEFIXUP}" - "$" - COMMENT "Patching in LOAD_CONFIG") + COMMAND native-pefixup "$" + COMMENT "Patching in LOAD_CONFIG" + DEPENDS native-pefixup) endfunction() function(generate_import_lib _libname _dllname _spec_file) diff --git a/sdk/cmake/host-tools.cmake b/sdk/cmake/host-tools.cmake index 92eb199df77..dedcb11a4c5 100644 --- a/sdk/cmake/host-tools.cmake +++ b/sdk/cmake/host-tools.cmake @@ -1,72 +1,31 @@ -function(configure_host_tools HOST_TOOLS_DIR) - file(MAKE_DIRECTORY ${HOST_TOOLS_DIR}) - - message(STATUS "Configuring host tools...") - # cmake sets CC and CXX when those languages are enabled - # so we need to clear them here - execute_process(COMMAND - ${CMAKE_COMMAND} - -E env --unset=CC --unset=CXX - ${CMAKE_COMMAND} - -G "${CMAKE_GENERATOR}" - -DARCH:STRING=${ARCH} - ${USE_CLANG_CL_ARG} - ${REACTOS_SOURCE_DIR} - WORKING_DIRECTORY ${HOST_TOOLS_DIR} - RESULT_VARIABLE _host_config_result - OUTPUT_VARIABLE _host_config_log - ERROR_VARIABLE _host_config_log) - - # Show cmake output only if host-tools breaks - if(NOT _host_config_result EQUAL 0) - message("\nHost tools log:") - message("${_host_config_log}") - message(FATAL_ERROR "Failed to configure host tools") - endif() - - set_property(SOURCE host_tools PROPERTY SYMBOLIC 1) - - include(${HOST_TOOLS_DIR}/ImportExecutables.cmake) - include(${HOST_TOOLS_DIR}/TargetList.cmake) - - foreach(_target ${NATIVE_TARGETS}) - get_target_property(_target_location native-${_target} LOCATION) - list(APPEND _target_locations ${_target_location}) - endforeach() - - # Make a host-tools target so it'll be built when needed - # custom target + symbolic output prevents cmake from running - # the command multiple times per build - # Specify the --config option, so the Release/Debug setting from the IDE can be used - add_custom_command( - COMMAND ${CMAKE_COMMAND} --build ${HOST_TOOLS_DIR} --config $ - OUTPUT host_tools - BYPRODUCTS ${_target_locations}) - add_custom_target(build-host-tools ALL DEPENDS host_tools) - - foreach(_target ${NATIVE_TARGETS}) - add_dependencies(native-${_target} build-host-tools) - endforeach() - -endfunction() +include(ExternalProject) function(setup_host_tools) - if(WITH_HOST_TOOLS) - # Use pre-built tools, required for cross compiling with msvc - # as only one target architecture is available at a time - find_path(HOST_TOOLS_DIR - NAMES ImportExecutables.cmake - HINTS ${WITH_HOST_TOOLS} ${REACTOS_SOURCE_DIR}/${WITH_HOST_TOOLS} - NO_CMAKE_PATH - NO_CMAKE_ENVIRONMENT_PATH) - message(STATUS "Using prebuilt host tools: ${HOST_TOOLS_DIR}") - include(${HOST_TOOLS_DIR}/ImportExecutables.cmake) - else() - # Build host-tools. Changes to tool sources will rebuild targets - # using that tool - set(HOST_TOOLS_DIR ${REACTOS_BINARY_DIR}/host-tools) - configure_host_tools(${HOST_TOOLS_DIR}) + list(APPEND HOST_TOOLS bin2c widl gendib cabman fatten hpp isohybrid mkhive mkisofs obj2bin spec2def geninc mkshelllink utf16le xml2sdb) + if(NOT MSVC) + list(APPEND HOST_TOOLS rsym pefixup) + endif() + list(TRANSFORM HOST_TOOLS PREPEND "${REACTOS_BINARY_DIR}/host-tools/bin/" OUTPUT_VARIABLE HOST_TOOLS_OUTPUT) + if (CMAKE_HOST_WIN32) + list(TRANSFORM HOST_TOOLS_OUTPUT APPEND ".exe") + set(HOST_EXE_SUFFIX ".exe") endif() + ExternalProject_Add(host-tools + SOURCE_DIR ${REACTOS_SOURCE_DIR} + PREFIX ${REACTOS_BINARY_DIR}/host-tools + INSTALL_DIR ${REACTOS_BINARY_DIR}/host-tools + CMAKE_ARGS -UCMAKE_TOOLCHAIN_FILE -DARCH:STRING=${ARCH} -DCMAKE_INSTALL_PREFIX=${REACTOS_BINARY_DIR}/host-tools + BUILD_ALWAYS TRUE + BUILD_BYPRODUCTS ${HOST_TOOLS_OUTPUT} + ) + + ExternalProject_Get_Property(host-tools INSTALL_DIR) + + foreach(_tool ${HOST_TOOLS}) + add_executable(native-${_tool} IMPORTED) + set_target_properties(native-${_tool} PROPERTIES IMPORTED_LOCATION ${INSTALL_DIR}/bin/${_tool}${HOST_EXE_SUFFIX}) + add_dependencies(native-${_tool} host-tools) + endforeach() endfunction() -- 2.17.1