#cmake #cmake-modules #cmake-language
Вопрос:
Я использую cmake в качестве генератора сборки. версия : 3.18.5 У меня есть 5 целей в моем проекте. Я хочу скомпилировать только определенный набор целей, зависит от опции, которую я даю во время создания. Как это сделать?
например, если я запущу
gmake -j4 foo=set2
Я хочу,чтобы целевое приложение 1,приложение 3, приложение 5 было скомпилировано.
если я побегу
gmake -j4 foo=3
я хочу,чтобы целевое приложение 2, приложение 4 должно быть скомпилировано.
я попробовал вышеперечисленные вещи и внутри cmakelist.txt,
if(foo STREQUAL "set2")
add_subdirectory(../../app1)
add_subdirectory(../../app3)
add_subdirectory(../../app5)
elseif(foo STREQUAL "set3")
add_subdirectory(../../app2)
add_subdirectory(../../app4)
endif()
Но я не получил ожидаемого результата.
Ответ №1:
Ваша if(foo STREQUAL ..)
конструкция не работает, потому что она оценивается во время настройки, а не во время сборки. Невозможно будет создать точный синтаксис, который вы себе представляли, но мы можем приблизиться.
Если вы добавите две пользовательские цели
add_custom_target(set2)
add_custom_target(set3)
а затем вручную укажите целевые объекты, принадлежащие каждому набору, в качестве зависимостей
add_dependencies(set2 app1 app3 app5)
add_dependencies(set3 app2 app4)
после включения всех подкаталогов, затем вызов gmake -j4 set2
(или cmake --build . --target set2 -- -j4
) должен создать только 3 приложения.