cmake
Skonfiguruj plik
Szukaj…
Wprowadzenie
Uwagi
Skopiuj plik do innej lokalizacji i zmodyfikuj jego zawartość.
configure_file(<input> <output>
[COPYONLY] [ESCAPE_QUOTES] [@ONLY]
[NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
Kopiuje plik do pliku i zastępuje wartości zmiennych, do których odwołuje się treść pliku. Jeśli jest ścieżką względną, jest oceniana w odniesieniu do bieżącego katalogu źródłowego. Musi to być plik, a nie katalog. Jeśli jest ścieżką względną, jest oceniana w odniesieniu do bieżącego katalogu binarnego. Jeśli nazwa istniejącego katalogu, plik wejściowy jest umieszczany w tym katalogu z oryginalną nazwą.
Jeśli plik zostanie zmodyfikowany, system kompilacji uruchomi ponownie CMake, aby ponownie skonfigurować plik i ponownie wygenerować system kompilacji.
To polecenie zastępuje dowolne zmienne w pliku wejściowym o nazwie $ {VAR} lub @ VAR @ ich wartościami określonymi przez CMake. Jeśli zmienna nie jest zdefiniowana, zostanie zastąpiona niczym. Jeśli podano COPYONLY, wówczas nie nastąpi rozwinięcie zmiennej. Jeśli podano ESCAPE_QUOTES, wszelkie podstawione cudzysłowy będą oznaczone znakiem ucieczki w stylu C. Plik zostanie skonfigurowany z bieżącymi wartościami zmiennych CMake. Jeśli podano @ONLY, tylko zmienne w postaci @ VAR @ zostaną zastąpione, a $ {VAR} zostanie zignorowane. Jest to przydatne do konfigurowania skryptów używających $ {VAR}.
Wiersze pliku wejściowego w postaci „#cmakedefine VAR ...” zostaną zastąpione przez „#define VAR ...” lub / * *undund VAR * / w zależności od tego, czy VAR jest ustawione w CMake na dowolną wartość, która nie jest uważana za fałsz stała przez polecenie if (). (Treść „...”, jeśli istnieje, jest przetwarzana jak wyżej.) Wiersze pliku wejściowego w postaci „# cmakedefine01 VAR” zostaną zastąpione odpowiednio „#define VAR 1” lub „#define VAR 0” w podobny sposób.
Za pomocą NEWLINE_STYLE można zmienić zakończenie linii:
'UNIX' or 'LF' for \n, 'DOS', 'WIN32' or 'CRLF' for \r\n.
Nie można używać COPYONLY z NEWLINE_STYLE.
Wygeneruj plik konfiguracyjny c ++ za pomocą CMake
Jeśli mamy projekt c ++, który używa pliku konfiguracyjnego config.h z niektórymi niestandardowymi ścieżkami lub zmiennymi, możemy go wygenerować przy użyciu CMake i ogólnego pliku config.h.in.
Plik config.h.in może być częścią repozytorium git, a wygenerowany plik config.h nigdy nie zostanie dodany, ponieważ jest generowany z bieżącego środowiska.
#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" )
Jeśli mamy plik config.h.in taki jak ten:
cmakedefine PATH_DATA "@myproject_DATA@"
cmakedefine THIRDPARTIES_PATH "@THIRDPARTIES_PATH@"
Poprzednie CMakeLists wygenerują taki nagłówek c ++:
#define PATH_DATA "/home/user/projects/myproject/data"
#define THIRDPARTIES_PATH "/home/user/projects/myproject/thirdparties"
Egzamin na podstawie wersji kontrolnej SDL2
Jeśli masz moduł cmake
. Można utworzyć folder o nazwie in
przechowywać wszystkie pliki konfiguracyjne.
Na przykład masz projekt o nazwie FOO
, możesz utworzyć plik FOO_config.h.in
, taki jak:
//===================================================================================
// 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@"
Ten plik utworzy plik FOO_config.h
w ścieżce instalacji ze zmienną zdefiniowaną w c FOO_PATH_MAIN
podstawie zmiennej cmake. Aby go wygenerować, musisz dołączyć plik in
pliku CMakeLists.txt, tak jak poniżej (ustaw ścieżki i zmienne):
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" )
Plik ten będzie zawierał dane z szablonu i zmienną z twoją prawdziwą ścieżką, na przykład:
// Paths
#define FOO_PATH_MAIN "/home/YOUR_USER/Respositories/git/foo_project"