Advertisement
Guest User

Untitled

a guest
Mar 6th, 2013
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
CMake 4.37 KB | None | 0 0
  1. cmake_minimum_required(VERSION 2.8.8)
  2.  
  3. #options
  4. option (USE_PRECOMPILED_HEADERS "Use precompiled headers" ON)
  5. option (USE_OBJECT_BUNDLES "Use object bundles" ON)
  6. if ((USE_OBJECT_BUNDLES)AND(USE_PRECOMPILED_HEADERS)AND(MSVC))
  7.   message( WARNING "you selected the buggy combination: MSVC + USE_OBJECT_BUNDLES + USE_PRECOMPILED_HEADERS" )
  8. else ()
  9.   message( WARNING "you selected a non-buggy combination" )
  10. endif()
  11.  
  12. ##my files
  13. include_directories(${CMAKE_SOURCE_DIR})
  14. set(INCS ${INCS} "${CMAKE_CURRENT_SOURCE_DIR}/lib.hpp")
  15. set(SOURCE_FILES ${SOURCE_FILES} "${CMAKE_CURRENT_SOURCE_DIR}/lib.cpp")
  16.  
  17. ##Precompiled header
  18. MACRO(ADD_PRECOMPILED_HEADER _targetName _input)
  19.   GET_FILENAME_COMPONENT(_inputWe ${_input} NAME_WE)
  20.   SET(pch_source ${_inputWe}.cpp)
  21.   FOREACH(arg ${ARGN})
  22.     IF(arg STREQUAL FORCEINCLUDE)
  23.       SET(FORCEINCLUDE ON)
  24.     ELSE(arg STREQUAL FORCEINCLUDE)
  25.       SET(FORCEINCLUDE OFF)
  26.     ENDIF(arg STREQUAL FORCEINCLUDE)
  27.   ENDFOREACH(arg)
  28.   IF(MSVC)
  29.     #message("precompile project " ${_targetName})
  30.     GET_TARGET_PROPERTY(sources ${_targetName} SOURCES)
  31.     SET(_sourceFound FALSE)
  32.     FOREACH(_source ${sources})
  33.       SET(PCH_COMPILE_FLAGS "")
  34.       IF(_source MATCHES \\.\(cc|cxx|cpp\)$)
  35.         #message("  precompile " ${_source})
  36.         GET_FILENAME_COMPONENT(_sourceWe ${_source} NAME_WE)
  37.         IF(_sourceWe STREQUAL ${_inputWe})
  38.             #message("    precompile creation")
  39.             SET(PCH_COMPILE_FLAGS "${PCH_COMPILE_FLAGS} /Yc${_input}")
  40.             SET(_sourceFound TRUE)
  41.         ELSE(_sourceWe STREQUAL ${_inputWe})
  42.             #message("    precompile utilization")
  43.             SET(PCH_COMPILE_FLAGS "${PCH_COMPILE_FLAGS} /Yu${_input}")
  44.             IF(FORCEINCLUDE)
  45.                 SET(PCH_COMPILE_FLAGS "${PCH_COMPILE_FLAGS} /FI${_input}")
  46.             ENDIF(FORCEINCLUDE)
  47.         ENDIF(_sourceWe STREQUAL ${_inputWe})
  48.         #message("  precompile flags " ${PCH_COMPILE_FLAGS})
  49.         SET_SOURCE_FILES_PROPERTIES(${_source} PROPERTIES COMPILE_FLAGS "${PCH_COMPILE_FLAGS}")
  50.       ENDIF(_source MATCHES \\.\(cc|cxx|cpp\)$)
  51.     ENDFOREACH()
  52.     IF(NOT _sourceFound)
  53.       MESSAGE(FATAL_ERROR "A source file for ${_input} was not found. Required for MSVC builds.")
  54.     ENDIF(NOT _sourceFound)
  55.   ELSEIF((CMAKE_COMPILER_IS_GNUCXX)OR("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang"))
  56.     GET_FILENAME_COMPONENT(_name ${_input} NAME)
  57.     SET(_source "${CMAKE_CURRENT_SOURCE_DIR}/${_input}")
  58.     SET(_output "${CMAKE_CURRENT_BINARY_DIR}/${_name}.pch")
  59.     SET(_compiler_FLAGS ${CMAKE_CXX_FLAGS})
  60.     GET_DIRECTORY_PROPERTY(_directory_flags INCLUDE_DIRECTORIES)
  61.     FOREACH(item ${_directory_flags})
  62.       LIST(APPEND _compiler_FLAGS "-I${item}")
  63.     ENDFOREACH(item)
  64.     GET_DIRECTORY_PROPERTY(_directory_flags DEFINITIONS)
  65.     LIST(APPEND _compiler_FLAGS ${_directory_flags})
  66.     SEPARATE_ARGUMENTS(_compiler_FLAGS)
  67.     ADD_CUSTOM_COMMAND(
  68.       OUTPUT ${_output}
  69.       COMMAND ${CMAKE_CXX_COMPILER} ${_compiler_FLAGS} -x c++-header -o ${_output} ${_source}
  70.       DEPENDS ${_source} )
  71.     ADD_CUSTOM_TARGET(${_targetName}_gch DEPENDS ${_output})
  72.     ADD_DEPENDENCIES(${_targetName} ${_targetName}_gch)
  73.     if (CMAKE_COMPILER_IS_GNUCXX)
  74.       SET_TARGET_PROPERTIES(${_targetName} PROPERTIES COMPILE_FLAGS "-include ${_name} -Winvalid-pch")
  75.     else()
  76.       SET_TARGET_PROPERTIES(${_targetName} PROPERTIES COMPILE_FLAGS "-Winvalid-pch")
  77.     endif()
  78.   ENDIF()
  79. ENDMACRO()
  80. set (COMMON_HEADER "common-header.hpp")
  81. if (USE_PRECOMPILED_HEADERS)
  82.   if (MSVC)
  83.     set(OPTIONAL_PRECOMPILATION_DEPENDENCIES common-header.cpp) #only MSVC requires a fake source file
  84.   else()
  85.     set(OPTIONAL_PRECOMPILATION_DEPENDENCIES "") #only MSVC requires a fake source file
  86.   endif()
  87. else ()
  88.   set(INCS ${INCS} "${CMAKE_CURRENT_SOURCE_DIR}/${COMMON_HEADER}")
  89. endif()
  90.  
  91. ##Object libraries
  92. if (USE_OBJECT_BUNDLES)
  93.     FOREACH(_object ${SOURCE_FILES})
  94.         GET_FILENAME_COMPONENT(_rootname ${_object} NAME_WE)
  95.         set(_bundle_name "bundle_${_rootname}")
  96.         add_library("${_bundle_name}" OBJECT "${_object}" ${OPTIONAL_PRECOMPILATION_DEPENDENCIES})
  97.         if (USE_PRECOMPILED_HEADERS)
  98.           add_precompiled_header("${_bundle_name}" ${COMMON_HEADER} FORCEINCLUDE)
  99.         endif()
  100.         set(INCS ${INCS} "$<TARGET_OBJECTS:${_bundle_name}>")
  101.     ENDFOREACH()
  102. else ()
  103.     set(INCS ${INCS} ${SOURCE_FILES})
  104. endif ()
  105.    
  106. ##Executable
  107. add_executable (main main.cpp ${OPTIONAL_PRECOMPILATION_DEPENDENCIES} ${INCS})
  108. if (USE_PRECOMPILED_HEADERS)
  109.   add_precompiled_header(main ${COMMON_HEADER} FORCEINCLUDE)
  110. endif()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement