Рекомендации по структурированию программы C (для сборки CMake)

У меня есть программа на C, которую мне передал ушедший разработчик. Я пытаюсь выяснить, что именно он имел в виду, и перестроить программное обеспечение во что-то более логичное, чтобы мне было проще его создавать. Я использую CMake для сборки, тогда как он использовал Make.

Есть одна папка src/, в которой было несколько исходных файлов, и из них около 4 имели методы main(). Файлы с методами main() находятся в файлах, имена которых больше похожи на утилиты, инструменты или что-то в этом роде. Это кажется мне странным, потому что у него также была папка lib с некоторыми другими вещами, которые были собраны и больше похожи на библиотеки. Должен ли я разделить эти основные методы на исходные файлы «драйверов» и сделать методы, которые также определены в этих файлах, другими библиотеками? Если я это сделаю, я знаю, как заставить CMake искать библиотеку, создавать и связывать ее с драйвером для выполнения.

Если допустимо создавать эти исходные файлы «библиотеки» там, где они находятся, в папке src, должен ли я просто настроить CMake для сборки всего в этой папке одновременно, или я должен создать структуру каталогов, по крайней мере, для некоторого логического разделения ?

Просто как идея, вот текущая структура каталогов

project
.../src
......file1.c
......file2.c <-has a main() as well as other methods
......file3.c
......file4.c <- has a main() as well as other methods
......file5.c
.../lib
....../lib1
........./file1.c <-references top level include folder files
........./file2.c
....../lib2
........./file1.c <-refs top level and local include files
........./file2.c
........./file2.h
.../scripts
.../include
.
.
.

Приветствуются любые советы по передовым методам реструктуризации этой сборки или ее настройки в CMake.


person Derek    schedule 17.07.2012    source источник


Ответы (1)


Ответить никогда не поздно, поэтому предлагаю:

project
.../CMakeLists.txt
     include_directories(include/)
     add_subdirectory(lib/lib1)
     add_subdirectory(lib/lib2)
     add_subdirectory(src/)  

.../lib/lib1/CMakeLists.txt
              add_library(lib1 file1.c file2.c)

.../src/CMakeLists.txt
         add_executable(test1 test1.c test2.c)
         target_link_libraries(test1 lib1)

Почему это работает: include_directories создаются в подкаталогах, все цели (и, следовательно, библиотеки) из add_subdirectory экспортируются по всему проекту.

person Patrick B.    schedule 10.10.2012