将此make转换为cmake 我发现了一个极好的例子,如何使用Makefile添加带有日期和内部版本号的链接变量:

将此make转换为cmake 我发现了一个极好的例子,如何使用Makefile添加带有日期和内部版本号的链接变量:,makefile,cmake,Makefile,Cmake,但是我在CMakeLists.txt中重复这一点的所有尝试都失败了…:-( 例如: ADD_CUSTOM_COMMAND(OUTPUT buildnumber.num COMMAND @if ! test -f buildnumber.num; then echo 0 > buildnumber.num; fi COMMAND @echo $$(($$(cat buildnumber.num) + 1)) > buildnumber.num) file (GLOB

但是我在CMakeLists.txt中重复这一点的所有尝试都失败了…:-( 例如:

ADD_CUSTOM_COMMAND(OUTPUT buildnumber.num 
    COMMAND @if ! test -f buildnumber.num; then echo 0 > buildnumber.num; fi
    COMMAND @echo $$(($$(cat buildnumber.num) + 1)) > buildnumber.num)

file (GLOB_RECURSE MAIN_SOURCES FOLLOW_SYMLINKS ./src/*.cpp)
add_custom_target(buildnumber.num DEPENDS ${MAIN_SOURCES})
我将非常感谢如何在cmake中实现这一点。

@Andre

好吧,我得到了我想要的,但有些笨拙,因为我是这方面的新手。请建议如何改进(主要是如何避免单独的文件)。这是CMakeLists.txt文件:

include_directories(${CMAKE_CURRENT_BINARY_DIR})
set(CMAKE_EXE_LINKER_FLAGS " /Projects/Testnum/linker.scr")
add_custom_target(stam ALL COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/custom.cmake) 
add_executable(foo main.c ) 
add_dependencies(foo stam)
这是附加的custom.cmake文件:

execute_process(COMMAND increment.scr )
execute_process(COMMAND cat buildnumber OUTPUT_VARIABLE _output OUTPUT_STRIP_TRAILING_WHITESPACE)
file(WRITE linker.scr "__BUILD_NUM = ${_output} ;")
这是increment.csr文件,我没有成功地将其插入custom.cmake:

#!/bin/bash
var=`cat buildnumber`; sum=$((1 + $var )); echo $sum >buildnumber
最后,这是主要的。c:

#include <stdio.h>
extern char* __BUILD_NUM;
int main()
{
  printf("LINK_TIME_VALUE: %d\n", (int)&__BUILD_NUM);
  return 0;
}
#包括
外部字符*\uuu构建\uu NUM;
int main()
{
printf(“链接时间值:%d\n”,(int)和构建数量);
返回0;
}

一切正常,但似乎太笨拙了。

您真的希望链接器添加它吗?还是一个重新配置的.cpp文件和两个#定义也可以(请参阅)?是的,我知道。因为链接器变量总是有正确的值,我希望在每次编译时更新它们。此外,使用链接器变量要快得多,因为不需要重新编译…:-)请查看
#include <stdio.h>
extern char* __BUILD_NUM;
int main()
{
  printf("LINK_TIME_VALUE: %d\n", (int)&__BUILD_NUM);
  return 0;
}