cmake_minimum_required (VERSION 3.8)
project(SourceGroups)

# this is not really a test which can fail
# it is more an example with several source_group()
# commands.
# The created projects have to be loaded manually
# in Visual Studio/Xcode/Eclipse/...
# to see whether the correct groups have been created.

source_group(Base             FILES main.c)

# a sub group
source_group(Base\\Sub1       FILES sub1/foo.c)

# a sub sub group
source_group(Base\\Sub1\\Sub2 FILES sub1/foobar.c)

# a group with empty name
source_group("" FILES foo.c)

# a group, whose name consists only of the delimiter
#should be handled the same way as an empty name
source_group("\\" FILES baz.c)

# a sub sub group whose last component has the same name
# as an already existing group
source_group(Base\\Sub1\\Base FILES bar.c)

# a group without files, is currently not created
source_group(EmptyGroup)

# Forward slashes can be delimiters too
source_group(Base/Nested FILES nested.c)

set(root ${CMAKE_CURRENT_SOURCE_DIR})

set(tree_files_without_prefix ${root}/sub1/tree_bar.c
                              sub1/tree_baz.c
                              sub1/../sub1/tree_subdir/tree_foobar.c)

set(tree_files_with_prefix ${root}/tree_prefix_foo.c
                           tree_prefix_bar.c)

set(tree_files_with_empty_prefix ${root}/tree_empty_prefix_foo.c
                                 tree_empty_prefix_bar.c)

set(tree_files_which_are_actually_directories ${root}
                                              ${root}/
                                              ${root}/sub1
                                              ${root}/sub1/)

source_group(TREE ${root} FILES ${tree_files_without_prefix})

# Should not crash and not add any files - just silently ignore the directories
source_group(TREE ${root} FILES ${tree_files_which_are_actually_directories})

source_group(FILES ${tree_files_with_prefix} PREFIX tree_root/subgroup TREE ${root})

source_group(PREFIX "" FILES ${tree_files_with_empty_prefix} TREE ${root})

add_executable(SourceGroups main.c bar.c foo.c sub1/foo.c sub1/foobar.c baz.c
                            ${tree_files_with_prefix} ${tree_files_without_prefix}
                            ${tree_files_with_empty_prefix} README.txt
                            nested.c)
