CMake: добавить исполняемый файл с неизвестными сгенерированными исходными файлами - PullRequest
0 голосов
/ 27 июня 2019

У меня есть инструмент, который генерирует набор исходных файлов, чье имя я не могу знать заранее.

Как написать правильный сценарий CMakeLists.txt для сценария?Этот вопрос уже задавался здесь CMake Компиляция сгенерированных файлов .Но оно не имеет правильного решения.

Например, в первом ответе (https://stackoverflow.com/a/8748478/2912478), OP может предсказать, какие файлы будут сгенерированы на основе входных .idl файлов. Второй ответ (https://stackoverflow.com/a/39258996/2912478) показывает три разных способа решения, но я действительно не могу заставить его работать.

Тестовый пример

Я подготовил простой тестовый пример. Предположим, у меня есть этот статический файл, в которомосновное расположение (main.cpp).

# main.cpp
void foo(void);

int main() {
    foo();
    return 0;
}

В настоящее время я использую это CMakeLists.txt. Пользовательская команда генерирует исходный файл в src.

# CMakeLists.txt
add_executable(a.out  main.cpp)

add_custom_command(
  OUTPUT mylib.cpp
  COMMAND ${CMAKE_SOURCE_DIR}/genf.sh ${CMAKE_SOURCE_DIR}/src
  DEPENDS ${CMAKE_SOURCE_DIR}/genf.sh
)
add_custom_target(GenFile DEPENDS mylib.cpp)
add_dependencies(a.out GenFile)

Здесьявляется генератором гипотетического кода genf.sh. Я использую случайное число, чтобы имитировать тот факт, что мы НЕ знаем, какие файлы сгенерирует генератор.

#!/bin/bash

rm -rf $1/*
fname=$(echo $((1 + RANDOM % 100)))
echo "Generating src$fname.cpp"
echo "void foo(void) {}" > $1/src$fname.cpp

Попытка 1

Я пыталсяиспользуйте GLOB, чтобы найти все сгенерированные файлы. Поэтому я поставил следующие строки в конце моего CMakeLists.txt. Это не работает, потому что на момент запуска cmake .. нет файлов под src. Так что это решение никогда не связываетсгенерированные исходные файлы.

file(GLOB GeneratedSourceFiles ${CMAKE_SOURCE_DIR}/src/*.cpp)
target_sources(a.out PUBLIC ${GeneratedSourceFiles})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...