В CMake я пытаюсь разработать проект, который включает библиотеки для нескольких различных архитектур процессора, скомпилированных различными наборами инструментальных средств. Для каждой архитектуры статические библиотеки созданы в нескольких подкаталогах и затем собраны в общую библиотеку в корневом каталоге. До сих пор я не был в состоянии понять это.
Самое близкое я приехал до сих пор, должно использовать add_custom_command
и add_custom_target
в подкаталогах, чтобы произвести.a файлы и затем попытаться собрать их в .so в использовании корневого каталога add_custom_command
и add_custom_target
снова. Но если я высказываю .so мнение зависимости к списку пользовательских выводов команды, make-файл не говорит "Правила сделать...", потому что пользовательские выводы команды не экспортируются из подкаталога. Таким образом, я пытался высказать .so мнение зависимости к списку пользовательских целей в подкаталоге, и это жалуется, что не может найти файл с тем именем.
Для помещения его в форму кода вот то, что я имею в подкаталоге:
add_custom_command(OUTPUT subout.a COMMAND ${MYAR} ...)
add_custom_target(subout_target DEPENDS subout.a)
В корневом каталоге я попробовал это:
add_custom_command(OUTPUT my.so COMMAND ${MYLD} ... DEPENDS sub/subout.a)
add_custom_target(dll ALL DEPENDS my.so)
И я не получаю "Правила сделать цель 'sub/subout.a', необходимой 'my.so'. Остановитесь". Который имеет смысл потому что add_custom_command
цели не экспортируются из каталога.
И я попробовал это:
add_custom_command(OUTPUT my.so COMMAND ${MYLD} ... DEPENDS subout_target)
add_custom_target(dll ALL DEPENDS my.so)
Это на самом деле заставит sub/subout.a файл быть сгенерированным, но тогда он умирает, не говоря "Правила сделать цель 'subout_target'..."
Я думаю, что я действительно хочу, должен быть в состоянии подражать add_library
поведение для нескольких различной архитектуры. Но по-видимому, CMake не хочет, чтобы я сделал это...:)
Какие-либо идеи?
Я предполагаю, что вам необходимо использовать add_dependonds , чтобы определить зависимости между целями, определенными с использованием add_custom_target
. зависит
опция используется для указания зависимостей на уровне файлов в пользовательских правилах, но не зависимостей на уровне целевых целей.
Например, создание команды .obj
файл в качестве вывода, зависит, зависит указать его зависит от файла .CPP
. Кроме того, цель может зависеть от одного файла не только на других целях. Таким образом, для зависит от уровня файла, используйте опцию, но add_dependonds для уровня целевого целевого значения.
На месте!
add_dependencies позволили мне создать последнюю «ссылку» зависимости между add_custom_target созданными целями, а add_custom_target генерирует цели, необходимые для получения add_custom_command к создать реальный контент в make-файле, то есть My add_custom_command не будет генерировать вывод в make-файлы, если только OUTPUT из add_custom_command не были указаны как зависимости в команда add_custom_target .
Затем, чтобы заставить add_custom_command выполнить в правильном порядке, мне пришлось использовать целевые имена, определенные в add_custom_target , как зависимости в add_dependencies . ПРИМЕЧАНИЕ. OUTPUT , указанные в командах add_custom_command и add_custom_target , должны были быть указаны в отдельных путях, заключенных в кавычки, то есть:
add_custom_command(OUTPUT "out1 out2 out3" ...) # WRONG!
add_custom_target(CUSTOMTARG1 "out1 out2 out3") # WRONG!
add_custom_command(OUTPUT "out1" "out2" "out3" ...) # RIGHT!
add_custom_target(CUSTOMTARG1 "out1" "out2" "out3") # RIGHT!
Если я не если они находятся в отдельных цитируемых путях, make-файл будет создавать выходные данные каждый раз, независимо от того, существуют они или нет!