c++ - Cmake का उपयोग करके नेस्टेड उप निर्देशिका के लिए Visual Studio फ़िल्टर कैसे सेट करें




visual-studio visual-studio-2012 (2)

मुझे पता है कि CMAKE ग्लोब फ़ंक्शन का उपयोग आमतौर पर किया जाता है: CMAKE ग्लोब बुराई क्यों है , लेकिन मेरे मामले में मैंने इसे स्पष्ट रूप से प्रत्येक फ़ाइल के नामकरण से बेहतर पाया। मुझे लगा कि मैं GLOB का उपयोग करके फ्लोरियन के जवाब का एक संशोधित संस्करण शामिल करूंगा।

# This code sorts the project files as they appear in the root directory

# Generate a list of all .c & .h files in the current directory and sub directores.
file(
     GLOB_RECURSE source_list RELATIVE
     "${CMAKE_CURRENT_SOURCE_DIR}"
     *.c *.h
    )
foreach(source IN LISTS source_list)
    get_filename_component(source_path "${source}" PATH)
    string(REPLACE "/" "\\" source_path_msvc "${source_path}")
    source_group("${source_path_msvc}" FILES "${source}")
endforeach()  
message(STATUS "Tree reorganized")

मेरे पास संरचना है

Main (dir)
      +-- CMakeLists.txt
      +-- File.cpp
      +-- File.hpp
      +-- Dir (dir)
          +-- CMakeLists.txt
          +-- File1.cpp
          +-- File1.hpp
          +-- File2.cpp
          +-- File2.hpp

मुख्य / CMakeLists.txt

CMAKE_MINIMUM_REQUIRED (VERSION 2.8.11)
PROJECT(Main)
FILE(GLOB SOURCE
    "*.hpp"
    "*.cpp"
)

ADD_SUBDIRECTORY(Dir)
ADD_EXECUTABLE(Main ${SOURCE})

मुख्य / डिर / CmakeLists.txt

FILE(GLOB LOCAL_SOURCE
    "*.hpp"
    "*.cpp"
)
SET(SOURCE
    ${SOURCE}
    ${LOCAL_SOURCE}
    PARENT_SCOPE
)

इसने Visual Studio में निम्न संरचना उत्पन्न की

मैं क्या चाहता हूँ:

मैंने क्या कोशिश की:

मुख्य / CMakeLists.txt

CMAKE_MINIMUM_REQUIRED (VERSION 2.8.11)
PROJECT(Main)
FILE(GLOB LOCAL_SOURCE
    "*.hpp"
    "*.cpp"
)

SET(SOURCE 
    ${LOCAL_SOURCE}
)

ADD_SUBDIRECTORY(Dir)

SOURCE_GROUP(Main FILES ${LOCAL_SOURCE})
ADD_EXECUTABLE(Main ${SOURCE})

मुख्य / डिर / CmakeLists.txt

FILE(GLOB LOCAL_SOURCE
    "*.hpp"
    "*.cpp"
)
SET(SOURCE
    ${SOURCE}
    ${LOCAL_SOURCE}
    PARENT_SCOPE
)

SOURCE_GROUP(Dir FILES ${LOCAL_SOURCE})

जो मैं समझता हूं:

कृपया इसके बारे में मेरी मदद करें।

  • मैं मुख्य निर्देशिका वाले फिल्टर में सिंगल CmakeFile.txt का उपयोग नहीं करना चाहता
  • वास्तविक संरचना कई परतों गहरी घोंसले के शिकार संरचना है। तो कृपया समाधान सुझाएं जो किसी भी स्तर की उप निर्देशिका के लिए काम करेगा

वहाँ एक स्रोत ट्री व्यवहार की नकल करने के लिए तैयार करने या अनुकूल करने के लिए कई तैयार हैं जैसे एक्लिप्स इन विजुअल स्टूडियो (उदाहरण के लिए ADD_SRC_SUBFOLDER DESTINATION_SRCS से ज़ोबा या GroupSources से लुका)।

यहाँ आपके उपयोग के मामले के लिए मेरा कम किया गया संस्करण है:

cmake_minimum_required(VERSION 2.8.10)

project(Main CXX)

set(
    source_list
    "File.cpp"
    "File.hpp"
    "Dir/File1.cpp"
    "Dir/File1.hpp"
    "Dir/File2.cpp"
    "Dir/File2.hpp"
)

add_executable(Main ${source_list})

foreach(source IN LISTS source_list)
    get_filename_component(source_path "${source}" PATH)
    string(REPLACE "/" "\\" source_path_msvc "${source_path}")
    source_group("${source_path_msvc}" FILES "${source}")
endforeach()

source_group() का दस्तावेज़ीकरण देखें जिसे आपको डबल-बैकस्लैश के साथ उप-निर्देशिकाएं देनी हैं।

इस कारण से मैंने आपकी file(GLOB ...) को उन सभी स्रोत फ़ाइलों की एक समर्पित सूची के साथ बदल दिया है, जिन्हें मैं CMake की file() कमांड प्रलेखन से उद्धृत करना चाहता हूँ:

हम आपके स्रोत वृक्ष से स्रोत फ़ाइलों की सूची एकत्र करने के लिए GLOB का उपयोग करने की अनुशंसा नहीं करते हैं। यदि कोई स्रोत जोड़ा या हटाए जाने पर कोई CMakeLists.txt फ़ाइल नहीं बदलती है, तो उत्पन्न बिल्ड सिस्टम को पता नहीं चल सकता है कि सीएमके को पुन: उत्पन्न करने के लिए कब कहा जाए।

और यहाँ मेरा फेल-सेफ संस्करण है (जो निरपेक्ष रास्तों की जाँच करता है) को एक फंक्शन के रूप में इस्तेमाल किया जाता है:

function(assign_source_group)
    foreach(_source IN ITEMS ${ARGN})
        if (IS_ABSOLUTE "${_source}")
            file(RELATIVE_PATH _source_rel "${CMAKE_CURRENT_SOURCE_DIR}" "${_source}")
        else()
            set(_source_rel "${_source}")
        endif()
        get_filename_component(_source_path "${_source_rel}" PATH)
        string(REPLACE "/" "\\" _source_path_msvc "${_source_path}")
        source_group("${_source_path_msvc}" FILES "${_source}")
    endforeach()
endfunction(assign_source_group)

जिसे आप उदाहरण के साथ कहेंगे

assign_source_group(${source_list})







cmake