2013-07-30 2 views
0

У меня есть файл CMakeLists.txt для библиотеки. Это довольно просто:Избегайте повторения имени каталога для нескольких включений файлов

set(LIB_FILES source/first.cpp) 

add_library(first ${LIB_FILES}) 

Я поместил файлы в список, потому что в конечном итоге я добавлю больше исходных файлов в библиотеку. Проблема в том, что все файлы будут в каталоге source. И я не хочу постоянно повторять это.

Я также не хочу использовать решение соответствия шаблону GLOB, потому что я хочу отредактировать файл CMakeLists.txt при добавлении нового файла. Таким образом, моя сборка будет перестроить решение сборки, и новые файлы будут правильно отображаться (как я понимаю. Я все еще новичок в CMake).

Я попытался добавить файл CMakeLists.txt в каталог source, просто чтобы создать список LIB_FILES. Это не получилось очень хорошо. Переменные в CMake являются файлами. И даже когда я нарушил область обзора (с PARENT_SCOPE), мне все равно пришлось префикс каждого файла с помощью каталога. Так что ничего не получилось.

Я не хочу ставить фактическое определение библиотеки в каталоге source, так как это сгенерирует все файлы сборки в каталоге source. И я не хочу этого. Кроме того, мне нужно будет включить заголовки, которые не находятся в каталоге source.

Моя структура каталогов выглядит следующим образом:

libroot (where the project build files should go) 
\-source (where the source code is) 
\-include (where the headers that the user of the library includes go) 

Так как же я говорю CMake, что все исходные файлы приходят из каталога source, так что я не должен постоянно объяснить это?

ответ

2

вы могли бы использовать простой макрос для этого

macro(AddSrc dst_var basepath_var) 
    foreach(file ${ARGN}) 
     list(APPEND ${dst_var} ${basepath_var}/${file}) 
    endforeach() 
endmacro() 

set(MY_SRCFILES "") 

AddSrc(MY_SRCFILES path/to/source 
    foo.cpp 
    bar.cpp 
    whatever.cpp 
) 
+0

, если вы определяете макрос в корневом CMakeLists.txt, он также должен быть видимым для cmakelists в дочерних каталогах – user1283078

+0

или вы можете поместить его в файл .cmake и использовать include (mymacro.cmake) – user1283078

3

Вы можете переместить add_library вызов к источнику/CMakeLists.txt также:

set(LIB_FILES first.cpp) 
add_library(first ${LIB_FILES}) 

Тогда просто использовать add_subdirectory в своем верхнем уровне CMakeLists.txt:

add_subdirectory(source) 
+0

Я думал, что упомянул, что я не хотел этого делать, но я Думаю, я пропустил это дело. Исходные файлы находятся в каталоге 'source' именно потому, что я * не * хочу поместить файлы сборки в исходный каталог. Кроме того, у меня есть файлы, которые не будут находиться в каталоге 'source' или под ним. –

+1

ОК. Но с помощью [out-of-source build] (http://www.cmake.org/Wiki/CMake_FAQ#Out-of-source_build_trees) (рекомендуемая техника) файлы сборки не будут проблемой. Кроме того, теперь, когда я вижу вашу структуру каталогов, было бы нормально включать все заголовки папки «include» в ваш вызов 'add_library', чтобы они отображались в IDE, таких как MSVC. В этом случае вам, вероятно, будет лучше с паролем 'macro' в соответствии с ответом @ user1283078. – Fraser

+0

@NicolBolas Это правильный ответ или, по крайней мере, правильный способ работы. С CMake, выполняющим сборку вне исходного кода, прост. – Antonio

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