Как сделать команду CMake 'FILE' зависимой от TARGET или OUTPUT? - PullRequest
0 голосов
/ 30 июня 2019

У меня есть кое-что add_custom_command() в сборке CMake, чтобы сделать некоторые вещи после создания цели для файла elf: преобразовать его в srec, заполнить различные области 0xFF и создать двоичное изображение, сгенерировать CRC и получить размеризображения.add_custom_command() может иметь DEPENDS, поэтому он запускается только при регенерации elf-файла, и это здорово.

Я также хочу создать новый файл с помощью FILE (), который содержит двоичное имя файла,crc и размер (может быть, в простом формате JSON), но документация подразумевает, что я не могу выполнить эту операцию с файлом после , что уже упоминалось выше.

# This command creates the FF-filled binary file.  It uses objcopy to create the srec
# file to operate on.
add_custom_command(
    OUTPUT ThreadingApp.bin filled.srec
    MAIN_DEPENDENCY ThreadingApp.elf
    COMMAND ${CMAKE_OBJCOPY} ARGS -O srec ThreadingApp.elf ThreadingApp.srec
    COMMAND srec_cat.exe ThreadingApp.srec -offset - -minimum-addr ThreadingApp.srec
            −fill 0xFF -over ThreadingApp.srec -o filled.srec
    COMMAND srec_cat.exe filled.srec -o ThreadingApp.bin -binary
    )

# This command creates the CRC
add_custom_command(
    OUTPUT crc.out size.out
    MAIN_DEPENDENCY filled.srec
    COMMAND srec_cat.exe filled.srec -crc32-b-e 0x08100000 -crop 0x08100000 0x08100004 -o - -hex-dump > crc.out
    COMMAND srec_info.exe filled.srec > size.out
    )

file(
    WRITE ThreadingApp.json

    )

Глядя на резюме «ФАЙЛ», я не вижу, как это можно сделать только после того, как мои пользовательские команды уже запущены.Любые предложения о том, как добиться этого в CMake?Моя альтернатива - написать отдельный скрипт Python для выполнения в add_custom_command для создания файла json.

Reading
  file(READ <filename> <out-var> [...])
  file(STRINGS <filename> <out-var> [...])
  file(<HASH> <filename> <out-var>)
  file(TIMESTAMP <filename> <out-var> [...])

Writing
  file({WRITE | APPEND} <filename> <content>...)
  file({TOUCH | TOUCH_NOCREATE} [<file>...])
  file(GENERATE OUTPUT <output-file> [...])

Filesystem
  file({GLOB | GLOB_RECURSE} <out-var> [...] [<globbing-expr>...])
  file(RENAME <oldname> <newname>)
  file({REMOVE | REMOVE_RECURSE } [<files>...])
  file(MAKE_DIRECTORY [<dir>...])
  file({COPY | INSTALL} <file>... DESTINATION <dir> [...])
  file(SIZE <filename> <out-var>)
  file(READ_SYMLINK <linkname> <out-var>)
  file(CREATE_LINK <original> <linkname> [...])

Path Conversion
  file(RELATIVE_PATH <out-var> <directory> <file>)
  file({TO_CMAKE_PATH | TO_NATIVE_PATH} <path> <out-var>)

Transfer
  file(DOWNLOAD <url> <file> [...])
  file(UPLOAD <file> <url> [...])

Locking
  file(LOCK <path> [...])

1 Ответ

1 голос
/ 01 июля 2019

В отличие от add_custom_command, команда которой выполняется на этапе build , FILE() выполняется немедленно , на конфигурации этап, когда CMakeLists.txtобработано.

Однако вы можете поместить вызов FILE() в отдельный скрипт CMake и запустить этот скрипт с add_custom_command.При таком подходе сценарий с FILE() будет выполняться на этапе build вашего проекта, и вы можете использовать опцию OUTPUT или TARGET:

# File: my_script.cmake
file(...)

# File: CMakeLists.txt:
add_custom_command(OUTPUT | TARGET ...
    COMMAND ${CMAKE_COMMAND} -P "${CMAKE_CURRENT_SOURCE_DIR}/my_script.cmake"
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...