CMake add_custom_command / _target в разных каталогах для кросс-компиляции - PullRequest
7 голосов
/ 28 января 2010

В CMake я пытаюсь создать проект, который включает в себя библиотеки для разных архитектур процессоров, скомпилированные разными инструментальными цепочками. Для каждой архитектуры статические библиотеки создаются в нескольких подкаталогах, а затем собираются в общую библиотеку в корневом каталоге. До сих пор я не смог понять это.

Самое близкое, что я до сих пор сделал, - это использование add_custom_command и add_custom_target в подкаталогах для создания файлов .a, а затем попытка собрать их в .so в корневом каталоге, используя add_custom_command и * Снова 1006 *. Но если я указываю точку .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 ». Stop». Это имеет смысл, поскольку цели 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 не хочет, чтобы я это делал ...:)

Есть идеи?

Ответы [ 2 ]

8 голосов
/ 28 января 2010

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

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

1 голос
/ 10 мая 2010

Spot On!

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...