यह होने की तुलना में ऐसा करने के लिए दर्द का अधिक दर्द है। आप विवर्तन से संस्करण जानकारी निकालने के लिए निर्माण समय पर एक प्रोग्राम चला सकते हैं। सीएमके स्वयं को अपनी स्क्रिप्टिंग भाषा का उपयोग करके इस कार्यक्रम के रूप में इस्तेमाल किया जा सकता है। आप -पी कमांड लाइन ध्वज का उपयोग कर किसी भी सीएमके स्क्रिप्ट को चला सकते हैं। कोड का टुकड़ा यह करने के लिए (फ़ाइल getsvn.cmake
में रखा करने के लिए जा सकती है) किया जाएगा:
# the FindSubversion.cmake module is part of the standard distribution
include(FindSubversion)
# extract working copy information for SOURCE_DIR into MY_XXX variables
Subversion_WC_INFO(${SOURCE_DIR} MY)
# write a file with the SVNVERSION define
file(WRITE svnversion.h.txt "#define SVNVERSION ${MY_WC_REVISION}\n")
# copy the file to the final header only if the version changes
# reduces needless rebuilds
execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different
svnversion.h.txt svnversion.h)
यह तोड़फोड़ संशोधन जानकारी निकाल लेता है और यह एक हेडर फाइल करने के लिए लिखता है। यह हेडर फ़ाइल केवल तभी अपडेट की जाती है जब हर समय recompiling से बचने के लिए आवश्यक है। आपके प्रोग्राम में, आप उस हेडर फ़ाइल को SVNVERSION परिभाषित करने के लिए शामिल करेंगे।
# boilerplate
cmake_minimum_required(VERSION 2.8)
project(testsvn)
# the test executable
add_executable(test main.c ${CMAKE_CURRENT_BINARY_DIR}/svnversion.h)
# include the output directory, where the svnversion.h file is generated
include_directories(${CMAKE_CURRENT_BINARY_DIR})
# a custom target that is always built
add_custom_target(svnheader ALL
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/svnheader.h)
# creates svnheader.h using cmake script
add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/svnheader.h
COMMAND ${CMAKE_COMMAND} -DSOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}
-P ${CMAKE_CURRENT_SOURCE_DIR}/getsvn.cmake)
# svnversion.h is a generated file
set_source_files_properties(${CMAKE_CURRENT_BINARY_DIR}/svnversion.h
PROPERTIES GENERATED TRUE
HEADER_FILE_ONLY TRUE)
# explicitly say that the executable depends on the svnheader
add_dependencies(test svnheader)
आप add_custom_target
और add_custom_command
का उपयोग करने के बाद से वहाँ svnheader.h फाइल करने के लिए कोई आदानों हैं की जरूरत है, यह "प्रकट होता है:
CMakeLists.txt
फ़ाइल है कि आप स्क्रिप्ट चलाने के लिए की आवश्यकता होगी कुछ इस तरह होगा कहीं से "सेमेक तक। मैंने पहले से ही getvn.cmake फ़ाइल में अनावश्यक पुनर्निर्माण के मुद्दे से निपटाया है, इसलिए "svnheader" लक्ष्य का पुनर्निर्माण मूल रूप से एक नो-ऑप है यदि उपversण संशोधन नहीं बदला गया है।
अंत में
, एक उदाहरण main.c
फ़ाइल:
#include "svnversion.h"
int main(int argc, const char *argv[])
{
printf("%d\n", SVNVERSION);
return 0;
}
बहुत बढ़िया जवाब:
इसके अलावा, किसी Git का उपयोग करना चाहता है, cmake स्क्रिप्ट के लिए इस का उपयोग । पता नहीं था कि निर्माण समय पर सेमेक स्क्रिप्ट को निष्पादित किया जा सकता है। – paleozogt
यह वास्तव में ऐसा नहीं करता है जो कोई अपेक्षा करेगा। जब 'मेक' कहा जाता है तो यह स्वचालित रूप से 'revision.h' को अपडेट नहीं करता है। आपके समाधान को थोड़ा संशोधित करना होगा - मैं इसे एक उत्तर में डालूंगा, इसलिए मैं कोड टैग का उपयोग कर सकता हूं ... – janitor048
@janitor बस इसे फिर से परीक्षण किया, जैसा कि मैंने मूल रूप से किया था, और यह निश्चित रूप से अपेक्षित रूप से काम करता है। आपको प्रत्येक कॉल पर "जेनरेटिंग svnheader.h" संदेश भी मिलता है, जिसे आप अपने संशोधित संस्करण में नहीं करते हैं। साथ ही, 'revision.h' कोड में नहीं है, तो हो सकता है कि आपके पास कॉपी-पेस्ट त्रुटि हो? – richq