Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to keep source folders hierarchy on solution explorer?

I made a C++ project on Linux, and I grouped source files in many directories to organize myself.

I was using CMake to compile, with one CMakeFiles.txt on each subdirectory.

srcs
|--folderA
|  |--Toto.cpp
|  |--Tata.cpp
|
|--folderB
|  |--Foo.cpp
|  |--Bar.cpp
[...]

Recently, I opened it with Visual Studio 2015, which found every source file, but just put the entire list on the "Source Files" folder of solution explorer.

Source Files
|--Toto.cpp
|--Tata.cpp
|--Foo.cpp
|--Bar.cpp

I plan to have a huge number of files, and it shall be soon difficult to find one.

Is there any way to explicitly tell it to respect the folder hierarchy on solution explorer?

like image 443
Aracthor Avatar asked Sep 15 '15 01:09

Aracthor


People also ask

How do I add folders to Solution Explorer Visual Studio?

To create a folder within the solution, right-click the solution name in the Solution Explorer pane and choose "Add", then "New Solution Folder" from the context-sensitive menu. To create a subfolder, start by right-clicking an existing solution folder and then choose the same menu options.

How do I show all folders in Visual Studio?

In Visual Studio, click File > Open > Folder. Navigate to the folder, and click Select Folder. This opens the folder in Solution Explorer and displays its contents, files and any subfolders.


2 Answers

Use the source_group command.

source_group(<name> [FILES <src>...] [REGULAR_EXPRESSION <regex>])

Defines a group into which sources will be placed in project files. This is intended to set up file tabs in Visual Studio. The options are:

FILES Any source file specified explicitly will be placed in group . Relative paths are interpreted with respect to the current source directory.

REGULAR_EXPRESSION Any source file whose name matches the regular expression will be placed in group .

like image 187
James Adkison Avatar answered Oct 12 '22 02:10

James Adkison


@James Adkison is correct; source_group is what you want to use. As of CMake 3.8, the improved source_group command now offers a TREE argument to recursively search your source hierarchy to create source groups to match it. Here is a basic solution for the example you provided:

project(MyProj)

set(MyProj_SOURCES
    "folderA/Toto.cpp"
    "folderA/Tata.cpp"
    "folderB/Foo.cpp"
    "folderB/Bar.cpp"
)

add_executable(Main ${MyProj_SOURCES})

# Create the source groups for source tree with root at CMAKE_CURRENT_SOURCE_DIR.
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${MyProj_SOURCES})
like image 37
Kevin Avatar answered Oct 12 '22 01:10

Kevin