CMake: как автоматически перестраивать .obj-файлы при изменении заголовка - PullRequest
1 голос
/ 05 октября 2019

По своему собственному поиску я не совсем уверен, что такое «нормальное» поведение: CMake обычно перестраивает .obj-файлы при изменении заголовка, включенного в связанный исходный файл? Потому что это не делает этого в моем проекте вообще. Вот мой CMakeLists.txt верхнего уровня:

cmake_minimum_required(VERSION 3.15 FATAL_ERROR)

enable_language(CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# project and binary name
project("myProjectName")


# compiler specific warnings
# and warnings are treated as errors
if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR
    "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
    set(warnings "-Wall -Wextra -Werror")
elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
    set(warnings "/W4 /WX /EHsc")
endif()
if (NOT CONFIGURED_ONCE)
    set(CMAKE_CXX_FLAGS "${warnings}"
        CACHE STRING "Flags used by the compiler during all build types." FORCE)
    set(CMAKE_C_FLAGS   "${warnings}"
        CACHE STRING "Flags used by the compiler during all build types." FORCE)
endif()

# default build-type is Debug:

if (NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE "Debug")
endif()


# =============================
# libraries
# =============================

# external
# eigen numerics library
find_package (Eigen3 3.3 REQUIRED NO_MODULE)
set( EIGEN Eigen3::Eigen )

# some internal libraries here
set( LIB_NAME_1 lib1 )
set( LIB_NAME_2 lib2 )


# =============================
# directory configuration
# =============================

# for finding libraries and such in the project's subdirectories
# all paths are prepended with the project's root directory
set(CMAKE_PREFIX_PATH ${CMAKE_SOURCE_DIR})

# specifiying output directories 
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
#set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# the last one is disabled to allow for tests in a different directory

# include paths
include_directories(
    ${CMAKE_SOURCE_DIR}/include
    ${CMAKE_SOURCE_DIR}/lib # I put header-only libraries there
    ${CMAKE_SOURCE_DIR}/src # for template definitions
)


# =============================
# unit test configuration
# =============================
# enable_testing() sets the internal flag "CMAKE_TESTING_ENABLED" to 1
# add_test() commands are only run when enable_testing() has executed.
# here, it is only executed in debug mode
if(CMAKE_BUILD_TYPE MATCHES Debug)
    enable_testing()
endif()


# the unit test framework used here is "Catch2" (single header file "catch.hpp")
# (https://github.com/catchorg/Catch2)

if ( ${CMAKE_TESTING_ENABLED} )
    message( "-- Tests are enabled" )
    set( UNIT_TEST_LIB catch2 )
endif()


# =============================
# subdir calls
# =============================
# the second parameter specifies the output path for binaries.
# however, the respective CMAKE_XYZ_OUTPUT_DIRECTORY takes precedence
add_subdirectory(lib)
add_subdirectory(src bin)

if ( ${CMAKE_TESTING_ENABLED} )
    add_subdirectory(tests tests)
endif()

, а затем у меня есть еще один CMakeLists.txt в lib, src и tests. Они содержат только команды addLibrary, addExecutable и targetLinkLibraries с использованием соответствующих исходных файлов. За исключением «тестов», где также есть addTest и addCustomCommand для запуска исполняемого модульного теста после сборки.

Вот вопрос: я что-то пропустил, и он должен перестраиваться при изменении заголовка (1)? Или это нормальное поведение (2)?

Возможные связанные вопросы:

Восстановление объектных файлов при изменении заголовка

Сделать нене перестраивать заголовки при изменении

Включенный заголовок GCC (с использованием -include) изменения, не обнаруженные CMake

1 Ответ

1 голос
/ 05 октября 2019

CMake перестраивает объектные файлы при изменении заголовков, однако в CMake 3.15 была ошибка, из-за которой он не работал должным образом для целей создания. Я тоже столкнулся с этой проблемой и обнаружил, что о ней уже сообщалось: https://gitlab.kitware.com/cmake/cmake/issues/19507

Она исправлена ​​в 3.15.1, поэтому решение заключается в обновлении (и, возможно, изменении cmake_minimum_required на 3.15.1).

...