CMake add_custom_command / _ предназначаются в различных каталогах для кросс-компиляции

В 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 не хочет, чтобы я сделал это...:)

Какие-либо идеи?

7
задан boiler96 28 January 2010 в 00:01
поделиться

2 ответа

Я предполагаю, что вам необходимо использовать add_dependonds , чтобы определить зависимости между целями, определенными с использованием add_custom_target . зависит опция используется для указания зависимостей на уровне файлов в пользовательских правилах, но не зависимостей на уровне целевых целей.

Например, создание команды .obj файл в качестве вывода, зависит, зависит указать его зависит от файла .CPP . Кроме того, цель может зависеть от одного файла не только на других целях. Таким образом, для зависит от уровня файла, используйте опцию, но add_dependonds для уровня целевого целевого значения.

8
ответ дан 7 December 2019 в 03:15
поделиться

На месте!

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-файл будет создавать выходные данные каждый раз, независимо от того, существуют они или нет!

1
ответ дан 7 December 2019 в 03:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: