1. 程式人生 > >在Visual Studio中按目錄結構自動建立Filters(Source Groups)

在Visual Studio中按目錄結構自動建立Filters(Source Groups)

 CMake作為構建系統可以輕鬆生成Visual Studio工程,這讓我們的新專案可以不必維護一組專門的Visual Studio工程檔案和sln檔案了。但是CMake預設生成的工程檔案中,只是籠統區分了標頭檔案和其他原始檔。對於大型專案,要在眾多的原始檔中找到想要的那個是很惱火的事情。對此,Visual Studio提供了filter機制來分類顯示原始檔。對於手工維護工程檔案的專案,我們可以自己新增filter,然後提交到程式碼庫,並與其他成員共享。
     但是,在使用CMake後,手工維護filter是不現實的。CMake也提供了可以生成filter的機制,就是source_group()命令。結合source_group(), file(), string()等命令,我們可以讓實現CMake自動按目錄結構生成filter。
     方法很簡單,程式碼如下:

macro(source_group_by_dir source_files)
    if(MSVC)
        set(sgbd_cur_dir ${CMAKE_CURRENT_SOURCE_DIR})
        foreach(sgbd_file ${${source_files}})
            string(REGEX REPLACE ${sgbd_cur_dir}/\(.*\) \\1 sgbd_fpath ${sgbd_file})
            string(REGEX REPLACE "\(.*\)/.*" \\1 sgbd_group_name ${sgbd_fpath})
            string(COMPARE EQUAL ${sgbd_fpath} ${sgbd_group_name} sgbd_nogroup)
            string(REPLACE "/" "\\" sgbd_group_name ${sgbd_group_name})
            if(sgbd_nogroup)
                set(sgbd_group_name "\\")
            endif(sgbd_nogroup)
            source_group(${sgbd_group_name} FILES ${sgbd_file})
        endforeach(sgbd_file)
    endif(MSVC)
endmacro(source_group_by_dir)

     使用的時候,先在比較頂層的CMakeLists.txt中定義該巨集。然後在新增工程(add_library或者add_executable)的CMakeLists.txt檔案中呼叫該巨集:

source_group_by_dir(all_files)

    其中all_files是儲存了所有檔名的變數。注意,這裡用的是變數名,而沒有引用其值。
    一般這個檔案列表可以用file()或者aux_source_directory()來得到。例如對於C++工程,通常是這樣的:

file(GLOB_RECURSE project_headers *.h)
file(GLOB_RECURSE project_cpps *.cpp)
set(all_files ${project_headers} ${project_cpps})
source_group_by_dir(all_files)