mirror of
https://github.com/reactos/reactos.git
synced 2025-04-20 20:36:35 +00:00
[CMAKE]
* *Significantly* speedup our GCC and MSVC builds by bringing-in precompiled headers support. * Grab RosBE 2.1.1, set PCH to 1 and enjoy ;) CORE-7716 svn path=/trunk/; revision=62139
This commit is contained in:
parent
e0fbecaa35
commit
57168c30e9
2 changed files with 64 additions and 55 deletions
|
@ -297,67 +297,36 @@ set(PSEH_LIB "pseh")
|
|||
|
||||
# Macros
|
||||
if(PCH)
|
||||
macro(_PCH_GET_COMPILE_FLAGS _target_name _out_compile_flags _header_filename)
|
||||
# Add the precompiled header to the build
|
||||
get_filename_component(_FILE ${_header_filename} NAME)
|
||||
set(_gch_filename "${_FILE}.gch")
|
||||
list(APPEND ${_out_compile_flags} -c ${_header_filename} -o ${_gch_filename})
|
||||
|
||||
# This gets us our includes
|
||||
get_directory_property(DIRINC INCLUDE_DIRECTORIES)
|
||||
foreach(item ${DIRINC})
|
||||
list(APPEND ${_out_compile_flags} -I${item})
|
||||
endforeach()
|
||||
|
||||
# This our definitions
|
||||
get_directory_property(_compiler_flags DEFINITIONS)
|
||||
list(APPEND ${_out_compile_flags} ${_compiler_flags})
|
||||
|
||||
# This gets any specific definitions that were added with set-target-property
|
||||
get_target_property(_target_defs ${_target_name} COMPILE_DEFINITIONS)
|
||||
if(_target_defs)
|
||||
foreach(item ${_target_defs})
|
||||
list(APPEND ${_out_compile_flags} -D${item})
|
||||
endforeach()
|
||||
endif()
|
||||
macro(add_pch _target _pch _sources)
|
||||
# When including x.h GCC looks for x.h.gch first
|
||||
set(_pch_final_name "${_target}_pch.h")
|
||||
set(_gch ${CMAKE_CURRENT_BINARY_DIR}/${_pch_final_name}.gch)
|
||||
|
||||
if(IS_CPP)
|
||||
list(APPEND ${_out_compile_flags} ${CMAKE_CXX_FLAGS})
|
||||
set(_pch_language CXX)
|
||||
else()
|
||||
list(APPEND ${_out_compile_flags} ${CMAKE_C_FLAGS})
|
||||
set(_pch_language C)
|
||||
endif()
|
||||
|
||||
separate_arguments(${_out_compile_flags})
|
||||
endmacro()
|
||||
# Build the precompiled header
|
||||
# HEADER_FILE_ONLY FALSE: force compiling the header
|
||||
# EXTERNAL_SOURCE TRUE: don't use the .gch file when linking
|
||||
set_source_files_properties(${_pch} PROPERTIES
|
||||
HEADER_FILE_ONLY FALSE
|
||||
LANGUAGE ${_pch_language}
|
||||
EXTERNAL_SOURCE TRUE
|
||||
OBJECT_LOCATION ${_gch})
|
||||
|
||||
macro(add_pch _target_name _FILE)
|
||||
set(_header_filename ${CMAKE_CURRENT_SOURCE_DIR}/${_FILE})
|
||||
get_filename_component(_basename ${_FILE} NAME)
|
||||
set(_gch_filename ${_basename}.gch)
|
||||
_PCH_GET_COMPILE_FLAGS(${_target_name} _args ${_header_filename})
|
||||
|
||||
if(IS_CPP)
|
||||
set(__lang CXX)
|
||||
set(__compiler ${CCACHE} ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1})
|
||||
else()
|
||||
set(__lang C)
|
||||
set(__compiler ${CCACHE} ${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1})
|
||||
if(ENABLE_CCACHE)
|
||||
set(_ccache_flag "-fpch-preprocess")
|
||||
endif()
|
||||
|
||||
add_custom_command(OUTPUT ${_gch_filename}
|
||||
COMMAND ${__compiler} ${_args}
|
||||
IMPLICIT_DEPENDS ${__lang} ${_header_filename}
|
||||
DEPENDS ${_header_filename} ${ARGN})
|
||||
get_target_property(_src_files ${_target_name} SOURCES)
|
||||
add_target_compile_flags(${_target_name} "-fpch-preprocess -Winvalid-pch -Wno-error=invalid-pch")
|
||||
foreach(_item in ${_src_files})
|
||||
get_source_file_property(__src_lang ${_item} LANGUAGE)
|
||||
if(__src_lang STREQUAL __lang)
|
||||
set_source_files_properties(${_item} PROPERTIES OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${_gch_filename})
|
||||
endif()
|
||||
# Include the gch in the specified source files, skipping the pch file itself
|
||||
list(REMOVE_ITEM ${_sources} ${_pch})
|
||||
foreach(_src ${${_sources}})
|
||||
set_property(SOURCE ${_src} APPEND_STRING PROPERTY COMPILE_FLAGS " ${_ccache_flag} -Winvalid-pch -Werror=invalid-pch -include ${_pch_final_name}")
|
||||
set_property(SOURCE ${_src} APPEND PROPERTY OBJECT_DEPENDS ${_gch})
|
||||
endforeach()
|
||||
#set dependency checking : depends on precompiled header only which already depends on deeper header
|
||||
set_target_properties(${_target_name} PROPERTIES IMPLICIT_DEPENDS_INCLUDE_TRANSFORM "\"${_basename}\"=;<${_basename}>=")
|
||||
endmacro()
|
||||
else()
|
||||
macro(add_pch _target_name _FILE)
|
||||
|
|
|
@ -54,7 +54,8 @@ add_compile_flags("/wd4290")
|
|||
# - TODO: C4133: incompatible types
|
||||
# - C4229: modifiers on data are ignored
|
||||
# - C4700: uninitialized variable usage
|
||||
add_compile_flags("/we4013 /we4022 /we4047 /we4098 /we4113 /we4129 /we4229 /we4700")
|
||||
# - C4603: macro is not defined or definition is different after precompiled header use
|
||||
add_compile_flags("/we4013 /we4022 /we4047 /we4098 /we4113 /we4129 /we4229 /we4700 /we4603")
|
||||
|
||||
# Enable warnings above the default level, but don't treat them as errors:
|
||||
# - C4115: named type definition in parentheses
|
||||
|
@ -118,8 +119,47 @@ set(CMAKE_RC_CREATE_SHARED_LIBRARY ${CMAKE_C_CREATE_SHARED_LIBRARY})
|
|||
set(CMAKE_ASM_CREATE_SHARED_LIBRARY ${CMAKE_C_CREATE_SHARED_LIBRARY})
|
||||
set(CMAKE_ASM_CREATE_STATIC_LIBRARY ${CMAKE_C_CREATE_STATIC_LIBRARY})
|
||||
|
||||
macro(add_pch _target_name _FILE)
|
||||
endmacro()
|
||||
if(PCH)
|
||||
macro(add_pch _target _pch _sources)
|
||||
set(_gch ${CMAKE_CURRENT_BINARY_DIR}/${_target}.pch)
|
||||
|
||||
if(IS_CPP)
|
||||
set(_pch_language CXX)
|
||||
set(_cl_lang_flag "/TP")
|
||||
else()
|
||||
set(_pch_language C)
|
||||
set(_cl_lang_flag "/TC")
|
||||
endif()
|
||||
|
||||
if(MSVC_IDE)
|
||||
set(_pch_path_name_flag "/Fp${_gch}")
|
||||
endif()
|
||||
|
||||
# Build the precompiled header
|
||||
# HEADER_FILE_ONLY FALSE: force compiling the header
|
||||
set_source_files_properties(${_pch} PROPERTIES
|
||||
HEADER_FILE_ONLY FALSE
|
||||
LANGUAGE ${_pch_language}
|
||||
COMPILE_FLAGS "${_cl_lang_flag} /Yc /Fp${_gch}"
|
||||
OBJECT_OUTPUTS ${_gch})
|
||||
|
||||
# Prevent a race condition related to writing to the PDB files between the PCH and the excluded list of source files
|
||||
get_target_property(_target_sources ${_target} SOURCES)
|
||||
list(REMOVE_ITEM _target_sources ${_pch})
|
||||
foreach(_target_src ${_target_sources})
|
||||
set_property(SOURCE ${_target_src} APPEND PROPERTY OBJECT_DEPENDS ${_gch})
|
||||
endforeach()
|
||||
|
||||
# Use the precompiled header with the specified source files, skipping the pch itself
|
||||
list(REMOVE_ITEM ${_sources} ${_pch})
|
||||
foreach(_src ${${_sources}})
|
||||
set_property(SOURCE ${_src} APPEND_STRING PROPERTY COMPILE_FLAGS " /FI${_gch} /Yu${_gch} ${_pch_path_name_flag}")
|
||||
endforeach()
|
||||
endmacro()
|
||||
else()
|
||||
macro(add_pch _target_name _FILE)
|
||||
endmacro()
|
||||
endif()
|
||||
|
||||
function(set_entrypoint _module _entrypoint)
|
||||
if(${_entrypoint} STREQUAL "0")
|
||||
|
|
Loading…
Reference in a new issue