Я бы предложил поместить три вызова add_subdirectory в ваш корневой CMakeLists.txt. Сначала libstuff, затем клиент и сервер ....
Настройте проект Stuff так, как если бы он был автономным, но добавьте переменные в кэш cmake, чтобы его можно было «импортировать» другими проектами. Затем в клиенте и на сервере вы можете обратиться к проекту Stuff ... используя обычный вызов include_directories и target_link_libraries .
например. в библиотеке ...
# libstuff CMakeLists
project( Stuff )
# ... whatever you need here: collect source files, ...
add_library( LibStuff ${Stuff_Sources} )
# Then, define a very useful variables which gets exported to the cmakecache and can be
# used by other cmakelists
set( STUFF_INCLUDE_DIRS ${Stuff_SOURCE_DIR} CACHE STRING "Include-dir for Stuff." FORCE )
А затем в Клиенте (и аналогично в Сервере)
# client CMakeLists
project( Client )
# refer to Stuff-includes here...
include_directories( ${STUFF_INCLUDE_DIRS} )
add_executable( Client client.h client.cpp main.cpp ) #
target_link_libraries( Client LibStuff )
Затем вы можете «скомпилировать» только каталог Client, войдя в каталог Client и запустив там make или msbuild. В качестве альтернативы, вы можете добавить cmake-flag в root-cmakelistt, который используется для фильтрации между клиентом, сервером или обоими ...