У меня есть инструмент, который генерирует набор исходных файлов, чье имя я не могу знать заранее.
Как написать правильный сценарий 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})