diff --git a/CMakeLists.txt b/CMakeLists.txt index bcf4c18d30..b87528a870 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,11 @@ if(POLICY CMP0051) cmake_policy(SET CMP0051 NEW) endif() +if(POLICY CMP0054) + # Don't expand variables in strings inside if() + cmake_policy(SET CMP0054 NEW) +endif() + if(POLICY CMP0058) # Ninja requires custom command byproducts to be explicit cmake_policy(SET CMP0058 OLD) diff --git a/sdk/cmake/CMakeMacros.cmake b/sdk/cmake/CMakeMacros.cmake index 597143838b..138c3d8d4b 100644 --- a/sdk/cmake/CMakeMacros.cmake +++ b/sdk/cmake/CMakeMacros.cmake @@ -89,11 +89,13 @@ function(add_dependency_node _node) endif() endfunction() -function(add_dependency_edge _source _target) +function(add_dependency_edges _source) if(GENERATE_DEPENDENCY_GRAPH) get_target_property(_type ${_source} TYPE) if(_type MATCHES SHARED_LIBRARY) - file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml " \n") + foreach(_target ${ARGN}) + file(APPEND ${REACTOS_BINARY_DIR}/dependencies.graphml " \n") + endforeach() endif() endif() endfunction() @@ -287,19 +289,41 @@ macro(dir_to_num dir var) endmacro() function(add_cd_file) - cmake_parse_arguments(_CD "NO_CAB;NOT_IN_HYBRIDCD" "DESTINATION;NAME_ON_CD;TARGET" "FILE;FOR" ${ARGN}) - if(NOT (_CD_TARGET OR _CD_FILE)) - message(FATAL_ERROR "You must provide a target or a file to install!") + if((${ARGC} GREATER 5) AND (ARGV2 STREQUAL DESTINATION)) + set(_CD_FASTPATH 1) + if(ARGV0 STREQUAL "TARGET") + set(_CD_TARGET ${ARGV1}) + elseif(ARGV0 STREQUAL "FILE") + set(_CD_FILE ${ARGV1}) + else() + unset(_CD_FASTPATH) + endif() + set(_CD_DESTINATION ${ARGV3}) + if((${ARGC} EQUAL 6) AND (ARGV4 STREQUAL "FOR")) + set(_CD_FOR ${ARGV5}) + elseif((${ARGC} EQUAL 7) AND (ARGV4 STREQUAL "NO_CAB") AND (ARGV5 STREQUAL "FOR")) + set(_CD_NO_CAB 1) + set(_CD_FOR ${ARGV6}) + else() + unset(_CD_FASTPATH) + endif() endif() - if(NOT _CD_DESTINATION) - message(FATAL_ERROR "You must provide a destination") - elseif(${_CD_DESTINATION} STREQUAL root) - set(_CD_DESTINATION "") + if(NOT _CD_FASTPATH) + cmake_parse_arguments(_CD "NO_CAB;NOT_IN_HYBRIDCD" "DESTINATION;NAME_ON_CD;TARGET" "FILE;FOR" ${ARGN}) + if(NOT (_CD_TARGET OR _CD_FILE)) + message(FATAL_ERROR "You must provide a target or a file to install!") + endif() + if(NOT _CD_DESTINATION) + message(FATAL_ERROR "You must provide a destination") + endif() + if(NOT _CD_FOR) + message(FATAL_ERROR "You must provide a cd name (or \"all\" for all of them) to install the file on!") + endif() endif() - if(NOT _CD_FOR) - message(FATAL_ERROR "You must provide a cd name (or \"all\" for all of them) to install the file on!") + if(${_CD_DESTINATION} STREQUAL root) + set(_CD_DESTINATION "") endif() # get file if we need to @@ -491,15 +515,17 @@ function(add_clean_target _target) endfunction() if(NOT MSVC_IDE) - function(add_library name) - _add_library(${name} ${ARGN}) - add_clean_target(${name}) - endfunction() + if(CLEAN_TARGETS) + function(add_library name) + _add_library(${name} ${ARGN}) + add_clean_target(${name}) + endfunction() - function(add_executable name) - _add_executable(${name} ${ARGN}) - add_clean_target(${name}) - endfunction() + function(add_executable name) + _add_executable(${name} ${ARGN}) + add_clean_target(${name}) + endfunction() + endif() elseif(USE_FOLDER_STRUCTURE) set_property(GLOBAL PROPERTY USE_FOLDERS ON) string(LENGTH ${CMAKE_SOURCE_DIR} CMAKE_SOURCE_DIR_LENGTH) @@ -558,9 +584,8 @@ function(add_importlibs _module) target_link_libraries(${_module} msvcrtex) endif() target_link_libraries(${_module} lib${LIB}) - add_dependencies(${_module} lib${LIB}) - add_dependency_edge(${_module} ${LIB}) endforeach() + add_dependency_edges(${_module} ${ARGN}) endfunction() function(set_module_type MODULE TYPE) diff --git a/sdk/cmake/config.cmake b/sdk/cmake/config.cmake index 7b296996ad..f3e76d6404 100644 --- a/sdk/cmake/config.cmake +++ b/sdk/cmake/config.cmake @@ -64,6 +64,9 @@ set(BUILD_MP TRUE CACHE BOOL set(GENERATE_DEPENDENCY_GRAPH FALSE CACHE BOOL "Whether to create a GraphML dependency graph of DLLs.") +set(CLEAN_TARGETS FALSE CACHE BOOL +"Whether to generate module_clean targets (slows down CMake).") + if(MSVC) set(_PREFAST_ FALSE CACHE BOOL "Whether to enable PREFAST while compiling.") diff --git a/sdk/cmake/gcc.cmake b/sdk/cmake/gcc.cmake index d54fc3a93e..05e773d9d2 100644 --- a/sdk/cmake/gcc.cmake +++ b/sdk/cmake/gcc.cmake @@ -345,11 +345,11 @@ function(generate_import_lib _libname _dllname _spec_file) set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/${_libname}_implib.def PROPERTIES EXTERNAL_OBJECT TRUE) # Create normal importlib - _add_library(${_libname} STATIC EXCLUDE_FROM_ALL ${CMAKE_CURRENT_BINARY_DIR}/${_libname}_implib.def) + add_library(${_libname} STATIC EXCLUDE_FROM_ALL ${CMAKE_CURRENT_BINARY_DIR}/${_libname}_implib.def) set_target_properties(${_libname} PROPERTIES LINKER_LANGUAGE "IMPLIB" PREFIX "") # Create delayed importlib - _add_library(${_libname}_delayed STATIC EXCLUDE_FROM_ALL ${CMAKE_CURRENT_BINARY_DIR}/${_libname}_implib.def) + add_library(${_libname}_delayed STATIC EXCLUDE_FROM_ALL ${CMAKE_CURRENT_BINARY_DIR}/${_libname}_implib.def) set_target_properties(${_libname}_delayed PROPERTIES LINKER_LANGUAGE "IMPLIB_DELAYED" PREFIX "") endfunction() diff --git a/sdk/lib/crt/oldnames.cmake b/sdk/lib/crt/oldnames.cmake index 806ada3570..91a70901ee 100644 --- a/sdk/lib/crt/oldnames.cmake +++ b/sdk/lib/crt/oldnames.cmake @@ -1,6 +1,6 @@ if(NOT MSVC) - _add_library(oldnames STATIC EXCLUDE_FROM_ALL ${CMAKE_CURRENT_SOURCE_DIR}/moldname-msvcrt.def) + add_library(oldnames STATIC EXCLUDE_FROM_ALL ${CMAKE_CURRENT_SOURCE_DIR}/moldname-msvcrt.def) set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/moldname-msvcrt.def PROPERTIES EXTERNAL_OBJECT TRUE) set_target_properties(oldnames PROPERTIES LINKER_LANGUAGE "IMPLIB" PREFIX "") else()