В CMake вы бы сделали это, используя свойства цели:
add_executable(MyApp ...)
add_executable(MyApp_IPV6 ...)
add_subdirectory(network)
# consumes the public interface of network
target_link_libraries(MyApp PRIVATE network)
# consumes the public interface of network_IPV6
target_link_libraries(MyApp_IPV6 PRIVATE network_IPV6)
Затем в файле CMake внутри network/
добавьте вашу цель и ее определение компиляции:
add_library(network STATIC files...)
add_library(network_IPV6 STATIC files...)
# add IPV6 into its interface
target_compile_definitions(network_IPV6 PUBLIC IPV6)
Потому что цель network_IPV6
устанавливает определение как IPV6
, у любого, кто ссылается на него, тоже будет это определение.
Другое решение может состоять в том, чтобы собрать все только один раз по конфигурации и позволить пользователю решить, хочет ли он ipv6 или нет.
Это будет работать так:
option(MYAPP_USE_IPV6 "Compile MyApp with ipv6 support", OFF)
add_subdirectory(network)
# consumes the public interface of network
target_link_libraries(MyApp PRIVATE network)
Затем внутри сетевого каталога:
add_library(network STATIC files...)
if (MYAPP_USE_IPV6)
# add IPV6 into its interface
target_compile_definitions(network_IPV6 PUBLIC IPV6)
endif()
Затем вы настраиваете свое приложение при необходимости или настройте оба профиля:
mkdir build
mkdir build-ipv6
cd build
cmake ..
cd ../build-ipv6
cmake .. -DMYAPP_USE_IPV6=ON