Usando o CMake com bibliotecas com impedâncias de diamante

Digamos que eu tenho quatro projetos separados. Três são bibliotecas,Common, FooeBar, e um deles é um executável,App. AmbosFoo eBar dependem da biblioteca comum eApp depende deFoo eBar. Além disso, alguns desses projetos têm alguns scripts que precisam ser executados para gerar alguns arquivos de cabeçalho e de origem.

Agora eu tenho uma confusão de chamadas como esta:

if (NOT TARGET common)
  add_subdirectory(${common_lib_directory})
endif()

Mas isso não parece a solução certa. Se eu não envolver isso em caso de guarda, há erros porque ele tenta criarCommon mais de uma vez. Colocar se os guardas nas CMakeLists de cada projeto também não parece certo. Eu deveria estar escrevendoFind<Library> scripts para cada biblioteca? Tentei procurar exemplos ou práticas recomendadas sobre como configurar meus arquivos CMakeLists, mas os únicos exemplos que posso encontrar são muito triviais ou cobrem casos de uso completamente diferentes.

Foi solicitado nos comentários que eu postasse algum código. Isso é mais ou menos com a aparência do meu arquivo CMakeLists.txt:

cmake_minimum_required(VERSION 2.8.12)

project(app)

# Temporary files (like object files) created while compiling projects.
set(tmp_dir ${CMAKE_BINARY_DIR}/obj)

# Directory which contains the source for 3rd party libraries.
if(NOT DEFINED dependencies_root)
  get_filename_component(
    dependencies_root "${CMAKE_CURRENT_SOURCE_DIR}/../../../../external"
    REALPATH)
endif()

set(dependencies_foo_dir "${dependencies_root}/foo"
    CACHE PATH "Directory containing the foo library.")
set(dependencies_bar_dir "${dependencies_root}/bar"
    CACHE PATH "Directory containing the bar library.")

if(NOT TARGET foo)
  add_subdirectory("${dependencies_foo_dir}" ${tmp_dir}/foo)
endif()

if(NOT TARGET bar)
  add_subdirectory("${dependencies_bar_dir}" ${tmp_dir}/bar)
endif()

include_directories(${dependencies_foo_dir}/include)
include_directories(${foo_generated_include_dir})

include_directories(${dependencies_bar_dir}/include)
include_directories(${bar_generated_include_dir})

set(app_srcs ...)

add_executable(app ${app_SRCS})

target_link_libraries(app foo bar common)

Como mencionado anteriormente, a razão pela qual tenho oif (NOT TARGET blah) guardas é porque se não o fizer, recebo erros como estes:

CMake Error at /path/to/my/project/CMakeLists.txt:267 (add_library):
  add_library cannot create target "blah" because another target with the
  same name already exists.  The existing target is a static library created
  in source directory
  "/path/to/blah".
  See documentation for policy CMP0002 for more details.

questionAnswers(1)

yourAnswerToTheQuestion