Я не эксперт по CMake, но так как других ответов нет, я посмотрю документ и попробую. Организация исходных и включаемых файлов в разных каталогах является нормой.
Похоже, что CMake позволяет вам получить список включаемых каталогов:
http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:include_directories
Так что-то вроде:
include_directories("src/top1/mid1/bot1" "src/top1/mid1/bot2/" ... )
Они передаются компилятору, чтобы он мог найти файлы заголовков и будут передаваться для каждого из исходных файлов. Таким образом, любой из ваших исходных файлов должен иметь возможность включать любые заголовочные файлы (которые, я думаю, именно то, что вы просите).
Подобно тому, как вы должны быть в состоянии перечислить все ваши исходные файлы в команде add_executable :
add_executable(name "src/top1/mid1/bot1/src1.cpp" "src/top1/id1/bot2/src2.cpp" ...)
Так что это был бы наивный способ заставить все построить. Каждый исходный файл будет скомпилирован и будет искать заголовки во всех этих каталогах, а затем объектные файлы будут связаны вместе. Подумайте, есть ли какой-нибудь способ упростить это так, что вам не нужно так много включаемых папок, возможно, есть только несколько общих заголовочных файлов, на которые должны ссылаться все исходные файлы. Если что-то становится более сложным, вы можете встроить подчиненные иерархии в библиотеки и т. Д. Также рассмотрите возможность разделения исходных файлов и заголовков (например, в src и include).