CMake создает странную структуру каталогов - PullRequest
1 голос
/ 08 декабря 2011

Я новичок в CMake, и у меня возникла проблема с организацией файлов, созданных в CMake.

Сначала я подробно опишу дерево файлов. Я пытаюсь собрать простую библиотеку с примером программы из двух исходных каталогов (Grid и examples) и каталог сборки. Итак, у меня есть три файла CmakeLists.txt. Итак, верхний каталог выглядит так: CMakeLists.txt, / Grid, / examples и /build.

Этот CMakeLists.txt содержит:

project(talyfem)
cmake_minimum_required(VERSION 2.8.4)
set(CMAKE_CXX_FLAGS "-g")
add_subdirectory(examples Grid) 

В папке Grid CmakeLists.txt находится:

add_library(${PROJECT_NAME} FEMElm.cpp Grid.cpp GridField.cpp SuperGrid.cpp SuperGrid3D.cpp)

В папке примеров CmakeLists.txt находится:

set(EXAMPLES example1)
foreach(example ${EXAMPLES})
   add_executable(${example} ${example}.cpp)
  target_link_libraries(${example} ${PROJECT_NAME})
endforeach(example)

Я запускаю CMake из каталога сборки как: Cmake ../ Когда я делаю это, это создает странную файловую структуру, которую я не могу понять и которая кажется неправильной. Сначала он создает папку ../build/CMakeFiles, чего я и ожидал. Но затем он создает папку ../build/Grid, а внутри этой папки находится еще одна папка CMakeFiles, которая затем содержит папку example1.dir. Если я переключаю порядок подкаталогов, в котором Grid первый и второй примеры, то происходит обратное, когда Grid.dir находится в подкаталоге examples.

Это кажется неправильным, и я был бы признателен за любую помощь в решении этой проблемы.

Я ожидаю, что ../build/CMakeFiles должен содержать Grid.dir и папку examples.dir.

1 Ответ

4 голосов
/ 08 декабря 2011

Ошибка в том, как вы используете add_subdirectory. От CMake Docs :

add_subdirectory (source_dir [binary_dir] [EXCLUDE_FROM_ALL])

Поэтому, когда вы передаете add_subdirectory два аргумента, первый интерпретируется как каталог источника, а второй - как каталог, в котором должен быть построен этот источник.

То, что вы хотите, это позвонить add_subdirectory дважды:

add_subdirectory(examples)
add_subdirectory(Grid)
...