It is possible to do that completely within CMake.
The trick is to run a separate CMake configuring stage within its own space, silently dismissing every crosscompiling setting and using the host's default toolchain, then import the generated outputs into it's parent, crosscompiling build.
First part:
set(host_tools_list wxrc generate_foo) if(CMAKE_CROSSCOMPILING) # Pawn off the creation of the host utilities into its own dedicated space file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/host_tools) file(TO_NATIVE_PATH ${CMAKE_COMMAND} native_cmake_command) file(TO_NATIVE_PATH ${CMAKE_CURRENT_SOURCE_DIR} native_cmake_current_source_dir) execute_process( COMMAND "${native_cmake_command}" "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}" "${native_cmake_current_source_dir}" WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/host_tools ) add_custom_target(host_tools COMMAND ${CMAKE_COMMAND} --build . --target host_tools --config $<CONFIG> WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/host_tools ) include(${CMAKE_CURRENT_BINARY_DIR}/host_tools/host_tools.cmake) foreach(tgt IN ITEMS ${host_tools_list}) add_dependencies(host${tgt} host_tools) endforeach() else() # Add an empty target, host tools are built inplace add_custom_target(host_tools DEPENDS ${host_tools_list} ) endif()
... then you add the usual add_executable and whatever ...
At the end:
if(NOT CMAKE_CROSSCOMPILING) foreach(tgt IN ITEMS ${host_tools_list}) add_executable(host${tgt} ALIAS ${tgt}) endforeach() export(TARGETS ${host_tools_list} NAMESPACE host FILE host_tools.cmake) endif()
When it crosscompiles, it pawns off the creation of the host-run tools into its own dedicated space, and imports the targets as "hostwxrc" and "hostgenerate_foo", with a dependency on generating the host_tools themselves .
When it doesn't crosscompile, it builds wxrc and generate_foo as-is, and aliases them to hostwxrc and hostgenerate_foo.
After this, when you use $<TARGET_FILE:wxrc>, you refer to the wxrc built for the target platform, and $<TARGET_FILE:hostwxrc> refers to the wxrc built for the host platform, regardless whether they are the same or not.
configurecommand to specify the host architecture. And you would have to runconfiguretwice if you want to build for two different host environments. So I see two possibilities with CMake: use a build script that creates and executes the two environments needed (see here) or use ExternalProject_Add() and split yourCMakeLists.txtinto dedicated subprojects.CC_FOR_BUILD. Seeax_cc_for_build.