CMake Запустить Встроенный Исполняемый Файл Перед Созданием Другого?

Как бы я сказал CMake построить и запустить исполняемый файл перед созданием другого? Поэтому у меня есть 2 исполняемых файла "a" и "b", где "a" требуется для запуска, чтобы генерировать файлы заголовков для "b". Таким образом," a " принимает 2 папки в качестве параметра, в котором он генерирует заголовочные файлы из xml-файлов из входного каталога в выходной каталог.

есть ли способ сказать CMake сделать это, а также узнать, когда XML-файлы изменяются или когда проект " a " изменяется для регенерации файлы?

1 ответов


если test1 строится test1.c требуется предварительное выполнение test2 строится test2.c, то решение должно выглядеть так:

-- test1.c --

#include <stdio.h>
int main(void) {
    printf("Hello world from test1\n");
    return 0;
}

-- условие_2.c --

#include <stdio.h>

int main(void) {
    printf("Hello world from test2\n");
    return 0;
}

-- CMakeLists.txt --

cmake_minimum_required(VERSION 2.8.11)

project(Test)

set(test1_SOURCES test1.c)
set(test2_SOURCES test2.c)

add_executable(test1 ${test1_SOURCES})

add_executable(test2 ${test2_SOURCES})
add_custom_target(test2_run
  COMMAND test2
  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
  COMMENT "run generated test2 in ${CMAKE_CURRENT_SOURCE_DIR}"
  SOURCES ${test2_SOURCES}
)

add_dependencies(test1 test2_run)

он генерирует следующий вывод:

alex@rhyme cmake/TestDep/build $ cmake ..             
-- The C compiler identification is GNU 4.8.2
-- The CXX compiler identification is GNU 4.8.2
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/alex/tmp/cmake/TestDep/build
alex@rhyme cmake/TestDep/build $ make test1
Scanning dependencies of target test2
[ 25%] Building C object CMakeFiles/test2.dir/test2.c.o
Linking C executable test2
[ 25%] Built target test2
Scanning dependencies of target test2_run
[ 50%] run generated test2 in /home/alex/tmp/cmake/TestDep
Hello world from test2
[ 75%] Built target test2_run
Scanning dependencies of target test1
[100%] Building C object CMakeFiles/test1.dir/test1.c.o
Linking C executable test1
[100%] Built target test1

вам также может потребоваться использовать add_custom_command и другие связанные директивы CMake, если ваша задача требует этого.