xref: /reactos/sdk/cmake/host-tools.cmake (revision 41805926)
1
2function(configure_host_tools HOST_TOOLS_DIR)
3    file(MAKE_DIRECTORY ${HOST_TOOLS_DIR})
4
5    message(STATUS "Configuring host tools...")
6    # cmake sets CC and CXX when those languages are enabled
7    # so we need to clear them here
8    execute_process(COMMAND
9        ${CMAKE_COMMAND}
10            -E env --unset=CC --unset=CXX
11        ${CMAKE_COMMAND}
12            -G "${CMAKE_GENERATOR}"
13            -DARCH:STRING=${ARCH}
14            ${USE_CLANG_CL_ARG}
15            ${REACTOS_SOURCE_DIR}
16        WORKING_DIRECTORY ${HOST_TOOLS_DIR}
17        RESULT_VARIABLE _host_config_result
18        OUTPUT_VARIABLE _host_config_log
19        ERROR_VARIABLE  _host_config_log)
20
21    # Show cmake output only if host-tools breaks
22    if(NOT _host_config_result EQUAL 0)
23        message("\nHost tools log:")
24        message("${_host_config_log}")
25        message(FATAL_ERROR "Failed to configure host tools")
26    endif()
27
28    set_property(SOURCE host_tools PROPERTY SYMBOLIC 1)
29
30    include(${HOST_TOOLS_DIR}/ImportExecutables.cmake)
31    include(${HOST_TOOLS_DIR}/TargetList.cmake)
32
33    foreach(_target ${NATIVE_TARGETS})
34        get_target_property(_target_location native-${_target} LOCATION)
35        list(APPEND _target_locations ${_target_location})
36    endforeach()
37
38    # Make a host-tools target so it'll be built when needed
39    # custom target + symbolic output prevents cmake from running
40    # the command multiple times per build
41    # Specify the --config option, so the Release/Debug setting from the IDE can be used
42    add_custom_command(
43        COMMAND ${CMAKE_COMMAND} --build ${HOST_TOOLS_DIR} --config $<CONFIG>
44        OUTPUT host_tools
45        BYPRODUCTS ${_target_locations})
46    add_custom_target(build-host-tools ALL DEPENDS host_tools)
47
48    foreach(_target ${NATIVE_TARGETS})
49        add_dependencies(native-${_target} build-host-tools)
50    endforeach()
51
52endfunction()
53
54function(setup_host_tools)
55    if(WITH_HOST_TOOLS)
56        # Use pre-built tools, required for cross compiling with msvc
57        # as only one target architecture is available at a time
58        find_path(HOST_TOOLS_DIR
59            NAMES ImportExecutables.cmake
60            HINTS ${WITH_HOST_TOOLS} ${REACTOS_SOURCE_DIR}/${WITH_HOST_TOOLS}
61            NO_CMAKE_PATH
62            NO_CMAKE_ENVIRONMENT_PATH)
63        message(STATUS "Using prebuilt host tools: ${HOST_TOOLS_DIR}")
64        include(${HOST_TOOLS_DIR}/ImportExecutables.cmake)
65    else()
66        # Build host-tools. Changes to tool sources will rebuild targets
67        # using that tool
68        set(HOST_TOOLS_DIR ${REACTOS_BINARY_DIR}/host-tools)
69        configure_host_tools(${HOST_TOOLS_DIR})
70    endif()
71
72endfunction()
73