2017-10-02 1 views
1

Comment stocker les informations de base, comme le nom du système (Linux), le compilateur utilisé gcc) ou l'architecture (x86_64), dans un fichier que j'inclus dans mon binaire?CMake: Stocker les informations de construction/système en binaire

Tout le code pour écrire un tel fichier .in est déjà présent, sauf que les variables CMake correspondantes sont toutes vides, par ex. CMAKE_SYSTEM ou CMAKE_SYSTEM_PROCESSOR:

set(NEWLINE "\\\\n") 
file(WRITE ${CMAKE_BINARY_DIR}/update_buildflags.cmake " 
file(WRITE \${DST} \"#define BUILDFLAGS \\\" 
    ARCH=\${CMAKE_SYSTEM}${NEWLINE} 
    COMP=\${CMAKE_SYSTEM_PROCESSOR}${NEWLINE} 
    BUILD=\${CMAKE_BUILD_TYPE}${NEWLINE}\\\"\n\")")  
add_custom_target(update_buildflags COMMAND ${CMAKE_COMMAND} 
    -DDST=${PROJECT_SOURCE_DIR}/src/buildflags.c 
    -P ${CMAKE_BINARY_DIR}/update_buildflags.cmake) 

Cet objectif personnalisé est ensuite ajouté comme dépendance pour le fichier binaire principal et le fichier résultant src/buildflags.c ressemble à ceci:

#define BUILDFLAGS " ARCH=\n COMP=\n BUILD=\n" 

Pourquoi sont les utilisés des variables CMake vides bien les imprimer avec message() affiche les informations correctes?

CMAKE_SYSTEM: Linux-4.4.0-92-generic 
+0

Quelle est la question? – arrowd

+0

J'ai modifié la question. – mattmilten

Répondre

3

Vous pouvez utiliser un fichier modèle pour le rendre plus lisible.

  • Pro: pas nécessaire d'écrire le fichier entier au sein de CMake
  • Pro: Facile à modifier
  • Contra: Fichier supplémentaire

Exemple src/autocode/buildflags.h.in:

#ifndef BUILD_FLAGS_H 
#def BUILD_FLAGS_H 
#define ARCH ${CMAKE_SYSTEM} 
#define COMP ${CMAKE_SYSTEM_PROCESSOR} 
#define BUILD ${CMAKE_BUILD_TYPE} 
// Add more of your stuff here 
#define APP_BUILD_WITH_CMAKE_VERSION "${CMAKE_VERSION}" 
#define APP_BUILD_ON_PLATFORM "${CMAKE_SYSTEM}" 
#endif // BUILD_FLAGS_H 

Dans votre CMakeLists.txt

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/autocode/buildflags.h.in 
       ${CMAKE_BINARY_DIR}/buildflags.h) 
include_directories(${CMAKE_BINARY_DIR}) 

Dans votre code

#include "buildflags.h" 
0

Vous devez supprimer le '\' avant le $ lors de l'accès aux variables CMAKE _.... Fonctionne comme un charme après.

+0

Je pense que l'utilisation d'un modèle est plus propre. C'est, après tout, ce qu'ils ont été faits pour. – legalize