Skip to content

Commit

Permalink
Build identification strings
Browse files Browse the repository at this point in the history
All client version information is moved to version.cpp, which optionally
(-DHAVE_BUILD_INFO) includes build.h. build.h is automatically generated
on supporting platforms via contrib/genbuild.sh, using git describe.

The git export-subst attribute is used to put the commit id statically
in version.cpp inside generated archives, and this value is used if no
build.h is present.

The gitian descriptors are modified to use git archive instead of a
copy, to create the src/ directory in the output. This way,
src/src/version.cpp will contain the static commit id. To prevent
gitian builds from getting the "-dirty" marker in their git-describe
generated identifiers, no touching of files or running sed on the
makefile is performed anymore. This does not seem to influence
determinism.
  • Loading branch information
sipa committed Apr 10, 2012
1 parent 138d08c commit a20c0d0
Show file tree
Hide file tree
Showing 20 changed files with 193 additions and 31 deletions.
1 change: 1 addition & 0 deletions .gitattributes
@@ -0,0 +1 @@
src/version.cpp export-subst
1 change: 1 addition & 0 deletions .gitignore
@@ -1,6 +1,7 @@
src/*.exe
src/bitcoin
src/bitcoind
src/build.h
.*.swp
*.*~*
*.bak
Expand Down
10 changes: 10 additions & 0 deletions bitcoin-qt.pro
Expand Up @@ -80,6 +80,15 @@ contains(BITCOIN_NEED_QT_PLUGINS, 1) {
# do not enable this on windows, as it will result in a non-working executable!
}

# regenerate src/build.h
!windows || contains(USE_BUILD_INFO, 1) {
genbuild.commands = share/genbuild.sh src/build.h
genbuild.target = src/build.h
"src/version.cpp".depends += src/build.h
QMAKE_EXTRA_TARGETS += genbuild
DEFINES += HAVE_BUILD_INFO
}

# disable quite some warnings because bitcoin core "sins" a lot
QMAKE_CXXFLAGS_WARN_ON = -fdiagnostics-show-option -Wall -Wno-strict-aliasing -Wno-invalid-offsetof -Wno-unused-variable -Wno-unused-parameter -Wno-sign-compare -Wno-char-subscripts -Wno-unused-value -Wno-sequence-point -Wno-parentheses -Wno-unknown-pragmas -Wno-switch

Expand Down Expand Up @@ -161,6 +170,7 @@ SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \
src/qt/aboutdialog.cpp \
src/qt/editaddressdialog.cpp \
src/qt/bitcoinaddressvalidator.cpp \
src/version.cpp \
src/util.cpp \
src/netbase.cpp \
src/key.cpp \
Expand Down
19 changes: 12 additions & 7 deletions contrib/gitian-descriptors/gitian-win32.yml
Expand Up @@ -45,25 +45,30 @@ script: |
#
cd bitcoin
mkdir -p $OUTDIR/src
cp -a . $OUTDIR/src
rm -rf $OUTDIR/src/.git
git archive HEAD | tar -x -C $OUTDIR/src
cp $OUTDIR/src/doc/README_windows.txt $OUTDIR/readme.txt
cp $OUTDIR/src/COPYING $OUTDIR/license.txt
export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
export FAKETIME=$REFERENCE_DATETIME
export TZ=UTC
$HOME/qt/src/bin/qmake -spec unsupported/win32-g++-cross MINIUPNPC_LIB_PATH=$HOME/build/miniupnpc MINIUPNPC_INCLUDE_PATH=$HOME/build/ BDB_LIB_PATH=$HOME/build/db-4.8.30.NC/build_unix BDB_INCLUDE_PATH=$HOME/build/db-4.8.30.NC/build_unix BOOST_LIB_PATH=$HOME/build/boost_1_47_0/stage/lib BOOST_INCLUDE_PATH=$HOME/build/boost_1_47_0 BOOST_LIB_SUFFIX=-mt-s BOOST_THREAD_LIB_SUFFIX=_win32-mt-s OPENSSL_LIB_PATH=$HOME/build/openssl-1.0.0e OPENSSL_INCLUDE_PATH=$HOME/build/openssl-1.0.0e/include QRENCODE_LIB_PATH=$HOME/build/qrencode-3.2.0/.libs QRENCODE_INCLUDE_PATH=$HOME/build/qrencode-3.2.0 USE_QRCODE=1 INCLUDEPATH=$HOME/build DEFINES=BOOST_THREAD_USE_LIB BITCOIN_NEED_QT_PLUGINS=1 QMAKE_LRELEASE=lrelease QMAKE_CXXFLAGS=-frandom-seed=bitcoin QMAKE_LFLAGS=-frandom-seed=bitcoin
$HOME/qt/src/bin/qmake -spec unsupported/win32-g++-cross MINIUPNPC_LIB_PATH=$HOME/build/miniupnpc MINIUPNPC_INCLUDE_PATH=$HOME/build/ BDB_LIB_PATH=$HOME/build/db-4.8.30.NC/build_unix BDB_INCLUDE_PATH=$HOME/build/db-4.8.30.NC/build_unix BOOST_LIB_PATH=$HOME/build/boost_1_47_0/stage/lib BOOST_INCLUDE_PATH=$HOME/build/boost_1_47_0 BOOST_LIB_SUFFIX=-mt-s BOOST_THREAD_LIB_SUFFIX=_win32-mt-s OPENSSL_LIB_PATH=$HOME/build/openssl-1.0.0e OPENSSL_INCLUDE_PATH=$HOME/build/openssl-1.0.0e/include QRENCODE_LIB_PATH=$HOME/build/qrencode-3.2.0/.libs QRENCODE_INCLUDE_PATH=$HOME/build/qrencode-3.2.0 USE_QRCODE=1 INCLUDEPATH=$HOME/build DEFINES=BOOST_THREAD_USE_LIB BITCOIN_NEED_QT_PLUGINS=1 QMAKE_LRELEASE=lrelease QMAKE_CXXFLAGS=-frandom-seed=bitcoin QMAKE_LFLAGS=-frandom-seed=bitcoin USE_BUILD_INFO=1
make $MAKEOPTS
cp release/bitcoin-qt.exe $OUTDIR/
#
cd src
sed 's/$(DEBUGFLAGS)/-frandom-seed=bitcoin/' -i makefile.linux-mingw
export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1
export FAKETIME=$REFERENCE_DATETIME
export TZ=UTC
make -f makefile.linux-mingw $MAKEOPTS DEPSDIR=$HOME/build bitcoind.exe USE_UPNP=0
make -f makefile.linux-mingw $MAKEOPTS DEPSDIR=$HOME/build bitcoind.exe USE_UPNP=0 DEBUGFLAGS="-frandom-seed=bitcoin"
i586-mingw32msvc-strip bitcoind.exe
makensis ../share/setup.nsi
cp ../share/bitcoin-*-win32-setup.exe $OUTDIR/
mkdir $OUTDIR/daemon
cp bitcoind.exe $OUTDIR/daemon
cd ..
mkdir nsis
git archive HEAD | tar -x -C nsis
cd nsis/src
mkdir ../release
cp ../../release/* ../release/
cp ../../src/*.exe .
makensis ../share/setup.nsi
cp ../share/bitcoin-*-win32-setup.exe $OUTDIR/
6 changes: 2 additions & 4 deletions contrib/gitian-descriptors/gitian.yml
Expand Up @@ -42,13 +42,11 @@ script: |
#
cd bitcoin
mkdir -p $OUTDIR/src
cp -a . $OUTDIR/src
rm -rf $OUTDIR/src/.git
git archive HEAD | tar -x -C $OUTDIR/src
cp $OUTDIR/src/doc/README $OUTDIR
cp $OUTDIR/src/COPYING $OUTDIR
cd src
sed 's/$(DEBUGFLAGS)//' -i makefile.unix
make -f makefile.unix STATIC=1 OPENSSL_INCLUDE_PATH="$INSTDIR/include" OPENSSL_LIB_PATH="$INSTDIR/lib" $MAKEOPTS bitcoind USE_UPNP=0
make -f makefile.unix STATIC=1 OPENSSL_INCLUDE_PATH="$INSTDIR/include" OPENSSL_LIB_PATH="$INSTDIR/lib" $MAKEOPTS bitcoind USE_UPNP=0 DEBUGFLAGS=
mkdir -p $OUTDIR/bin/$GBUILD_BITS
install -s bitcoind $OUTDIR/bin/$GBUILD_BITS
cd ..
Expand Down
2 changes: 1 addition & 1 deletion doc/release-process.txt
Expand Up @@ -2,7 +2,7 @@

* update (commit) version in sources
bitcoin-qt.pro
src/main.h (CLIENT_VERSION : PROTOCOL_VERSION in serialize.h is updated only on protocol changes)
src/version.cpp
share/setup.nsi
doc/README*

Expand Down
35 changes: 35 additions & 0 deletions share/genbuild.sh
@@ -0,0 +1,35 @@
#!/bin/sh

if [ $# -gt 0 ]; then
FILE="$1"
shift
if [ -f "$FILE" ]; then
INFO="$(head -n 1 "$FILE")"
fi
else
echo "Usage: $0 <filename>"
exit 1
fi

if [ -e "$(which git)" ]; then
# clean 'dirty' status of touched files that haven't been modified
git diff >/dev/null 2>/dev/null

# get a string like "v0.6.0-66-g59887e8-dirty"
DESC="$(git describe --dirty 2>/dev/null)"

# get a string like "2012-04-10 16:27:19 +0200"
TIME="$(git log -n 1 --format="%ci")"
fi

if [ -n "$DESC" ]; then
NEWINFO="#define BUILD_DESC \"$DESC\""
else
NEWINFO="// No build information available"
fi

# only update build.h if necessary
if [ "$INFO" != "$NEWINFO" ]; then
echo "$NEWINFO" >"$FILE"
echo "#define BUILD_DATE \"$TIME\"" >>"$FILE"
fi
2 changes: 1 addition & 1 deletion src/init.cpp
Expand Up @@ -307,7 +307,7 @@ bool AppInit2(int argc, char* argv[])
if (!fDebug && !pszSetDataDir[0])
ShrinkDebugFile();
printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
printf("Bitcoin version %s\n", FormatFullVersion().c_str());
printf("Bitcoin version %s (%s)\n", FormatFullVersion().c_str(), CLIENT_DATE.c_str());
printf("Default data directory %s\n", GetDefaultDataDir().c_str());

if (GetBoolArg("-loadblockindextest"))
Expand Down
5 changes: 0 additions & 5 deletions src/main.cpp
Expand Up @@ -18,11 +18,6 @@ using namespace boost;
// Global state
//

// Name of client reported in the 'version' message. Report the same name
// for both bitcoind and bitcoin-qt, to make it harder for attackers to
// target servers or GUI users specifically.
const std::string CLIENT_NAME("Satoshi");

CCriticalSection cs_setpwalletRegistered;
set<CWallet*> setpwalletRegistered;

Expand Down
5 changes: 1 addition & 4 deletions src/main.h
Expand Up @@ -10,6 +10,7 @@
#include "key.h"
#include "script.h"
#include "db.h"
#include "version.h"

#ifdef WIN32
#include <io.h> /* for _commit */
Expand All @@ -30,10 +31,6 @@ class CInv;
class CRequestTracker;
class CNode;

static const int CLIENT_VERSION = 60099;
static const bool VERSION_IS_BETA = true;
extern const std::string CLIENT_NAME;

static const unsigned int MAX_BLOCK_SIZE = 1000000;
static const unsigned int MAX_BLOCK_SIZE_GEN = MAX_BLOCK_SIZE/2;
static const int MAX_BLOCK_SIGOPS = MAX_BLOCK_SIZE/50;
Expand Down
10 changes: 9 additions & 1 deletion src/makefile.linux-mingw
Expand Up @@ -43,6 +43,7 @@ LIBS += -l mingwthrd -l kernel32 -l user32 -l gdi32 -l comdlg32 -l winspool -l w
HEADERS = $(wildcard *.h)

OBJS= \
obj/version.o \
obj/checkpoints.o \
obj/netbase.o \
obj/addrman.o \
Expand All @@ -64,10 +65,14 @@ OBJS= \

all: bitcoind.exe

build.h: FORCE
@../share/genbuild.sh build.h
DEFS += -DHAVE_BUILD_INFO

obj/%.o: %.cpp $(HEADERS)
i586-mingw32msvc-g++ -c $(CFLAGS) -o $@ $<

bitcoind.exe: $(OBJS:obj/%=obj/%)
bitcoind.exe: build.h $(OBJS:obj/%=obj/%)
i586-mingw32msvc-g++ $(CFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS)


Expand All @@ -85,3 +90,6 @@ clean:
-rm -f headers.h.gch
-rm -f bitcoind.exe
-rm -f test_bitcoin.exe
-rm -f src/build.h

FORCE:
2 changes: 2 additions & 0 deletions src/makefile.mingw
Expand Up @@ -41,6 +41,7 @@ LIBS += -l kernel32 -l user32 -l gdi32 -l comdlg32 -l winspool -l winmm -l shell
HEADERS = $(wildcard *.h)

OBJS= \
obj/version.o \
obj/checkpoints.o \
obj/netbase.o \
obj/addrman.o \
Expand Down Expand Up @@ -82,3 +83,4 @@ clean:
-del /Q obj\test\*
-del /Q test\*.o
-del /Q headers.h.gch
-del /Q build.h
10 changes: 9 additions & 1 deletion src/makefile.osx
Expand Up @@ -65,6 +65,7 @@ CFLAGS += -Wextra -Wno-sign-compare -Wno-char-subscripts -Wno-invalid-offsetof -
$(DEBUGFLAGS) $(DEFS) $(INCLUDEPATHS)

OBJS= \
obj/version.o \
obj/checkpoints.o \
obj/netbase.o \
obj/addrman.o \
Expand Down Expand Up @@ -99,14 +100,18 @@ all: bitcoind
-include obj/*.P
-include obj-test/*.P

build.h: FORCE
@../share/genbuild.sh build.h
DEFS += -DHAVE_BUILD_INFO

obj/%.o: %.cpp
$(CXX) -c $(CFLAGS) -MMD -o $@ $<
@cp $(@:%.o=%.d) $(@:%.o=%.P); \
sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
-e '/^$$/ d' -e 's/$$/ :/' < $(@:%.o=%.d) >> $(@:%.o=%.P); \
rm -f $(@:%.o=%.d)

bitcoind: $(OBJS:obj/%=obj/%)
bitcoind: build.h $(OBJS:obj/%=obj/%)
$(CXX) $(CFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS)

TESTOBJS := $(patsubst test/%.cpp,obj-test/%.o,$(wildcard test/*.cpp))
Expand All @@ -127,3 +132,6 @@ clean:
-rm -f obj-test/*.o
-rm -f obj/*.P
-rm -f obj-test/*.P
-rm -f src/build.h

FORCE:
10 changes: 9 additions & 1 deletion src/makefile.unix
Expand Up @@ -85,6 +85,7 @@ xCXXFLAGS=-pthread -Wextra -Wno-sign-compare -Wno-char-subscripts -Wno-invalid-o
$(DEBUGFLAGS) $(DEFS) $(HARDENING) $(CXXFLAGS)

OBJS= \
obj/version.o \
obj/checkpoints.o \
obj/netbase.o \
obj/addrman.o \
Expand All @@ -111,14 +112,18 @@ all: bitcoind
-include obj/*.P
-include obj-test/*.P

build.h: FORCE
@../share/genbuild.sh build.h
DEFS += -DHAVE_BUILD_INFO

obj/%.o: %.cpp
$(CXX) -c $(xCXXFLAGS) -MMD -o $@ $<
@cp $(@:%.o=%.d) $(@:%.o=%.P); \
sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
-e '/^$$/ d' -e 's/$$/ :/' < $(@:%.o=%.d) >> $(@:%.o=%.P); \
rm -f $(@:%.o=%.d)

bitcoind: $(OBJS:obj/%=obj/%)
bitcoind: build.h $(OBJS:obj/%=obj/%)
$(CXX) $(xCXXFLAGS) -o $@ $^ $(LDFLAGS) $(LIBS)

TESTOBJS := $(patsubst test/%.cpp,obj-test/%.o,$(wildcard test/*.cpp))
Expand All @@ -139,3 +144,6 @@ clean:
-rm -f obj-test/*.o
-rm -f obj/*.P
-rm -f obj-test/*.P
-rm -f src/build.h

FORCE:
2 changes: 2 additions & 0 deletions src/qt/aboutdialog.cpp
Expand Up @@ -2,6 +2,8 @@
#include "ui_aboutdialog.h"
#include "clientmodel.h"

#include "version.h"

AboutDialog::AboutDialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::AboutDialog)
Expand Down
5 changes: 5 additions & 0 deletions src/qt/clientmodel.cpp
Expand Up @@ -88,3 +88,8 @@ QString ClientModel::formatFullVersion() const
{
return QString::fromStdString(FormatFullVersion());
}

QString ClientModel::formatBuildDate() const
{
return QString::fromStdString(CLIENT_DATE);
}
1 change: 1 addition & 0 deletions src/qt/clientmodel.h
Expand Up @@ -37,6 +37,7 @@ class ClientModel : public QObject
QString getStatusBarWarnings() const;

QString formatFullVersion() const;
QString formatBuildDate() const;

private:
OptionsModel *optionsModel;
Expand Down
7 changes: 1 addition & 6 deletions src/util.cpp
Expand Up @@ -1061,12 +1061,7 @@ string FormatVersion(int nVersion)

string FormatFullVersion()
{
string s = FormatVersion(CLIENT_VERSION);
if (VERSION_IS_BETA) {
s += "-";
s += _("beta");
}
return s;
return CLIENT_BUILD;
}

// Format the subversion field according to BIP 14 spec (https://en.bitcoin.it/wiki/BIP_0014)
Expand Down

0 comments on commit a20c0d0

Please sign in to comment.