Следующие команды CMake могут служить отправной точкой для вашего проекта:
add_custom_target(scanner COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/scanner.py"
COMMENT "Scanning include files ..."
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
Эта команда охватывает шаг 1. Она вызывает ваш скрипт на python, который может обновить существующие файлы precompiled.h
в CMAKE_CURRENT_SOURCE_DIR
.
add_custom_command(OUTPUT precompiled.h.gch
COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS}
-c "${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h" -o precompiled.h.gch
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h"
IMPLICIT_DEPENDS CXX "${CMAKE_CURRENT_SOURCE_DIR}/precompiled.h")
add_custom_target(generate_precompiled DEPENDS
"${CMAKE_CURRENT_BINARY_DIR}/precompiled.h.gch")
add_dependencies(generate_precompiled scanner)
Эти команды охватывают шаг 2. Предварительно скомпилированный заголовок создается с помощью пользовательской команды, которая неявно зависит от precompiled.h
и от других заголовков, включенных в precompiled.h
.precompiled.h.gch
генерируется в каталоге CMAKE_CURRENT_BINARY_DIR
.Поскольку генерация предварительно скомпилированного заголовка требует обновления precompiled.h
скриптом python, мы добавляем зависимость целевого уровня от цели scanner
.
include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR})
add_executable(main main.cpp)
set_target_properties(main PROPERTIES COMPILE_FLAGS "-include precompiled.h -H")
add_dependencies(main generate_precompiled)
Эти команды добавляют стандартные шаги компиляции, которые генерируют исполняемый файл main
.Предварительно скомпилированный заголовок включен в качестве заголовка по умолчанию с ключом gcc -include
.CMAKE_CURRENT_BINARY_DIR
, содержащий precompiled.h.gch
, добавляется в качестве включаемого каталога.gcc будет извлекать precompiled.h.gch
оттуда, когда включен precompiled.h (см. Использование предварительно скомпилированных заголовков ).
Наконец, целевая зависимость от generate_precompiled
гарантирует, что предварительно скомпилированный заголовок обновляется, еслинеобходимо.