From 8f3fc52eb34b7b485b662e2b6c788ef2eb612c7a Mon Sep 17 00:00:00 2001 From: Amine Khaldi Date: Sun, 6 Sep 2015 16:44:30 +0000 Subject: [PATCH] [CMAKE] Introduce a way to compile ReactOS without invoking CMake twice. You can enable it by running configure with -DNEW_STYLE_BUILD=1. Once the transition goes smoothly we can enable this by default. CORE-10121 svn path=/trunk/; revision=69060 --- reactos/CMakeLists.txt | 33 ++++++++++++++++------- reactos/cmake/gcc.cmake | 8 +++++- reactos/cmake/host-tools.cmake | 37 ++++++++++++++++++++++++++ reactos/tools/CMakeLists.txt | 21 ++++++++++----- reactos/tools/cabman/CMakeLists.txt | 2 +- reactos/tools/cdmake/CMakeLists.txt | 2 +- reactos/tools/hpp/CMakeLists.txt | 2 +- reactos/tools/kbdtool/CMakeLists.txt | 2 +- reactos/tools/log2lines/CMakeLists.txt | 2 +- reactos/tools/mkhive/CMakeLists.txt | 2 +- reactos/tools/rsym/CMakeLists.txt | 6 ++--- reactos/tools/widl/CMakeLists.txt | 2 +- 12 files changed, 92 insertions(+), 27 deletions(-) create mode 100644 reactos/cmake/host-tools.cmake diff --git a/reactos/CMakeLists.txt b/reactos/CMakeLists.txt index 70cfe2fa433..6cd33278859 100644 --- a/reactos/CMakeLists.txt +++ b/reactos/CMakeLists.txt @@ -41,6 +41,10 @@ if(NOT CMAKE_VERSION STREQUAL "2.8.12.1-ReactOS") set(CMAKE_DISABLE_NINJA_DEPSLOG TRUE) endif() +if(NOT DEFINED NEW_STYLE_BUILD) + set(NEW_STYLE_BUILD FALSE) +endif() + if(NOT ARCH) set(ARCH i386) endif() @@ -80,6 +84,10 @@ endif() if(NOT CMAKE_CROSSCOMPILING) + if(NEW_STYLE_BUILD) + set(TOOLS_FOLDER ${CMAKE_CURRENT_BINARY_DIR}) + endif() + add_definitions(-DTARGET_${ARCH}) if(MSVC) @@ -102,14 +110,20 @@ if(NOT CMAKE_CROSSCOMPILING) add_subdirectory(tools) add_subdirectory(lib) - if(NOT MSVC) - export(TARGETS bin2c widl gendib cabman cdmake mkhive obj2bin spec2def geninc rsym mkshelllink utf16le FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake NAMESPACE native- ) - else() - export(TARGETS bin2c widl gendib cabman cdmake mkhive obj2bin spec2def geninc mkshelllink utf16le FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake NAMESPACE native- ) + if(NOT NEW_STYLE_BUILD) + if(NOT MSVC) + export(TARGETS bin2c widl gendib cabman cdmake mkhive obj2bin spec2def geninc rsym mkshelllink utf16le FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake NAMESPACE native- ) + else() + export(TARGETS bin2c widl gendib cabman cdmake mkhive obj2bin spec2def geninc mkshelllink utf16le FILE ${CMAKE_BINARY_DIR}/ImportExecutables.cmake NAMESPACE native- ) + endif() endif() else() + if(NEW_STYLE_BUILD) + include(cmake/host-tools.cmake) + endif() + # adjust the default behaviour of the FIND_XXX() commands: # search headers and libraries in the target environment, search # programs in the host environment @@ -130,13 +144,14 @@ else() ${REACTOS_BINARY_DIR}/boot/ros_cab.txt ${REACTOS_BINARY_DIR}/boot/ros_cab_target.txt) - if(NOT DEFINED REACTOS_BUILD_TOOLS_DIR) - set(REACTOS_BUILD_TOOLS_DIR ${REACTOS_SOURCE_DIR}/build) + if(NOT NEW_STYLE_BUILD) + if(NOT DEFINED REACTOS_BUILD_TOOLS_DIR) + set(REACTOS_BUILD_TOOLS_DIR ${REACTOS_SOURCE_DIR}/build) + endif() + set(IMPORT_EXECUTABLES "${REACTOS_BUILD_TOOLS_DIR}/ImportExecutables.cmake" CACHE FILEPATH "Host executables") + include(${IMPORT_EXECUTABLES}) endif() - set(IMPORT_EXECUTABLES "${REACTOS_BUILD_TOOLS_DIR}/ImportExecutables.cmake" CACHE FILEPATH "Host executables") - include(${IMPORT_EXECUTABLES}) - if(DBG) add_definitions(-DDBG=1 -D_SEH_ENABLE_TRACE) else() diff --git a/reactos/cmake/gcc.cmake b/reactos/cmake/gcc.cmake index 73012ee6930..4bd655981ec 100644 --- a/reactos/cmake/gcc.cmake +++ b/reactos/cmake/gcc.cmake @@ -225,7 +225,13 @@ 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) + if(NEW_STYLE_BUILD) + string(TOUPPER ${CMAKE_BUILD_TYPE} _build_type) + get_target_property(RSYM native-rsym IMPORTED_LOCATION_${_build_type}) + else() + get_target_property(RSYM native-rsym IMPORTED_LOCATION_NOCONFIG) + endif() + set(CMAKE_C_LINK_EXECUTABLE " ${CMAKE_C_FLAGS} -o " "${RSYM} -s ${REACTOS_SOURCE_DIR} ") diff --git a/reactos/cmake/host-tools.cmake b/reactos/cmake/host-tools.cmake new file mode 100644 index 00000000000..79915607c24 --- /dev/null +++ b/reactos/cmake/host-tools.cmake @@ -0,0 +1,37 @@ + +if(CMAKE_HOST_WIN32) + set(native_suffix ".exe") +endif() + +string(TOUPPER ${CMAKE_BUILD_TYPE} _build_type) + +# List of host tools +list(APPEND host_tools_list bin2c widl gendib cabman cdmake mkhive obj2bin spec2def geninc mkshelllink utf16le) +if(NOT MSVC) + list(APPEND host_tools_list rsym) +endif() + +foreach(_host_tool ${host_tools_list}) + if(MSVC_IDE) + get_filename_component(_tool_location "${CMAKE_CURRENT_BINARY_DIR}/host-tools/${CMAKE_BUILD_TYPE}/${_host_tool}${native_suffix}" ABSOLUTE) + else() + get_filename_component(_tool_location "${CMAKE_CURRENT_BINARY_DIR}/host-tools/${_host_tool}${native_suffix}" ABSOLUTE) + endif() + list(APPEND tools_binaries ${_tool_location}) + add_executable(native-${_host_tool} IMPORTED) + set_property(TARGET native-${_host_tool} PROPERTY IMPORTED_LOCATION_${_build_type} ${_tool_location}) + add_dependencies(native-${_host_tool} host-tools) +endforeach() + +include(ExternalProject) + +ExternalProject_Add(host-tools + SOURCE_DIR ${REACTOS_SOURCE_DIR} + BINARY_DIR ${REACTOS_BINARY_DIR}/host-tools + STAMP_DIR ${REACTOS_BINARY_DIR}/host-tools/stamps + BUILD_ALWAYS 1 + PREFIX host-tools + EXCLUDE_FROM_ALL 1 + CMAKE_ARGS "-DNEW_STYLE_BUILD=1" + INSTALL_COMMAND "" + BUILD_BYPRODUCTS ${tools_binaries}) diff --git a/reactos/tools/CMakeLists.txt b/reactos/tools/CMakeLists.txt index 56f09b11646..d1f402ef13c 100644 --- a/reactos/tools/CMakeLists.txt +++ b/reactos/tools/CMakeLists.txt @@ -1,21 +1,28 @@ +function(add_host_tool _tool) + add_executable(${_tool} ${ARGN}) + if(NEW_STYLE_BUILD) + set_target_properties(${_tool} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${TOOLS_FOLDER}) + endif() +endfunction() + #add_executable(pefixup pefixup.c) if(MSVC) add_definitions(-D_CRT_SECURE_NO_WARNINGS) endif() -add_executable(bin2c bin2c.c) -add_executable(gendib gendib/gendib.c) -add_executable(geninc geninc/geninc.c) -add_executable(mkshelllink mkshelllink/mkshelllink.c) -add_executable(obj2bin obj2bin/obj2bin.c) -add_executable(spec2def spec2def/spec2def.c) +add_host_tool(bin2c bin2c.c) +add_host_tool(gendib gendib/gendib.c) +add_host_tool(geninc geninc/geninc.c) +add_host_tool(mkshelllink mkshelllink/mkshelllink.c) +add_host_tool(obj2bin obj2bin/obj2bin.c) +add_host_tool(spec2def spec2def/spec2def.c) if(MSVC) set_property(SOURCE utf16le/utf16le.cpp APPEND_STRING PROPERTY COMPILE_FLAGS " /EHsc") endif() -add_executable(utf16le utf16le/utf16le.cpp) +add_host_tool(utf16le utf16le/utf16le.cpp) add_subdirectory(cabman) add_subdirectory(cdmake) diff --git a/reactos/tools/cabman/CMakeLists.txt b/reactos/tools/cabman/CMakeLists.txt index 2fd93f88582..60242b6f9a7 100644 --- a/reactos/tools/cabman/CMakeLists.txt +++ b/reactos/tools/cabman/CMakeLists.txt @@ -7,5 +7,5 @@ list(APPEND SOURCE raw.cxx) include_directories(${REACTOS_SOURCE_DIR}/include/reactos/libs/zlib) -add_executable(cabman ${SOURCE}) +add_host_tool(cabman ${SOURCE}) target_link_libraries(cabman zlibhost) diff --git a/reactos/tools/cdmake/CMakeLists.txt b/reactos/tools/cdmake/CMakeLists.txt index d2a70e69107..caaeb070884 100644 --- a/reactos/tools/cdmake/CMakeLists.txt +++ b/reactos/tools/cdmake/CMakeLists.txt @@ -1,2 +1,2 @@ -add_executable(cdmake cdmake.c dirhash.c llmsort.c) +add_host_tool(cdmake cdmake.c dirhash.c llmsort.c) diff --git a/reactos/tools/hpp/CMakeLists.txt b/reactos/tools/hpp/CMakeLists.txt index 26113d3074e..684214fbe1f 100644 --- a/reactos/tools/hpp/CMakeLists.txt +++ b/reactos/tools/hpp/CMakeLists.txt @@ -1,2 +1,2 @@ -add_executable(hpp hpp.c) +add_host_tool(hpp hpp.c) diff --git a/reactos/tools/kbdtool/CMakeLists.txt b/reactos/tools/kbdtool/CMakeLists.txt index 0e9db092e02..a8adaa25bf8 100644 --- a/reactos/tools/kbdtool/CMakeLists.txt +++ b/reactos/tools/kbdtool/CMakeLists.txt @@ -1,2 +1,2 @@ -add_executable(kbdtool data.c main.c output.c parser.c) +add_host_tool(kbdtool data.c main.c output.c parser.c) diff --git a/reactos/tools/log2lines/CMakeLists.txt b/reactos/tools/log2lines/CMakeLists.txt index 18b56580e5f..8e1485b0912 100644 --- a/reactos/tools/log2lines/CMakeLists.txt +++ b/reactos/tools/log2lines/CMakeLists.txt @@ -13,5 +13,5 @@ list(APPEND SOURCE util.c) include_directories(${REACTOS_SOURCE_DIR}/tools/rsym) -add_executable(log2lines ${SOURCE}) +add_host_tool(log2lines ${SOURCE}) target_link_libraries(log2lines rsym_common) diff --git a/reactos/tools/mkhive/CMakeLists.txt b/reactos/tools/mkhive/CMakeLists.txt index 04bd7472e5e..66a91d3f735 100644 --- a/reactos/tools/mkhive/CMakeLists.txt +++ b/reactos/tools/mkhive/CMakeLists.txt @@ -16,5 +16,5 @@ list(APPEND SOURCE registry.c rtl.c) -add_executable(mkhive ${SOURCE}) +add_host_tool(mkhive ${SOURCE}) target_link_libraries(mkhive unicode cmlibhost inflibhost) diff --git a/reactos/tools/rsym/CMakeLists.txt b/reactos/tools/rsym/CMakeLists.txt index 0daf7886eab..2e4e3893fb2 100644 --- a/reactos/tools/rsym/CMakeLists.txt +++ b/reactos/tools/rsym/CMakeLists.txt @@ -4,12 +4,12 @@ add_library(rsym_common rsym_common.c) if(ARCH STREQUAL "i386") add_definitions(-D_X86_) - add_executable(rsym rsym.c) + add_host_tool(rsym rsym.c) elseif(ARCH STREQUAL "amd64") - add_executable(rsym rsym64.c) + add_host_tool(rsym rsym64.c) elseif(ARCH STREQUAL "arm") add_executable(rsym rsym64.c) endif() target_link_libraries(rsym rsym_common dbghelphost zlibhost unicode) -add_executable(raddr2line rsym_common.c raddr2line.c) +add_host_tool(raddr2line rsym_common.c raddr2line.c) diff --git a/reactos/tools/widl/CMakeLists.txt b/reactos/tools/widl/CMakeLists.txt index 009c4152994..de1174b0a13 100644 --- a/reactos/tools/widl/CMakeLists.txt +++ b/reactos/tools/widl/CMakeLists.txt @@ -32,5 +32,5 @@ list(APPEND SOURCE # Taken from widl.rbuild add_definitions(-DINT16=SHORT) -add_executable(widl ${SOURCE}) +add_host_tool(widl ${SOURCE}) target_link_libraries(widl wpphost)