खोज…


परिचय

config_file किसी फ़ाइल को किसी अन्य स्थान पर कॉपी करने और उसकी सामग्री को संशोधित करने के लिए एक CMake फ़ंक्शन है। यह फ़ंक्शन जेनेरिक टेम्पलेट का उपयोग करके पथ, कस्टम चर के साथ कॉन्फ़िगरेशन फ़ाइलों को बनाने के लिए बहुत उपयोगी है।

टिप्पणियों

फ़ाइल को किसी अन्य स्थान पर कॉपी करें और उसकी सामग्री को संशोधित करें।

configure_file(<input> <output>
           [COPYONLY] [ESCAPE_QUOTES] [@ONLY]
           [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])

फ़ाइल में एक फ़ाइल की प्रतिलिपि बनाता है और फ़ाइल सामग्री में संदर्भित चर मानों को प्रतिस्थापित करता है। यदि एक सापेक्ष पथ है तो इसका मूल्यांकन वर्तमान स्रोत निर्देशिका के संबंध में किया जाता है। एक निर्देशिका होना चाहिए, एक फ़ाइल होना चाहिए। यदि एक सापेक्ष पथ है तो इसका मूल्यांकन वर्तमान बाइनरी निर्देशिका के संबंध में किया जाता है। यदि किसी मौजूदा निर्देशिका के नामों को इनपुट फ़ाइल को उसके मूल नाम के साथ उस निर्देशिका में रखा गया है।

यदि फ़ाइल को संशोधित किया जाता है तो बिल्ड सिस्टम फ़ाइल को फिर से कॉन्फ़िगर करने और बिल्ड सिस्टम को फिर से बनाने के लिए CMake को फिर से चलाएगा।

यह कमांड CMake द्वारा निर्धारित उनके मूल्यों के साथ $ {VAR} या @ VAR के रूप में संदर्भित इनपुट फ़ाइल में किसी भी चर की जगह लेती है। यदि एक चर को परिभाषित नहीं किया गया है, तो इसे कुछ भी नहीं के साथ बदल दिया जाएगा। यदि COPYONLY निर्दिष्ट है, तो कोई चर विस्तार नहीं होगा। यदि ESCAPE_QUOTES निर्दिष्ट किया जाता है, तो कोई भी प्रतिस्थापित उद्धरण C- शैली से बच जाएगा। फ़ाइल को सीएमके चर के वर्तमान मूल्यों के साथ कॉन्फ़िगर किया जाएगा। यदि @ केवल निर्दिष्ट किया गया है, तो केवल @ VAR @ के चर को बदला जाएगा और $ {VAR} को अनदेखा किया जाएगा। यह उन स्क्रिप्ट को कॉन्फ़िगर करने के लिए उपयोगी है जो $ {VAR} का उपयोग करते हैं।

"#Cmakedefine VAR ..." फ़ॉर्म की इनपुट फ़ाइल लाइनों को "#define VAR ..." या * * #undef VAR * के साथ बदल दिया जाएगा / इस पर निर्भर करते हुए कि क्या VAR को CMake में किसी भी मूल्य पर सेट नहीं किया गया है, एक झूठा नहीं माना जाता है if () कमांड द्वारा स्थिर। ("..." की सामग्री, यदि कोई हो, ऊपर के रूप में संसाधित किया गया है।) "# cmakedefine01 VAR" फॉर्म की इनपुट फ़ाइल लाइनों को "#define VAR 1" या "#define VAR 0" के साथ प्रतिस्थापित किया जाएगा।

NEWLINE_STYLE के साथ समाप्त होने वाली रेखा समायोजित की जा सकती है:

'UNIX' or 'LF' for \n, 'DOS', 'WIN32' or 'CRLF' for \r\n.

COPYONLY का उपयोग NEWLINE_STYLE के साथ नहीं किया जाना चाहिए।

C ++ के साथ c ++ कॉन्फिगर फाइल जेनरेट करें

यदि हमारे पास एक c ++ प्रोजेक्ट है जो कुछ कस्टम पथ या चर के साथ config.h कॉन्फ़िगरेशन फ़ाइल का उपयोग करता है, तो हम इसे CMake और एक सामान्य फ़ाइल config.h.in का उपयोग करके उत्पन्न कर सकते हैं।

Config.h.in एक गिट रिपॉजिटरी का हिस्सा हो सकता है, जबकि उत्पन्न फ़ाइल config.h को कभी नहीं जोड़ा जाएगा, क्योंकि यह वर्तमान वातावरण से उत्पन्न होता है।

#CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.11)

SET(PROJ_NAME "myproject")
PROJECT(${PROJ_NAME})

SET(${PROJ_NAME}_DATA     ""     CACHE PATH "This directory contains all DATA and RESOURCES")
SET(THIRDPARTIES_PATH    ${CMAKE_CURRENT_SOURCE_DIR}/../thirdparties      CACHE PATH "This directory contains thirdparties")

configure_file ("${CMAKE_CURRENT_SOURCE_DIR}/common/config.h.in"
            "${CMAKE_CURRENT_SOURCE_DIR}/include/config.h" )

अगर हमारे पास config.h.in ऐसा है:

cmakedefine PATH_DATA "@myproject_DATA@"
cmakedefine THIRDPARTIES_PATH "@THIRDPARTIES_PATH@"

पिछले CMakeLists इस तरह एक c ++ हैडर उत्पन्न करेंगे:

#define PATH_DATA "/home/user/projects/myproject/data"
#define THIRDPARTIES_PATH "/home/user/projects/myproject/thirdparties"

SDL2 नियंत्रण संस्करण पर आधारित परीक्षा

यदि आपके पास cmake मॉड्यूल है। आप एक फ़ोल्डर बुलाया बना सकते हैं in सभी config फ़ाइलों को स्टोर करने के लिए।

उदाहरण के लिए, आपके पास FOO नामक एक परियोजना है, आप एक FOO_config.h.in फ़ाइल बना सकते हैं जैसे:

//===================================================================================
//  CMake configuration file, based on SDL 2 version header
// ===================================================================================

#pragma once

#include <string>
#include <sstream>

namespace yournamespace
{
  /**
 *  \brief Information the version of FOO_PROJECT in use.
 *
 *  Represents the library's version as three levels: major revision
 *  (increments with massive changes, additions, and enhancements),
 *  minor revision (increments with backwards-compatible changes to the
 *  major revision), and patchlevel (increments with fixes to the minor
 *  revision).
 *
 *  \sa FOO_VERSION
 *  \sa FOO_GetVersion
 */
typedef struct FOO_version
{
    int major;        /**< major version */
    int minor;        /**< minor version */
    int patch;        /**< update version */
} FOO_version;

/* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL
*/
#define FOO_MAJOR_VERSION   0
#define FOO_MINOR_VERSION   1
#define FOO_PATCHLEVEL      0

/**
 *  \brief Macro to determine FOO version program was compiled against.
 *
 *  This macro fills in a FOO_version structure with the version of the
 *  library you compiled against. This is determined by what header the
 *  compiler uses. Note that if you dynamically linked the library, you might
 *  have a slightly newer or older version at runtime. That version can be
 *  determined with GUCpp_GetVersion(), which, unlike GUCpp_VERSION(),
 *  is not a macro.
 *
 *  \param x A pointer to a FOO_version struct to initialize.
 *
 *  \sa FOO_version
 *  \sa FOO_GetVersion
 */
#define FOO_VERSION(x)                          \
{                                   \
    (x)->major = FOO_MAJOR_VERSION;                 \
    (x)->minor = FOO_MINOR_VERSION;                 \
    (x)->patch = FOO_PATCHLEVEL;                    \
}

/**
 *  This macro turns the version numbers into a numeric value:
 *  \verbatim
    (1,2,3) -> (1203)
    \endverbatim
 *
 *  This assumes that there will never be more than 100 patchlevels.
 */
#define FOO_VERSIONNUM(X, Y, Z)                     \
    ((X)*1000 + (Y)*100 + (Z))

/**
 *  This is the version number macro for the current GUCpp version.
 */
#define FOO_COMPILEDVERSION \
    FOO_VERSIONNUM(FOO_MAJOR_VERSION, FOO_MINOR_VERSION, FOO_PATCHLEVEL)

/**
 *  This macro will evaluate to true if compiled with FOO at least X.Y.Z.
 */
#define FOO_VERSION_ATLEAST(X, Y, Z) \
    (FOO_COMPILEDVERSION >= FOO_VERSIONNUM(X, Y, Z))

}

// Paths
#cmakedefine FOO_PATH_MAIN "@FOO_PATH_MAIN@"

यह फ़ाइल संस्थापित पथ में एक FOO_config.h , जिसमें C FOO_PATH_MAIN से परिभाषित चर के साथ cmake चर होगा। इसे बनाने के लिए आपको अपने CMakeLists.txt in फाइल को शामिल करना होगा, जैसे (पथ और चर सेट करें):

MESSAGE("Configuring FOO_config.h ...")
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/common/in/FOO_config.h.in"
"${FOO_PATH_INSTALL}/common/include/FOO_config.h" )

उस फ़ाइल में उदाहरण के लिए टेम्प्लेट और आपके वास्तविक पथ के साथ परिवर्तनशील डेटा होगा:

// Paths
#define FOO_PATH_MAIN "/home/YOUR_USER/Respositories/git/foo_project"


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow