Как скомпилировать только некоторый набор целей во время создания

#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 приложения.