CMake подставляет сгенерированные файлы

Я использую asn1c для создания из одного или нескольких файлов .asn1 последовательности файлов .h и .c в заданную папку.

Эти C-файлы не имеют соответствия по именам с оригинальными asn1 файлами.

Эти файлы должны быть связаны вместе с моими, чтобы получить работающий исполняемый файл. Я хотел бы иметь возможность:

  • Автоматически создавать файлы в каталоге сборки, чтобы не загрязнять остальную часть проекта (вероятно, делается с помощью add_custom_target)
  • Укажите зависимость моего исполняемого файла от этих файлов, чтобы исполняемый файл asn1c запускался автоматически, если файлы отсутствуют или если один из файлов .asn1 обновляется.
  • Автоматически добавлять ВСЕ сгенерированные файлы в компиляцию моего исполняемого файла.

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


person Svalorzen    schedule 19.05.2017    source источник


Ответы (1)


CMake ожидает, что полный список источников будет передан add_executable(). То есть вы не можете использовать glob-файлы, сгенерированные на этапе сборки — было бы слишком поздно.

У вас есть несколько способов обработки исходных файлов без предварительного знания их имен:

  1. Создавайте файлы на этапе настройки с помощью execute_process. После этого вы можете использовать file(GLOB) для сбора имен источников и передачи их в add_executable():

    execute_process(COMMAND asn1c <list of .asn1 files>)
    file(GLOB generated_sources "${CMAKE_CURRENT_BINARY_DIR}/*.c")
    add_executable(my_exe <list of normal sources> ${generated_sources})
    

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

    Если вы собираетесь изменить входные файлы и ожидаете, что CMake обнаружит эти изменения и восстановит исходный код, следует предпринять дополнительные действия. Например, вы можете сначала скопировать входные файлы в каталог сборки с помощью configure_file(COPY_ONLY). В этом случае входные файлы будут отслеживаться, и CMake перезапустится, если они будут изменены:

    set(build_input_files) # Will be list of files copied into build tree
    foreach(input_file <list of .asn1 files>)
        # Extract name of the file for generate path of the file in the build tree
        get_filename_component(input_file_name ${input_file} NAME)
        # Path to the file created by copy
        set(build_input_file ${CMAKE_CURRENT_BINARY_DIR}/${input_file_name})
        # Copy file
        configure_file(${input_file} ${build_input_file} COPY_ONLY)
        # Add name of created file into the list
        list(APPEND build_input_files ${build_input_file})
    endforeach()
    
    execute_process(COMMAND asn1c ${build_input_files})
    file(GLOB generated_sources "${CMAKE_CURRENT_BINARY_DIR}/*.c")
    add_executable(my_exe <list of normal sources> ${generated_sources})
    
  2. Проанализируйте входные файлы, чтобы определить, какие файлы будут созданы из них. Не уверен, что это работает с .asn1, но для некоторых форматов это работает:

    set(input_files <list of .asn1 files>)
    execute_process(COMMAND <determine_output_files> ${input_files}
        OUTPUT_VARIABLE generated_sources)
    add_executable(my_exe <list of normal sources> ${generated_sources})
    add_custom_command(OUTPUT ${generated_sources}
        COMMAND asn1c ${input_files}
        DEPENDS ${input_files})
    

    В этом случае CMake обнаружит изменения во входных файлах (но в случае изменения списка сгенерированных исходных файлов необходимо перезапустить cmake вручную).

person Tsyvarev    schedule 19.05.2017
comment
Настоящая проблема заключается в том, что я также использую CMake для фактической сборки исполняемого файла asn1c, поэтому я не могу запустить его до этапа сборки. - person Svalorzen; 20.05.2017
comment
Вы можете построить asn1c как подпроект на этапе настройки с execute_process(). Похоже, это хорошее решение: не нужно откладывать сборку всего на этапе сборки. - person Tsyvarev; 20.05.2017