diff PrecompiledHeader.cmake @ 0:a3834af36579

Working with memory backend.
author Tom Fredrik Blenning Klaussen <bfg@blenning.no>
date Mon, 20 Aug 2012 15:49:48 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PrecompiledHeader.cmake	Mon Aug 20 15:49:48 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()