When generating for the following setup the include directories generated for the liba and libb in dependent projects are:
liba/include/liba
and liba
as well as libb/include/libb
and libb
However the correct include directories would be:
liba/include
as well as libb/include
I have no idea why it would even generate the root directory as an include path which doesn't make any sense in the first place.
libX/include/libX
would be the correct include path for within libX but not in dependent projects.
How do I get cmake to only generate the desired include paths?
CMakeLists.txt:
cmake_minimum_required(VERSION 3.28)
project(TopLevel VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_VERBOSE_MAKEFILE TRUE)
cmake_policy(SET CMP0177 NEW)
include(FetchContent)
FetchContent_Declare(liba SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/liba" OVERRIDE_FIND_PACKAGE)
FetchContent_MakeAvailable(liba)
list(PREPEND CMAKE_PREFIX_PATH "${CMAKE_CURRENT_SOURCE_DIR}/libb/build/generators")
list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/libb/build/generators")
FetchContent_Declare(libb SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libb" OVERRIDE_FIND_PACKAGE)
FetchContent_MakeAvailable(libb)
list(PREPEND CMAKE_PREFIX_PATH "${CMAKE_CURRENT_SOURCE_DIR}/app/build/generators")
list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/app/build/generators")
add_subdirectory(app)
liba/CMakeLists.txt:
cmake_minimum_required(VERSION 3.28)
set(PROJ_NS "liba")
set(PROJ_BIN_NAME "liba")
project(${PROJ_NS} VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_VERBOSE_MAKEFILE TRUE)
cmake_policy(SET CMP0177 NEW)
set(CXX_STANDARD_REQUIRED ON)
if(NOT DEFINED CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD LESS 23)
set(CMAKE_CXX_STANDARD 23)
endif()
add_library(${PROJ_BIN_NAME} STATIC)
target_include_directories(${PROJ_BIN_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/liba> $<INSTALL_INTERFACE:include>)
if (MSVC)
if(MSVC_VERSION GREATER_EQUAL 1914)
target_compile_options(${PROJ_BIN_NAME} PUBLIC "/Zc:__cplusplus")
target_compile_options(${PROJ_BIN_NAME} PUBLIC "/permissive-")
endif()
if(MSVC_VERSION GREATER_EQUAL 1934)
target_compile_options(${PROJ_BIN_NAME} PRIVATE /external:anglebrackets /external:W0)
endif()
endif()
# Actual source files
target_sources(${PROJ_BIN_NAME} PRIVATE
src/liba/helpers.cpp
)
# Public headers
target_sources(${PROJ_BIN_NAME} PUBLIC FILE_SET pub_headers TYPE HEADERS FILES
include/liba/helpers.hpp
)
# === Installation ===
install(TARGETS ${PROJ_BIN_NAME} LIBRARY)
install(TARGETS ${PROJ_BIN_NAME} FILE_SET pub_headers)
libb/CMakeLists.txt
cmake_minimum_required(VERSION 3.28)
set(PROJ_NS "libb")
set(PROJ_BIN_NAME "libb")
project(${PROJ_NS} VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_VERBOSE_MAKEFILE TRUE)
cmake_policy(SET CMP0177 NEW)
set(CXX_STANDARD_REQUIRED ON)
if(NOT DEFINED CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD LESS 23)
set(CMAKE_CXX_STANDARD 23)
endif()
add_library(${PROJ_BIN_NAME})
target_include_directories(${PROJ_BIN_NAME} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/libb> $<INSTALL_INTERFACE:include>)
find_package(nlohmann_json REQUIRED)
find_package(Microsoft.GSL REQUIRED)
find_package(liba REQUIRED)
target_link_libraries(${PROJ_BIN_NAME} PRIVATE nlohmann_json::nlohmann_json)
target_link_libraries(${PROJ_BIN_NAME} PRIVATE Microsoft.GSL::GSL)
target_link_libraries(${PROJ_BIN_NAME} PRIVATE liba)
if (MSVC)
if(MSVC_VERSION GREATER_EQUAL 1914)
target_compile_options(${PROJ_BIN_NAME} PUBLIC "/Zc:__cplusplus")
target_compile_options(${PROJ_BIN_NAME} PUBLIC "/permissive-")
endif()
if(MSVC_VERSION GREATER_EQUAL 1934)
target_compile_options(${PROJ_BIN_NAME} PRIVATE /external:anglebrackets /external:W0)
endif()
endif()
# Actual source files
target_sources(${PROJ_BIN_NAME} PRIVATE
src/libb/test.cpp
)
# Public headers
target_sources(${PROJ_BIN_NAME} PUBLIC FILE_SET pub_headers TYPE HEADERS FILES
include/libb/test.hpp
)
# === Installation ===
install(TARGETS ${PROJ_BIN_NAME} LIBRARY)
install(TARGETS ${PROJ_BIN_NAME} FILE_SET pub_headers)
app/CMakeLists.txt:
cmake_minimum_required(VERSION 3.28)
project(App VERSION 1.0.0 LANGUAGES CXX)
set(PROJ_BIN_NAME "App")
set(CMAKE_VERBOSE_MAKEFILE TRUE)
set(CXX_STANDARD_REQUIRED ON)
if(NOT DEFINED CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD LESS 23)
set(CMAKE_CXX_STANDARD 23)
endif()
add_executable(${PROJ_BIN_NAME})
find_package(nlohmann_json REQUIRED)
target_link_libraries(${PROJ_BIN_NAME} PRIVATE nlohmann_json::nlohmann_json)
find_package(liba REQUIRED)
find_package(libb REQUIRED)
target_link_libraries(${PROJ_BIN_NAME} PRIVATE liba)
target_link_libraries(${PROJ_BIN_NAME} PRIVATE libb)
if (MSVC)
if(MSVC_VERSION GREATER_EQUAL 1914)
target_compile_options(${PROJ_BIN_NAME} PUBLIC "/Zc:__cplusplus")
target_compile_options(${PROJ_BIN_NAME} PUBLIC "/permissive-")
endif()
if(MSVC_VERSION GREATER_EQUAL 1934)
target_compile_options(${PROJ_BIN_NAME} PRIVATE /external:anglebrackets /external:W0)
endif()
endif()
# Actual source files
target_sources(${PROJ_BIN_NAME} PRIVATE
src/main.cpp
)