Reading SUBDIRECTORIES property recursively can lead to an endless recursion when building in a non-intuitive in-source build
The sample project.
$ tree sample
sample
├── CMakeLists.txt
├── README.md
└── subdir
└── CMakeLists.txt
2 directories, 3 files
$ cat sample/CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(proj)
function(print_subdir_tree input_src_dir)
set(dir "${input_src_dir}")
get_property(subdirs DIRECTORY "${dir}" PROPERTY SUBDIRECTORIES)
message(">> current dir: ${dir} \n >> subdirs ${subdirs}")
foreach(subdir IN LISTS subdirs)
message(">> Calling print_subdir_tree(${subdir})")
print_subdir_tree("${subdir}")
endforeach()
endfunction()
add_subdirectory(subdir)
print_subdir_tree("${CMAKE_CURRENT_SOURCE_DIR}")
$ cat sample/subdir/CMakeLists.txt
# it's empty
When configuring the project in the following strange way cmake errors out after hitting its recursion limit
cd sample/subdir
cmake -S .. -B .
>> current dir: /Volumes/T3/Dev/projects/cmake/general/nested_subdirectories
>> subdirs /Volumes/T3/Dev/projects/cmake/general/nested_subdirectories/subdir
>> Calling print_subdir_tree(/Volumes/T3/Dev/projects/cmake/general/nested_subdirectories/subdir)
>> current dir: /Volumes/T3/Dev/projects/cmake/general/nested_subdirectories/subdir
>> subdirs /Volumes/T3/Dev/projects/cmake/general/nested_subdirectories/subdir
>> Calling print_subdir_tree(/Volumes/T3/Dev/projects/cmake/general/nested_subdirectories/subdir)
>> current dir: /Volumes/T3/Dev/projects/cmake/general/nested_subdirectories/subdir
>> subdirs /Volumes/T3/Dev/projects/cmake/general/nested_subdirectories/subdir
>> Calling print_subdir_tree(/Volumes/T3/Dev/projects/cmake/general/nested_subdirectories/subdir)
>> current dir: /Volumes/T3/Dev/projects/cmake/general/nested_subdirectories/subdir
>> subdirs /Volumes/T3/Dev/projects/cmake/general/nested_subdirectories/subdir
>> Calling print_subdir_tree(/Volumes/T3/Dev/projects/cmake/general/nested_subdirectories/subdir)
..... repeats 1000 times
CMake Error at CMakeLists.txt:5 (set):
Maximum recursion depth of 1000 exceeded
Call Stack (most recent call first):
CMakeLists.txt:11 (print_subdir_tree)
CMakeLists.txt:11 (print_subdir_tree)
CMakeLists.txt:11 (print_subdir_tree)
....
-- Configuring incomplete, errors occurred!
To emphasise, this only happens if i configure in the subdir
source dir, against the parent CMakeLists.txt
.
For some reason the SUBDIRECTORIES
property of that source dir always contains itself.
I wasn't able to find any documentation on this behavior, but i suspect perhaps there's some mismatch in source vs binary dir, or the presence of the CMakeCache.txt
Full project: nested_subdirectories.zip
Edited by alcroito