Initial commit
[keepassx] / cmake / FindPCHSupport.cmake
1 # - Try to find precompiled headers support for GCC 3.4 and 4.x
2 # Once done this will define:
3 #
4 # Variable:
5 #   PCHSupport_FOUND
6 #
7 # Macro:
8 #   ADD_PRECOMPILED_HEADER
9
10 IF(CMAKE_COMPILER_IS_GNUCXX)
11     EXEC_PROGRAM(
12         ${CMAKE_CXX_COMPILER} 
13         ARGS                    --version 
14         OUTPUT_VARIABLE _compiler_output)
15     STRING(REGEX REPLACE ".* ([0-9]\\.[0-9]\\.[0-9]) .*" "\\1" 
16            gcc_compiler_version ${_compiler_output})
17     #MESSAGE("GCC Version: ${gcc_compiler_version}")
18     IF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
19         SET(PCHSupport_FOUND TRUE)
20     ELSE(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
21         IF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]")
22             SET(PCHSupport_FOUND TRUE)
23         ENDIF(gcc_compiler_version MATCHES "3\\.4\\.[0-9]")
24     ENDIF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
25 ENDIF(CMAKE_COMPILER_IS_GNUCXX)
26
27 MACRO(ADD_PRECOMPILED_HEADER _targetName _input )
28
29     GET_FILENAME_COMPONENT(_name ${_input} NAME)
30     SET(_source "${CMAKE_CURRENT_SOURCE_DIR}/${_input}")
31     SET(_outdir "${CMAKE_CURRENT_BINARY_DIR}/${_name}.gch")
32     MAKE_DIRECTORY(${_outdir})
33     SET(_output "${_outdir}/${CMAKE_BUILD_TYPE}.c++")
34     STRING(TOUPPER "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" _flags_var_name)
35     SET(_compiler_FLAGS ${${_flags_var_name}})
36     
37     GET_DIRECTORY_PROPERTY(_directory_flags INCLUDE_DIRECTORIES)
38     FOREACH(item ${_directory_flags})
39     LIST(APPEND _compiler_FLAGS "-I${item}")
40     ENDFOREACH(item)
41
42         GET_DIRECTORY_PROPERTY(_directory_flags COMPILE_DEFINITIONS)
43         FOREACH(item ${_directory_flags})
44     LIST(APPEND _compiler_FLAGS "-D${item}")
45     ENDFOREACH(item)
46
47     SEPARATE_ARGUMENTS(_compiler_FLAGS)
48     #MESSAGE("_compiler_FLAGS: ${_compiler_FLAGS}")
49     message("${CMAKE_CXX_COMPILER} ${_compiler_FLAGS} -x c++-header -o ${_output} ${_source}")
50     ADD_CUSTOM_COMMAND(
51         OUTPUT ${_output}
52         COMMAND ${CMAKE_CXX_COMPILER}
53                                 ${_compiler_FLAGS}
54                                 -x c++-header
55                                 -o ${_output} ${_source}
56         DEPENDS ${_source} )
57         ADD_CUSTOM_TARGET(${_targetName}_gch DEPENDS ${_output})
58     ADD_DEPENDENCIES(${_targetName} ${_targetName}_gch)
59     #SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} "-include ${_name} -Winvalid-pch -H")
60     #SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include ${_name} -Winvalid-pch")
61     SET_TARGET_PROPERTIES(${_targetName} PROPERTIES
62         COMPILE_FLAGS "-include ${_name} -Winvalid-pch"
63     )
64         
65 ENDMACRO(ADD_PRECOMPILED_HEADER)