Skip to content

Commit e638f72

Browse files
committed
CBMC_VERSION: Use generated include files instead of command-line defines
Also fixes a number of shortcomings of the earlier approach as far as CMake is concerned: - Adds --dirty to the git command line (as is done for Makefiles). - Does not require a rebuild when there are no changes to the version string. - CBMC release number updates will be reflected and trigger a rebuild (even when no other changes have taken place).
1 parent 1360f7f commit e638f72

29 files changed

+80
-83
lines changed

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ Release/*
2828
*.obj
2929
*.a
3030
*.lib
31-
.release_info
31+
version.h
3232
src/ansi-c/arm_builtin_headers.inc
3333
src/ansi-c/clang_builtin_headers.inc
3434
src/ansi-c/cprover_builtin_headers.inc

CMakeLists.txt

+37-42
Original file line numberDiff line numberDiff line change
@@ -39,52 +39,47 @@ if(${enable_cbmc_tests})
3939
enable_testing()
4040
endif()
4141

42-
file(STRINGS src/config.inc config_inc_v REGEX "CBMC_VERSION *= *[0-9\.]+")
43-
string(REGEX REPLACE "^CBMC_VERSION *= *" "" CBMC_RELEASE ${config_inc_v})
44-
message(STATUS "CBMC release ${CBMC_RELEASE}")
45-
42+
# based on https://cmake.org/pipermail/cmake/2010-July/038015.html
4643
find_package(Git)
44+
if(GIT_FOUND)
45+
file(WRITE ${CMAKE_BINARY_DIR}/version.cmake
46+
"
47+
file(STRINGS \${CBMC_SOURCE_DIR}/config.inc
48+
config_inc_v REGEX \"CBMC_VERSION *= *[0-9\.]+\")
49+
string(REGEX REPLACE \"^CBMC_VERSION *= *\" \"\" CBMC_RELEASE \${config_inc_v})
50+
execute_process(
51+
COMMAND \"${GIT_EXECUTABLE}\" \"describe\" \"--tags\" \"--always\" \"--dirty\"
52+
OUTPUT_VARIABLE GIT_INFO
53+
OUTPUT_STRIP_TRAILING_WHITESPACE
54+
)
55+
configure_file(\${CUR}/version.h.in version.h)
56+
"
57+
)
58+
else()
59+
file(WRITE ${CMAKE_BINARY_DIR}/version.cmake
60+
"
61+
file(STRINGS \${CBMC_SOURCE_DIR}/config.inc
62+
config_inc_v REGEX \"CBMC_VERSION *= *[0-9\.]+\")
63+
string(REGEX REPLACE \"^CBMC_VERSION *= *\" \"\" CBMC_RELEASE \${config_inc_v})
64+
set(GIT_INFO \"n/a\")
65+
configure_file(\${CUR}/version.h.in version.h)
66+
"
67+
)
68+
endif()
4769

48-
macro(git_revision target files_var)
49-
if(GIT_FOUND)
50-
add_custom_command(
51-
OUTPUT .release_info
52-
COMMAND ${CMAKE_COMMAND} -E echo_append "#define __CBMC_VERSION " > .release_info
53-
COMMAND "${GIT_EXECUTABLE}" "describe" "--tags" "--always" "--long" >> .release_info
54-
COMMAND ${CMAKE_COMMAND} -E echo "#define __CBMC_VERSION_str(v) \"${CBMC_RELEASE} (\" # v \")\"" >> .release_info
55-
COMMAND ${CMAKE_COMMAND} -E echo "#define __CBMC_VERSION_xstr(v) __CBMC_VERSION_str(v)" >> .release_info
56-
COMMAND ${CMAKE_COMMAND} -E echo "#define CBMC_VERSION __CBMC_VERSION_xstr(__CBMC_VERSION)" >> .release_info
57-
VERBATIM
58-
)
59-
add_custom_command(
60-
TARGET ${target}
61-
POST_BUILD
62-
COMMAND ${CMAKE_COMMAND} -E remove -f .release_info
63-
)
64-
else()
65-
add_custom_command(
66-
OUTPUT .release_info
67-
COMMAND ${CMAKE_COMMAND} -E echo "#define CBMC_VERSION \"${CBMC_RELEASE} (n/a)\"" >> .release_info
68-
VERBATIM
69-
)
70-
endif()
71-
72-
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR
73-
"${CMAKE_CXX_COMPILER_ID}" STREQUAL "AppleClang" OR
74-
"${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU"
70+
macro(git_revision target)
71+
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/version.h.in
72+
"\#define CBMC_VERSION \"@CBMC_RELEASE@ (@GIT_INFO@)\"\n")
73+
add_custom_target(
74+
${target}-version.h
75+
COMMAND ${CMAKE_COMMAND}
76+
-D CBMC_SOURCE_DIR=${CBMC_SOURCE_DIR}
77+
-D CUR=${CMAKE_CURRENT_BINARY_DIR}
78+
-P ${CMAKE_BINARY_DIR}/version.cmake
7579
)
76-
set_source_files_properties(
77-
${${files_var}}
78-
PROPERTIES
79-
OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/.release_info
80-
COMPILE_FLAGS "-include .release_info")
81-
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
82-
set_source_files_properties(
83-
${${files_var}}
84-
PROPERTIES
85-
COMPILE_FLAGS "/DCBMC_VERSION=\"${CBMC_RELEASE} (n/a)\"")
86-
endif()
80+
add_dependencies(${target} ${target}-version.h)
8781
endmacro()
82+
include_directories(${CMAKE_CURRENT_BINARY_DIR})
8883

8984
add_subdirectory(src)
9085
add_subdirectory(regression)

jbmc/src/janalyzer/CMakeLists.txt

+1-2
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,4 @@ target_link_libraries(janalyzer-lib
2525
add_executable(janalyzer janalyzer_main.cpp)
2626
target_link_libraries(janalyzer janalyzer-lib)
2727

28-
set(cbmc_version_files janalyzer_parse_options.cpp)
29-
git_revision(janalyzer-lib cbmc_version_files)
28+
git_revision(janalyzer-lib)

jbmc/src/janalyzer/janalyzer_parse_options.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ Author: Daniel Kroening, [email protected]
5656
#include <goto-analyzer/taint_analysis.h>
5757
#include <goto-analyzer/unreachable_instructions.h>
5858

59+
#include "version.h"
60+
5961
janalyzer_parse_optionst::janalyzer_parse_optionst(int argc, const char **argv)
6062
: parse_options_baset(JANALYZER_OPTIONS, argc, argv),
6163
messaget(ui_message_handler),

jbmc/src/jbmc/CMakeLists.txt

+1-2
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,4 @@ target_link_libraries(jbmc-lib
3030
add_executable(jbmc jbmc_main.cpp)
3131
target_link_libraries(jbmc jbmc-lib)
3232

33-
set(cbmc_version_files jbmc_parse_options.cpp)
34-
git_revision(jbmc-lib cbmc_version_files)
33+
git_revision(jbmc-lib)

jbmc/src/jbmc/jbmc_parse_options.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ Author: Daniel Kroening, [email protected]
6060
#include <java_bytecode/replace_java_nondet.h>
6161
#include <java_bytecode/simple_method_stubbing.h>
6262

63+
#include "version.h"
64+
6365
jbmc_parse_optionst::jbmc_parse_optionst(int argc, const char **argv):
6466
parse_options_baset(JBMC_OPTIONS, argc, argv),
6567
messaget(ui_message_handler),

jbmc/src/jdiff/CMakeLists.txt

+1-2
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,4 @@ target_link_libraries(jdiff-lib
2727
add_executable(jdiff jdiff_main.cpp)
2828
target_link_libraries(jdiff jdiff-lib)
2929

30-
set(cbmc_version_files jdiff_parse_options.cpp)
31-
git_revision(jdiff-lib cbmc_version_files)
30+
git_revision(jdiff-lib)

jbmc/src/jdiff/jdiff_parse_options.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ Author: Peter Schrammel
6060
#include <goto-diff/goto_diff.h>
6161
#include <goto-diff/unified_diff.h>
6262

63+
#include "version.h"
64+
6365
jdiff_parse_optionst::jdiff_parse_optionst(int argc, const char **argv)
6466
: parse_options_baset(JDIFF_OPTIONS, argc, argv),
6567
jdiff_languagest(cmdline, ui_message_handler),

src/cbmc/CMakeLists.txt

+1-2
Original file line numberDiff line numberDiff line change
@@ -32,5 +32,4 @@ add_if_library(cbmc-lib jsil)
3232
add_executable(cbmc cbmc_main.cpp)
3333
target_link_libraries(cbmc cbmc-lib)
3434

35-
set(cbmc_version_files cbmc_parse_options.cpp cbmc_solvers.cpp)
36-
git_revision(cbmc-lib cbmc_version_files)
35+
git_revision(cbmc-lib)

src/cbmc/Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,15 @@ INCLUDES= -I ..
5656

5757
LIBS =
5858

59-
CBMC_VERSION_FILES = cbmc_solvers$(OBJEXT)
60-
6159
include ../config.inc
6260
include ../common
6361

6462
CLEANFILES = cbmc$(EXEEXT)
6563

6664
all: cbmc$(EXEEXT)
6765

66+
cbmc_solvers$(OBJEXT): $(GIT_INFO_FILE)
67+
6868
ifneq ($(wildcard ../bv_refinement/Makefile),)
6969
OBJ += ../bv_refinement/bv_refinement$(LIBEXT)
7070
CP_CXXFLAGS += -DHAVE_BV_REFINEMENT

src/cbmc/cbmc_parse_options.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ Author: Daniel Kroening, [email protected]
6464

6565
#include "xml_interface.h"
6666

67+
#include "version.h"
68+
6769
cbmc_parse_optionst::cbmc_parse_optionst(int argc, const char **argv):
6870
parse_options_baset(CBMC_OPTIONS, argc, argv),
6971
xml_interfacet(cmdline),

src/cbmc/cbmc_solvers.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ Author: Daniel Kroening, [email protected]
2828
#include "bv_cbmc.h"
2929
#include "cbmc_dimacs.h"
3030
#include "counterexample_beautification.h"
31+
#include "version.h"
3132

3233
/// Uses the options to pick an SMT 2.0 solver
3334
/// \return An smt2_dect::solvert giving the solver to use.

src/clobber/CMakeLists.txt

+1-2
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,4 @@ add_if_library(clobber-lib bv_refinement)
3030
add_executable(clobber clobber_main.cpp)
3131
target_link_libraries(clobber clobber-lib)
3232

33-
set(cbmc_version_files clobber_parse_options.cpp)
34-
git_revision(clobber-lib cbmc_version_files)
33+
git_revision(clobber-lib)

src/clobber/clobber_parse_options.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ Author: Daniel Kroening, [email protected]
3434

3535
#include <langapi/mode.h>
3636

37+
#include "version.h"
3738

3839
clobber_parse_optionst::clobber_parse_optionst(int argc, const char **argv):
3940
parse_options_baset(CLOBBER_OPTIONS, argc, argv),

src/common

+8-13
Original file line numberDiff line numberDiff line change
@@ -229,23 +229,18 @@ OBJ += $(patsubst %.cc, %$(OBJEXT), $(filter %.cc, $(SRC)))
229229

230230
# get version from git
231231
GIT_INFO = $(shell git describe --tags --always --dirty || echo "n/a")
232-
GIT_INFO_FILE = .release_info
232+
RELEASE_INFO = \#define CBMC_VERSION "$(CBMC_VERSION) ($(GIT_INFO))"
233+
GIT_INFO_FILE = version.h
233234

234-
CBMC_VERSION_FILES += $(filter %_parse_options$(OBJEXT), $(OBJ))
235+
$(GIT_INFO_FILE):
236+
echo '$(RELEASE_INFO)' > $@
235237

236-
ifeq ($(BUILD_ENV_),MSVC)
237-
$(CBMC_VERSION_FILES): CP_CXXFLAGS += /DCBMC_VERSION='"""$(CBMC_VERSION) ($(GIT_INFO))"""'
238-
else
239-
$(CBMC_VERSION_FILES): CP_CXXFLAGS += -DCBMC_VERSION="\"$(CBMC_VERSION) ($(GIT_INFO))\""
240-
endif
238+
$(filter %_parse_options$(OBJEXT), $(OBJ)): $(GIT_INFO_FILE)
241239

240+
# mark the actually generated file as a phony target to enforce a rebuild - but
241+
# only of the version information has changed!
242242
KNOWN_RELEASE_INFO = $(shell cat $(GIT_INFO_FILE) 2>/dev/null)
243-
ifneq ($(GIT_INFO), $(KNOWN_RELEASE_INFO))
244-
$(CBMC_VERSION_FILES): $(GIT_INFO_FILE)
245-
246-
$(GIT_INFO_FILE):
247-
echo $(GIT_INFO) > $@
248-
243+
ifneq ($(RELEASE_INFO), $(KNOWN_RELEASE_INFO))
249244
.PHONY: $(GIT_INFO_FILE)
250245
endif
251246

src/goto-analyzer/CMakeLists.txt

+1-2
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,4 @@ add_if_library(goto-analyzer-lib jsil)
2727
add_executable(goto-analyzer goto_analyzer_main.cpp)
2828
target_link_libraries(goto-analyzer goto-analyzer-lib)
2929

30-
set(cbmc_version_files goto_analyzer_parse_options.cpp)
31-
git_revision(goto-analyzer-lib cbmc_version_files)
30+
git_revision(goto-analyzer-lib)

src/goto-analyzer/goto_analyzer_parse_options.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ Author: Daniel Kroening, [email protected]
6161
#include "static_show_domain.h"
6262
#include "static_simplifier.h"
6363
#include "static_verifier.h"
64+
#include "version.h"
6465

6566
goto_analyzer_parse_optionst::goto_analyzer_parse_optionst(
6667
int argc,

src/goto-cc/CMakeLists.txt

+1-2
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,4 @@ else()
3535
goto-cc $<TARGET_FILE_DIR:goto-cc>/goto-gcc)
3636
endif()
3737

38-
set(cbmc_version_files as_mode.cpp compile.cpp gcc_mode.cpp goto_cc_mode.cpp)
39-
git_revision(goto-cc-lib cbmc_version_files)
38+
git_revision(goto-cc-lib)

src/goto-cc/Makefile

+2-5
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,6 @@ LIBS =
3838

3939
CLEANFILES = goto-cc$(EXEEXT) goto-cl$(EXEEXT)
4040

41-
CBMC_VERSION_FILES = as_mode$(OBJEXT) \
42-
compile$(OBJEXT) \
43-
gcc_mode$(OBJEXT) \
44-
goto_cc_mode$(OBJEXT)
45-
4641
include ../config.inc
4742
include ../common
4843

@@ -51,6 +46,8 @@ all: goto-cl$(EXEEXT)
5146
endif
5247
all: goto-cc$(EXEEXT)
5348

49+
as_mode$(OBJEXT) compile$(OBJEXT) gcc_mode$(OBJEXT) goto_cc_mode$(OBJEXT): $(GIT_INFO_FILE)
50+
5451
ifneq ($(wildcard ../jsil/Makefile),)
5552
OBJ += ../jsil/jsil$(LIBEXT)
5653
CP_CXXFLAGS += -DHAVE_JSIL

src/goto-cc/as_mode.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ Author: Michael Tautschnig
3030
#include <util/cout_message.h>
3131

3232
#include "compile.h"
33+
#include "version.h"
3334

3435
static std::string assembler_name(
3536
const cmdlinet &cmdline,

src/goto-cc/compile.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ Date: June 2006
6363
#define pclose _pclose
6464
#endif
6565

66+
#include "version.h"
67+
6668
/// reads and source and object files, compiles and links them into goto program
6769
/// objects.
6870
/// \return true on error, false otherwise

src/goto-cc/gcc_mode.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ Author: CM Wintersteiger, 2006
4848

4949
#include "hybrid_binary.h"
5050
#include "linker_script_merge.h"
51+
#include "version.h"
5152

5253
static std::string compiler_name(
5354
const cmdlinet &cmdline,

src/goto-cc/goto_cc_mode.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ Author: CM Wintersteiger, 2006
2424

2525
#include <util/parse_options.h>
2626

27+
#include "version.h"
28+
2729
/// constructor
2830
goto_cc_modet::goto_cc_modet(
2931
goto_cc_cmdlinet &_cmdline,

src/goto-diff/CMakeLists.txt

+1-2
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,4 @@ add_if_library(goto-diff-lib jsil)
2929
add_executable(goto-diff goto_diff_main.cpp)
3030
target_link_libraries(goto-diff goto-diff-lib)
3131

32-
set(cbmc_version_files goto_diff_parse_options.cpp)
33-
git_revision(goto-diff-lib cbmc_version_files)
32+
git_revision(goto-diff-lib)

src/goto-diff/goto_diff_parse_options.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ Author: Peter Schrammel
5959
#include "syntactic_diff.h"
6060
#include "unified_diff.h"
6161
#include "change_impact.h"
62+
#include "version.h"
6263

6364
goto_diff_parse_optionst::goto_diff_parse_optionst(int argc, const char **argv):
6465
parse_options_baset(GOTO_DIFF_OPTIONS, argc, argv),

src/goto-instrument/CMakeLists.txt

+1-2
Original file line numberDiff line numberDiff line change
@@ -33,5 +33,4 @@ add_if_library(goto-instrument-lib glpk)
3333
add_executable(goto-instrument goto_instrument_main.cpp)
3434
target_link_libraries(goto-instrument goto-instrument-lib)
3535

36-
set(cbmc_version_files "goto_instrument_parse_options.cpp")
37-
git_revision(goto-instrument-lib cbmc_version_files)
36+
git_revision(goto-instrument-lib)

src/goto-instrument/goto_instrument_parse_options.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ Author: Daniel Kroening, [email protected]
9898
#include "undefined_functions.h"
9999
#include "remove_function.h"
100100
#include "splice_call.h"
101+
#include "version.h"
101102

102103
/// invoke main modules
103104
int goto_instrument_parse_optionst::doit()

src/memory-models/CMakeLists.txt

+1-2
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,4 @@ generic_includes(mmcc)
1212

1313
target_link_libraries(mmcc util)
1414

15-
set(cbmc_version_files mmcc_parse_options.cpp)
16-
git_revision(mmcc cbmc_version_files)
15+
git_revision(mmcc)

src/memory-models/mmcc_parse_options.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ Author: Daniel Kroening, [email protected]
1818

1919
#include "mm_parser.h"
2020
#include "mm2cpp.h"
21+
#include "version.h"
2122

2223
mmcc_parse_optionst::mmcc_parse_optionst(int argc, const char **argv):
2324
parse_options_baset(MMCC_OPTIONS, argc, argv)

0 commit comments

Comments
 (0)