Warning, /graphics/kst-plot/cmake/modules/KstPchSupport.cmake is written in an unsupported language. File is not indexed.

0001 # ***************************************************************************
0002 # *                                                                         *
0003 # *   Copyright : (C) 2010 The University of Toronto                        *
0004 # *   email     : netterfield@astro.utoronto.ca                             *
0005 # *                                                                         *
0006 # *   Copyright : (C) 2010 Peter Kümmel                                     *
0007 # *   email     : syntheticpp@gmx.net                                       *
0008 # *                                                                         *
0009 # *   This program is free software; you can redistribute it and/or modify  *
0010 # *   it under the terms of the GNU General Public License as published by  *
0011 # *   the Free Software Foundation; either version 2 of the License, or     *
0012 # *   (at your option) any later version.                                   *
0013 # *                                                                         *
0014 # ***************************************************************************
0015 
0016 
0017 # Not supported officially my cmake
0018 # but there is a cmake ticket with examples
0019 # http://www.vtk.org/Bug/view.php?id=1260
0020 
0021 
0022 
0023 # use this macro before <add_library>
0024 #
0025 # _header : header to make a .gch
0026 # _sources: the variable name (do not use ${..}) which contains a
0027 #           a list of sources (a.cpp b.cpp c.cpp ...)
0028 #           This macro will append a header file to it, then this 
0029 #           src_list can be used in <add_library>
0030 #
0031 # Now a .gch file should be generated and gcc should use it.
0032 #       (add -Winvalid-pch to the cpp flags to verify)
0033 #
0034 # make clean should delete the pch file
0035 #
0036 # example : kst_add_pch_rule(pch.h source_list_name SHARED)
0037 
0038 macro(kst_add_pch_rule  _header _sources _lib_type)
0039 
0040         if(CMAKE_COMPILER_IS_GNUCC)
0041                 # first we have to find all compiler arguments
0042                 get_directory_property(_definitions COMPILE_DEFINITIONS)
0043         foreach(_it ${_definitions})
0044             if(CMAKE_MAJOR_VERSION LESS 3)
0045                 list(APPEND _args "-D${_it}")
0046             else()
0047                 list(APPEND _args "$<$<BOOL:${_it}>:-D${_it}>")
0048             endif()
0049                 endforeach()
0050                 
0051                 list(APPEND _args ${CMAKE_CXX_FLAGS})
0052                 if(CMAKE_BUILD_TYPE MATCHES Release)
0053                         list(APPEND _args ${CMAKE_CXX_FLAGS_RELEASE})
0054                         get_directory_property(_definitions_type COMPILE_DEFINITIONS_RELEASE)
0055                 else()
0056                         list(APPEND _args ${CMAKE_CXX_FLAGS_DEBUG})
0057                         get_directory_property(_definitions_type COMPILE_DEFINITIONS_DEBUG)
0058                 endif()
0059                 if(${_lib_type} MATCHES SHARED)
0060                         list(APPEND _args ${CMAKE_SHARED_LIBRARY_CXX_FLAGS})
0061                 endif()
0062                 if(_definitions_type)
0063                         if(CMAKE_MAJOR_VERSION LESS 3)
0064                                 list(APPEND _args "-D${_definitions_type}")
0065                         else()
0066                                 list(APPEND _args "$<$<BOOL:${_definitions_type}>:-D${_definitions_type}>")
0067                         endif()
0068                 endif()
0069                 #message(STATUS "pch: ${_args}")
0070                 
0071                 get_directory_property(DIRINC INCLUDE_DIRECTORIES)
0072                 foreach (_inc ${DIRINC})
0073                         LIST(APPEND _args "-I" ${_inc})
0074                 endforeach()
0075                 
0076                 set(_gch_filename "${_header}.gch")
0077                 list(APPEND ${_sources} ${_gch_filename})
0078                 list(APPEND _args -c ${_header} -o ${_gch_filename})
0079                 
0080                 separate_arguments(_args)
0081                 
0082                 # now build the pch with the compiler arguments 
0083                 add_custom_command(OUTPUT ${_gch_filename}
0084                         COMMAND ${CMAKE_COMMAND} -E remove ${_gch_filename}
0085                         COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1} ${_args}
0086                         DEPENDS ${_header})
0087                         
0088                 # all other files should use the pch
0089                 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Winvalid-pch -include ${_header}")
0090         
0091         else()
0092                 
0093                 file(WRITE ${_header}.tmp "#include \"${_header}\"\n")
0094                 execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different ${_header}.tmp ${_header}.cpp)
0095                 
0096                 if(MSVC_IDE)
0097                         set(pch_file "${_header}.\$(ConfigurationName).pch")
0098                 else()
0099                         set(pch_file ${_header}.pch)
0100                 endif()
0101                 
0102                 set_source_files_properties(${_header}.cpp PROPERTIES COMPILE_FLAGS "/Yc\"${_header}\" /Fp${pch_file}"
0103                                                                       OBJECT_OUTPUTS ${pch_file})
0104 
0105                 # Bug in cmake: next line also compile .c files with pchs
0106                 #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /FI${_header} /Yu${_header} /Fp${pch_file}")
0107                 foreach(it ${${_sources}})
0108                         get_filename_component(ext ${it} EXT)
0109                         if(ext STREQUAL .c)
0110                         else()
0111                                 set_source_files_properties(${it} PROPERTIES COMPILE_FLAGS "/FI${_header} /Yu${_header} /Fp${pch_file}"
0112                                                                              OBJECT_DEPENDS ${pch_file})
0113                         endif()
0114                 endforeach()
0115                         
0116                 list(APPEND ${_sources} ${_header} ${_header}.cpp) 
0117         endif()
0118                 
0119 endmacro()
0120 
0121