2014-08-29 3 views
0

Я пытаюсь перенести свое решение Visual Studio на CMake.CMake: генерировать источники во время выполнения сценария CMake

У меня есть два проекта - генератор (generator.exe генерирует источники C++ из текстовых файлов) и myProj (включает в себя некоторые текстовые файлы, которые должны обрабатываться генератором.exe).
Что я хочу:

  1. проект сборки генератора
  2. использование generator.exe из step1 для создания C++ исходных файлов из текстовых файлов в проекте MYPROJ
  3. поместить эти сгенерированные исходные файлы в результате VS проекта MYPROJ

Итак, как это сделать?

EDIT то, что я пытался до сих пор:

################################################################### 
# in root/generator/CMakeLists.txt: 
set(SRC_LIST ....) 
set(HDR_LIST ....) 
add_executable(generator ${SRC_LIST} ${HDR_LIST})  

################################################################### 
# in root/my_proj/CMakeLists.txt: 

add_subdirectory(../generator/ ../generator/cmake_out) 
add_subdirectory(src) 

################################################################### 
# in root/my_proj/src/CMakeLists.txt:  

ADD_CUSTOM_COMMAND(
    OUTPUT ../include/SomeSource.h SomeSource.cpp 
    COMMAND generator ../definitions/SomeDefs1.txt 
    DEPENDS generator ../definitions/SomeDefs1.txt 
    ) 

set(SRC_LIST SomeSource.cpp ....) 
set(HDR_LIST SomeSource.h ....) 

add_library(myProj STATIC ${SRC_LIST} ${HDR_LIST}) 

################################################################### 
################################################################### 

выход CMake в:

..... 
-- Detecting C compiler ABI info - done 
-- Check for working CXX compiler using: Visual Studio 12 2013 
-- Check for working CXX compiler using: Visual Studio 12 2013 -- works 
-- Detecting CXX compiler ABI info 
-- Detecting CXX compiler ABI info - done 
-- Configuring done 
CMake Error at src/CMakeLists.txt:145 (add_library): 
    Cannot find source file: 

    ../include/SomeSource.h 

    Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp 
    .hxx .in .txx 

ответ

0

Старт с CMake-х add_custom_command() и взять его оттуда:

add_executable(generator ${generator_SOURCES}) 
add_custom_command(OUTPUT source1.cpp source2.cpp 
    COMMAND generator args1 args2 
    COMMENT "Generating sources...") 

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


Ответить правки:

Во-первых, это чрезвычайно плохая идея включить Header файлов в списке источников. CMake, в сотрудничестве с компилятором, должен выяснить зависимости исходных файлов в заголовочных файлах, которые они включают, и они намного лучше работают над этим, чем большинство людей. C++ #includeуже сообщает компилятору обрабатывать заголовок!

Во-вторых, код CMake, который вы показываете, не тот, который вы выполняете. Ваши add_library() перечисляет SomeSource.h, но CMake жалуется на ../include/SomeSource.h. Имена каталогов также не работают. Это трудно сказать, что именно не так.

Моего общее предложение, когда ознакомившись с новым инструментом: Do не сразу попытаться сделать его танец в контексте вы в конечном итоге хотите, чтобы работать в (MYPROJ, в данном случае). Вместо этого настройте простую тестовую среду (с каталогами X и Y, исходными файлами foo.cpp и bar.cpp, вы получите эту идею) и проверьте концепции (например, имея echo, создайте файл вместо generator, поэтому вам не нужно сначала строить generator - это следующий шаг).

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

Кроме того, вы избегаете проблем, возникающих из-за ошибочных предрассудков. Довольно часто ваша первая попытка приведет к неудобной настройке, и реальная элегантность возникает только из уроков. Потратьте время, чтобы изучить инструмент правильно.


Если вы не знали об этом уже, source_group() позволяет CMake создать файл проекта MSVC с заданными исходными файлами, сгруппированных вместе, так что вы можете иметь свой проект под контролем CMake, но по-прежнему работать с комфортом в MSVC.


Я создал «рамочное» Настройка CMake Я работаю с различными проектами, возможно, вы заинтересованы в нем (для вдохновения или фактического использования): JAWS.

+0

спасибо за ответ, pls check my edit –

+0

@VramVardanian: Обновлен ответ. – DevSolar

+2

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

Смежные вопросы