diff --git a/polly/cmake/polly_macros.cmake b/polly/cmake/polly_macros.cmake --- a/polly/cmake/polly_macros.cmake +++ b/polly/cmake/polly_macros.cmake @@ -86,3 +86,28 @@ endforeach() endif() endfunction() + +# Recursive helper for setup_source_group. Traverse the file system and add +# source files matching the glob_expr to the prefix, recursing into +# subdirectories as they are encountered +function(setup_polly_source_groups_helper pwd prefix glob_expr) + file(GLOB children RELATIVE ${pwd} ${pwd}/*) + foreach(child ${children}) + if (IS_DIRECTORY ${pwd}/${child}) + setup_polly_source_groups_helper(${pwd}/${child} + "${prefix}\\${child}" ${glob_expr}) + endif() + endforeach() + + file(GLOB to_add ${pwd}/${glob_expr}) + source_group(${prefix} FILES ${to_add}) +endfunction(setup_polly_source_groups_helper) + +# Set up source groups in order to nicely organize source files in IDEs +macro(setup_polly_source_groups src_root hdr_root) + # FIXME: The helper can be eliminated if the CMake version is increased + # to 3.8 or higher. If this is done, the TREE version of source_group can + # be used + setup_polly_source_groups_helper(${src_root} "Source Files" "*.cpp") + setup_polly_source_groups_helper(${hdr_root} "Header Files" "*.h") +endmacro(setup_polly_source_groups) diff --git a/polly/lib/CMakeLists.txt b/polly/lib/CMakeLists.txt --- a/polly/lib/CMakeLists.txt +++ b/polly/lib/CMakeLists.txt @@ -73,6 +73,17 @@ set_target_properties(obj.Polly PROPERTIES FOLDER "Polly") set_target_properties(Polly PROPERTIES FOLDER "Polly") +if (MSVC_IDE OR XCODE) + # Configure source groups for Polly source files. By default, in the IDE there + # will be a source and include folder. In the source folder will be all the + # source files in a flat list, and in the include folder will be all the + # headers in a flat list. Sets the CMake source_group for each folder such + # the organization of the sources and headers in the IDE matches how it is + # laid out on disk + setup_polly_source_groups(${CMAKE_CURRENT_LIST_DIR} + ${CMAKE_CURRENT_LIST_DIR}/../include/polly) +endif() + # Create the library that can be linked into LLVM's tools and Polly's unittests. # It depends on all library it needs, such that with # LLVM_POLLY_LINK_INTO_TOOLS=ON, its dependencies like PollyISL are linked as