File: GccPchSupport.cmake

package info (click to toggle)
openclonk 5.5.1-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 95,984 kB
  • ctags: 30,251
  • sloc: cpp: 156,513; ansic: 63,819; xml: 31,289; python: 1,090; php: 767; makefile: 138; ruby: 27; sh: 22
file content (76 lines) | stat: -rwxr-xr-x 3,321 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#Copied from http://www.mail-archive.com/cmake@cmake.org/msg04394.html which copied it from the rosengarden project
#see also: http://gcc.gnu.org/onlinedocs/gcc-4.0.4/gcc/Precompiled-Headers.html

MACRO(ADD_PRECOMPILED_HEADER _targetName _input)

	# Prepare environment
	GET_FILENAME_COMPONENT(_name ${_input} NAME)
	SET(_pchdir "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${_targetName}_pch.dir")
	MAKE_DIRECTORY(${_pchdir})
	SET(_source "${CMAKE_CURRENT_SOURCE_DIR}/${_input}")
	SET(_includeput "${_pchdir}/${_name}")
	SET(_output "${_includeput}.gch")

	# Assemble the compiler command with which future stuff will be built
	STRING(TOUPPER "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" _flags_var_name) # Don't worry: CMake won't use any of the R/D/RWDI/MSR vars if the build type is not defined
	if(CMAKE_CXX_COMPILER_ARG1) # please, know what you're doing if you rely on this...
		STRING(STRIP ${CMAKE_CXX_COMPILER_ARG1} _ccache_tweak)
		SET(_ccache_tweak "\"${_ccache_tweak}\"")
	endif()
	SET(_compiler_FLAGS ${_ccache_tweak} ${CMAKE_CXX_FLAGS} ${${_flags_var_name}})
	if(CMAKE_BUILD_TYPE)
        if(${CMAKE_BUILD_TYPE} STREQUAL "Debug")
            LIST(APPEND _compiler_FLAGS "-D_DEBUG")
        endif()
	endif()
	GET_TARGET_PROPERTY(_compile_defines ${_targetName} COMPILE_DEFINITIONS)
	if(_compile_defines)
		FOREACH(item ${_compile_defines})
			STRING(REPLACE "\"" "\\\"" item ${item})
			LIST(APPEND _compiler_FLAGS "-D${item}")
		ENDFOREACH(item)
	endif()
	GET_TARGET_PROPERTY(_compile_defines ${_targetName} COMPILE_DEFINITIONS_${CMAKE_BUILD_TYPE})
	if(_compile_defines)
		FOREACH(item ${_compile_defines})
			STRING(REPLACE "\"" "\\\"" item ${item})
			LIST(APPEND _compiler_FLAGS "-D${item}")
		ENDFOREACH(item)
	endif()
	GET_DIRECTORY_PROPERTY(_compile_defines COMPILE_DEFINITIONS)
	if(_compile_defines)
		FOREACH(item ${_compile_defines})
			STRING(REPLACE "\"" "\\\"" item ${item})
			LIST(APPEND _compiler_FLAGS "-D${item}")
		ENDFOREACH(item)
	endif()
	GET_DIRECTORY_PROPERTY(_compile_defines COMPILE_DEFINITIONS_${CMAKE_BUILD_TYPE})
	if(_compile_defines)
		FOREACH(item ${_compile_defines})
			STRING(REPLACE "\"" "\\\"" item ${item})
			LIST(APPEND _compiler_FLAGS "-D${item}")
		ENDFOREACH(item)
	endif()
	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)
	STRING(REPLACE "\"" "\\\"" _directory_flags ${_directory_flags}) # Welcome to escape hell. Replace " with \"
	LIST(APPEND _compiler_FLAGS ${_directory_flags})
	SEPARATE_ARGUMENTS(_compiler_FLAGS)
	list(REMOVE_DUPLICATES _compiler_FLAGS)

	# Add a target with the pch
	ADD_CUSTOM_COMMAND(
		OUTPUT ${_output}
		COMMAND "${CMAKE_CXX_COMPILER}"
			${_compiler_FLAGS} -x c++-header -o ${_output} ${_source}
		IMPLICIT_DEPENDS CXX ${_source}
	)
	FILE(WRITE "${_pchdir}/${_name}" "#ifdef __cplusplus\n#warning Precompiled header not used. Turn off or fix!\n#endif") # This file is added so the cc-units don't stumble over not being able to include the file
	ADD_CUSTOM_TARGET(${_targetName}_pch DEPENDS ${_output})
	ADD_DEPENDENCIES(${_targetName} ${_targetName}_pch)
	SET_TARGET_PROPERTIES(${_targetName} PROPERTIES	COMPILE_FLAGS "-include ${_includeput}")

ENDMACRO(ADD_PRECOMPILED_HEADER)