O CMake não inclui o diretório de cabeçalho do submódulo A no submódulo B
Eu tenho um projeto CMake que se parece com isso:
project/
CMakeLists.txt
subprojectA/
CMakeLists.txt
include/
headerA.hpp
src/
libraryA.cpp
subprojectB/
CMakeLists.txt
src/
mainB.cpp
O subprojeto "library", A, é compilado como uma biblioteca estática, tornando-se libsubprojectA.a. O projeto "principal", B, é compilado como um binário e depende da biblioteca. mainB.cpp inclui uma referência ao headerA.hpp.
Aqui está o subprojetoA / CMakeLists.txt:
project(SubProjectA)
include_directories(include)
add_library(subprojectA STATIC src/libraryA.cpp)
set(${PROJECT_NAME}_INCLUDE_DIRS
${PROJECT_SOURCE_DIR}/include
CACHE INTERNAL "${PROJECT_NAME}: Include Directories" FORCE)
E aqui está o subprojetoB / CMakeLists.txt:
project(SubProjectB)
include_directories(${SubProjectA_INCLUDE_DIRS})
add_executable(mainBinary src/mainB.cpp)
target_link_libraries(mainBinary subprojectA)
O principal projeto CMakeLists.txt se parece com:
project(Project)
add_subdirectory(subprojectB)
add_subdirectory(subprojectA)
Observe que o subprojetoB, o projeto principal, está listadoantes subprojetoA.
Aqui está o problema. Quando executo "cmake" neste projeto,${SubProjectA_INCLUDE_DIRS}
não está definido no SubProjectB.
O que eu acho que está acontecendo é que o CMakeLists for SubProjectB carrega primeiro, quando${SubProjectA_INCLUDE_DIRS}
ainda não foi definido. Ele define seu próprio caminho de inclusão para uma sequência vazia como resultado. No entanto, emboralibsubprojectA.a
é construído com sucesso antesmainBinary
, o caminho de inclusão já foi definido vazio anteriormente. Como resultado, recebo esse erro ao tentar fazermainBinary
:
subprojectB/src/mainB.cpp:1:23: fatal error: headerA.hpp: No such file or directory
#include "headerA.hpp"
^
É uma solução alternativa colocar o subprojeto A antes do subprojeto B nas principais listas de projetos do CMake no mundo declarativo do CMake. O que realmente quero é saber a maneira correta de indicar ao CMake que oinclude_directories(${SubProjectA_INCLUDE_DIRS})
linhadepende nas definições existentes nos CMakeLists do SubProjectA. Existe uma maneira melhor de fazer isso?