Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- cmake_minimum_required(VERSION 2.8.8)
- #options
- option (USE_PRECOMPILED_HEADERS "Use precompiled headers" ON)
- option (USE_OBJECT_BUNDLES "Use object bundles" ON)
- if ((USE_OBJECT_BUNDLES)AND(USE_PRECOMPILED_HEADERS)AND(MSVC))
- message( WARNING "you selected the buggy combination: MSVC + USE_OBJECT_BUNDLES + USE_PRECOMPILED_HEADERS" )
- else ()
- message( WARNING "you selected a non-buggy combination" )
- endif()
- ##my files
- include_directories(${CMAKE_SOURCE_DIR})
- set(INCS ${INCS} "${CMAKE_CURRENT_SOURCE_DIR}/lib.hpp")
- set(SOURCE_FILES ${SOURCE_FILES} "${CMAKE_CURRENT_SOURCE_DIR}/lib.cpp")
- ##Precompiled header
- 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)
- #message("precompile project " ${_targetName})
- GET_TARGET_PROPERTY(sources ${_targetName} SOURCES)
- SET(_sourceFound FALSE)
- FOREACH(_source ${sources})
- SET(PCH_COMPILE_FLAGS "")
- IF(_source MATCHES \\.\(cc|cxx|cpp\)$)
- #message(" precompile " ${_source})
- GET_FILENAME_COMPONENT(_sourceWe ${_source} NAME_WE)
- IF(_sourceWe STREQUAL ${_inputWe})
- #message(" precompile creation")
- SET(PCH_COMPILE_FLAGS "${PCH_COMPILE_FLAGS} /Yc${_input}")
- SET(_sourceFound TRUE)
- ELSE(_sourceWe STREQUAL ${_inputWe})
- #message(" precompile utilization")
- 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})
- #message(" precompile flags " ${PCH_COMPILE_FLAGS})
- 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)
- ELSEIF((CMAKE_COMPILER_IS_GNUCXX)OR("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang"))
- GET_FILENAME_COMPONENT(_name ${_input} NAME)
- SET(_source "${CMAKE_CURRENT_SOURCE_DIR}/${_input}")
- SET(_output "${CMAKE_CURRENT_BINARY_DIR}/${_name}.pch")
- SET(_compiler_FLAGS ${CMAKE_CXX_FLAGS})
- 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)
- 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)
- if (CMAKE_COMPILER_IS_GNUCXX)
- SET_TARGET_PROPERTIES(${_targetName} PROPERTIES COMPILE_FLAGS "-include ${_name} -Winvalid-pch")
- else()
- SET_TARGET_PROPERTIES(${_targetName} PROPERTIES COMPILE_FLAGS "-Winvalid-pch")
- endif()
- ENDIF()
- ENDMACRO()
- set (COMMON_HEADER "common-header.hpp")
- if (USE_PRECOMPILED_HEADERS)
- if (MSVC)
- set(OPTIONAL_PRECOMPILATION_DEPENDENCIES common-header.cpp) #only MSVC requires a fake source file
- else()
- set(OPTIONAL_PRECOMPILATION_DEPENDENCIES "") #only MSVC requires a fake source file
- endif()
- else ()
- set(INCS ${INCS} "${CMAKE_CURRENT_SOURCE_DIR}/${COMMON_HEADER}")
- endif()
- ##Object libraries
- if (USE_OBJECT_BUNDLES)
- FOREACH(_object ${SOURCE_FILES})
- GET_FILENAME_COMPONENT(_rootname ${_object} NAME_WE)
- set(_bundle_name "bundle_${_rootname}")
- add_library("${_bundle_name}" OBJECT "${_object}" ${OPTIONAL_PRECOMPILATION_DEPENDENCIES})
- if (USE_PRECOMPILED_HEADERS)
- add_precompiled_header("${_bundle_name}" ${COMMON_HEADER} FORCEINCLUDE)
- endif()
- set(INCS ${INCS} "$<TARGET_OBJECTS:${_bundle_name}>")
- ENDFOREACH()
- else ()
- set(INCS ${INCS} ${SOURCE_FILES})
- endif ()
- ##Executable
- add_executable (main main.cpp ${OPTIONAL_PRECOMPILATION_DEPENDENCIES} ${INCS})
- if (USE_PRECOMPILED_HEADERS)
- add_precompiled_header(main ${COMMON_HEADER} FORCEINCLUDE)
- endif()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement