# - Try to find precompiled headers support for GCC 3.4 and 4.x (and MSVC) # Once done this will define: # # Variable: # PCHSupport_FOUND # # ADD_PRECOMPILED_HEADER _targetName _inputh _inputcpp # ADD_PRECOMPILED_HEADER_TO_TARGET _targetName _input _pch_output_to_use # ADD_NATIVE_PRECOMPILED_HEADER _targetName _inputh _inputcpp IF(MSVC) SET(PCHSupport_FOUND TRUE) ELSE() IF(CMAKE_COMPILER_IS_GNUCXX) EXEC_PROGRAM(${CMAKE_CXX_COMPILER} ARGS ${CMAKE_CXX_COMPILER_ARG1} -dumpversion OUTPUT_VARIABLE gcc_compiler_version) IF(gcc_compiler_version VERSION_LESS "4.2") SET(PCHSupport_FOUND FALSE) ELSE() SET(PCHSupport_FOUND TRUE) ENDIF() ELSE() # TODO: make tests for other compilers than GCC SET(PCHSupport_FOUND TRUE) ENDIF() ENDIF() MACRO(APPEND_DEFINITION _NAME _VAL) IF(CMAKE_VERSION VERSION_LESS "2.8.12") # don't support logical expressions, append definition LIST(APPEND ${_NAME} "-D${_VAL}") ELSE() # support logical expressions, use them LIST(APPEND ${_NAME} "$<$:-D$>") ENDIF() ENDMACRO() # Set PCH_FLAGS for common flags, PCH_ARCH_XXX_FLAGS for specific archs flags and PCH_ARCHS for archs MACRO(PCH_SET_COMPILE_FLAGS _target) SET(PCH_FLAGS) SET(PCH_ARCHS) SET(PCH_INCLUDES) # Append target for clang if defined IF(CMAKE_CXX_COMPILER_TARGET) LIST(APPEND PCH_FLAGS "--target=${CMAKE_CXX_COMPILER_TARGET}") ENDIF() IF(CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN) LIST(APPEND PCH_FLAGS "--gcc-toolchain=${CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN}") ENDIF() IF(CMAKE_SYSROOT) LIST(APPEND PCH_FLAGS "--sysroot=${CMAKE_SYSROOT}") ENDIF() IF(CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES) FOREACH(item ${CMAKE_CXX_STANDARD_INCLUDE_DIRECTORIES}) LIST(APPEND PCH_FLAGS "-isystem ${item}") ENDFOREACH() ENDIF() # C++ flags SET(_FLAGS ${CMAKE_CXX_FLAGS}) SEPARATE_ARGUMENTS(_FLAGS) LIST(APPEND PCH_FLAGS ${_FLAGS}) # C++ config flags STRING(TOUPPER "${CMAKE_BUILD_TYPE}" _UPPER_BUILD) SET(_FLAGS ${CMAKE_CXX_FLAGS_${_UPPER_BUILD}}) SEPARATE_ARGUMENTS(_FLAGS) LIST(APPEND PCH_FLAGS ${_FLAGS}) GET_TARGET_PROPERTY(_targetType ${_target} TYPE) SET(_USE_PIC OFF) IF(${_targetType} STREQUAL "SHARED_LIBRARY" OR ${_targetType} STREQUAL "MODULE_LIBRARY") SET(_FLAGS ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}) SEPARATE_ARGUMENTS(_FLAGS) LIST(APPEND PCH_FLAGS ${_FLAGS}) ELSE() GET_TARGET_PROPERTY(_pic ${_target} POSITION_INDEPENDENT_CODE) IF(_pic) SET(_USE_PIC ON) ENDIF() ENDIF() GET_DIRECTORY_PROPERTY(DIRINC INCLUDE_DIRECTORIES) FOREACH(item ${DIRINC}) LIST(APPEND PCH_INCLUDES "${item}") ENDFOREACH() # NOTE: As cmake files (eg FindQT4) may now use generator expressions around their defines that evaluate # to an empty string, wrap all "items" in an expression that outputs a -D IFF the generated # expression is not empty. # Required for CMake 2.6 SET(GLOBAL_DEFINITIONS) GET_DIRECTORY_PROPERTY(DEFINITIONS COMPILE_DEFINITIONS) IF(DEFINITIONS) FOREACH(item ${DEFINITIONS}) APPEND_DEFINITION(GLOBAL_DEFINITIONS ${item}) ENDFOREACH() ENDIF() GET_DIRECTORY_PROPERTY(DEFINITIONS COMPILE_DEFINITIONS_${_UPPER_BUILD}) IF(DEFINITIONS) FOREACH(item ${DEFINITIONS}) APPEND_DEFINITION(GLOBAL_DEFINITIONS ${item}) ENDFOREACH() ENDIF() GET_DIRECTORY_PROPERTY(DEFINITIONS DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMPILE_DEFINITIONS) IF(DEFINITIONS) FOREACH(item ${DEFINITIONS}) APPEND_DEFINITION(GLOBAL_DEFINITIONS ${item}) ENDFOREACH() ENDIF() GET_DIRECTORY_PROPERTY(DEFINITIONS DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMPILE_DEFINITIONS_${_UPPER_BUILD}) IF(DEFINITIONS) FOREACH(item ${DEFINITIONS}) APPEND_DEFINITION(GLOBAL_DEFINITIONS ${item}) ENDFOREACH() ENDIF() GET_TARGET_PROPERTY(oldProps ${_target} COMPILE_FLAGS) IF(oldProps) SET(_FLAGS ${oldProps}) SEPARATE_ARGUMENTS(_FLAGS) LIST(APPEND PCH_FLAGS ${_FLAGS}) ENDIF() GET_TARGET_PROPERTY(oldPropsBuild ${_target} COMPILE_FLAGS_${_UPPER_BUILD}) IF(oldPropsBuild) SET(_FLAGS ${oldPropsBuild}) SEPARATE_ARGUMENTS(_FLAGS) LIST(APPEND PCH_FLAGS ${_FLAGS}) ENDIF() GET_TARGET_PROPERTY(DIRINC ${_target} INCLUDE_DIRECTORIES) IF(DIRINC) FOREACH(item ${DIRINC}) LIST(APPEND PCH_INCLUDES "${item}") ENDFOREACH() ENDIF() GET_TARGET_PROPERTY(DEFINITIONS ${_target} COMPILE_DEFINITIONS) IF(DEFINITIONS) FOREACH(item ${DEFINITIONS}) APPEND_DEFINITION(GLOBAL_DEFINITIONS ${item}) ENDFOREACH() ENDIF() GET_TARGET_PROPERTY(DEFINITIONS ${_target} COMPILE_DEFINITIONS_${_UPPER_BUILD}) IF(DEFINITIONS) FOREACH(item ${DEFINITIONS}) APPEND_DEFINITION(GLOBAL_DEFINITIONS ${item}) ENDFOREACH() ENDIF() GET_TARGET_PROPERTY(OPTIONS ${_target} COMPILE_OPTIONS) IF(OPTIONS) SEPARATE_ARGUMENTS(OPTIONS) LIST(APPEND PCH_FLAGS ${OPTIONS}) ENDIF() GET_TARGET_PROPERTY(OPTIONS ${_target} COMPILE_OPTIONS_${_UPPER_BUILD}) IF(OPTIONS) SEPARATE_ARGUMENTS(OPTIONS) LIST(APPEND PCH_FLAGS ${OPTIONS}) ENDIF() GET_TARGET_PROPERTY(_LIBS ${_target} INTERFACE_LINK_LIBRARIES) IF(_LIBS) FOREACH(_LIB ${_LIBS}) IF(TARGET "${_LIB}") # use same include directories GET_TARGET_PROPERTY(_DIRS ${_LIB} INTERFACE_INCLUDE_DIRECTORIES) IF(_DIRS) FOREACH(item ${_DIRS}) LIST(APPEND PCH_INCLUDES "${item}") ENDFOREACH() ENDIF() # use same compile definitions GET_TARGET_PROPERTY(_DEFINITIONS ${_LIB} INTERFACE_COMPILE_DEFINITIONS) IF(_DEFINITIONS) FOREACH(item ${_DEFINITIONS}) APPEND_DEFINITION(GLOBAL_DEFINITIONS ${item}) ENDFOREACH() ENDIF() ENDIF() ENDFOREACH() ENDIF() # Special Qt 5 cases IF(GLOBAL_DEFINITIONS MATCHES "QT_CORE_LIB") # Hack to define missing QT_NO_DEBUG with Qt 5.2 IF(_UPPER_BUILD STREQUAL "RELEASE") LIST(APPEND GLOBAL_DEFINITIONS "-DQT_NO_DEBUG") ENDIF() # Qt5_POSITION_INDEPENDENT_CODE should be true if Qt was compiled with PIC IF(Qt5_POSITION_INDEPENDENT_CODE) SET(_USE_PIC ON) ENDIF() IF(_USE_PIC) LIST(APPEND PCH_FLAGS ${CMAKE_CXX_COMPILE_OPTIONS_PIC}) ENDIF() ENDIF() IF(CMAKE_VERSION VERSION_LESS "3.3.0") GET_DIRECTORY_PROPERTY(_DIRECTORY_FLAGS DEFINITIONS) IF(_DIRECTORY_FLAGS) SEPARATE_ARGUMENTS(_DIRECTORY_FLAGS) FOREACH(item ${_DIRECTORY_FLAGS}) LIST(APPEND PCH_FLAGS "${item}") ENDFOREACH() ENDIF() GET_DIRECTORY_PROPERTY(_DIRECTORY_DEFINITIONS DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} DEFINITIONS) IF(_DIRECTORY_DEFINITIONS) SEPARATE_ARGUMENTS(_DIRECTORY_DEFINITIONS) FOREACH(item ${_DIRECTORY_DEFINITIONS}) LIST(APPEND PCH_FLAGS "${item}") ENDFOREACH() ENDIF() ENDIF() IF(CMAKE_CXX11_EXTENSION_COMPILE_OPTION) LIST(APPEND PCH_FLAGS "${CMAKE_CXX11_EXTENSION_COMPILE_OPTION}") ENDIF() # Already in list form and items may contain non-leading spaces that should not be split on LIST(APPEND PCH_FLAGS "${GLOBAL_DEFINITIONS}") IF(WIN32) SET(SYSTEM_FLAG "[-/$]") ELSE() SET(SYSTEM_FLAG "[-$]") ENDIF() SET(_FINAL_FLAGS) SET(_PREVIOUS_FLAG) FOREACH(_FLAG ${PCH_FLAGS}) # If parameter is really a flag (starts with -) IF(_FLAG MATCHES "^${SYSTEM_FLAG}") IF(_PREVIOUS_FLAG) # Append previous flag LIST(APPEND _FINAL_FLAGS ${_PREVIOUS_FLAG}) ENDIF() SET(_PREVIOUS_FLAG ${_FLAG}) ELSE() IF(_PREVIOUS_FLAG) # Append previous flag and its parameter # TODO: escape them only if there is an space LIST(APPEND _FINAL_FLAGS "${_PREVIOUS_FLAG} \"${_FLAG}\"") SET(_PREVIOUS_FLAG) ELSE() # Shouldn't happen MESSAGE(FATAL_ERROR "No previous flag before ${_FLAG}") ENDIF() ENDIF() ENDFOREACH() IF(_PREVIOUS_FLAG) LIST(APPEND _FINAL_FLAGS ${_PREVIOUS_FLAG}) ENDIF() SET(PCH_FLAGS ${_FINAL_FLAGS}) # Remove flags that don't work with PCH LIST(REMOVE_ITEM PCH_FLAGS "-Wa,--noexecstack") # Remove all empty parameters LIST(REMOVE_ITEM PCH_FLAGS "") # Remove duplicate parameters LIST(REMOVE_DUPLICATES PCH_FLAGS) # create a command-line string STRING(REGEX REPLACE ";" " " PCH_FLAGS "${PCH_FLAGS}") # and separate arguments SEPARATE_ARGUMENTS(PCH_FLAGS) ENDMACRO() MACRO(PCH_SET_COMPILE_COMMAND _inputcpp _compile_FLAGS _includes) IF(CMAKE_CXX_COMPILER_ARG1) # remove leading space in compiler argument STRING(REGEX REPLACE "^ +" "" pchsupport_compiler_cxx_arg1 ${CMAKE_CXX_COMPILER_ARG1}) ELSE() SET(pchsupport_compiler_cxx_arg1 "") ENDIF() IF(MSVC) GET_INTERMEDIATE_PDB_FULLPATH(${_PCH_current_target} _PDB_FILE) SET(PCH_TEMP_CONTENT) FOREACH(_include ${_includes}) SET(PCH_TEMP_CONTENT "${PCH_TEMP_CONTENT} -I \"${_include}\"") ENDFOREACH() SET(PCH_TEMP_FILE ${CMAKE_CURRENT_BINARY_DIR}/pch_command.txt) FILE(WRITE ${PCH_TEMP_FILE} "${PCH_TEMP_CONTENT}") SET(PCH_COMMAND ${CMAKE_CXX_COMPILER} /nologo @${PCH_TEMP_FILE} ${pchsupport_compiler_cxx_arg1} ${_compile_FLAGS} /Yc /Fp"${PCH_OUTPUT}" ${_inputcpp} /Fd"${_PDB_FILE}" /c /Fo"${PCH_OUTPUT}.obj") # Ninja PCH Support # http://public.kitware.com/pipermail/cmake-developers/2012-March/003653.html SET_SOURCE_FILES_PROPERTIES(${_inputcpp} PROPERTIES OBJECT_OUTPUTS "${PCH_OUTPUT}.obj") ELSE() SET(HEADER_FORMAT "c++-header") SET(_FLAGS) IF(APPLE) SET(HEADER_FORMAT "objective-${HEADER_FORMAT}") LIST(APPEND _FLAGS ${OBJC_FLAGS}) ENDIF() FOREACH(_include ${_includes}) LIST(APPEND _FLAGS -I "${_include}") ENDFOREACH() SET(PCH_COMMAND ${CMAKE_CXX_COMPILER} ${pchsupport_compiler_cxx_arg1} ${_compile_FLAGS} ${_FLAGS} -x ${HEADER_FORMAT} -o ${PCH_OUTPUT} -c ${PCH_INPUT}) ENDIF() ENDMACRO() MACRO(PCH_SET_PRECOMPILED_HEADER_OUTPUT _targetName _input _arch _language) SET(_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/${_targetName}_pch") IF(MSVC) FILE(MAKE_DIRECTORY ${_OUTPUT_DIR}) GET_FILENAME_COMPONENT(_name ${_input} NAME_WE) SET(PCH_INPUT ${_input}) SET(PCH_OUTPUT "${_OUTPUT_DIR}/${_name}.pch") ELSE() IF(NOT "${_arch}" STREQUAL "") SET(_OUTPUT_DIR "${_OUTPUT_DIR}_${_arch}") ENDIF() IF(NOT "${_language}" STREQUAL "") SET(_OUTPUT_DIR "${_OUTPUT_DIR}_${_language}") ENDIF() GET_FILENAME_COMPONENT(_name ${_input} NAME) # Copy .h to output dir SET(PCH_INPUT "${_OUTPUT_DIR}/${_name}") ADD_CUSTOM_COMMAND(OUTPUT ${PCH_INPUT} COMMAND ${CMAKE_COMMAND} -E copy_if_different ${_input} ${PCH_INPUT} DEPENDS ${_input} COMMENT "[${_targetName}] Update precompiled header - done" ) IF(CLANG) SET(PCH_EXT "pth") ELSE() SET(PCH_EXT "gch") ENDIF() # For GCC and Clang, PCH needs to be in the same directory as .h SET(PCH_OUTPUT "${_OUTPUT_DIR}/${_name}.${PCH_EXT}") ENDIF() ENDMACRO() # Add common flags MACRO(ADD_PRECOMPILED_HEADER_TO_TARGET _targetName) GET_TARGET_PROPERTY(oldProps ${_targetName} COMPILE_FLAGS) IF(${oldProps} MATCHES NOTFOUND) SET(oldProps "") ENDIF() IF(MSVC) SET(_target_cflags "${oldProps} /Yu\"${PCH_INPUT}\" /FI\"${PCH_INPUT}\" /Fp\"${PCH_OUTPUT}\"") # Ninja PCH Support # http://public.kitware.com/pipermail/cmake-developers/2012-March/003653.html SET_TARGET_PROPERTIES(${_targetName} PROPERTIES OBJECT_DEPENDS "${PCH_OUTPUT}") # NMAKE-VS2012 Error LNK2011 (NMAKE-VS2010 do not complain) # we need to link the pch.obj file, see http://msdn.microsoft.com/en-us/library/3ay26wa2(v=vs.110).aspx GET_TARGET_PROPERTY(_STATIC_LIBRARY_FLAGS ${_targetName} STATIC_LIBRARY_FLAGS) IF(NOT _STATIC_LIBRARY_FLAGS) SET(_STATIC_LIBRARY_FLAGS) ENDIF() SET(_STATIC_LIBRARY_FLAGS "${PCH_OUTPUT}.obj ${_STATIC_LIBRARY_FLAGS}") GET_TARGET_PROPERTY(_LINK_FLAGS ${_targetName} LINK_FLAGS) IF(NOT _LINK_FLAGS) SET(_LINK_FLAGS) ENDIF() SET(_LINK_FLAGS "${PCH_OUTPUT}.obj ${_LINK_FLAGS}") SET_TARGET_PROPERTIES(${_targetName} PROPERTIES STATIC_LIBRARY_FLAGS ${_STATIC_LIBRARY_FLAGS} LINK_FLAGS ${_LINK_FLAGS}) ELSE() # for use with distcc and gcc >4.0.1 if preprocessed files are accessible # on all remote machines set # PCH_ADDITIONAL_COMPILER_FLAGS to -fpch-preprocess SET(PCH_ADDITIONAL_COMPILER_FLAGS) LIST(LENGTH PCH_ARCHS PCH_ARCHS_COUNT) # If no arch is specified, create common flags IF(PCH_ARCHS_COUNT LESS 2) SET(PCH_ADDITIONAL_COMPILER_FLAGS "-include ${PCH_INPUT} ${PCH_ADDITIONAL_COMPILER_FLAGS}") ENDIF() IF(APPLE) STRING(REPLACE ";" " " OBJC_FLAGS_STR "${OBJC_FLAGS}") SET(PCH_ADDITIONAL_COMPILER_FLAGS "${OBJC_FLAGS_STR} -x objective-c++ ${PCH_ADDITIONAL_COMPILER_FLAGS}") ENDIF() IF(WITH_PCH_DEBUG) SET(PCH_ADDITIONAL_COMPILER_FLAGS "-H ${PCH_ADDITIONAL_COMPILER_FLAGS}") ENDIF() SET(_target_cflags "${oldProps} ${PCH_ADDITIONAL_COMPILER_FLAGS} -Winvalid-pch") ENDIF() SET_TARGET_PROPERTIES(${_targetName} PROPERTIES COMPILE_FLAGS ${_target_cflags}) ENDMACRO() # Add specific flags for an arch MACRO(ADD_PRECOMPILED_HEADER_TO_TARGET_ARCH _targetName _arch) LIST(LENGTH PCH_ARCHS PCH_ARCHS_COUNT) IF(PCH_ARCHS_COUNT GREATER 1) GET_TARGET_PROPERTY(_FLAGS ${_targetName} COMPILE_FLAGS) IF(${_FLAGS} MATCHES NOTFOUND) SET(_FLAGS "") ENDIF() SET(_FLAGS "${_FLAGS} -Xarch_${_arch} -include${PCH_INPUT}") SET_TARGET_PROPERTIES(${_targetName} PROPERTIES COMPILE_FLAGS ${_FLAGS}) ENDIF() ENDMACRO() MACRO(PCH_CREATE_TARGET _targetName _targetNamePCH) ADD_CUSTOM_COMMAND(OUTPUT ${PCH_OUTPUT} COMMAND ${PCH_COMMAND} COMMENT "Generating ${_targetNamePCH}" DEPENDS ${PCH_INPUT}) ADD_CUSTOM_TARGET(${_targetNamePCH} DEPENDS ${PCH_INPUT} ${PCH_OUTPUT}) ADD_DEPENDENCIES(${_targetName} ${_targetNamePCH}) ENDMACRO() MACRO(ADD_PRECOMPILED_HEADER _targetName _inputh _inputcpp) SET(_PCH_current_target ${_targetName}) IF(NOT CMAKE_BUILD_TYPE) MESSAGE(FATAL_ERROR "This is the ADD_PRECOMPILED_HEADER macro. " "You must set CMAKE_BUILD_TYPE!" ) ENDIF() PCH_SET_COMPILE_FLAGS(${_targetName}) IF(PCH_ARCHS) SET(PCH_OUTPUTS) FOREACH(_ARCH ${PCH_ARCHS}) STRING(TOUPPER "${_ARCH}" _UPPER_ARCH) PCH_SET_PRECOMPILED_HEADER_OUTPUT(${_targetName} ${_inputh} ${_ARCH} "") LIST(APPEND PCH_OUTPUTS ${PCH_OUTPUT}) PCH_SET_COMPILE_COMMAND(${_inputcpp} "${PCH_ARCH_${_UPPER_ARCH}_FLAGS};${PCH_FLAGS}" "${PCH_INCLUDES}") PCH_CREATE_TARGET(${_targetName} ${_targetName}_pch_${_ARCH}) ADD_PRECOMPILED_HEADER_TO_TARGET_ARCH(${_targetName} ${_ARCH}) ENDFOREACH() ELSE() PCH_SET_PRECOMPILED_HEADER_OUTPUT(${_targetName} ${_inputh} "" "") LIST(APPEND PCH_OUTPUTS ${PCH_OUTPUT}) PCH_SET_COMPILE_COMMAND(${_inputcpp} "${PCH_FLAGS}" "${PCH_INCLUDES}") PCH_CREATE_TARGET(${_targetName} ${_targetName}_pch) ENDIF() ADD_PRECOMPILED_HEADER_TO_TARGET(${_targetName}) SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${PCH_OUTPUTS}") ENDMACRO() MACRO(ADD_NATIVE_PRECOMPILED_HEADER _targetName _inputh _inputcpp) IF(PCHSupport_FOUND) # 0 => creating a new target for PCH, works for all makefiles # 1 => setting PCH for VC++ project, works for VC++ projects # 2 => setting PCH for XCode project, works for XCode projects IF(CMAKE_GENERATOR MATCHES "Visual Studio") SET(PCH_METHOD 1) ELSEIF(CMAKE_GENERATOR MATCHES "Xcode") SET(PCH_METHOD 2) ELSE() SET(PCH_METHOD 0) ENDIF() IF(PCH_METHOD EQUAL 1) # Auto include the precompile (useful for moc processing, since the use of # precompiled is specified at the target level # and I don't want to specifiy /F- for each moc/res/ui generated files (using Qt) GET_TARGET_PROPERTY(oldProps ${_targetName} COMPILE_FLAGS) IF(${oldProps} MATCHES NOTFOUND) SET(oldProps "") ENDIF() SET(newProperties "${oldProps} /Yu\"${_inputh}\" /FI\"${_inputh}\"") SET_TARGET_PROPERTIES(${_targetName} PROPERTIES COMPILE_FLAGS "${newProperties}") #also inlude ${oldProps} to have the same compile options SET_SOURCE_FILES_PROPERTIES(${_inputcpp} PROPERTIES COMPILE_FLAGS "${oldProps} /Yc\"${_inputh}\"") ELSEIF(PCH_METHOD EQUAL 2) # For Xcode, cmake needs my patch to process # GCC_PREFIX_HEADER and GCC_PRECOMPILE_PREFIX_HEADER as target properties # When buiding out of the tree, precompiled may not be located # Use full path instead. GET_FILENAME_COMPONENT(fullPath ${_inputh} ABSOLUTE) SET_TARGET_PROPERTIES(${_targetName} PROPERTIES XCODE_ATTRIBUTE_GCC_PREFIX_HEADER "${fullPath}") SET_TARGET_PROPERTIES(${_targetName} PROPERTIES XCODE_ATTRIBUTE_GCC_PRECOMPILE_PREFIX_HEADER "YES") ELSE() #Fallback to the "old" precompiled suppport IF(CMAKE_OSX_ARCHITECTURES AND TARGETS_COUNT GREATER 1) FOREACH(_ARCH ${CMAKE_OSX_ARCHITECTURES}) ADD_PRECOMPILED_HEADER(${_targetName}_${_ARCH} ${_inputh} ${_inputcpp}) ENDFOREACH() ELSE() ADD_PRECOMPILED_HEADER(${_targetName} ${_inputh} ${_inputcpp}) ENDIF() ENDIF() IF(TARGET ${_targetName}_static) ADD_NATIVE_PRECOMPILED_HEADER(${_targetName}_static ${_inputh} ${_inputcpp}) ENDIF() ELSE() MESSAGE(STATUS "PCH disabled because compiler doesn't support them") ENDIF() ENDMACRO()