Как запретить использование части макросов подпроекта в остальном проекте?

Занимаюсь 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: В терминологии мог напутать, но, думаю, изложил достаточно информации.


Ответы (0 шт):