В нашей системе сборки все сторонние библиотеки компилируются вместе с проектом, поэтому стандартное FIND_PACKAGE нам не подходит. Значит, CMakeLists.txt из сборки OgreBullet тоже идет лесом. Поэтому приходится извращаться на свой лад.
CMakeLists.txt
# Название проекта
project( OgreBullet )
# Разделяем исходники для двух precompiled headers
file( GLOB_RECURSE OGRE_BULLET_COLLISIONS Collisions/*.cpp )
file( GLOB_RECURSE OGRE_BULLET_DYNAMICS Dynamics/*.cpp )
# Папки для поиска #include
include_directories(
${GLOBAL_INCLUDE_DIR}/Ogre
${GLOBAL_INCLUDE_DIR}/OgreBullet/Collisions
${GLOBAL_INCLUDE_DIR}/OgreBullet/Dynamics
${GLOBAL_LIB_DIR}/Bullet
${GLOBAL_LIB_DIR}/Bullet/BulletConvexDecomposition
${GLOBAL_LIB_DIR}/Bullet )
# Определяем макрос для использования precompiled headers
macro(use_precompiled_header SRC_LIST HDR_FILE SRC_FILE)
# Выделяем имя заголовка без пути
get_filename_component(PCH_HEADER ${HDR_FILE} NAME)
# Выделям имя заголовка без расширения и пути
get_filename_component(PCH_BINARY ${HDR_FILE} NAME_WE)
# Полный путь к созданному pch
set(PCH_BINARY "${CMAKE_CURRENT_BINARY_DIR}/${PCH_BINARY}.pch")
if (MSVC)
# Для precompiled.cpp создаем pch, указывая файл (OBJECT_OUTPUTS), который создается в результате комманды
set_source_files_properties( ${SRC_FILE} PROPERTIES
COMPILE_FLAGS "/Yc${PCH_HEADER} /Fp${PCH_BINARY}"
OBJECT_OUTPUTS "${PCH_BINARY}" )
# Для каждого исходника в списке, задаем зависимость от precompiled.pch и указываем использовать его параметром "/Yu"
foreach( SOURCE ${SRC_LIST} )
set_source_files_properties( ${SOURCE} PROPERTIES
COMPILE_FLAGS "/Yu${PCH_HEADER}"
OBJECT_DEPENDS "${PCH_BINARY}" )
endforeach( SOURCE ${SRC_LIST} )
endif(MSVC)
endmacro(use_precompiled_header)
# Создаем precompiled header для Collisions
use_precompiled_header( OGRE_BULLET_COLLISIONS
"${GLOBAL_INCLUDE_DIR}/OgreBullet/Collisions/OgreBulletCollisions.h" Collisions/OgreBulletCollisionsPrecompiled.cpp )
# Создаем precompiled header для Dynamics
use_precompiled_header( OGRE_BULLET_DYNAMICS
"${GLOBAL_INCLUDE_DIR}/OgreBullet/Dynamics/OgreBulletDynamics.h" Dynamics/OgreBulletDynamicsPrecompiled.cpp )
# Объединим два списка файлов для удобства
set( OGRE_BULLET_SRC
"${OGRE_BULLET_COLLISIONS}"
"${OGRE_BULLET_DYNAMICS}" )
# Добавляем define для использования precompiled headers библиотекой OgreBullet
add_definitions( -D_PRECOMP )
# Profit!
add_library( ogre_bullet STATIC ${OGRE_BULLET_SRC} )
UPDATE: Окончательный вариант precompiled headers смотрим здесь.