Mercurial > dedupe
diff CMake_Modules/PrecompiledHeader.cmake @ 29:ad9c92d782dd
Move cmake file into CMake_Modules
| author | Tom Fredrik Blenning Klaussen <bfg@blenning.no> |
|---|---|
| date | Thu, 06 Sep 2012 18:32:02 +0200 |
| parents | PrecompiledHeader.cmake@a3834af36579 |
| children | 44a3c32dd0cb |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CMake_Modules/PrecompiledHeader.cmake Thu Sep 06 18:32:02 2012 +0200 @@ -0,0 +1,76 @@ +# Macro for setting up precompiled headers. Usage: +# +# add_precompiled_header(target header.h [FORCEINCLUDE]) +# +# MSVC: A source file with the same name as the header must exist and +# be included in the target (E.g. header.cpp). +# +# MSVC: Add FORCEINCLUDE to automatically include the precompiled +# header file from every source file. +# +# GCC: The precompiled header is always automatically included from +# every header file. +MACRO(ADD_PRECOMPILED_HEADER _targetName _input) + GET_FILENAME_COMPONENT(_inputWe ${_input} NAME_WE) + SET(pch_source ${_inputWe}.cpp) + FOREACH(arg ${ARGN}) + IF(arg STREQUAL FORCEINCLUDE) + SET(FORCEINCLUDE ON) + ELSE(arg STREQUAL FORCEINCLUDE) + SET(FORCEINCLUDE OFF) + ENDIF(arg STREQUAL FORCEINCLUDE) + ENDFOREACH(arg) + + IF(MSVC) + GET_TARGET_PROPERTY(sources ${_targetName} SOURCES) + SET(_sourceFound FALSE) + FOREACH(_source ${sources}) + SET(PCH_COMPILE_FLAGS "") + IF(_source MATCHES \\.\(cc|cxx|cpp\)$) +GET_FILENAME_COMPONENT(_sourceWe ${_source} NAME_WE) +IF(_sourceWe STREQUAL ${_inputWe}) +SET(PCH_COMPILE_FLAGS "${PCH_COMPILE_FLAGS} /Yc${_input}") +SET(_sourceFound TRUE) +ELSE(_sourceWe STREQUAL ${_inputWe}) +SET(PCH_COMPILE_FLAGS "${PCH_COMPILE_FLAGS} /Yu${_input}") +IF(FORCEINCLUDE) +SET(PCH_COMPILE_FLAGS "${PCH_COMPILE_FLAGS} /FI${_input}") +ENDIF(FORCEINCLUDE) +ENDIF(_sourceWe STREQUAL ${_inputWe}) +SET_SOURCE_FILES_PROPERTIES(${_source} PROPERTIES COMPILE_FLAGS "${PCH_COMPILE_FLAGS}") + ENDIF(_source MATCHES \\.\(cc|cxx|cpp\)$) + ENDFOREACH() + IF(NOT _sourceFound) + MESSAGE(FATAL_ERROR "A source file for ${_input} was not found. Required for MSVC builds.") + ENDIF(NOT _sourceFound) + ENDIF(MSVC) + + IF(CMAKE_COMPILER_IS_GNUCXX) + GET_FILENAME_COMPONENT(_name ${_input} NAME) + SET(_source "${CMAKE_CURRENT_SOURCE_DIR}/${_input}") + SET(_outdir "${CMAKE_CURRENT_BINARY_DIR}/${_name}.gch") + MAKE_DIRECTORY(${_outdir}) + SET(_output "${_outdir}/.c++") + + STRING(TOUPPER "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" _flags_var_name) + SET(_compiler_FLAGS ${${_flags_var_name}}) + + GET_DIRECTORY_PROPERTY(_directory_flags INCLUDE_DIRECTORIES) + FOREACH(item ${_directory_flags}) + LIST(APPEND _compiler_FLAGS "-I${item}") + ENDFOREACH(item) + + GET_DIRECTORY_PROPERTY(_directory_flags DEFINITIONS) + LIST(APPEND _compiler_FLAGS ${_directory_flags}) + + SEPARATE_ARGUMENTS(_compiler_FLAGS) + MESSAGE("${CMAKE_CXX_COMPILER} -DPCHCOMPILE ${_compiler_FLAGS} -x c++-header -o {_output} ${_source}") + ADD_CUSTOM_COMMAND( + OUTPUT ${_output} + COMMAND ${CMAKE_CXX_COMPILER} ${_compiler_FLAGS} -x c++-header -o ${_output} ${_source} + DEPENDS ${_source} ) + ADD_CUSTOM_TARGET(${_targetName}_gch DEPENDS ${_output}) + ADD_DEPENDENCIES(${_targetName} ${_targetName}_gch) + SET_TARGET_PROPERTIES(${_targetName} PROPERTIES COMPILE_FLAGS "-include ${_name} -Winvalid-pch") + ENDIF(CMAKE_COMPILER_IS_GNUCXX) +ENDMACRO()
