Вся философия заключается в том, чтобы начать с центрального CMakeLists.txt для всего вашего проекта.На этом уровне все цели (libs, исполняемые файлы) будут агрегированы, поэтому не будет проблем с подключением, например, из lib1 в lib2.Если lib2 будет ссылаться на lib1, сначала необходимо собрать lib1.
Исходные файлы для конкретной платформы должны быть условно установлены для некоторой переменной.(Если вам нужно установить переменную в подкаталоге и использовать ее в каталоге выше, вы должны установить ее в кэш, используя CACHE FORCE и т. Д. - см. Руководство для set
)
Вот как выделать правильно из исходной сборки - как CMake намеревается:
cd project-build
cmake ../project
Наличие отдельных каталогов сборки для библиотеки не очень CMake'ish (если можно так сказать) и, вероятно, потребует некоторых хаков.
project-build/
project/
CMakeLists.txt (whole project CMakeLists.txt)
[
project(MyAwesomeProject)
include_directories(include) # allow lib1 and lib2 to include lib1/lib.h and lib2/lib.h
add_subdirectory(lib1) # this adds target lib1
add_subdirectory(lib2) # this adds target lib2
]
lib1/ (first library)
CMakeList.txt
[
add_library(lib1...)
add_subdirectory(test)
]
src/
lib1.c
foo1.h
test/ (tests)
CMakeList.txt
test1.c
test2.c
lib2/ (second library)
CMakeList.txt
[
add_subdirectory(src)
]
src/
CMakeList.txt
[
if(WIN32)
set(lib2_os_sources os/win32/xxx.c)
elsif(LINUX)
set(lib2_os_sources os/linux/xxx.c)
else()
message(FATAL_ERROR "Unsupported OS")
endif()
add_library(lib2 SHARED lib2.c ${lib2_os_sources})
]
os/ (OS dependent code)
win32/
xxx.c (win32 implementation)
linux/
xxx.c (linux implementation)
lib2.c
foo2.h
include/ (shared/public headers)
lib1/
lib.h (shared library header included from apps)
lib2/
lib.h (shared library header -"-)