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?

questionAnswers(1)

yourAnswerToTheQuestion