Skip to content

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
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information