Как запретить использование части макросов подпроекта в остальном проекте?
Занимаюсь CMake пару-тройку дней.
Имеется проект на Си. Упрощённая структура его выглядит так:
project/
|--> macro/
| |--> inc/
| | |--> concat.h '#include "prv_concat.h" #define CONCAT(a, b) PRV_CONCAT(a, b)'
| |--> prv/
| | |--> prv_concat.h '#define PRV_CONCAT(a,b) a ## b'
| |--> CMakeLists.txt
|--> task/
| |--> inc/
| | |--> task.h 'int foo();'
| |--> src/
| | |--> task.c '#include "task.h" #include "concat.h" int foo{ ... }'
| |--> CMakeLists.txt
|--> main.c '#include "task.h" int main() { foo(); }'
|--> CMakeList.txt
Предполагаемое содержание файлов CMakeLists.txt
:
project/macro/CMakeLists.txt
:
project(prv_macro C)
add_library(prv_macro INTERFACE)
add_library(project::prv_macro ALIAS macro)
target_include_directories(prv_macro INTERFACE prv)
project(macro C)
add_library(macro INTERFACE)
add_library(project::macro ALIAS macro)
target_include_directories(macro INTERFACE inc)
target_link_libraries(macro PRIVATE prv_macro)
project/task/CMakeLists.txt
:
project(task C)
add_library(task STATIC "inc/task.h" "src/task.c")
add_library(project::task ALIAS task)
target_include_directories(task PUBLIC inc)
target_link_libraries(macro PUBLIC project::macro)
project/CMakeLists.txt
:
project (project C)
add_executable (project "main.c")
add_subdirectory(macro)
add_subdirectory(task)
target_link_libraries(project project::macro)
target_link_libraries(project project::task)
Логика такова, что модуль macro
должен поставляться как библиотека, соответственно мне хотелось бы, что бы часть функционала была "скрыта" от пользователя, использующего эту библиотеку и появлялась только в случае необходимости. Иными словами в модуле task
должна быть возможность воспользоваться только макросом CONCAT()
, а если пользователь попробует написать PRV_CONCAT()
без подключения project::prv_macro
, происходила ошибка.
Вопрос: Возможно ли такое? Как это реализовать? Возможно есть иные варианты компоновки проекта или специфичные настройки cmake?
Полный тулсет: Windows 10, cmake 3.27.4, clang 17.0.1, ninja 1.12.1
P.S: В терминологии мог напутать, но, думаю, изложил достаточно информации.