Add pending effective amount to rpc methods #232
752 changed files with 53108 additions and 20272 deletions
7
.gitignore
vendored
7
.gitignore
vendored
|
@ -86,15 +86,13 @@ src/test/buildenv.py
|
||||||
# Resources cpp
|
# Resources cpp
|
||||||
qrc_*.cpp
|
qrc_*.cpp
|
||||||
|
|
||||||
# Qt creator
|
|
||||||
*.pro.user
|
|
||||||
|
|
||||||
# Mac specific
|
# Mac specific
|
||||||
.DS_Store
|
.DS_Store
|
||||||
build
|
build
|
||||||
|
|
||||||
#lcov
|
#lcov
|
||||||
*.gcno
|
*.gcno
|
||||||
|
*.gcda
|
||||||
/*.info
|
/*.info
|
||||||
test_bitcoin.coverage/
|
test_bitcoin.coverage/
|
||||||
total.coverage/
|
total.coverage/
|
||||||
|
@ -108,6 +106,9 @@ qa/pull-tester/run-bitcoind-for-test.sh
|
||||||
qa/pull-tester/tests_config.py
|
qa/pull-tester/tests_config.py
|
||||||
qa/pull-tester/cache/*
|
qa/pull-tester/cache/*
|
||||||
qa/pull-tester/test.*/*
|
qa/pull-tester/test.*/*
|
||||||
|
qa/tmp
|
||||||
|
cache/
|
||||||
|
share/BitcoindComparisonTool.jar
|
||||||
|
|
||||||
!src/leveldb*/Makefile
|
!src/leveldb*/Makefile
|
||||||
|
|
||||||
|
|
21
.travis.yml
21
.travis.yml
|
@ -2,7 +2,13 @@
|
||||||
# - A travis bug causes caches to trample eachother when using the same
|
# - A travis bug causes caches to trample eachother when using the same
|
||||||
# compiler key (which we don't use anyway). This is worked around for now by
|
# compiler key (which we don't use anyway). This is worked around for now by
|
||||||
# replacing the "compilers" with a build name prefixed by the no-op ":"
|
# replacing the "compilers" with a build name prefixed by the no-op ":"
|
||||||
# command. See: https://github.com/travis-ci/casher/issues/6
|
# command. See: https://github.com/travis-ci/travis-ci/issues/4393
|
||||||
|
# - sudo/dist/group are set so as to get Blue Box VMs, necessary for [loopback]
|
||||||
|
# IPv6 support
|
||||||
|
|
||||||
|
sudo: required
|
||||||
|
dist: precise
|
||||||
|
group: legacy
|
||||||
|
|
||||||
os: linux
|
os: linux
|
||||||
language: cpp
|
language: cpp
|
||||||
|
@ -11,6 +17,7 @@ env:
|
||||||
global:
|
global:
|
||||||
- MAKEJOBS=-j3
|
- MAKEJOBS=-j3
|
||||||
- RUN_TESTS=false
|
- RUN_TESTS=false
|
||||||
|
- CHECK_DOC=0
|
||||||
- BOOST_TEST_RANDOM=1$TRAVIS_BUILD_ID
|
- BOOST_TEST_RANDOM=1$TRAVIS_BUILD_ID
|
||||||
- CCACHE_SIZE=100M
|
- CCACHE_SIZE=100M
|
||||||
- CCACHE_TEMPDIR=/tmp/.ccache-temp
|
- CCACHE_TEMPDIR=/tmp/.ccache-temp
|
||||||
|
@ -29,7 +36,7 @@ matrix:
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
include:
|
include:
|
||||||
- compiler: ": ARM"
|
- compiler: ": ARM"
|
||||||
env: HOST=arm-linux-gnueabihf PACKAGES="g++-arm-linux-gnueabihf" DEP_OPTS="NO_QT=1" GOAL="install" BITCOIN_CONFIG="--enable-glibc-back-compat --enable-reduce-exports"
|
env: HOST=arm-linux-gnueabihf PACKAGES="g++-arm-linux-gnueabihf" DEP_OPTS="NO_QT=1" CHECK_DOC=1 GOAL="install" BITCOIN_CONFIG="--enable-glibc-back-compat --enable-reduce-exports"
|
||||||
- compiler: ": Win32"
|
- compiler: ": Win32"
|
||||||
env: HOST=i686-w64-mingw32 PPA="ppa:ubuntu-wine/ppa" PACKAGES="nsis gcc-mingw-w64-i686 g++-mingw-w64-i686 binutils-mingw-w64-i686 mingw-w64-dev wine1.7 bc" RUN_TESTS=true GOAL="deploy" BITCOIN_CONFIG="--enable-gui --enable-reduce-exports" MAKEJOBS="-j2"
|
env: HOST=i686-w64-mingw32 PPA="ppa:ubuntu-wine/ppa" PACKAGES="nsis gcc-mingw-w64-i686 g++-mingw-w64-i686 binutils-mingw-w64-i686 mingw-w64-dev wine1.7 bc" RUN_TESTS=true GOAL="deploy" BITCOIN_CONFIG="--enable-gui --enable-reduce-exports" MAKEJOBS="-j2"
|
||||||
- compiler: ": 32-bit + dash"
|
- compiler: ": 32-bit + dash"
|
||||||
|
@ -41,7 +48,7 @@ matrix:
|
||||||
- compiler: ": No wallet"
|
- compiler: ": No wallet"
|
||||||
env: HOST=x86_64-unknown-linux-gnu DEP_OPTS="NO_WALLET=1" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-glibc-back-compat --enable-reduce-exports"
|
env: HOST=x86_64-unknown-linux-gnu DEP_OPTS="NO_WALLET=1" RUN_TESTS=true GOAL="install" BITCOIN_CONFIG="--enable-glibc-back-compat --enable-reduce-exports"
|
||||||
- compiler: ": Cross-Mac"
|
- compiler: ": Cross-Mac"
|
||||||
env: HOST=x86_64-apple-darwin11 PACKAGES="cmake libcap-dev libz-dev libbz2-dev" BITCOIN_CONFIG="--enable-reduce-exports" OSX_SDK=10.9 GOAL="deploy"
|
env: HOST=x86_64-apple-darwin11 PACKAGES="cmake imagemagick libcap-dev librsvg2-bin libz-dev libbz2-dev libtiff-tools python-dev" BITCOIN_CONFIG="--enable-reduce-exports" OSX_SDK=10.9 GOAL="deploy"
|
||||||
exclude:
|
exclude:
|
||||||
- compiler: gcc
|
- compiler: gcc
|
||||||
install:
|
install:
|
||||||
|
@ -51,11 +58,13 @@ install:
|
||||||
- if [ -n "$PACKAGES" ]; then travis_retry sudo apt-get install --no-install-recommends --no-upgrade -qq $PACKAGES; fi
|
- if [ -n "$PACKAGES" ]; then travis_retry sudo apt-get install --no-install-recommends --no-upgrade -qq $PACKAGES; fi
|
||||||
before_script:
|
before_script:
|
||||||
- unset CC; unset CXX
|
- unset CC; unset CXX
|
||||||
|
- if [ "$CHECK_DOC" = 1 ]; then contrib/devtools/check-doc.py; fi
|
||||||
- mkdir -p depends/SDKs depends/sdk-sources
|
- mkdir -p depends/SDKs depends/sdk-sources
|
||||||
- if [ -n "$OSX_SDK" -a ! -f depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz ]; then wget $SDK_URL/MacOSX${OSX_SDK}.sdk.tar.gz -O depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz; fi
|
- if [ -n "$OSX_SDK" -a ! -f depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz ]; then curl --location --fail $SDK_URL/MacOSX${OSX_SDK}.sdk.tar.gz -o depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz; fi
|
||||||
- if [ -n "$OSX_SDK" -a -f depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz ]; then tar -C depends/SDKs -xf depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz; fi
|
- if [ -n "$OSX_SDK" -a -f depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz ]; then tar -C depends/SDKs -xf depends/sdk-sources/MacOSX${OSX_SDK}.sdk.tar.gz; fi
|
||||||
- make $MAKEJOBS -C depends HOST=$HOST $DEP_OPTS
|
- make $MAKEJOBS -C depends HOST=$HOST $DEP_OPTS
|
||||||
script:
|
script:
|
||||||
|
- export TRAVIS_COMMIT_LOG=`git log --format=fuller -1`
|
||||||
- if [ -n "$USE_SHELL" ]; then export CONFIG_SHELL="$USE_SHELL"; fi
|
- if [ -n "$USE_SHELL" ]; then export CONFIG_SHELL="$USE_SHELL"; fi
|
||||||
- OUTDIR=$BASE_OUTDIR/$TRAVIS_PULL_REQUEST/$TRAVIS_JOB_NUMBER-$HOST
|
- OUTDIR=$BASE_OUTDIR/$TRAVIS_PULL_REQUEST/$TRAVIS_JOB_NUMBER-$HOST
|
||||||
- BITCOIN_CONFIG_ALL="--disable-dependency-tracking --prefix=$TRAVIS_BUILD_DIR/depends/$HOST --bindir=$OUTDIR/bin --libdir=$OUTDIR/lib"
|
- BITCOIN_CONFIG_ALL="--disable-dependency-tracking --prefix=$TRAVIS_BUILD_DIR/depends/$HOST --bindir=$OUTDIR/bin --libdir=$OUTDIR/lib"
|
||||||
|
@ -69,6 +78,8 @@ script:
|
||||||
- make $MAKEJOBS $GOAL || ( echo "Build failure. Verbose build follows." && make $GOAL V=1 ; false )
|
- make $MAKEJOBS $GOAL || ( echo "Build failure. Verbose build follows." && make $GOAL V=1 ; false )
|
||||||
- export LD_LIBRARY_PATH=$TRAVIS_BUILD_DIR/depends/$HOST/lib
|
- export LD_LIBRARY_PATH=$TRAVIS_BUILD_DIR/depends/$HOST/lib
|
||||||
- if [ "$RUN_TESTS" = "true" ]; then make check; fi
|
- if [ "$RUN_TESTS" = "true" ]; then make check; fi
|
||||||
- if [ "$RUN_TESTS" = "true" ]; then qa/pull-tester/rpc-tests.py; fi
|
- if [ "$RUN_TESTS" = "true" ]; then qa/pull-tester/rpc-tests.py --coverage; fi
|
||||||
after_script:
|
after_script:
|
||||||
|
- echo $TRAVIS_COMMIT_RANGE
|
||||||
|
- echo $TRAVIS_COMMIT_LOG
|
||||||
- if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then (echo "Upload goes here. Something like: scp -r $BASE_OUTDIR server" || echo "upload failed"); fi
|
- if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then (echo "Upload goes here. Something like: scp -r $BASE_OUTDIR server" || echo "upload failed"); fi
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
[main]
|
[main]
|
||||||
host = https://www.transifex.com
|
host = https://www.transifex.com
|
||||||
|
|
||||||
[bitcoin.qt-translation-011x]
|
[bitcoin.qt-translation-012x]
|
||||||
file_filter = src/qt/locale/bitcoin_<lang>.ts
|
file_filter = src/qt/locale/bitcoin_<lang>.ts
|
||||||
source_file = src/qt/locale/bitcoin_en.ts
|
source_file = src/qt/locale/bitcoin_en.ts
|
||||||
source_lang = en
|
source_lang = en
|
||||||
|
|
|
@ -95,6 +95,8 @@ Anyone may participate in peer review which is expressed by comments in the pull
|
||||||
- Concept ACK means "I agree in the general principle of this pull request";
|
- Concept ACK means "I agree in the general principle of this pull request";
|
||||||
- Nit refers to trivial, often non-blocking issues.
|
- Nit refers to trivial, often non-blocking issues.
|
||||||
|
|
||||||
|
Reviewers should include the commit hash which they reviewed in their comments.
|
||||||
|
|
||||||
Project maintainers reserve the right to weigh the opinions of peer reviewers using common sense judgement and also may weight based on meritocracy: Those that have demonstrated a deeper commitment and understanding towards the project (over time) or have clear domain expertise may naturally have more weight, as one would expect in all walks of life.
|
Project maintainers reserve the right to weigh the opinions of peer reviewers using common sense judgement and also may weight based on meritocracy: Those that have demonstrated a deeper commitment and understanding towards the project (over time) or have clear domain expertise may naturally have more weight, as one would expect in all walks of life.
|
||||||
|
|
||||||
Where a patch set affects consensus critical code, the bar will be set much higher in terms of discussion and peer review requirements, keeping in mind that mistakes could be very costly to the wider community. This includes refactoring of consensus critical code.
|
Where a patch set affects consensus critical code, the bar will be set much higher in terms of discussion and peer review requirements, keeping in mind that mistakes could be very costly to the wider community. This includes refactoring of consensus critical code.
|
||||||
|
|
2
COPYING
2
COPYING
|
@ -1,6 +1,6 @@
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2009-2015 The Bitcoin Core developers
|
Copyright (c) 2009-2016 The Bitcoin Core developers
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
72
Makefile.am
72
Makefile.am
|
@ -3,43 +3,53 @@ SUBDIRS = src
|
||||||
.PHONY: deploy FORCE
|
.PHONY: deploy FORCE
|
||||||
|
|
||||||
GZIP_ENV="-9n"
|
GZIP_ENV="-9n"
|
||||||
|
export PYTHONPATH
|
||||||
|
|
||||||
if BUILD_BITCOIN_LIBS
|
if BUILD_BITCOIN_LIBS
|
||||||
pkgconfigdir = $(libdir)/pkgconfig
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
pkgconfig_DATA = libbitcoinconsensus.pc
|
pkgconfig_DATA = libbitcoinconsensus.pc
|
||||||
endif
|
endif
|
||||||
|
|
||||||
BITCOIND_BIN=$(top_builddir)/src/lbrycrdd$(EXEEXT)
|
BITCOIND_BIN=$(top_builddir)/src/$(BITCOIN_DAEMON_NAME)$(EXEEXT)
|
||||||
BITCOIN_QT_BIN=$(top_builddir)/src/qt/lbrycrd-qt$(EXEEXT)
|
BITCOIN_QT_BIN=$(top_builddir)/src/qt/$(BITCOIN_GUI_NAME)$(EXEEXT)
|
||||||
BITCOIN_CLI_BIN=$(top_builddir)/src/lbrycrd-cli$(EXEEXT)
|
BITCOIN_CLI_BIN=$(top_builddir)/src/$(BITCOIN_CLI_NAME)$(EXEEXT)
|
||||||
BITCOIN_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win$(WINDOWS_BITS)-setup$(EXEEXT)
|
BITCOIN_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win$(WINDOWS_BITS)-setup$(EXEEXT)
|
||||||
|
|
||||||
|
empty :=
|
||||||
|
space := $(empty) $(empty)
|
||||||
|
|
||||||
OSX_APP=Bitcoin-Qt.app
|
OSX_APP=Bitcoin-Qt.app
|
||||||
OSX_DMG=Bitcoin-Core.dmg
|
OSX_VOLNAME = $(subst $(space),-,$(PACKAGE_NAME))
|
||||||
|
OSX_DMG = $(OSX_VOLNAME).dmg
|
||||||
|
OSX_BACKGROUND_SVG=background.svg
|
||||||
OSX_BACKGROUND_IMAGE=background.tiff
|
OSX_BACKGROUND_IMAGE=background.tiff
|
||||||
|
OSX_BACKGROUND_IMAGE_DPIS=36 72
|
||||||
|
OSX_DSSTORE_GEN=$(top_srcdir)/contrib/macdeploy/custom_dsstore.py
|
||||||
OSX_DEPLOY_SCRIPT=$(top_srcdir)/contrib/macdeploy/macdeployqtplus
|
OSX_DEPLOY_SCRIPT=$(top_srcdir)/contrib/macdeploy/macdeployqtplus
|
||||||
OSX_FANCY_PLIST=$(top_srcdir)/contrib/macdeploy/fancy.plist
|
OSX_FANCY_PLIST=$(top_srcdir)/contrib/macdeploy/fancy.plist
|
||||||
OSX_BASE_LPROJ_DIR=$(top_srcdir)/contrib/macdeploy/Base.lproj/InfoPlist.strings
|
|
||||||
OSX_INSTALLER_ICONS=$(top_srcdir)/src/qt/res/icons/bitcoin.icns
|
OSX_INSTALLER_ICONS=$(top_srcdir)/src/qt/res/icons/bitcoin.icns
|
||||||
OSX_PLIST=$(top_srcdir)/share/qt/Info.plist #not installed
|
OSX_PLIST=$(top_srcdir)/share/qt/Info.plist #not installed
|
||||||
OSX_QT_TRANSLATIONS = da,de,es,hu,ru,uk,zh_CN,zh_TW
|
OSX_QT_TRANSLATIONS = da,de,es,hu,ru,uk,zh_CN,zh_TW
|
||||||
|
|
||||||
DIST_DOCS = $(wildcard doc/*.md) $(wildcard doc/release-notes/*.md)
|
DIST_DOCS = $(wildcard doc/*.md) $(wildcard doc/release-notes/*.md)
|
||||||
|
|
||||||
|
BIN_CHECKS=$(top_srcdir)/contrib/devtools/symbol-check.py \
|
||||||
|
$(top_srcdir)/contrib/devtools/security-check.py
|
||||||
|
|
||||||
WINDOWS_PACKAGING = $(top_srcdir)/share/pixmaps/bitcoin.ico \
|
WINDOWS_PACKAGING = $(top_srcdir)/share/pixmaps/bitcoin.ico \
|
||||||
$(top_srcdir)/share/pixmaps/nsis-header.bmp \
|
$(top_srcdir)/share/pixmaps/nsis-header.bmp \
|
||||||
$(top_srcdir)/share/pixmaps/nsis-wizard.bmp \
|
$(top_srcdir)/share/pixmaps/nsis-wizard.bmp \
|
||||||
$(top_srcdir)/doc/README_windows.txt
|
$(top_srcdir)/doc/README_windows.txt
|
||||||
|
|
||||||
OSX_PACKAGING = $(OSX_DEPLOY_SCRIPT) $(OSX_FANCY_PLIST) $(OSX_INSTALLER_ICONS) $(OSX_BASE_LPROJ_DIR) \
|
OSX_PACKAGING = $(OSX_DEPLOY_SCRIPT) $(OSX_FANCY_PLIST) $(OSX_INSTALLER_ICONS) \
|
||||||
$(top_srcdir)/contrib/macdeploy/$(OSX_BACKGROUND_IMAGE) \
|
$(top_srcdir)/contrib/macdeploy/$(OSX_BACKGROUND_SVG) \
|
||||||
$(top_srcdir)/contrib/macdeploy/DS_Store \
|
$(OSX_DSSTORE_GEN) \
|
||||||
$(top_srcdir)/contrib/macdeploy/detached-sig-apply.sh \
|
$(top_srcdir)/contrib/macdeploy/detached-sig-apply.sh \
|
||||||
$(top_srcdir)/contrib/macdeploy/detached-sig-create.sh
|
$(top_srcdir)/contrib/macdeploy/detached-sig-create.sh
|
||||||
|
|
||||||
COVERAGE_INFO = baseline_filtered_combined.info baseline.info block_test.info \
|
COVERAGE_INFO = baseline_filtered_combined.info baseline.info block_test.info \
|
||||||
leveldb_baseline.info test_bitcoin_filtered.info total_coverage.info \
|
leveldb_baseline.info test_bitcoin_filtered.info total_coverage.info \
|
||||||
baseline_filtered.info block_test_filtered.info \
|
baseline_filtered.info block_test_filtered.info rpc_test.info rpc_test_filtered.info \
|
||||||
leveldb_baseline_filtered.info test_bitcoin_coverage.info test_bitcoin.info
|
leveldb_baseline_filtered.info test_bitcoin_coverage.info test_bitcoin.info
|
||||||
|
|
||||||
dist-hook:
|
dist-hook:
|
||||||
|
@ -87,17 +97,20 @@ $(OSX_APP)/Contents/MacOS/Bitcoin-Qt: $(BITCOIN_QT_BIN)
|
||||||
$(MKDIR_P) $(@D)
|
$(MKDIR_P) $(@D)
|
||||||
STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $< $@
|
STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $< $@
|
||||||
|
|
||||||
$(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings: $(OSX_BASE_LPROJ_DIR)
|
$(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings:
|
||||||
$(MKDIR_P) $(@D)
|
$(MKDIR_P) $(@D)
|
||||||
$(INSTALL_DATA) $< $@
|
echo '{ CFBundleDisplayName = "$(PACKAGE_NAME)"; CFBundleName = "$(PACKAGE_NAME)"; }' > $@
|
||||||
|
|
||||||
OSX_APP_BUILT=$(OSX_APP)/Contents/PkgInfo $(OSX_APP)/Contents/Resources/empty.lproj \
|
OSX_APP_BUILT=$(OSX_APP)/Contents/PkgInfo $(OSX_APP)/Contents/Resources/empty.lproj \
|
||||||
$(OSX_APP)/Contents/Resources/bitcoin.icns $(OSX_APP)/Contents/Info.plist \
|
$(OSX_APP)/Contents/Resources/bitcoin.icns $(OSX_APP)/Contents/Info.plist \
|
||||||
$(OSX_APP)/Contents/MacOS/Bitcoin-Qt $(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings
|
$(OSX_APP)/Contents/MacOS/Bitcoin-Qt $(OSX_APP)/Contents/Resources/Base.lproj/InfoPlist.strings
|
||||||
|
|
||||||
|
osx_volname:
|
||||||
|
echo $(OSX_VOLNAME) >$@
|
||||||
|
|
||||||
if BUILD_DARWIN
|
if BUILD_DARWIN
|
||||||
$(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING)
|
$(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING)
|
||||||
$(OSX_DEPLOY_SCRIPT) $(OSX_APP) -add-qt-tr $(OSX_QT_TRANSLATIONS) -translations-dir=$(QT_TRANSLATION_DIR) -dmg -fancy $(OSX_FANCY_PLIST) -verbose 2
|
$(PYTHON) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -add-qt-tr $(OSX_QT_TRANSLATIONS) -translations-dir=$(QT_TRANSLATION_DIR) -dmg -fancy $(OSX_FANCY_PLIST) -verbose 2 -volname $(OSX_VOLNAME)
|
||||||
|
|
||||||
deploydir: $(OSX_DMG)
|
deploydir: $(OSX_DMG)
|
||||||
else
|
else
|
||||||
|
@ -111,16 +124,20 @@ $(APP_DIST_DIR)/Applications:
|
||||||
$(APP_DIST_EXTRAS): $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Bitcoin-Qt
|
$(APP_DIST_EXTRAS): $(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Bitcoin-Qt
|
||||||
|
|
||||||
$(OSX_DMG): $(APP_DIST_EXTRAS)
|
$(OSX_DMG): $(APP_DIST_EXTRAS)
|
||||||
$(GENISOIMAGE) -no-cache-inodes -D -l -probe -V "Bitcoin-Core" -no-pad -r -apple -o $@ dist
|
$(GENISOIMAGE) -no-cache-inodes -D -l -probe -V "$(OSX_VOLNAME)" -no-pad -r -dir-mode 0755 -apple -o $@ dist
|
||||||
|
|
||||||
$(APP_DIST_DIR)/.background/$(OSX_BACKGROUND_IMAGE): contrib/macdeploy/$(OSX_BACKGROUND_IMAGE)
|
dpi%.$(OSX_BACKGROUND_IMAGE): contrib/macdeploy/$(OSX_BACKGROUND_SVG)
|
||||||
|
sed 's/PACKAGE_NAME/$(PACKAGE_NAME)/' < "$<" | $(RSVG_CONVERT) -f png -d $* -p $* | $(IMAGEMAGICK_CONVERT) - $@
|
||||||
|
OSX_BACKGROUND_IMAGE_DPIFILES := $(foreach dpi,$(OSX_BACKGROUND_IMAGE_DPIS),dpi$(dpi).$(OSX_BACKGROUND_IMAGE))
|
||||||
|
$(APP_DIST_DIR)/.background/$(OSX_BACKGROUND_IMAGE): $(OSX_BACKGROUND_IMAGE_DPIFILES)
|
||||||
$(MKDIR_P) $(@D)
|
$(MKDIR_P) $(@D)
|
||||||
$(INSTALL) $< $@
|
$(TIFFCP) -c none $(OSX_BACKGROUND_IMAGE_DPIFILES) $@
|
||||||
$(APP_DIST_DIR)/.DS_Store: contrib/macdeploy/DS_Store
|
|
||||||
$(INSTALL) $< $@
|
$(APP_DIST_DIR)/.DS_Store: $(OSX_DSSTORE_GEN)
|
||||||
|
$(PYTHON) $< "$@" "$(OSX_VOLNAME)"
|
||||||
|
|
||||||
$(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Bitcoin-Qt: $(OSX_APP_BUILT) $(OSX_PACKAGING)
|
$(APP_DIST_DIR)/$(OSX_APP)/Contents/MacOS/Bitcoin-Qt: $(OSX_APP_BUILT) $(OSX_PACKAGING)
|
||||||
INSTALLNAMETOOL=$(INSTALLNAMETOOL) OTOOL=$(OTOOL) STRIP=$(STRIP) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -translations-dir=$(QT_TRANSLATION_DIR) -add-qt-tr $(OSX_QT_TRANSLATIONS) -verbose 2
|
INSTALLNAMETOOL=$(INSTALLNAMETOOL) OTOOL=$(OTOOL) STRIP=$(STRIP) $(PYTHON) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -translations-dir=$(QT_TRANSLATION_DIR) -add-qt-tr $(OSX_QT_TRANSLATIONS) -verbose 2
|
||||||
|
|
||||||
deploydir: $(APP_DIST_EXTRAS)
|
deploydir: $(APP_DIST_EXTRAS)
|
||||||
endif
|
endif
|
||||||
|
@ -170,7 +187,7 @@ test_bitcoin_filtered.info: test_bitcoin.info
|
||||||
|
|
||||||
block_test.info: test_bitcoin_filtered.info
|
block_test.info: test_bitcoin_filtered.info
|
||||||
$(MKDIR_P) qa/tmp
|
$(MKDIR_P) qa/tmp
|
||||||
-@TIMEOUT=15 qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool 0
|
-@TIMEOUT=15 qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool $(COMPARISON_TOOL_REORG_TESTS)
|
||||||
$(LCOV) -c -d $(abs_builddir)/src --t BitcoinJBlockTest -o $@
|
$(LCOV) -c -d $(abs_builddir)/src --t BitcoinJBlockTest -o $@
|
||||||
$(LCOV) -z -d $(abs_builddir)/src
|
$(LCOV) -z -d $(abs_builddir)/src
|
||||||
$(LCOV) -z -d $(abs_builddir)/src/leveldb
|
$(LCOV) -z -d $(abs_builddir)/src/leveldb
|
||||||
|
@ -178,11 +195,20 @@ block_test.info: test_bitcoin_filtered.info
|
||||||
block_test_filtered.info: block_test.info
|
block_test_filtered.info: block_test.info
|
||||||
$(LCOV) -r $< "/usr/include/*" -o $@
|
$(LCOV) -r $< "/usr/include/*" -o $@
|
||||||
|
|
||||||
|
rpc_test.info: test_bitcoin_filtered.info
|
||||||
|
-@TIMEOUT=15 python qa/pull-tester/rpc-tests.py $(EXTENDED_RPC_TESTS)
|
||||||
|
$(LCOV) -c -d $(abs_builddir)/src --t rpc-tests -o $@
|
||||||
|
$(LCOV) -z -d $(abs_builddir)/src
|
||||||
|
$(LCOV) -z -d $(abs_builddir)/src/leveldb
|
||||||
|
|
||||||
|
rpc_test_filtered.info: rpc_test.info
|
||||||
|
$(LCOV) -r $< "/usr/include/*" -o $@
|
||||||
|
|
||||||
test_bitcoin_coverage.info: baseline_filtered_combined.info test_bitcoin_filtered.info
|
test_bitcoin_coverage.info: baseline_filtered_combined.info test_bitcoin_filtered.info
|
||||||
$(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_bitcoin_filtered.info -o $@
|
$(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_bitcoin_filtered.info -o $@
|
||||||
|
|
||||||
total_coverage.info: baseline_filtered_combined.info test_bitcoin_filtered.info block_test_filtered.info
|
total_coverage.info: baseline_filtered_combined.info test_bitcoin_filtered.info block_test_filtered.info rpc_test_filtered.info
|
||||||
$(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_bitcoin_filtered.info -a block_test_filtered.info -o $@ | $(GREP) "\%" | $(AWK) '{ print substr($$3,2,50) "/" $$5 }' > coverage_percent.txt
|
$(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_bitcoin_filtered.info -a block_test_filtered.info -a rpc_test_filtered.info -o $@ | $(GREP) "\%" | $(AWK) '{ print substr($$3,2,50) "/" $$5 }' > coverage_percent.txt
|
||||||
|
|
||||||
test_bitcoin.coverage/.dirstamp: test_bitcoin_coverage.info
|
test_bitcoin.coverage/.dirstamp: test_bitcoin_coverage.info
|
||||||
$(GENHTML) -s $< -o $(@D)
|
$(GENHTML) -s $< -o $(@D)
|
||||||
|
@ -204,11 +230,11 @@ endif
|
||||||
|
|
||||||
dist_noinst_SCRIPTS = autogen.sh
|
dist_noinst_SCRIPTS = autogen.sh
|
||||||
|
|
||||||
EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/rpc-tests.py qa/pull-tester/tests_config.py qa/rpc-tests $(DIST_DOCS) $(WINDOWS_PACKAGING) $(OSX_PACKAGING)
|
EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/rpc-tests.py qa/rpc-tests $(DIST_DOCS) $(WINDOWS_PACKAGING) $(OSX_PACKAGING) $(BIN_CHECKS)
|
||||||
|
|
||||||
CLEANFILES = $(OSX_DMG) $(BITCOIN_WIN_INSTALLER)
|
CLEANFILES = $(OSX_DMG) $(BITCOIN_WIN_INSTALLER)
|
||||||
|
|
||||||
.INTERMEDIATE: $(COVERAGE_INFO)
|
.INTERMEDIATE: $(COVERAGE_INFO)
|
||||||
|
|
||||||
clean-local:
|
clean-local:
|
||||||
rm -rf test_bitcoin.coverage/ total.coverage/ $(OSX_APP)
|
rm -rf coverage_percent.txt test_bitcoin.coverage/ total.coverage/ qa/tmp/ cache/ $(OSX_APP)
|
||||||
|
|
28
README.md
28
README.md
|
@ -20,13 +20,14 @@ out collectively by the network. Bitcoin Core is the name of open source
|
||||||
software which enables the use of this currency.
|
software which enables the use of this currency.
|
||||||
|
|
||||||
For more information, as well as an immediately useable, binary version of
|
For more information, as well as an immediately useable, binary version of
|
||||||
the Bitcoin Core software, see https://www.bitcoin.org/en/download.
|
the Bitcoin Core software, see https://bitcoin.org/en/download, or read the
|
||||||
|
[original whitepaper](https://bitcoincore.org/bitcoin.pdf).
|
||||||
|
|
||||||
License
|
License
|
||||||
-------
|
-------
|
||||||
|
|
||||||
Bitcoin Core is released under the terms of the MIT license. See [COPYING](COPYING) for more
|
Bitcoin Core is released under the terms of the MIT license. See [COPYING](COPYING) for more
|
||||||
information or see http://opensource.org/licenses/MIT.
|
information or see https://opensource.org/licenses/MIT.
|
||||||
|
|
||||||
Development Process
|
Development Process
|
||||||
-------------------
|
-------------------
|
||||||
|
@ -53,24 +54,23 @@ lots of money.
|
||||||
|
|
||||||
### Automated Testing
|
### Automated Testing
|
||||||
|
|
||||||
Developers are strongly encouraged to write unit tests for new code, and to
|
Developers are strongly encouraged to write [unit tests](/doc/unit-tests.md) for new code, and to
|
||||||
submit new unit tests for old code. Unit tests can be compiled and run (assuming they weren't disabled in configure) with: `make check`
|
submit new unit tests for old code. Unit tests can be compiled and run
|
||||||
|
(assuming they weren't disabled in configure) with: `make check`
|
||||||
|
|
||||||
There are also regression and integration tests of the RPC interface, written
|
There are also [regression and integration tests](/qa) of the RPC interface, written
|
||||||
in Python, that are run automatically on the build server.
|
in Python, that are run automatically on the build server.
|
||||||
These tests can be run with: `qa/pull-tester/rpc-tests.py`
|
These tests can be run (if the [test dependencies](/qa) are installed) with: `qa/pull-tester/rpc-tests.py`
|
||||||
|
|
||||||
Every pull request is built for both Windows and Linux on a dedicated server,
|
The Travis CI system makes sure that every pull request is built for Windows
|
||||||
and unit and sanity tests are automatically run. The binaries produced may be
|
and Linux, OS X, and that unit and sanity tests are automatically run.
|
||||||
used for manual QA testing — a link to them will appear in a comment on the
|
|
||||||
pull request posted by [BitcoinPullTester](https://github.com/BitcoinPullTester). See https://github.com/TheBlueMatt/test-scripts
|
|
||||||
for the build/test scripts.
|
|
||||||
|
|
||||||
### Manual Quality Assurance (QA) Testing
|
### Manual Quality Assurance (QA) Testing
|
||||||
|
|
||||||
Large changes should have a test plan, and should be tested by somebody other
|
Changes should be tested by somebody other than the developer who wrote the
|
||||||
than the developer who wrote the code.
|
code. This is especially important for large or high-risk changes. It is useful
|
||||||
See https://github.com/bitcoin/QA/ for how to create a test plan.
|
to add a test plan to the pull request description if testing the changes is
|
||||||
|
not straightforward.
|
||||||
|
|
||||||
Translations
|
Translations
|
||||||
------------
|
------------
|
||||||
|
|
|
@ -6,4 +6,6 @@ if [ -z ${LIBTOOLIZE} ] && GLIBTOOLIZE="`which glibtoolize 2>/dev/null`"; then
|
||||||
LIBTOOLIZE="${GLIBTOOLIZE}"
|
LIBTOOLIZE="${GLIBTOOLIZE}"
|
||||||
export LIBTOOLIZE
|
export LIBTOOLIZE
|
||||||
fi
|
fi
|
||||||
|
which autoreconf >/dev/null || \
|
||||||
|
(echo "configuration failed, please install autoconf first" && exit 1)
|
||||||
autoreconf --install --force --warnings=all
|
autoreconf --install --force --warnings=all
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
# and this notice are preserved. This file is offered as-is, without any
|
# and this notice are preserved. This file is offered as-is, without any
|
||||||
# warranty.
|
# warranty.
|
||||||
|
|
||||||
#serial 23
|
#serial 26
|
||||||
|
|
||||||
AC_DEFUN([AX_BOOST_BASE],
|
AC_DEFUN([AX_BOOST_BASE],
|
||||||
[
|
[
|
||||||
|
@ -95,8 +95,8 @@ if test "x$want_boost" = "xyes"; then
|
||||||
x86_64)
|
x86_64)
|
||||||
libsubdirs="lib64 libx32 lib lib64"
|
libsubdirs="lib64 libx32 lib lib64"
|
||||||
;;
|
;;
|
||||||
ppc64|s390x|sparc64|aarch64)
|
ppc64|s390x|sparc64|aarch64|ppc64le)
|
||||||
libsubdirs="lib64 lib lib64"
|
libsubdirs="lib64 lib lib64 ppc64le"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
@ -170,7 +170,7 @@ if test "x$want_boost" = "xyes"; then
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
succeeded=yes
|
succeeded=yes
|
||||||
found_system=yes
|
found_system=yes
|
||||||
],[:
|
],[
|
||||||
])
|
])
|
||||||
AC_LANG_POP([C++])
|
AC_LANG_POP([C++])
|
||||||
|
|
||||||
|
@ -179,6 +179,10 @@ if test "x$want_boost" = "xyes"; then
|
||||||
dnl if we found no boost with system layout we search for boost libraries
|
dnl if we found no boost with system layout we search for boost libraries
|
||||||
dnl built and installed without the --layout=system option or for a staged(not installed) version
|
dnl built and installed without the --layout=system option or for a staged(not installed) version
|
||||||
if test "x$succeeded" != "xyes"; then
|
if test "x$succeeded" != "xyes"; then
|
||||||
|
CPPFLAGS="$CPPFLAGS_SAVED"
|
||||||
|
LDFLAGS="$LDFLAGS_SAVED"
|
||||||
|
BOOST_CPPFLAGS=
|
||||||
|
BOOST_LDFLAGS=
|
||||||
_version=0
|
_version=0
|
||||||
if test "$ac_boost_path" != ""; then
|
if test "$ac_boost_path" != ""; then
|
||||||
if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
|
if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then
|
||||||
|
@ -191,6 +195,12 @@ if test "x$want_boost" = "xyes"; then
|
||||||
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
|
VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'`
|
||||||
BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE"
|
BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE"
|
||||||
done
|
done
|
||||||
|
dnl if nothing found search for layout used in Windows distributions
|
||||||
|
if test -z "$BOOST_CPPFLAGS"; then
|
||||||
|
if test -d "$ac_boost_path/boost" && test -r "$ac_boost_path/boost"; then
|
||||||
|
BOOST_CPPFLAGS="-I$ac_boost_path"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
if test "$cross_compiling" != yes; then
|
if test "$cross_compiling" != yes; then
|
||||||
|
@ -253,7 +263,7 @@ if test "x$want_boost" = "xyes"; then
|
||||||
AC_MSG_RESULT(yes)
|
AC_MSG_RESULT(yes)
|
||||||
succeeded=yes
|
succeeded=yes
|
||||||
found_system=yes
|
found_system=yes
|
||||||
],[:
|
],[
|
||||||
])
|
])
|
||||||
AC_LANG_POP([C++])
|
AC_LANG_POP([C++])
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
# and this notice are preserved. This file is offered as-is, without any
|
# and this notice are preserved. This file is offered as-is, without any
|
||||||
# warranty.
|
# warranty.
|
||||||
|
|
||||||
#serial 22
|
#serial 24
|
||||||
|
|
||||||
AC_DEFUN([AX_BOOST_PROGRAM_OPTIONS],
|
AC_DEFUN([AX_BOOST_PROGRAM_OPTIONS],
|
||||||
[
|
[
|
||||||
|
@ -63,9 +63,9 @@ AC_DEFUN([AX_BOOST_PROGRAM_OPTIONS],
|
||||||
AC_CACHE_CHECK([whether the Boost::Program_Options library is available],
|
AC_CACHE_CHECK([whether the Boost::Program_Options library is available],
|
||||||
ax_cv_boost_program_options,
|
ax_cv_boost_program_options,
|
||||||
[AC_LANG_PUSH(C++)
|
[AC_LANG_PUSH(C++)
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <boost/program_options.hpp>
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <boost/program_options/errors.hpp>
|
||||||
]],
|
]],
|
||||||
[[boost::program_options::options_description generic("Generic options");
|
[[boost::program_options::error err("Error message");
|
||||||
return 0;]])],
|
return 0;]])],
|
||||||
ax_cv_boost_program_options=yes, ax_cv_boost_program_options=no)
|
ax_cv_boost_program_options=yes, ax_cv_boost_program_options=no)
|
||||||
AC_LANG_POP([C++])
|
AC_LANG_POP([C++])
|
||||||
|
@ -74,7 +74,6 @@ AC_DEFUN([AX_BOOST_PROGRAM_OPTIONS],
|
||||||
AC_DEFINE(HAVE_BOOST_PROGRAM_OPTIONS,,[define if the Boost::PROGRAM_OPTIONS library is available])
|
AC_DEFINE(HAVE_BOOST_PROGRAM_OPTIONS,,[define if the Boost::PROGRAM_OPTIONS library is available])
|
||||||
BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'`
|
BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'`
|
||||||
if test "x$ax_boost_user_program_options_lib" = "x"; then
|
if test "x$ax_boost_user_program_options_lib" = "x"; then
|
||||||
ax_lib=
|
|
||||||
for libextension in `ls $BOOSTLIBDIR/libboost_program_options*.so* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_program_options.*\)\.so.*$;\1;'` `ls $BOOSTLIBDIR/libboost_program_options*.dylib* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_program_options.*\)\.dylib.*$;\1;'` `ls $BOOSTLIBDIR/libboost_program_options*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_program_options.*\)\.a.*$;\1;'` ; do
|
for libextension in `ls $BOOSTLIBDIR/libboost_program_options*.so* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_program_options.*\)\.so.*$;\1;'` `ls $BOOSTLIBDIR/libboost_program_options*.dylib* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_program_options.*\)\.dylib.*$;\1;'` `ls $BOOSTLIBDIR/libboost_program_options*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_program_options.*\)\.a.*$;\1;'` ; do
|
||||||
ax_lib=${libextension}
|
ax_lib=${libextension}
|
||||||
AC_CHECK_LIB($ax_lib, exit,
|
AC_CHECK_LIB($ax_lib, exit,
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
# and this notice are preserved. This file is offered as-is, without any
|
# and this notice are preserved. This file is offered as-is, without any
|
||||||
# warranty.
|
# warranty.
|
||||||
|
|
||||||
#serial 17
|
#serial 18
|
||||||
|
|
||||||
AC_DEFUN([AX_BOOST_SYSTEM],
|
AC_DEFUN([AX_BOOST_SYSTEM],
|
||||||
[
|
[
|
||||||
|
@ -68,9 +68,10 @@ AC_DEFUN([AX_BOOST_SYSTEM],
|
||||||
ax_cv_boost_system,
|
ax_cv_boost_system,
|
||||||
[AC_LANG_PUSH([C++])
|
[AC_LANG_PUSH([C++])
|
||||||
CXXFLAGS_SAVE=$CXXFLAGS
|
CXXFLAGS_SAVE=$CXXFLAGS
|
||||||
|
CXXFLAGS=
|
||||||
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <boost/system/error_code.hpp>]],
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include <boost/system/error_code.hpp>]],
|
||||||
[[boost::system::system_category]])],
|
[[boost::system::error_category *a = 0;]])],
|
||||||
ax_cv_boost_system=yes, ax_cv_boost_system=no)
|
ax_cv_boost_system=yes, ax_cv_boost_system=no)
|
||||||
CXXFLAGS=$CXXFLAGS_SAVE
|
CXXFLAGS=$CXXFLAGS_SAVE
|
||||||
AC_LANG_POP([C++])
|
AC_LANG_POP([C++])
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#
|
#
|
||||||
# SYNOPSIS
|
# SYNOPSIS
|
||||||
#
|
#
|
||||||
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS])
|
# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
|
||||||
#
|
#
|
||||||
# DESCRIPTION
|
# DESCRIPTION
|
||||||
#
|
#
|
||||||
|
@ -19,6 +19,8 @@
|
||||||
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
|
# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to
|
||||||
# force the compiler to issue an error when a bad flag is given.
|
# force the compiler to issue an error when a bad flag is given.
|
||||||
#
|
#
|
||||||
|
# INPUT gives an alternative input source to AC_COMPILE_IFELSE.
|
||||||
|
#
|
||||||
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
|
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
|
||||||
# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
|
# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.
|
||||||
#
|
#
|
||||||
|
@ -53,19 +55,19 @@
|
||||||
# modified version of the Autoconf Macro, you may extend this special
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
# exception to the GPL to apply to your modified version as well.
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
|
||||||
#serial 2
|
#serial 4
|
||||||
|
|
||||||
AC_DEFUN([AX_CHECK_COMPILE_FLAG],
|
AC_DEFUN([AX_CHECK_COMPILE_FLAG],
|
||||||
[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX
|
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
|
||||||
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
|
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl
|
||||||
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
|
AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [
|
||||||
ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
|
ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS
|
||||||
_AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
|
_AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1"
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM()],
|
AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
|
||||||
[AS_VAR_SET(CACHEVAR,[yes])],
|
[AS_VAR_SET(CACHEVAR,[yes])],
|
||||||
[AS_VAR_SET(CACHEVAR,[no])])
|
[AS_VAR_SET(CACHEVAR,[no])])
|
||||||
_AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
|
_AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])
|
||||||
AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes],
|
AS_VAR_IF(CACHEVAR,yes,
|
||||||
[m4_default([$2], :)],
|
[m4_default([$2], :)],
|
||||||
[m4_default([$3], :)])
|
[m4_default([$3], :)])
|
||||||
AS_VAR_POPDEF([CACHEVAR])dnl
|
AS_VAR_POPDEF([CACHEVAR])dnl
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#
|
#
|
||||||
# SYNOPSIS
|
# SYNOPSIS
|
||||||
#
|
#
|
||||||
# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS])
|
# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
|
||||||
#
|
#
|
||||||
# DESCRIPTION
|
# DESCRIPTION
|
||||||
#
|
#
|
||||||
|
@ -19,6 +19,8 @@
|
||||||
# EXTRA-FLAGS FLAG". This can for example be used to force the linker to
|
# EXTRA-FLAGS FLAG". This can for example be used to force the linker to
|
||||||
# issue an error when a bad flag is given.
|
# issue an error when a bad flag is given.
|
||||||
#
|
#
|
||||||
|
# INPUT gives an alternative input source to AC_LINK_IFELSE.
|
||||||
|
#
|
||||||
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
|
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
|
||||||
# macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG.
|
# macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG.
|
||||||
#
|
#
|
||||||
|
@ -53,18 +55,19 @@
|
||||||
# modified version of the Autoconf Macro, you may extend this special
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
# exception to the GPL to apply to your modified version as well.
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
|
||||||
#serial 2
|
#serial 4
|
||||||
|
|
||||||
AC_DEFUN([AX_CHECK_LINK_FLAG],
|
AC_DEFUN([AX_CHECK_LINK_FLAG],
|
||||||
[AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl
|
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
|
||||||
|
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl
|
||||||
AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [
|
AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [
|
||||||
ax_check_save_flags=$LDFLAGS
|
ax_check_save_flags=$LDFLAGS
|
||||||
LDFLAGS="$LDFLAGS $4 $1"
|
LDFLAGS="$LDFLAGS $4 $1"
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM()],
|
AC_LINK_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
|
||||||
[AS_VAR_SET(CACHEVAR,[yes])],
|
[AS_VAR_SET(CACHEVAR,[yes])],
|
||||||
[AS_VAR_SET(CACHEVAR,[no])])
|
[AS_VAR_SET(CACHEVAR,[no])])
|
||||||
LDFLAGS=$ax_check_save_flags])
|
LDFLAGS=$ax_check_save_flags])
|
||||||
AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes],
|
AS_VAR_IF(CACHEVAR,yes,
|
||||||
[m4_default([$2], :)],
|
[m4_default([$2], :)],
|
||||||
[m4_default([$3], :)])
|
[m4_default([$3], :)])
|
||||||
AS_VAR_POPDEF([CACHEVAR])dnl
|
AS_VAR_POPDEF([CACHEVAR])dnl
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#
|
#
|
||||||
# SYNOPSIS
|
# SYNOPSIS
|
||||||
#
|
#
|
||||||
# AX_CHECK_PREPROC_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS])
|
# AX_CHECK_PREPROC_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT])
|
||||||
#
|
#
|
||||||
# DESCRIPTION
|
# DESCRIPTION
|
||||||
#
|
#
|
||||||
|
@ -19,6 +19,8 @@
|
||||||
# "CPPFLAGS EXTRA-FLAGS FLAG". This can for example be used to force the
|
# "CPPFLAGS EXTRA-FLAGS FLAG". This can for example be used to force the
|
||||||
# preprocessor to issue an error when a bad flag is given.
|
# preprocessor to issue an error when a bad flag is given.
|
||||||
#
|
#
|
||||||
|
# INPUT gives an alternative input source to AC_PREPROC_IFELSE.
|
||||||
|
#
|
||||||
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
|
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this
|
||||||
# macro in sync with AX_CHECK_{COMPILE,LINK}_FLAG.
|
# macro in sync with AX_CHECK_{COMPILE,LINK}_FLAG.
|
||||||
#
|
#
|
||||||
|
@ -53,19 +55,19 @@
|
||||||
# modified version of the Autoconf Macro, you may extend this special
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
# exception to the GPL to apply to your modified version as well.
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
|
||||||
#serial 2
|
#serial 4
|
||||||
|
|
||||||
AC_DEFUN([AX_CHECK_PREPROC_FLAG],
|
AC_DEFUN([AX_CHECK_PREPROC_FLAG],
|
||||||
[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX
|
[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF
|
||||||
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]cppflags_$4_$1])dnl
|
AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]cppflags_$4_$1])dnl
|
||||||
AC_CACHE_CHECK([whether _AC_LANG preprocessor accepts $1], CACHEVAR, [
|
AC_CACHE_CHECK([whether _AC_LANG preprocessor accepts $1], CACHEVAR, [
|
||||||
ax_check_save_flags=$CPPFLAGS
|
ax_check_save_flags=$CPPFLAGS
|
||||||
CPPFLAGS="$CPPFLAGS $4 $1"
|
CPPFLAGS="$CPPFLAGS $4 $1"
|
||||||
AC_PREPROC_IFELSE([AC_LANG_PROGRAM()],
|
AC_PREPROC_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])],
|
||||||
[AS_VAR_SET(CACHEVAR,[yes])],
|
[AS_VAR_SET(CACHEVAR,[yes])],
|
||||||
[AS_VAR_SET(CACHEVAR,[no])])
|
[AS_VAR_SET(CACHEVAR,[no])])
|
||||||
CPPFLAGS=$ax_check_save_flags])
|
CPPFLAGS=$ax_check_save_flags])
|
||||||
AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes],
|
AS_VAR_IF(CACHEVAR,yes,
|
||||||
[m4_default([$2], :)],
|
[m4_default([$2], :)],
|
||||||
[m4_default([$3], :)])
|
[m4_default([$3], :)])
|
||||||
AS_VAR_POPDEF([CACHEVAR])dnl
|
AS_VAR_POPDEF([CACHEVAR])dnl
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
# cold
|
# cold
|
||||||
# const
|
# const
|
||||||
# constructor
|
# constructor
|
||||||
|
# constructor_priority for constructor attribute with priority
|
||||||
# deprecated
|
# deprecated
|
||||||
# destructor
|
# destructor
|
||||||
# dllexport
|
# dllexport
|
||||||
|
@ -73,7 +74,7 @@
|
||||||
# and this notice are preserved. This file is offered as-is, without any
|
# and this notice are preserved. This file is offered as-is, without any
|
||||||
# warranty.
|
# warranty.
|
||||||
|
|
||||||
#serial 2
|
#serial 3
|
||||||
|
|
||||||
AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [
|
AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [
|
||||||
AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1])
|
AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1])
|
||||||
|
@ -103,6 +104,9 @@ AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [
|
||||||
[const], [
|
[const], [
|
||||||
int foo( void ) __attribute__(($1));
|
int foo( void ) __attribute__(($1));
|
||||||
],
|
],
|
||||||
|
[constructor_priority], [
|
||||||
|
int foo( void ) __attribute__((__constructor__(65535/2)));
|
||||||
|
],
|
||||||
[constructor], [
|
[constructor], [
|
||||||
int foo( void ) __attribute__(($1));
|
int foo( void ) __attribute__(($1));
|
||||||
],
|
],
|
||||||
|
@ -180,6 +184,8 @@ AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [
|
||||||
[visibility], [
|
[visibility], [
|
||||||
int foo_def( void ) __attribute__(($1("default")));
|
int foo_def( void ) __attribute__(($1("default")));
|
||||||
int foo_hid( void ) __attribute__(($1("hidden")));
|
int foo_hid( void ) __attribute__(($1("hidden")));
|
||||||
|
int foo_int( void ) __attribute__(($1("internal")));
|
||||||
|
int foo_pro( void ) __attribute__(($1("protected")));
|
||||||
],
|
],
|
||||||
[warning], [
|
[warning], [
|
||||||
int foo( void ) __attribute__(($1("")));
|
int foo( void ) __attribute__(($1("")));
|
||||||
|
|
|
@ -19,10 +19,10 @@
|
||||||
# is necessary on AIX to use the special cc_r compiler alias.)
|
# is necessary on AIX to use the special cc_r compiler alias.)
|
||||||
#
|
#
|
||||||
# NOTE: You are assumed to not only compile your program with these flags,
|
# NOTE: You are assumed to not only compile your program with these flags,
|
||||||
# but also link it with them as well. e.g. you should link with
|
# but also to link with them as well. For example, you might link with
|
||||||
# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
|
# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS
|
||||||
#
|
#
|
||||||
# If you are only building threads programs, you may wish to use these
|
# If you are only building threaded programs, you may wish to use these
|
||||||
# variables in your default LIBS, CFLAGS, and CC:
|
# variables in your default LIBS, CFLAGS, and CC:
|
||||||
#
|
#
|
||||||
# LIBS="$PTHREAD_LIBS $LIBS"
|
# LIBS="$PTHREAD_LIBS $LIBS"
|
||||||
|
@ -30,8 +30,8 @@
|
||||||
# CC="$PTHREAD_CC"
|
# CC="$PTHREAD_CC"
|
||||||
#
|
#
|
||||||
# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
|
# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant
|
||||||
# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name
|
# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to
|
||||||
# (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
|
# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
|
||||||
#
|
#
|
||||||
# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
|
# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the
|
||||||
# PTHREAD_PRIO_INHERIT symbol is defined when compiling with
|
# PTHREAD_PRIO_INHERIT symbol is defined when compiling with
|
||||||
|
@ -82,35 +82,40 @@
|
||||||
# modified version of the Autoconf Macro, you may extend this special
|
# modified version of the Autoconf Macro, you may extend this special
|
||||||
# exception to the GPL to apply to your modified version as well.
|
# exception to the GPL to apply to your modified version as well.
|
||||||
|
|
||||||
#serial 21
|
#serial 22
|
||||||
|
|
||||||
AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
|
AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])
|
||||||
AC_DEFUN([AX_PTHREAD], [
|
AC_DEFUN([AX_PTHREAD], [
|
||||||
AC_REQUIRE([AC_CANONICAL_HOST])
|
AC_REQUIRE([AC_CANONICAL_HOST])
|
||||||
|
AC_REQUIRE([AC_PROG_CC])
|
||||||
|
AC_REQUIRE([AC_PROG_SED])
|
||||||
AC_LANG_PUSH([C])
|
AC_LANG_PUSH([C])
|
||||||
ax_pthread_ok=no
|
ax_pthread_ok=no
|
||||||
|
|
||||||
# We used to check for pthread.h first, but this fails if pthread.h
|
# We used to check for pthread.h first, but this fails if pthread.h
|
||||||
# requires special compiler flags (e.g. on True64 or Sequent).
|
# requires special compiler flags (e.g. on Tru64 or Sequent).
|
||||||
# It gets checked for in the link test anyway.
|
# It gets checked for in the link test anyway.
|
||||||
|
|
||||||
# First of all, check if the user has set any of the PTHREAD_LIBS,
|
# First of all, check if the user has set any of the PTHREAD_LIBS,
|
||||||
# etcetera environment variables, and if threads linking works using
|
# etcetera environment variables, and if threads linking works using
|
||||||
# them:
|
# them:
|
||||||
if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
|
if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then
|
||||||
save_CFLAGS="$CFLAGS"
|
ax_pthread_save_CC="$CC"
|
||||||
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
ax_pthread_save_CFLAGS="$CFLAGS"
|
||||||
save_LIBS="$LIBS"
|
ax_pthread_save_LIBS="$LIBS"
|
||||||
LIBS="$PTHREAD_LIBS $LIBS"
|
AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"])
|
||||||
AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
|
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||||
AC_TRY_LINK_FUNC([pthread_join], [ax_pthread_ok=yes])
|
LIBS="$PTHREAD_LIBS $LIBS"
|
||||||
AC_MSG_RESULT([$ax_pthread_ok])
|
AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS])
|
||||||
if test x"$ax_pthread_ok" = xno; then
|
AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes])
|
||||||
PTHREAD_LIBS=""
|
AC_MSG_RESULT([$ax_pthread_ok])
|
||||||
PTHREAD_CFLAGS=""
|
if test "x$ax_pthread_ok" = "xno"; then
|
||||||
fi
|
PTHREAD_LIBS=""
|
||||||
LIBS="$save_LIBS"
|
PTHREAD_CFLAGS=""
|
||||||
CFLAGS="$save_CFLAGS"
|
fi
|
||||||
|
CC="$ax_pthread_save_CC"
|
||||||
|
CFLAGS="$ax_pthread_save_CFLAGS"
|
||||||
|
LIBS="$ax_pthread_save_LIBS"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# We must check for the threads library under a number of different
|
# We must check for the threads library under a number of different
|
||||||
|
@ -123,7 +128,7 @@ fi
|
||||||
# which indicates that we try without any flags at all, and "pthread-config"
|
# which indicates that we try without any flags at all, and "pthread-config"
|
||||||
# which is a program returning the flags for the Pth emulation library.
|
# which is a program returning the flags for the Pth emulation library.
|
||||||
|
|
||||||
ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
|
ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
|
||||||
|
|
||||||
# The ordering *is* (sometimes) important. Some notes on the
|
# The ordering *is* (sometimes) important. Some notes on the
|
||||||
# individual items follow:
|
# individual items follow:
|
||||||
|
@ -132,186 +137,334 @@ ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mt
|
||||||
# none: in case threads are in libc; should be tried before -Kthread and
|
# none: in case threads are in libc; should be tried before -Kthread and
|
||||||
# other compiler flags to prevent continual compiler warnings
|
# other compiler flags to prevent continual compiler warnings
|
||||||
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
|
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
|
||||||
# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
|
# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64
|
||||||
# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
|
# (Note: HP C rejects this with "bad form for `-t' option")
|
||||||
# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
|
# -pthreads: Solaris/gcc (Note: HP C also rejects)
|
||||||
# -pthreads: Solaris/gcc
|
|
||||||
# -mthreads: Mingw32/gcc, Lynx/gcc
|
|
||||||
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
|
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
|
||||||
# doesn't hurt to check since this sometimes defines pthreads too;
|
# doesn't hurt to check since this sometimes defines pthreads and
|
||||||
# also defines -D_REENTRANT)
|
# -D_REENTRANT too), HP C (must be checked before -lpthread, which
|
||||||
# ... -mt is also the pthreads flag for HP/aCC
|
# is present but should not be used directly; and before -mthreads,
|
||||||
|
# because the compiler interprets this as "-mt" + "-hreads")
|
||||||
|
# -mthreads: Mingw32/gcc, Lynx/gcc
|
||||||
# pthread: Linux, etcetera
|
# pthread: Linux, etcetera
|
||||||
# --thread-safe: KAI C++
|
# --thread-safe: KAI C++
|
||||||
# pthread-config: use pthread-config program (for GNU Pth library)
|
# pthread-config: use pthread-config program (for GNU Pth library)
|
||||||
|
|
||||||
case ${host_os} in
|
case $host_os in
|
||||||
solaris*)
|
|
||||||
|
|
||||||
# On Solaris (at least, for some versions), libc contains stubbed
|
freebsd*)
|
||||||
# (non-functional) versions of the pthreads routines, so link-based
|
|
||||||
# tests will erroneously succeed. (We need to link with -pthreads/-mt/
|
|
||||||
# -lpthread.) (The stubs are missing pthread_cleanup_push, or rather
|
|
||||||
# a function called by this macro, so we could check for that, but
|
|
||||||
# who knows whether they'll stub that too in a future libc.) So,
|
|
||||||
# we'll just look for -pthreads and -lpthread first:
|
|
||||||
|
|
||||||
ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags"
|
# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
|
||||||
;;
|
# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
|
||||||
|
|
||||||
darwin*)
|
ax_pthread_flags="-kthread lthread $ax_pthread_flags"
|
||||||
ax_pthread_flags="-pthread $ax_pthread_flags"
|
;;
|
||||||
;;
|
|
||||||
|
hpux*)
|
||||||
|
|
||||||
|
# From the cc(1) man page: "[-mt] Sets various -D flags to enable
|
||||||
|
# multi-threading and also sets -lpthread."
|
||||||
|
|
||||||
|
ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags"
|
||||||
|
;;
|
||||||
|
|
||||||
|
openedition*)
|
||||||
|
|
||||||
|
# IBM z/OS requires a feature-test macro to be defined in order to
|
||||||
|
# enable POSIX threads at all, so give the user a hint if this is
|
||||||
|
# not set. (We don't define these ourselves, as they can affect
|
||||||
|
# other portions of the system API in unpredictable ways.)
|
||||||
|
|
||||||
|
AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING],
|
||||||
|
[
|
||||||
|
# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS)
|
||||||
|
AX_PTHREAD_ZOS_MISSING
|
||||||
|
# endif
|
||||||
|
],
|
||||||
|
[AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])])
|
||||||
|
;;
|
||||||
|
|
||||||
|
solaris*)
|
||||||
|
|
||||||
|
# On Solaris (at least, for some versions), libc contains stubbed
|
||||||
|
# (non-functional) versions of the pthreads routines, so link-based
|
||||||
|
# tests will erroneously succeed. (N.B.: The stubs are missing
|
||||||
|
# pthread_cleanup_push, or rather a function called by this macro,
|
||||||
|
# so we could check for that, but who knows whether they'll stub
|
||||||
|
# that too in a future libc.) So we'll check first for the
|
||||||
|
# standard Solaris way of linking pthreads (-mt -lpthread).
|
||||||
|
|
||||||
|
ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags"
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# Clang doesn't consider unrecognized options an error unless we specify
|
# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC)
|
||||||
# -Werror. We throw in some extra Clang-specific options to ensure that
|
|
||||||
# this doesn't happen for GCC, which also accepts -Werror.
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([if compiler needs -Werror to reject unknown flags])
|
AS_IF([test "x$GCC" = "xyes"],
|
||||||
save_CFLAGS="$CFLAGS"
|
[ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"])
|
||||||
ax_pthread_extra_flags="-Werror"
|
|
||||||
CFLAGS="$CFLAGS $ax_pthread_extra_flags -Wunknown-warning-option -Wsizeof-array-argument"
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([int foo(void);],[foo()])],
|
|
||||||
[AC_MSG_RESULT([yes])],
|
|
||||||
[ax_pthread_extra_flags=
|
|
||||||
AC_MSG_RESULT([no])])
|
|
||||||
CFLAGS="$save_CFLAGS"
|
|
||||||
|
|
||||||
if test x"$ax_pthread_ok" = xno; then
|
# The presence of a feature test macro requesting re-entrant function
|
||||||
for flag in $ax_pthread_flags; do
|
# definitions is, on some systems, a strong hint that pthreads support is
|
||||||
|
# correctly enabled
|
||||||
|
|
||||||
case $flag in
|
case $host_os in
|
||||||
none)
|
darwin* | hpux* | linux* | osf* | solaris*)
|
||||||
AC_MSG_CHECKING([whether pthreads work without any flags])
|
ax_pthread_check_macro="_REENTRANT"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
-*)
|
aix* | freebsd*)
|
||||||
AC_MSG_CHECKING([whether pthreads work with $flag])
|
ax_pthread_check_macro="_THREAD_SAFE"
|
||||||
PTHREAD_CFLAGS="$flag"
|
;;
|
||||||
;;
|
|
||||||
|
|
||||||
pthread-config)
|
*)
|
||||||
AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
|
ax_pthread_check_macro="--"
|
||||||
if test x"$ax_pthread_config" = xno; then continue; fi
|
;;
|
||||||
PTHREAD_CFLAGS="`pthread-config --cflags`"
|
esac
|
||||||
PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
|
AS_IF([test "x$ax_pthread_check_macro" = "x--"],
|
||||||
;;
|
[ax_pthread_check_cond=0],
|
||||||
|
[ax_pthread_check_cond="!defined($ax_pthread_check_macro)"])
|
||||||
|
|
||||||
*)
|
# Are we compiling with Clang?
|
||||||
AC_MSG_CHECKING([for the pthreads library -l$flag])
|
|
||||||
PTHREAD_LIBS="-l$flag"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
save_LIBS="$LIBS"
|
AC_CACHE_CHECK([whether $CC is Clang],
|
||||||
save_CFLAGS="$CFLAGS"
|
[ax_cv_PTHREAD_CLANG],
|
||||||
LIBS="$PTHREAD_LIBS $LIBS"
|
[ax_cv_PTHREAD_CLANG=no
|
||||||
CFLAGS="$CFLAGS $PTHREAD_CFLAGS $ax_pthread_extra_flags"
|
# Note that Autoconf sets GCC=yes for Clang as well as GCC
|
||||||
|
if test "x$GCC" = "xyes"; then
|
||||||
|
AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG],
|
||||||
|
[/* Note: Clang 2.7 lacks __clang_[a-z]+__ */
|
||||||
|
# if defined(__clang__) && defined(__llvm__)
|
||||||
|
AX_PTHREAD_CC_IS_CLANG
|
||||||
|
# endif
|
||||||
|
],
|
||||||
|
[ax_cv_PTHREAD_CLANG=yes])
|
||||||
|
fi
|
||||||
|
])
|
||||||
|
ax_pthread_clang="$ax_cv_PTHREAD_CLANG"
|
||||||
|
|
||||||
# Check for various functions. We must include pthread.h,
|
ax_pthread_clang_warning=no
|
||||||
# since some functions may be macros. (On the Sequent, we
|
|
||||||
# need a special flag -Kthread to make this header compile.)
|
|
||||||
# We check for pthread_join because it is in -lpthread on IRIX
|
|
||||||
# while pthread_create is in libc. We check for pthread_attr_init
|
|
||||||
# due to DEC craziness with -lpthreads. We check for
|
|
||||||
# pthread_cleanup_push because it is one of the few pthread
|
|
||||||
# functions on Solaris that doesn't have a non-functional libc stub.
|
|
||||||
# We try pthread_create on general principles.
|
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
|
|
||||||
static void routine(void *a) { a = 0; }
|
|
||||||
static void *start_routine(void *a) { return a; }],
|
|
||||||
[pthread_t th; pthread_attr_t attr;
|
|
||||||
pthread_create(&th, 0, start_routine, 0);
|
|
||||||
pthread_join(th, 0);
|
|
||||||
pthread_attr_init(&attr);
|
|
||||||
pthread_cleanup_push(routine, 0);
|
|
||||||
pthread_cleanup_pop(0) /* ; */])],
|
|
||||||
[ax_pthread_ok=yes],
|
|
||||||
[])
|
|
||||||
|
|
||||||
LIBS="$save_LIBS"
|
# Clang needs special handling, because older versions handle the -pthread
|
||||||
CFLAGS="$save_CFLAGS"
|
# option in a rather... idiosyncratic way
|
||||||
|
|
||||||
AC_MSG_RESULT([$ax_pthread_ok])
|
if test "x$ax_pthread_clang" = "xyes"; then
|
||||||
if test "x$ax_pthread_ok" = xyes; then
|
|
||||||
break;
|
|
||||||
fi
|
|
||||||
|
|
||||||
PTHREAD_LIBS=""
|
# Clang takes -pthread; it has never supported any other flag
|
||||||
PTHREAD_CFLAGS=""
|
|
||||||
|
# (Note 1: This will need to be revisited if a system that Clang
|
||||||
|
# supports has POSIX threads in a separate library. This tends not
|
||||||
|
# to be the way of modern systems, but it's conceivable.)
|
||||||
|
|
||||||
|
# (Note 2: On some systems, notably Darwin, -pthread is not needed
|
||||||
|
# to get POSIX threads support; the API is always present and
|
||||||
|
# active. We could reasonably leave PTHREAD_CFLAGS empty. But
|
||||||
|
# -pthread does define _REENTRANT, and while the Darwin headers
|
||||||
|
# ignore this macro, third-party headers might not.)
|
||||||
|
|
||||||
|
PTHREAD_CFLAGS="-pthread"
|
||||||
|
PTHREAD_LIBS=
|
||||||
|
|
||||||
|
ax_pthread_ok=yes
|
||||||
|
|
||||||
|
# However, older versions of Clang make a point of warning the user
|
||||||
|
# that, in an invocation where only linking and no compilation is
|
||||||
|
# taking place, the -pthread option has no effect ("argument unused
|
||||||
|
# during compilation"). They expect -pthread to be passed in only
|
||||||
|
# when source code is being compiled.
|
||||||
|
#
|
||||||
|
# Problem is, this is at odds with the way Automake and most other
|
||||||
|
# C build frameworks function, which is that the same flags used in
|
||||||
|
# compilation (CFLAGS) are also used in linking. Many systems
|
||||||
|
# supported by AX_PTHREAD require exactly this for POSIX threads
|
||||||
|
# support, and in fact it is often not straightforward to specify a
|
||||||
|
# flag that is used only in the compilation phase and not in
|
||||||
|
# linking. Such a scenario is extremely rare in practice.
|
||||||
|
#
|
||||||
|
# Even though use of the -pthread flag in linking would only print
|
||||||
|
# a warning, this can be a nuisance for well-run software projects
|
||||||
|
# that build with -Werror. So if the active version of Clang has
|
||||||
|
# this misfeature, we search for an option to squash it.
|
||||||
|
|
||||||
|
AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread],
|
||||||
|
[ax_cv_PTHREAD_CLANG_NO_WARN_FLAG],
|
||||||
|
[ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown
|
||||||
|
# Create an alternate version of $ac_link that compiles and
|
||||||
|
# links in two steps (.c -> .o, .o -> exe) instead of one
|
||||||
|
# (.c -> exe), because the warning occurs only in the second
|
||||||
|
# step
|
||||||
|
ax_pthread_save_ac_link="$ac_link"
|
||||||
|
ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g'
|
||||||
|
ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"`
|
||||||
|
ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)"
|
||||||
|
ax_pthread_save_CFLAGS="$CFLAGS"
|
||||||
|
for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do
|
||||||
|
AS_IF([test "x$ax_pthread_try" = "xunknown"], [break])
|
||||||
|
CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS"
|
||||||
|
ac_link="$ax_pthread_save_ac_link"
|
||||||
|
AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
|
||||||
|
[ac_link="$ax_pthread_2step_ac_link"
|
||||||
|
AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])],
|
||||||
|
[break])
|
||||||
|
])
|
||||||
|
done
|
||||||
|
ac_link="$ax_pthread_save_ac_link"
|
||||||
|
CFLAGS="$ax_pthread_save_CFLAGS"
|
||||||
|
AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no])
|
||||||
|
ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try"
|
||||||
|
])
|
||||||
|
|
||||||
|
case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in
|
||||||
|
no | unknown) ;;
|
||||||
|
*) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
fi # $ax_pthread_clang = yes
|
||||||
|
|
||||||
|
if test "x$ax_pthread_ok" = "xno"; then
|
||||||
|
for ax_pthread_try_flag in $ax_pthread_flags; do
|
||||||
|
|
||||||
|
case $ax_pthread_try_flag in
|
||||||
|
none)
|
||||||
|
AC_MSG_CHECKING([whether pthreads work without any flags])
|
||||||
|
;;
|
||||||
|
|
||||||
|
-mt,pthread)
|
||||||
|
AC_MSG_CHECKING([whether pthreads work with -mt -lpthread])
|
||||||
|
PTHREAD_CFLAGS="-mt"
|
||||||
|
PTHREAD_LIBS="-lpthread"
|
||||||
|
;;
|
||||||
|
|
||||||
|
-*)
|
||||||
|
AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag])
|
||||||
|
PTHREAD_CFLAGS="$ax_pthread_try_flag"
|
||||||
|
;;
|
||||||
|
|
||||||
|
pthread-config)
|
||||||
|
AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])
|
||||||
|
AS_IF([test "x$ax_pthread_config" = "xno"], [continue])
|
||||||
|
PTHREAD_CFLAGS="`pthread-config --cflags`"
|
||||||
|
PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag])
|
||||||
|
PTHREAD_LIBS="-l$ax_pthread_try_flag"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
ax_pthread_save_CFLAGS="$CFLAGS"
|
||||||
|
ax_pthread_save_LIBS="$LIBS"
|
||||||
|
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||||
|
LIBS="$PTHREAD_LIBS $LIBS"
|
||||||
|
|
||||||
|
# Check for various functions. We must include pthread.h,
|
||||||
|
# since some functions may be macros. (On the Sequent, we
|
||||||
|
# need a special flag -Kthread to make this header compile.)
|
||||||
|
# We check for pthread_join because it is in -lpthread on IRIX
|
||||||
|
# while pthread_create is in libc. We check for pthread_attr_init
|
||||||
|
# due to DEC craziness with -lpthreads. We check for
|
||||||
|
# pthread_cleanup_push because it is one of the few pthread
|
||||||
|
# functions on Solaris that doesn't have a non-functional libc stub.
|
||||||
|
# We try pthread_create on general principles.
|
||||||
|
|
||||||
|
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>
|
||||||
|
# if $ax_pthread_check_cond
|
||||||
|
# error "$ax_pthread_check_macro must be defined"
|
||||||
|
# endif
|
||||||
|
static void routine(void *a) { a = 0; }
|
||||||
|
static void *start_routine(void *a) { return a; }],
|
||||||
|
[pthread_t th; pthread_attr_t attr;
|
||||||
|
pthread_create(&th, 0, start_routine, 0);
|
||||||
|
pthread_join(th, 0);
|
||||||
|
pthread_attr_init(&attr);
|
||||||
|
pthread_cleanup_push(routine, 0);
|
||||||
|
pthread_cleanup_pop(0) /* ; */])],
|
||||||
|
[ax_pthread_ok=yes],
|
||||||
|
[])
|
||||||
|
|
||||||
|
CFLAGS="$ax_pthread_save_CFLAGS"
|
||||||
|
LIBS="$ax_pthread_save_LIBS"
|
||||||
|
|
||||||
|
AC_MSG_RESULT([$ax_pthread_ok])
|
||||||
|
AS_IF([test "x$ax_pthread_ok" = "xyes"], [break])
|
||||||
|
|
||||||
|
PTHREAD_LIBS=""
|
||||||
|
PTHREAD_CFLAGS=""
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Various other checks:
|
# Various other checks:
|
||||||
if test "x$ax_pthread_ok" = xyes; then
|
if test "x$ax_pthread_ok" = "xyes"; then
|
||||||
save_LIBS="$LIBS"
|
ax_pthread_save_CFLAGS="$CFLAGS"
|
||||||
LIBS="$PTHREAD_LIBS $LIBS"
|
ax_pthread_save_LIBS="$LIBS"
|
||||||
save_CFLAGS="$CFLAGS"
|
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
||||||
CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
|
LIBS="$PTHREAD_LIBS $LIBS"
|
||||||
|
|
||||||
# Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
|
# Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
|
||||||
AC_MSG_CHECKING([for joinable pthread attribute])
|
AC_CACHE_CHECK([for joinable pthread attribute],
|
||||||
attr_name=unknown
|
[ax_cv_PTHREAD_JOINABLE_ATTR],
|
||||||
for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
|
[ax_cv_PTHREAD_JOINABLE_ATTR=unknown
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
|
for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
|
||||||
[int attr = $attr; return attr /* ; */])],
|
AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],
|
||||||
[attr_name=$attr; break],
|
[int attr = $ax_pthread_attr; return attr /* ; */])],
|
||||||
[])
|
[ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break],
|
||||||
done
|
[])
|
||||||
AC_MSG_RESULT([$attr_name])
|
done
|
||||||
if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
|
])
|
||||||
AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], [$attr_name],
|
AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \
|
||||||
[Define to necessary symbol if this constant
|
test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \
|
||||||
uses a non-standard name on your system.])
|
test "x$ax_pthread_joinable_attr_defined" != "xyes"],
|
||||||
fi
|
[AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE],
|
||||||
|
[$ax_cv_PTHREAD_JOINABLE_ATTR],
|
||||||
|
[Define to necessary symbol if this constant
|
||||||
|
uses a non-standard name on your system.])
|
||||||
|
ax_pthread_joinable_attr_defined=yes
|
||||||
|
])
|
||||||
|
|
||||||
AC_MSG_CHECKING([if more special flags are required for pthreads])
|
AC_CACHE_CHECK([whether more special flags are required for pthreads],
|
||||||
flag=no
|
[ax_cv_PTHREAD_SPECIAL_FLAGS],
|
||||||
case ${host_os} in
|
[ax_cv_PTHREAD_SPECIAL_FLAGS=no
|
||||||
aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";;
|
case $host_os in
|
||||||
osf* | hpux*) flag="-D_REENTRANT";;
|
solaris*)
|
||||||
solaris*)
|
ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS"
|
||||||
if test "$GCC" = "yes"; then
|
;;
|
||||||
flag="-D_REENTRANT"
|
esac
|
||||||
else
|
])
|
||||||
# TODO: What about Clang on Solaris?
|
AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \
|
||||||
flag="-mt -D_REENTRANT"
|
test "x$ax_pthread_special_flags_added" != "xyes"],
|
||||||
fi
|
[PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS"
|
||||||
;;
|
ax_pthread_special_flags_added=yes])
|
||||||
esac
|
|
||||||
AC_MSG_RESULT([$flag])
|
|
||||||
if test "x$flag" != xno; then
|
|
||||||
PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
|
AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],
|
||||||
[ax_cv_PTHREAD_PRIO_INHERIT], [
|
[ax_cv_PTHREAD_PRIO_INHERIT],
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],
|
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],
|
||||||
[[int i = PTHREAD_PRIO_INHERIT;]])],
|
[[int i = PTHREAD_PRIO_INHERIT;]])],
|
||||||
[ax_cv_PTHREAD_PRIO_INHERIT=yes],
|
[ax_cv_PTHREAD_PRIO_INHERIT=yes],
|
||||||
[ax_cv_PTHREAD_PRIO_INHERIT=no])
|
[ax_cv_PTHREAD_PRIO_INHERIT=no])
|
||||||
])
|
])
|
||||||
AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"],
|
AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \
|
||||||
[AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])])
|
test "x$ax_pthread_prio_inherit_defined" != "xyes"],
|
||||||
|
[AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])
|
||||||
|
ax_pthread_prio_inherit_defined=yes
|
||||||
|
])
|
||||||
|
|
||||||
LIBS="$save_LIBS"
|
CFLAGS="$ax_pthread_save_CFLAGS"
|
||||||
CFLAGS="$save_CFLAGS"
|
LIBS="$ax_pthread_save_LIBS"
|
||||||
|
|
||||||
# More AIX lossage: compile with *_r variant
|
# More AIX lossage: compile with *_r variant
|
||||||
if test "x$GCC" != xyes; then
|
if test "x$GCC" != "xyes"; then
|
||||||
case $host_os in
|
case $host_os in
|
||||||
aix*)
|
aix*)
|
||||||
AS_CASE(["x/$CC"],
|
AS_CASE(["x/$CC"],
|
||||||
[x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
|
[x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],
|
||||||
[#handle absolute path differently from PATH based program lookup
|
[#handle absolute path differently from PATH based program lookup
|
||||||
AS_CASE(["x$CC"],
|
AS_CASE(["x$CC"],
|
||||||
[x/*],
|
[x/*],
|
||||||
[AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])],
|
[AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])],
|
||||||
[AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])])
|
[AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])])
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
|
test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
|
||||||
|
@ -321,12 +474,12 @@ AC_SUBST([PTHREAD_CFLAGS])
|
||||||
AC_SUBST([PTHREAD_CC])
|
AC_SUBST([PTHREAD_CC])
|
||||||
|
|
||||||
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
|
# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
|
||||||
if test x"$ax_pthread_ok" = xyes; then
|
if test "x$ax_pthread_ok" = "xyes"; then
|
||||||
ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1])
|
ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1])
|
||||||
:
|
:
|
||||||
else
|
else
|
||||||
ax_pthread_ok=no
|
ax_pthread_ok=no
|
||||||
$2
|
$2
|
||||||
fi
|
fi
|
||||||
AC_LANG_POP
|
AC_LANG_POP
|
||||||
])dnl AX_PTHREAD
|
])dnl AX_PTHREAD
|
||||||
|
|
|
@ -38,7 +38,7 @@ AC_DEFUN([BITCOIN_FIND_BDB48],[
|
||||||
done
|
done
|
||||||
if test "x$bdbpath" = "xX"; then
|
if test "x$bdbpath" = "xX"; then
|
||||||
AC_MSG_RESULT([no])
|
AC_MSG_RESULT([no])
|
||||||
AC_MSG_ERROR([libdb_cxx headers missing, Bitcoin Core requires this library for wallet functionality (--disable-wallet to disable wallet functionality)])
|
AC_MSG_ERROR([libdb_cxx headers missing, ]AC_PACKAGE_NAME[ requires this library for wallet functionality (--disable-wallet to disable wallet functionality)])
|
||||||
elif test "x$bdb48path" = "xX"; then
|
elif test "x$bdb48path" = "xX"; then
|
||||||
BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdbpath}],db_cxx)
|
BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdbpath}],db_cxx)
|
||||||
AC_ARG_WITH([incompatible-bdb],[AS_HELP_STRING([--with-incompatible-bdb], [allow using a bdb version other than 4.8])],[
|
AC_ARG_WITH([incompatible-bdb],[AS_HELP_STRING([--with-incompatible-bdb], [allow using a bdb version other than 4.8])],[
|
||||||
|
@ -60,7 +60,7 @@ AC_DEFUN([BITCOIN_FIND_BDB48],[
|
||||||
])
|
])
|
||||||
done
|
done
|
||||||
if test "x$BDB_LIBS" = "x"; then
|
if test "x$BDB_LIBS" = "x"; then
|
||||||
AC_MSG_ERROR([libdb_cxx missing, Bitcoin Core requires this library for wallet functionality (--disable-wallet to disable wallet functionality)])
|
AC_MSG_ERROR([libdb_cxx missing, ]AC_PACKAGE_NAME[ requires this library for wallet functionality (--disable-wallet to disable wallet functionality)])
|
||||||
fi
|
fi
|
||||||
AC_SUBST(BDB_LIBS)
|
AC_SUBST(BDB_LIBS)
|
||||||
])
|
])
|
||||||
|
|
|
@ -50,7 +50,7 @@ AC_DEFUN([BITCOIN_QT_INIT],[
|
||||||
dnl enable qt support
|
dnl enable qt support
|
||||||
AC_ARG_WITH([gui],
|
AC_ARG_WITH([gui],
|
||||||
[AS_HELP_STRING([--with-gui@<:@=no|qt4|qt5|auto@:>@],
|
[AS_HELP_STRING([--with-gui@<:@=no|qt4|qt5|auto@:>@],
|
||||||
[build bitcoin-qt GUI (default=auto, qt4 tried first)])],
|
[build bitcoin-qt GUI (default=auto, qt5 tried first)])],
|
||||||
[
|
[
|
||||||
bitcoin_qt_want_version=$withval
|
bitcoin_qt_want_version=$withval
|
||||||
if test x$bitcoin_qt_want_version = xyes; then
|
if test x$bitcoin_qt_want_version = xyes; then
|
||||||
|
@ -106,7 +106,9 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[
|
||||||
dnl results to QT_LIBS.
|
dnl results to QT_LIBS.
|
||||||
BITCOIN_QT_CHECK([
|
BITCOIN_QT_CHECK([
|
||||||
TEMP_CPPFLAGS=$CPPFLAGS
|
TEMP_CPPFLAGS=$CPPFLAGS
|
||||||
|
TEMP_CXXFLAGS=$CXXFLAGS
|
||||||
CPPFLAGS="$QT_INCLUDES $CPPFLAGS"
|
CPPFLAGS="$QT_INCLUDES $CPPFLAGS"
|
||||||
|
CXXFLAGS="$PIC_FLAGS $CXXFLAGS"
|
||||||
if test x$bitcoin_qt_got_major_vers = x5; then
|
if test x$bitcoin_qt_got_major_vers = x5; then
|
||||||
_BITCOIN_QT_IS_STATIC
|
_BITCOIN_QT_IS_STATIC
|
||||||
if test x$bitcoin_cv_static_qt = xyes; then
|
if test x$bitcoin_cv_static_qt = xyes; then
|
||||||
|
@ -149,6 +151,7 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
CPPFLAGS=$TEMP_CPPFLAGS
|
CPPFLAGS=$TEMP_CPPFLAGS
|
||||||
|
CXXFLAGS=$TEMP_CXXFLAGS
|
||||||
])
|
])
|
||||||
|
|
||||||
if test x$use_pkgconfig$qt_bin_path = xyes; then
|
if test x$use_pkgconfig$qt_bin_path = xyes; then
|
||||||
|
@ -157,6 +160,43 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test x$use_hardening != xno; then
|
||||||
|
BITCOIN_QT_CHECK([
|
||||||
|
AC_MSG_CHECKING(whether -fPIE can be used with this Qt config)
|
||||||
|
TEMP_CPPFLAGS=$CPPFLAGS
|
||||||
|
TEMP_CXXFLAGS=$CXXFLAGS
|
||||||
|
CPPFLAGS="$QT_INCLUDES $CPPFLAGS"
|
||||||
|
CXXFLAGS="$PIE_FLAGS $CXXFLAGS"
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <QtCore/qconfig.h>]],
|
||||||
|
[[
|
||||||
|
#if defined(QT_REDUCE_RELOCATIONS)
|
||||||
|
choke;
|
||||||
|
#endif
|
||||||
|
]])],
|
||||||
|
[ AC_MSG_RESULT(yes); QT_PIE_FLAGS=$PIE_FLAGS ],
|
||||||
|
[ AC_MSG_RESULT(no); QT_PIE_FLAGS=$PIC_FLAGS]
|
||||||
|
)
|
||||||
|
CPPFLAGS=$TEMP_CPPFLAGS
|
||||||
|
CXXFLAGS=$TEMP_CXXFLAGS
|
||||||
|
])
|
||||||
|
else
|
||||||
|
BITCOIN_QT_CHECK([
|
||||||
|
AC_MSG_CHECKING(whether -fPIC is needed with this Qt config)
|
||||||
|
TEMP_CPPFLAGS=$CPPFLAGS
|
||||||
|
CPPFLAGS="$QT_INCLUDES $CPPFLAGS"
|
||||||
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <QtCore/qconfig.h>]],
|
||||||
|
[[
|
||||||
|
#if defined(QT_REDUCE_RELOCATIONS)
|
||||||
|
choke;
|
||||||
|
#endif
|
||||||
|
]])],
|
||||||
|
[ AC_MSG_RESULT(no)],
|
||||||
|
[ AC_MSG_RESULT(yes); QT_PIE_FLAGS=$PIC_FLAGS]
|
||||||
|
)
|
||||||
|
CPPFLAGS=$TEMP_CPPFLAGS
|
||||||
|
])
|
||||||
|
fi
|
||||||
|
|
||||||
BITCOIN_QT_PATH_PROGS([MOC], [moc-qt${bitcoin_qt_got_major_vers} moc${bitcoin_qt_got_major_vers} moc], $qt_bin_path)
|
BITCOIN_QT_PATH_PROGS([MOC], [moc-qt${bitcoin_qt_got_major_vers} moc${bitcoin_qt_got_major_vers} moc], $qt_bin_path)
|
||||||
BITCOIN_QT_PATH_PROGS([UIC], [uic-qt${bitcoin_qt_got_major_vers} uic${bitcoin_qt_got_major_vers} uic], $qt_bin_path)
|
BITCOIN_QT_PATH_PROGS([UIC], [uic-qt${bitcoin_qt_got_major_vers} uic${bitcoin_qt_got_major_vers} uic], $qt_bin_path)
|
||||||
BITCOIN_QT_PATH_PROGS([RCC], [rcc-qt${bitcoin_qt_got_major_vers} rcc${bitcoin_qt_got_major_vers} rcc], $qt_bin_path)
|
BITCOIN_QT_PATH_PROGS([RCC], [rcc-qt${bitcoin_qt_got_major_vers} rcc${bitcoin_qt_got_major_vers} rcc], $qt_bin_path)
|
||||||
|
@ -180,7 +220,7 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[
|
||||||
|
|
||||||
|
|
||||||
dnl enable qt support
|
dnl enable qt support
|
||||||
AC_MSG_CHECKING(whether to build Bitcoin Core GUI)
|
AC_MSG_CHECKING(whether to build ]AC_PACKAGE_NAME[ GUI)
|
||||||
BITCOIN_QT_CHECK([
|
BITCOIN_QT_CHECK([
|
||||||
bitcoin_enable_qt=yes
|
bitcoin_enable_qt=yes
|
||||||
bitcoin_enable_qt_test=yes
|
bitcoin_enable_qt_test=yes
|
||||||
|
@ -202,6 +242,7 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[
|
||||||
])
|
])
|
||||||
AC_MSG_RESULT([$bitcoin_enable_qt (Qt${bitcoin_qt_got_major_vers})])
|
AC_MSG_RESULT([$bitcoin_enable_qt (Qt${bitcoin_qt_got_major_vers})])
|
||||||
|
|
||||||
|
AC_SUBST(QT_PIE_FLAGS)
|
||||||
AC_SUBST(QT_INCLUDES)
|
AC_SUBST(QT_INCLUDES)
|
||||||
AC_SUBST(QT_LIBS)
|
AC_SUBST(QT_LIBS)
|
||||||
AC_SUBST(QT_LDFLAGS)
|
AC_SUBST(QT_LDFLAGS)
|
||||||
|
@ -343,7 +384,7 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITH_PKGCONFIG],[
|
||||||
|
|
||||||
dnl qt version is set to 'auto' and the preferred version wasn't found. Now try the other.
|
dnl qt version is set to 'auto' and the preferred version wasn't found. Now try the other.
|
||||||
if test x$have_qt = xno && test x$bitcoin_qt_want_version = xauto; then
|
if test x$have_qt = xno && test x$bitcoin_qt_want_version = xauto; then
|
||||||
if test x$auto_priority_version = x$qt5; then
|
if test x$auto_priority_version = xqt5; then
|
||||||
PKG_CHECK_MODULES([QT], [$qt4_modules], [QT_INCLUDES="$QT_CFLAGS"; have_qt=yes; QT_LIB_PREFIX=Qt; bitcoin_qt_got_major_vers=4], [have_qt=no])
|
PKG_CHECK_MODULES([QT], [$qt4_modules], [QT_INCLUDES="$QT_CFLAGS"; have_qt=yes; QT_LIB_PREFIX=Qt; bitcoin_qt_got_major_vers=4], [have_qt=no])
|
||||||
else
|
else
|
||||||
PKG_CHECK_MODULES([QT], [$qt5_modules], [QT_INCLUDES="$QT_CFLAGS"; have_qt=yes; QT_LIB_PREFIX=Qt5; bitcoin_qt_got_major_vers=5], [have_qt=no])
|
PKG_CHECK_MODULES([QT], [$qt5_modules], [QT_INCLUDES="$QT_CFLAGS"; have_qt=yes; QT_LIB_PREFIX=Qt5; bitcoin_qt_got_major_vers=5], [have_qt=no])
|
||||||
|
@ -373,6 +414,8 @@ dnl Outputs: bitcoin_qt_got_major_vers is set to "4" or "5".
|
||||||
dnl Outputs: have_qt_test and have_qt_dbus are set (if applicable) to yes|no.
|
dnl Outputs: have_qt_test and have_qt_dbus are set (if applicable) to yes|no.
|
||||||
AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[
|
AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[
|
||||||
TEMP_CPPFLAGS="$CPPFLAGS"
|
TEMP_CPPFLAGS="$CPPFLAGS"
|
||||||
|
TEMP_CXXFLAGS="$CXXFLAGS"
|
||||||
|
CXXFLAGS="$PIC_FLAGS $CXXFLAGS"
|
||||||
TEMP_LIBS="$LIBS"
|
TEMP_LIBS="$LIBS"
|
||||||
BITCOIN_QT_CHECK([
|
BITCOIN_QT_CHECK([
|
||||||
if test x$qt_include_path != x; then
|
if test x$qt_include_path != x; then
|
||||||
|
@ -442,6 +485,7 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[
|
||||||
fi
|
fi
|
||||||
])
|
])
|
||||||
CPPFLAGS="$TEMP_CPPFLAGS"
|
CPPFLAGS="$TEMP_CPPFLAGS"
|
||||||
|
CXXFLAGS="$TEMP_CXXFLAGS"
|
||||||
LIBS="$TEMP_LIBS"
|
LIBS="$TEMP_LIBS"
|
||||||
])
|
])
|
||||||
|
|
||||||
|
|
186
configure.ac
186
configure.ac
|
@ -1,17 +1,24 @@
|
||||||
dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N)
|
dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N)
|
||||||
AC_PREREQ([2.60])
|
AC_PREREQ([2.60])
|
||||||
define(_CLIENT_VERSION_MAJOR, 0)
|
define(_CLIENT_VERSION_MAJOR, 0)
|
||||||
define(_CLIENT_VERSION_MINOR, 11)
|
define(_CLIENT_VERSION_MINOR, 12)
|
||||||
define(_CLIENT_VERSION_REVISION, 99)
|
define(_CLIENT_VERSION_REVISION, 99)
|
||||||
define(_CLIENT_VERSION_BUILD, 0)
|
define(_CLIENT_VERSION_BUILD, 0)
|
||||||
define(_CLIENT_VERSION_IS_RELEASE, false)
|
define(_CLIENT_VERSION_IS_RELEASE, false)
|
||||||
define(_COPYRIGHT_YEAR, 2015)
|
define(_COPYRIGHT_YEAR, 2016)
|
||||||
AC_INIT([LBRYcrd Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[https://github.com/lbryio/lbrycrd/issues],[lbrycrd])
|
define(_COPYRIGHT_HOLDERS,[The %s developers])
|
||||||
|
define(_COPYRIGHT_HOLDERS_SUBSTITUTION,[[LBRY]])
|
||||||
|
AC_INIT([LBRYcrd Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[https://github.com/lbryio/lbrycrd/issues],[lbrycrd],[https://lbry.io/])
|
||||||
AC_CONFIG_SRCDIR([src/main.cpp])
|
AC_CONFIG_SRCDIR([src/main.cpp])
|
||||||
AC_CONFIG_HEADERS([src/config/bitcoin-config.h])
|
AC_CONFIG_HEADERS([src/config/bitcoin-config.h])
|
||||||
AC_CONFIG_AUX_DIR([build-aux])
|
AC_CONFIG_AUX_DIR([build-aux])
|
||||||
AC_CONFIG_MACRO_DIR([build-aux/m4])
|
AC_CONFIG_MACRO_DIR([build-aux/m4])
|
||||||
|
|
||||||
|
BITCOIN_DAEMON_NAME=lbrycrdd
|
||||||
|
BITCOIN_GUI_NAME=lbrycrd-qt
|
||||||
|
BITCOIN_CLI_NAME=lbrycrd-cli
|
||||||
|
BITCOIN_TX_NAME=lbrycrd-tx
|
||||||
|
|
||||||
AC_CANONICAL_HOST
|
AC_CANONICAL_HOST
|
||||||
|
|
||||||
AH_TOP([#ifndef BITCOIN_CONFIG_H])
|
AH_TOP([#ifndef BITCOIN_CONFIG_H])
|
||||||
|
@ -58,11 +65,16 @@ AC_PATH_TOOL(STRIP, strip)
|
||||||
AC_PATH_TOOL(GCOV, gcov)
|
AC_PATH_TOOL(GCOV, gcov)
|
||||||
AC_PATH_PROG(LCOV, lcov)
|
AC_PATH_PROG(LCOV, lcov)
|
||||||
AC_PATH_PROG(JAVA, java)
|
AC_PATH_PROG(JAVA, java)
|
||||||
|
AC_PATH_PROGS([PYTHON], [python3 python2.7 python2 python])
|
||||||
AC_PATH_PROG(GENHTML, genhtml)
|
AC_PATH_PROG(GENHTML, genhtml)
|
||||||
AC_PATH_PROG([GIT], [git])
|
AC_PATH_PROG([GIT], [git])
|
||||||
AC_PATH_PROG(CCACHE,ccache)
|
AC_PATH_PROG(CCACHE,ccache)
|
||||||
AC_PATH_PROG(XGETTEXT,xgettext)
|
AC_PATH_PROG(XGETTEXT,xgettext)
|
||||||
AC_PATH_PROG(HEXDUMP,hexdump)
|
AC_PATH_PROG(HEXDUMP,hexdump)
|
||||||
|
AC_PATH_TOOL(READELF, readelf)
|
||||||
|
AC_PATH_TOOL(CPPFILT, c++filt)
|
||||||
|
|
||||||
|
AC_ARG_VAR(PYTHONPATH, Augments the default search path for python module files)
|
||||||
|
|
||||||
dnl pkg-config check.
|
dnl pkg-config check.
|
||||||
PKG_PROG_PKG_CONFIG
|
PKG_PROG_PKG_CONFIG
|
||||||
|
@ -91,8 +103,13 @@ AC_ARG_ENABLE(tests,
|
||||||
[use_tests=$enableval],
|
[use_tests=$enableval],
|
||||||
[use_tests=yes])
|
[use_tests=yes])
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(gui-tests,
|
||||||
|
AS_HELP_STRING([--disable-gui-tests],[do not compile GUI tests (default is to compile if GUI and tests enabled)]),
|
||||||
|
[use_gui_tests=$enableval],
|
||||||
|
[use_gui_tests=$use_tests])
|
||||||
|
|
||||||
AC_ARG_ENABLE(bench,
|
AC_ARG_ENABLE(bench,
|
||||||
AS_HELP_STRING([--enable-bench],[compile benchmarks (default is yes)]),
|
AS_HELP_STRING([--disable-bench],[do not compile benchmarks (default is to compile)]),
|
||||||
[use_bench=$enableval],
|
[use_bench=$enableval],
|
||||||
[use_bench=yes])
|
[use_bench=yes])
|
||||||
|
|
||||||
|
@ -106,6 +123,11 @@ AC_ARG_ENABLE([comparison-tool-reorg-tests],
|
||||||
[use_comparison_tool_reorg_tests=$enableval],
|
[use_comparison_tool_reorg_tests=$enableval],
|
||||||
[use_comparison_tool_reorg_tests=no])
|
[use_comparison_tool_reorg_tests=no])
|
||||||
|
|
||||||
|
AC_ARG_ENABLE([extended-rpc-tests],
|
||||||
|
AS_HELP_STRING([--enable-extended-rpc-tests],[enable expensive RPC tests when using lcov (default no)]),
|
||||||
|
[use_extended_rpc_tests=$enableval],
|
||||||
|
[use_extended_rpc_tests=no])
|
||||||
|
|
||||||
AC_ARG_WITH([qrencode],
|
AC_ARG_WITH([qrencode],
|
||||||
[AS_HELP_STRING([--with-qrencode],
|
[AS_HELP_STRING([--with-qrencode],
|
||||||
[enable QR code support (default is yes if qt is enabled and libqrencode is found)])],
|
[enable QR code support (default is yes if qt is enabled and libqrencode is found)])],
|
||||||
|
@ -142,6 +164,12 @@ AC_ARG_ENABLE([glibc-back-compat],
|
||||||
[use_glibc_compat=$enableval],
|
[use_glibc_compat=$enableval],
|
||||||
[use_glibc_compat=no])
|
[use_glibc_compat=no])
|
||||||
|
|
||||||
|
AC_ARG_WITH([system-univalue],
|
||||||
|
[AS_HELP_STRING([--with-system-univalue],
|
||||||
|
[Build with system UniValue (default is no)])],
|
||||||
|
[system_univalue=$withval],
|
||||||
|
[system_univalue=no]
|
||||||
|
)
|
||||||
AC_ARG_ENABLE([zmq],
|
AC_ARG_ENABLE([zmq],
|
||||||
[AS_HELP_STRING([--disable-zmq],
|
[AS_HELP_STRING([--disable-zmq],
|
||||||
[disable ZMQ notifications])],
|
[disable ZMQ notifications])],
|
||||||
|
@ -308,6 +336,9 @@ case $host in
|
||||||
AC_PATH_TOOL([INSTALLNAMETOOL], [install_name_tool], install_name_tool)
|
AC_PATH_TOOL([INSTALLNAMETOOL], [install_name_tool], install_name_tool)
|
||||||
AC_PATH_TOOL([OTOOL], [otool], otool)
|
AC_PATH_TOOL([OTOOL], [otool], otool)
|
||||||
AC_PATH_PROGS([GENISOIMAGE], [genisoimage mkisofs],genisoimage)
|
AC_PATH_PROGS([GENISOIMAGE], [genisoimage mkisofs],genisoimage)
|
||||||
|
AC_PATH_PROGS([RSVG_CONVERT], [rsvg-convert rsvg],rsvg-convert)
|
||||||
|
AC_PATH_PROGS([IMAGEMAGICK_CONVERT], [convert],convert)
|
||||||
|
AC_PATH_PROGS([TIFFCP], [tiffcp],tiffcp)
|
||||||
|
|
||||||
dnl libtool will try to strip the static lib, which is a problem for
|
dnl libtool will try to strip the static lib, which is a problem for
|
||||||
dnl cross-builds because strip attempts to call a hard-coded ld,
|
dnl cross-builds because strip attempts to call a hard-coded ld,
|
||||||
|
@ -320,6 +351,7 @@ case $host in
|
||||||
|
|
||||||
AX_CHECK_LINK_FLAG([[-Wl,-headerpad_max_install_names]], [LDFLAGS="$LDFLAGS -Wl,-headerpad_max_install_names"])
|
AX_CHECK_LINK_FLAG([[-Wl,-headerpad_max_install_names]], [LDFLAGS="$LDFLAGS -Wl,-headerpad_max_install_names"])
|
||||||
CPPFLAGS="$CPPFLAGS -DMAC_OSX"
|
CPPFLAGS="$CPPFLAGS -DMAC_OSX"
|
||||||
|
OBJCXXFLAGS="$CXXFLAGS"
|
||||||
;;
|
;;
|
||||||
*linux*)
|
*linux*)
|
||||||
TARGET_OS=linux
|
TARGET_OS=linux
|
||||||
|
@ -341,6 +373,10 @@ else
|
||||||
AC_SUBST(COMPARISON_TOOL_REORG_TESTS, 0)
|
AC_SUBST(COMPARISON_TOOL_REORG_TESTS, 0)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test x$use_extended_rpc_tests != xno; then
|
||||||
|
AC_SUBST(EXTENDED_RPC_TESTS, -extended)
|
||||||
|
fi
|
||||||
|
|
||||||
if test x$use_lcov = xyes; then
|
if test x$use_lcov = xyes; then
|
||||||
if test x$LCOV = x; then
|
if test x$LCOV = x; then
|
||||||
AC_MSG_ERROR("lcov testing requested but lcov not found")
|
AC_MSG_ERROR("lcov testing requested but lcov not found")
|
||||||
|
@ -351,6 +387,9 @@ if test x$use_lcov = xyes; then
|
||||||
if test x$JAVA = x; then
|
if test x$JAVA = x; then
|
||||||
AC_MSG_ERROR("lcov testing requested but java not found")
|
AC_MSG_ERROR("lcov testing requested but java not found")
|
||||||
fi
|
fi
|
||||||
|
if test x$PYTHON = x; then
|
||||||
|
AC_MSG_ERROR("lcov testing requested but python not found")
|
||||||
|
fi
|
||||||
if test x$GENHTML = x; then
|
if test x$GENHTML = x; then
|
||||||
AC_MSG_ERROR("lcov testing requested but genhtml not found")
|
AC_MSG_ERROR("lcov testing requested but genhtml not found")
|
||||||
fi
|
fi
|
||||||
|
@ -395,6 +434,10 @@ AX_GCC_FUNC_ATTRIBUTE([dllimport])
|
||||||
|
|
||||||
if test x$use_glibc_compat != xno; then
|
if test x$use_glibc_compat != xno; then
|
||||||
|
|
||||||
|
#glibc absorbed clock_gettime in 2.17. librt (its previous location) is safe to link
|
||||||
|
#in anyway for back-compat.
|
||||||
|
AC_CHECK_LIB([rt],[clock_gettime],, AC_MSG_ERROR(lib missing))
|
||||||
|
|
||||||
#__fdelt_chk's params and return type have changed from long unsigned int to long int.
|
#__fdelt_chk's params and return type have changed from long unsigned int to long int.
|
||||||
# See which one is present here.
|
# See which one is present here.
|
||||||
AC_MSG_CHECKING(__fdelt_chk type)
|
AC_MSG_CHECKING(__fdelt_chk type)
|
||||||
|
@ -408,7 +451,13 @@ if test x$use_glibc_compat != xno; then
|
||||||
[ fdelt_type="long int"])
|
[ fdelt_type="long int"])
|
||||||
AC_MSG_RESULT($fdelt_type)
|
AC_MSG_RESULT($fdelt_type)
|
||||||
AC_DEFINE_UNQUOTED(FDELT_TYPE, $fdelt_type,[parameter and return value type for __fdelt_chk])
|
AC_DEFINE_UNQUOTED(FDELT_TYPE, $fdelt_type,[parameter and return value type for __fdelt_chk])
|
||||||
|
else
|
||||||
|
AC_SEARCH_LIBS([clock_gettime],[rt])
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test x$TARGET_OS != xwindows; then
|
||||||
|
# All windows code is PIC, forcing it on just adds useless compile warnings
|
||||||
|
AX_CHECK_COMPILE_FLAG([-fPIC],[PIC_FLAGS="-fPIC"])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test x$use_hardening != xno; then
|
if test x$use_hardening != xno; then
|
||||||
|
@ -428,8 +477,7 @@ if test x$use_hardening != xno; then
|
||||||
AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,now"])
|
AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,now"])
|
||||||
|
|
||||||
if test x$TARGET_OS != xwindows; then
|
if test x$TARGET_OS != xwindows; then
|
||||||
# All windows code is PIC, forcing it on just adds useless compile warnings
|
AX_CHECK_COMPILE_FLAG([-fPIE],[PIE_FLAGS="-fPIE"])
|
||||||
AX_CHECK_COMPILE_FLAG([-fPIE],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fPIE"])
|
|
||||||
AX_CHECK_LINK_FLAG([[-pie]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -pie"])
|
AX_CHECK_LINK_FLAG([[-pie]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -pie"])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -438,11 +486,6 @@ if test x$use_hardening != xno; then
|
||||||
AC_CHECK_LIB([ssp], [main],, AC_MSG_ERROR(lib missing))
|
AC_CHECK_LIB([ssp], [main],, AC_MSG_ERROR(lib missing))
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
CXXFLAGS="$CXXFLAGS $HARDENED_CXXFLAGS"
|
|
||||||
CPPFLAGS="$CPPFLAGS $HARDENED_CPPFLAGS"
|
|
||||||
LDFLAGS="$LDFLAGS $HARDENED_LDFLAGS"
|
|
||||||
OBJCXXFLAGS="$CXXFLAGS"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl this flag screws up non-darwin gcc even when the check fails. special-case it.
|
dnl this flag screws up non-darwin gcc even when the check fails. special-case it.
|
||||||
|
@ -476,8 +519,6 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/socket.h>]],
|
||||||
[ AC_MSG_RESULT(no)]
|
[ AC_MSG_RESULT(no)]
|
||||||
)
|
)
|
||||||
|
|
||||||
AC_SEARCH_LIBS([clock_gettime],[rt])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([for visibility attribute])
|
AC_MSG_CHECKING([for visibility attribute])
|
||||||
AC_LINK_IFELSE([AC_LANG_SOURCE([
|
AC_LINK_IFELSE([AC_LANG_SOURCE([
|
||||||
int foo_def( void ) __attribute__((visibility("default")));
|
int foo_def( void ) __attribute__((visibility("default")));
|
||||||
|
@ -525,7 +566,7 @@ fi
|
||||||
BITCOIN_QT_INIT
|
BITCOIN_QT_INIT
|
||||||
|
|
||||||
dnl sets $bitcoin_enable_qt, $bitcoin_enable_qt_test, $bitcoin_enable_qt_dbus
|
dnl sets $bitcoin_enable_qt, $bitcoin_enable_qt_test, $bitcoin_enable_qt_dbus
|
||||||
BITCOIN_QT_CONFIGURE([$use_pkgconfig], [qt4])
|
BITCOIN_QT_CONFIGURE([$use_pkgconfig], [qt5])
|
||||||
|
|
||||||
if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests = xnononono; then
|
if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests = xnononono; then
|
||||||
use_boost=no
|
use_boost=no
|
||||||
|
@ -606,6 +647,42 @@ if test x$use_boost = xyes; then
|
||||||
|
|
||||||
BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRAM_OPTIONS_LIB $BOOST_THREAD_LIB $BOOST_CHRONO_LIB"
|
BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRAM_OPTIONS_LIB $BOOST_THREAD_LIB $BOOST_CHRONO_LIB"
|
||||||
|
|
||||||
|
|
||||||
|
dnl If boost (prior to 1.57) was built without c++11, it emulated scoped enums
|
||||||
|
dnl using c++98 constructs. Unfortunately, this implementation detail leaked into
|
||||||
|
dnl the abi. This was fixed in 1.57.
|
||||||
|
|
||||||
|
dnl When building against that installed version using c++11, the headers pick up
|
||||||
|
dnl on the native c++11 scoped enum support and enable it, however it will fail to
|
||||||
|
dnl link. This can be worked around by disabling c++11 scoped enums if linking will
|
||||||
|
dnl fail.
|
||||||
|
dnl BOOST_NO_SCOPED_ENUMS was changed to BOOST_NO_CXX11_SCOPED_ENUMS in 1.51.
|
||||||
|
|
||||||
|
TEMP_LIBS="$LIBS"
|
||||||
|
LIBS="$BOOST_LIBS $LIBS"
|
||||||
|
TEMP_CPPFLAGS="$CPPFLAGS"
|
||||||
|
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
|
||||||
|
AC_MSG_CHECKING([for mismatched boost c++11 scoped enums])
|
||||||
|
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
||||||
|
#include "boost/config.hpp"
|
||||||
|
#include "boost/version.hpp"
|
||||||
|
#if !defined(BOOST_NO_SCOPED_ENUMS) && !defined(BOOST_NO_CXX11_SCOPED_ENUMS) && BOOST_VERSION < 105700
|
||||||
|
#define BOOST_NO_SCOPED_ENUMS
|
||||||
|
#define BOOST_NO_CXX11_SCOPED_ENUMS
|
||||||
|
#define CHECK
|
||||||
|
#endif
|
||||||
|
#include "boost/filesystem.hpp"
|
||||||
|
]],[[
|
||||||
|
#if defined(CHECK)
|
||||||
|
boost::filesystem::copy_file("foo", "bar");
|
||||||
|
#else
|
||||||
|
choke;
|
||||||
|
#endif
|
||||||
|
]])],
|
||||||
|
[AC_MSG_RESULT(mismatched); BOOST_CPPFLAGS="$BOOST_CPPFLAGS -DBOOST_NO_SCOPED_ENUMS -DBOOST_NO_CXX11_SCOPED_ENUMS"], [AC_MSG_RESULT(ok)])
|
||||||
|
LIBS="$TEMP_LIBS"
|
||||||
|
CPPFLAGS="$TEMP_CPPFLAGS"
|
||||||
|
|
||||||
dnl Boost >= 1.50 uses sleep_for rather than the now-deprecated sleep, however
|
dnl Boost >= 1.50 uses sleep_for rather than the now-deprecated sleep, however
|
||||||
dnl it was broken from 1.50 to 1.52 when backed by nanosleep. Use sleep_for if
|
dnl it was broken from 1.50 to 1.52 when backed by nanosleep. Use sleep_for if
|
||||||
dnl a working version is available, else fall back to sleep. sleep was removed
|
dnl a working version is available, else fall back to sleep. sleep was removed
|
||||||
|
@ -729,6 +806,44 @@ else
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
dnl univalue check
|
||||||
|
|
||||||
|
if test x$system_univalue != xno ; then
|
||||||
|
found_univalue=no
|
||||||
|
if test x$use_pkgconfig = xyes; then
|
||||||
|
: #NOP
|
||||||
|
m4_ifdef(
|
||||||
|
[PKG_CHECK_MODULES],
|
||||||
|
[
|
||||||
|
PKG_CHECK_MODULES([UNIVALUE],[libunivalue],[found_univalue=yes],[true])
|
||||||
|
]
|
||||||
|
)
|
||||||
|
else
|
||||||
|
AC_CHECK_HEADER([univalue.h],[
|
||||||
|
AC_CHECK_LIB([univalue], [main],[
|
||||||
|
UNIVALUE_LIBS=-lunivalue
|
||||||
|
found_univalue=yes
|
||||||
|
],[true])
|
||||||
|
],[true])
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test x$found_univalue = xyes ; then
|
||||||
|
system_univalue=yes
|
||||||
|
elif test x$system_univalue = xyes ; then
|
||||||
|
AC_MSG_ERROR([univalue not found])
|
||||||
|
else
|
||||||
|
system_univalue=no
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test x$system_univalue = xno ; then
|
||||||
|
UNIVALUE_CFLAGS='-I$(srcdir)/univalue/include'
|
||||||
|
UNIVALUE_LIBS='univalue/libunivalue.la'
|
||||||
|
fi
|
||||||
|
AM_CONDITIONAL([EMBEDDED_UNIVALUE],[test x$system_univalue = xno])
|
||||||
|
AC_SUBST(UNIVALUE_CFLAGS)
|
||||||
|
AC_SUBST(UNIVALUE_LIBS)
|
||||||
|
|
||||||
CXXFLAGS_TEMP="$CXXFLAGS"
|
CXXFLAGS_TEMP="$CXXFLAGS"
|
||||||
LIBS_TEMP="$LIBS"
|
LIBS_TEMP="$LIBS"
|
||||||
CXXFLAGS="$CXXFLAGS $SSL_CFLAGS $CRYPTO_CFLAGS"
|
CXXFLAGS="$CXXFLAGS $SSL_CFLAGS $CRYPTO_CFLAGS"
|
||||||
|
@ -814,8 +929,8 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
dnl these are only used when qt is enabled
|
dnl these are only used when qt is enabled
|
||||||
|
BUILD_TEST_QT=""
|
||||||
if test x$bitcoin_enable_qt != xno; then
|
if test x$bitcoin_enable_qt != xno; then
|
||||||
BUILD_QT=qt
|
|
||||||
dnl enable dbus support
|
dnl enable dbus support
|
||||||
AC_MSG_CHECKING([whether to build GUI with support for D-Bus])
|
AC_MSG_CHECKING([whether to build GUI with support for D-Bus])
|
||||||
if test x$bitcoin_enable_qt_dbus != xno; then
|
if test x$bitcoin_enable_qt_dbus != xno; then
|
||||||
|
@ -845,9 +960,9 @@ if test x$bitcoin_enable_qt != xno; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_MSG_CHECKING([whether to build test_bitcoin-qt])
|
AC_MSG_CHECKING([whether to build test_bitcoin-qt])
|
||||||
if test x$use_tests$bitcoin_enable_qt_test = xyesyes; then
|
if test x$use_gui_tests$bitcoin_enable_qt_test = xyesyes; then
|
||||||
AC_MSG_RESULT([yes])
|
AC_MSG_RESULT([yes])
|
||||||
BUILD_TEST_QT="test"
|
BUILD_TEST_QT="yes"
|
||||||
else
|
else
|
||||||
AC_MSG_RESULT([no])
|
AC_MSG_RESULT([no])
|
||||||
fi
|
fi
|
||||||
|
@ -858,9 +973,10 @@ AM_CONDITIONAL([ENABLE_ZMQ], [test "x$use_zmq" = "xyes"])
|
||||||
AC_MSG_CHECKING([whether to build test_bitcoin])
|
AC_MSG_CHECKING([whether to build test_bitcoin])
|
||||||
if test x$use_tests = xyes; then
|
if test x$use_tests = xyes; then
|
||||||
AC_MSG_RESULT([yes])
|
AC_MSG_RESULT([yes])
|
||||||
BUILD_TEST="test"
|
BUILD_TEST="yes"
|
||||||
else
|
else
|
||||||
AC_MSG_RESULT([no])
|
AC_MSG_RESULT([no])
|
||||||
|
BUILD_TEST=""
|
||||||
fi
|
fi
|
||||||
|
|
||||||
AC_MSG_CHECKING([whether to reduce exports])
|
AC_MSG_CHECKING([whether to reduce exports])
|
||||||
|
@ -878,39 +994,53 @@ AM_CONDITIONAL([TARGET_DARWIN], [test x$TARGET_OS = xdarwin])
|
||||||
AM_CONDITIONAL([BUILD_DARWIN], [test x$BUILD_OS = xdarwin])
|
AM_CONDITIONAL([BUILD_DARWIN], [test x$BUILD_OS = xdarwin])
|
||||||
AM_CONDITIONAL([TARGET_WINDOWS], [test x$TARGET_OS = xwindows])
|
AM_CONDITIONAL([TARGET_WINDOWS], [test x$TARGET_OS = xwindows])
|
||||||
AM_CONDITIONAL([ENABLE_WALLET],[test x$enable_wallet = xyes])
|
AM_CONDITIONAL([ENABLE_WALLET],[test x$enable_wallet = xyes])
|
||||||
AM_CONDITIONAL([ENABLE_TESTS],[test x$use_tests = xyes])
|
AM_CONDITIONAL([ENABLE_TESTS],[test x$BUILD_TEST = xyes])
|
||||||
AM_CONDITIONAL([ENABLE_QT],[test x$bitcoin_enable_qt = xyes])
|
AM_CONDITIONAL([ENABLE_QT],[test x$bitcoin_enable_qt = xyes])
|
||||||
AM_CONDITIONAL([ENABLE_QT_TESTS],[test x$use_tests$bitcoin_enable_qt_test = xyesyes])
|
AM_CONDITIONAL([ENABLE_QT_TESTS],[test x$BUILD_TEST_QT = xyes])
|
||||||
AM_CONDITIONAL([ENABLE_BENCH],[test x$use_bench = xyes])
|
AM_CONDITIONAL([ENABLE_BENCH],[test x$use_bench = xyes])
|
||||||
AM_CONDITIONAL([USE_QRCODE], [test x$use_qr = xyes])
|
AM_CONDITIONAL([USE_QRCODE], [test x$use_qr = xyes])
|
||||||
AM_CONDITIONAL([USE_LCOV],[test x$use_lcov = xyes])
|
AM_CONDITIONAL([USE_LCOV],[test x$use_lcov = xyes])
|
||||||
AM_CONDITIONAL([USE_COMPARISON_TOOL],[test x$use_comparison_tool != xno])
|
AM_CONDITIONAL([USE_COMPARISON_TOOL],[test x$use_comparison_tool != xno])
|
||||||
AM_CONDITIONAL([USE_COMPARISON_TOOL_REORG_TESTS],[test x$use_comparison_tool_reorg_test != xno])
|
AM_CONDITIONAL([USE_COMPARISON_TOOL_REORG_TESTS],[test x$use_comparison_tool_reorg_test != xno])
|
||||||
AM_CONDITIONAL([GLIBC_BACK_COMPAT],[test x$use_glibc_compat = xyes])
|
AM_CONDITIONAL([GLIBC_BACK_COMPAT],[test x$use_glibc_compat = xyes])
|
||||||
|
AM_CONDITIONAL([HARDEN],[test x$use_hardening = xyes])
|
||||||
|
|
||||||
AC_DEFINE(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR, [Major version])
|
AC_DEFINE(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR, [Major version])
|
||||||
AC_DEFINE(CLIENT_VERSION_MINOR, _CLIENT_VERSION_MINOR, [Minor version])
|
AC_DEFINE(CLIENT_VERSION_MINOR, _CLIENT_VERSION_MINOR, [Minor version])
|
||||||
AC_DEFINE(CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION, [Build revision])
|
AC_DEFINE(CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION, [Build revision])
|
||||||
AC_DEFINE(CLIENT_VERSION_BUILD, _CLIENT_VERSION_BUILD, [Version Build])
|
AC_DEFINE(CLIENT_VERSION_BUILD, _CLIENT_VERSION_BUILD, [Version Build])
|
||||||
AC_DEFINE(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE, [Version is release])
|
AC_DEFINE(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE, [Version is release])
|
||||||
AC_DEFINE(COPYRIGHT_YEAR, _COPYRIGHT_YEAR, [Version is release])
|
AC_DEFINE(COPYRIGHT_YEAR, _COPYRIGHT_YEAR, [Copyright year])
|
||||||
|
AC_DEFINE(COPYRIGHT_HOLDERS, "_COPYRIGHT_HOLDERS", [Copyright holder(s) before %s replacement])
|
||||||
|
AC_DEFINE(COPYRIGHT_HOLDERS_SUBSTITUTION, "_COPYRIGHT_HOLDERS_SUBSTITUTION", [Replacement for %s in copyright holders string])
|
||||||
|
define(_COPYRIGHT_HOLDERS_FINAL, [patsubst(_COPYRIGHT_HOLDERS, [%s], [_COPYRIGHT_HOLDERS_SUBSTITUTION])])
|
||||||
|
AC_DEFINE(COPYRIGHT_HOLDERS_FINAL, "_COPYRIGHT_HOLDERS_FINAL", [Copyright holder(s)])
|
||||||
AC_SUBST(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR)
|
AC_SUBST(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR)
|
||||||
AC_SUBST(CLIENT_VERSION_MINOR, _CLIENT_VERSION_MINOR)
|
AC_SUBST(CLIENT_VERSION_MINOR, _CLIENT_VERSION_MINOR)
|
||||||
AC_SUBST(CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION)
|
AC_SUBST(CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION)
|
||||||
AC_SUBST(CLIENT_VERSION_BUILD, _CLIENT_VERSION_BUILD)
|
AC_SUBST(CLIENT_VERSION_BUILD, _CLIENT_VERSION_BUILD)
|
||||||
AC_SUBST(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE)
|
AC_SUBST(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE)
|
||||||
AC_SUBST(COPYRIGHT_YEAR, _COPYRIGHT_YEAR)
|
AC_SUBST(COPYRIGHT_YEAR, _COPYRIGHT_YEAR)
|
||||||
|
AC_SUBST(COPYRIGHT_HOLDERS, "_COPYRIGHT_HOLDERS")
|
||||||
|
AC_SUBST(COPYRIGHT_HOLDERS_SUBSTITUTION, "_COPYRIGHT_HOLDERS_SUBSTITUTION")
|
||||||
|
AC_SUBST(COPYRIGHT_HOLDERS_FINAL, "_COPYRIGHT_HOLDERS_FINAL")
|
||||||
|
AC_SUBST(BITCOIN_DAEMON_NAME)
|
||||||
|
AC_SUBST(BITCOIN_GUI_NAME)
|
||||||
|
AC_SUBST(BITCOIN_CLI_NAME)
|
||||||
|
AC_SUBST(BITCOIN_TX_NAME)
|
||||||
|
|
||||||
AC_SUBST(RELDFLAGS)
|
AC_SUBST(RELDFLAGS)
|
||||||
|
AC_SUBST(HARDENED_CXXFLAGS)
|
||||||
|
AC_SUBST(HARDENED_CPPFLAGS)
|
||||||
|
AC_SUBST(HARDENED_LDFLAGS)
|
||||||
|
AC_SUBST(PIC_FLAGS)
|
||||||
|
AC_SUBST(PIE_FLAGS)
|
||||||
AC_SUBST(LIBTOOL_APP_LDFLAGS)
|
AC_SUBST(LIBTOOL_APP_LDFLAGS)
|
||||||
AC_SUBST(USE_UPNP)
|
AC_SUBST(USE_UPNP)
|
||||||
AC_SUBST(USE_QRCODE)
|
AC_SUBST(USE_QRCODE)
|
||||||
AC_SUBST(BOOST_LIBS)
|
AC_SUBST(BOOST_LIBS)
|
||||||
AC_SUBST(TESTDEFS)
|
AC_SUBST(TESTDEFS)
|
||||||
AC_SUBST(LEVELDB_TARGET_FLAGS)
|
AC_SUBST(LEVELDB_TARGET_FLAGS)
|
||||||
AC_SUBST(BUILD_TEST)
|
|
||||||
AC_SUBST(BUILD_QT)
|
|
||||||
AC_SUBST(BUILD_TEST_QT)
|
|
||||||
AC_SUBST(MINIUPNPC_CPPFLAGS)
|
AC_SUBST(MINIUPNPC_CPPFLAGS)
|
||||||
AC_SUBST(MINIUPNPC_LIBS)
|
AC_SUBST(MINIUPNPC_LIBS)
|
||||||
AC_CONFIG_FILES([Makefile src/Makefile share/setup.nsi share/qt/Info.plist src/test/buildenv.py])
|
AC_CONFIG_FILES([Makefile src/Makefile share/setup.nsi share/qt/Info.plist src/test/buildenv.py])
|
||||||
|
@ -940,8 +1070,12 @@ PKGCONFIG_LIBDIR_TEMP="$PKG_CONFIG_LIBDIR"
|
||||||
unset PKG_CONFIG_LIBDIR
|
unset PKG_CONFIG_LIBDIR
|
||||||
PKG_CONFIG_LIBDIR="$PKGCONFIG_LIBDIR_TEMP"
|
PKG_CONFIG_LIBDIR="$PKGCONFIG_LIBDIR_TEMP"
|
||||||
|
|
||||||
ac_configure_args="${ac_configure_args} --disable-shared --with-pic --with-bignum=no"
|
if test x$system_univalue = xno; then
|
||||||
AC_CONFIG_SUBDIRS([src/secp256k1 src/univalue])
|
AC_CONFIG_SUBDIRS([src/univalue])
|
||||||
|
fi
|
||||||
|
|
||||||
|
ac_configure_args="${ac_configure_args} --disable-shared --with-pic --with-bignum=no --enable-module-recovery"
|
||||||
|
AC_CONFIG_SUBDIRS([src/secp256k1])
|
||||||
|
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|
||||||
|
|
|
@ -11,10 +11,10 @@ Repository Tools
|
||||||
|
|
||||||
### [Developer tools](/contrib/devtools) ###
|
### [Developer tools](/contrib/devtools) ###
|
||||||
Specific tools for developers working on this repository.
|
Specific tools for developers working on this repository.
|
||||||
Contains the script `github-merge.sh` for merging github pull requests securely and signing them using GPG.
|
Contains the script `github-merge.py` for merging github pull requests securely and signing them using GPG.
|
||||||
|
|
||||||
### [Verify-Commits](/contrib/verify-commits) ###
|
### [Verify-Commits](/contrib/verify-commits) ###
|
||||||
Tool to verify that every merge commit was signed by a developer using the above `github-merge.sh` script.
|
Tool to verify that every merge commit was signed by a developer using the above `github-merge.py` script.
|
||||||
|
|
||||||
### [Linearize](/contrib/linearize) ###
|
### [Linearize](/contrib/linearize) ###
|
||||||
Construct a linear, no-fork, best version of the blockchain.
|
Construct a linear, no-fork, best version of the blockchain.
|
||||||
|
@ -34,23 +34,22 @@ Contains files used to package bitcoind/bitcoin-qt
|
||||||
for Debian-based Linux systems. If you compile bitcoind/bitcoin-qt yourself, there are some useful files here.
|
for Debian-based Linux systems. If you compile bitcoind/bitcoin-qt yourself, there are some useful files here.
|
||||||
|
|
||||||
### [Gitian-descriptors](/contrib/gitian-descriptors) ###
|
### [Gitian-descriptors](/contrib/gitian-descriptors) ###
|
||||||
Gavin's notes on getting gitian builds up and running using KVM.
|
Notes on getting Gitian builds up and running using KVM.
|
||||||
|
|
||||||
### [Gitian-downloader](/contrib/gitian-downloader)
|
### [Gitian-keys](/contrib/gitian-keys)
|
||||||
Various PGP files of core developers.
|
PGP keys used for signing Bitcoin Core [Gitian release](/doc/release-process.md) results.
|
||||||
|
|
||||||
### [MacDeploy](/contrib/macdeploy) ###
|
### [MacDeploy](/contrib/macdeploy) ###
|
||||||
Scripts and notes for Mac builds.
|
Scripts and notes for Mac builds.
|
||||||
|
|
||||||
|
### [RPM](/contrib/rpm) ###
|
||||||
|
RPM spec file for building bitcoin-core on RPM based distributions
|
||||||
|
|
||||||
Test and Verify Tools
|
Test and Verify Tools
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
### [TestGen](/contrib/testgen) ###
|
### [TestGen](/contrib/testgen) ###
|
||||||
Utilities to generate test vectors for the data-driven Bitcoin tests.
|
Utilities to generate test vectors for the data-driven Bitcoin tests.
|
||||||
|
|
||||||
### [Test Patches](/contrib/test-patches) ###
|
|
||||||
These patches are applied when the automated pull-tester
|
|
||||||
tests each pull and when master is tested using jenkins.
|
|
||||||
|
|
||||||
### [Verify SF Binaries](/contrib/verifysfbinaries) ###
|
### [Verify SF Binaries](/contrib/verifysfbinaries) ###
|
||||||
This script attempts to download and verify the signature file SHA256SUMS.asc from SourceForge.
|
This script attempts to download and verify the signature file SHA256SUMS.asc from SourceForge.
|
||||||
|
|
|
@ -23,7 +23,7 @@ Build-Depends: debhelper,
|
||||||
libprotobuf-dev, protobuf-compiler,
|
libprotobuf-dev, protobuf-compiler,
|
||||||
python
|
python
|
||||||
Standards-Version: 3.9.2
|
Standards-Version: 3.9.2
|
||||||
Homepage: https://www.bitcoin.org/
|
Homepage: https://bitcoincore.org/
|
||||||
Vcs-Git: git://github.com/bitcoin/bitcoin.git
|
Vcs-Git: git://github.com/bitcoin/bitcoin.git
|
||||||
Vcs-Browser: https://github.com/bitcoin/bitcoin
|
Vcs-Browser: https://github.com/bitcoin/bitcoin
|
||||||
|
|
||||||
|
@ -31,14 +31,11 @@ Package: bitcoind
|
||||||
Architecture: any
|
Architecture: any
|
||||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||||
Description: peer-to-peer network based digital currency - daemon
|
Description: peer-to-peer network based digital currency - daemon
|
||||||
Bitcoin is a free open source peer-to-peer electronic cash system that
|
Bitcoin is an experimental new digital currency that enables instant
|
||||||
is completely decentralized, without the need for a central server or
|
payments to anyone, anywhere in the world. Bitcoin uses peer-to-peer
|
||||||
trusted parties. Users hold the crypto keys to their own money and
|
technology to operate with no central authority: managing transactions
|
||||||
transact directly with each other, with the help of a P2P network to
|
and issuing money are carried out collectively by the network. Bitcoin Core
|
||||||
check for double-spending.
|
is the name of the open source software which enables the use of this currency.
|
||||||
.
|
|
||||||
Full transaction history is stored locally at each client. This
|
|
||||||
requires 20+ GB of space, slowly growing.
|
|
||||||
.
|
.
|
||||||
This package provides the daemon, bitcoind, and the CLI tool
|
This package provides the daemon, bitcoind, and the CLI tool
|
||||||
bitcoin-cli to interact with the daemon.
|
bitcoin-cli to interact with the daemon.
|
||||||
|
@ -47,14 +44,11 @@ Package: bitcoin-qt
|
||||||
Architecture: any
|
Architecture: any
|
||||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||||
Description: peer-to-peer network based digital currency - Qt GUI
|
Description: peer-to-peer network based digital currency - Qt GUI
|
||||||
Bitcoin is a free open source peer-to-peer electronic cash system that
|
Bitcoin is an experimental new digital currency that enables instant
|
||||||
is completely decentralized, without the need for a central server or
|
payments to anyone, anywhere in the world. Bitcoin uses peer-to-peer
|
||||||
trusted parties. Users hold the crypto keys to their own money and
|
technology to operate with no central authority: managing transactions
|
||||||
transact directly with each other, with the help of a P2P network to
|
and issuing money are carried out collectively by the network. Bitcoin Core
|
||||||
check for double-spending.
|
is the name of the open source software which enables the use of this currency.
|
||||||
.
|
|
||||||
Full transaction history is stored locally at each client. This
|
|
||||||
requires 20+ GB of space, slowly growing.
|
|
||||||
.
|
.
|
||||||
This package provides Bitcoin-Qt, a GUI for Bitcoin based on Qt.
|
This package provides Bitcoin-Qt, a GUI for Bitcoin based on Qt.
|
||||||
|
|
||||||
|
@ -62,11 +56,11 @@ Package: bitcoin-tx
|
||||||
Architecture: any
|
Architecture: any
|
||||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||||
Description: peer-to-peer digital currency - standalone transaction tool
|
Description: peer-to-peer digital currency - standalone transaction tool
|
||||||
Bitcoin is a free open source peer-to-peer electronic cash system that
|
Bitcoin is an experimental new digital currency that enables instant
|
||||||
is completely decentralized, without the need for a central server or
|
payments to anyone, anywhere in the world. Bitcoin uses peer-to-peer
|
||||||
trusted parties. Users hold the crypto keys to their own money and
|
technology to operate with no central authority: managing transactions
|
||||||
transact directly with each other, with the help of a P2P network to
|
and issuing money are carried out collectively by the network. Bitcoin Core
|
||||||
check for double-spending.
|
is the name of the open source software which enables the use of this currency.
|
||||||
.
|
.
|
||||||
This package provides bitcoin-tx, a command-line transaction creation
|
This package provides bitcoin-tx, a command-line transaction creation
|
||||||
tool which can be used without a bitcoin daemon. Some means of
|
tool which can be used without a bitcoin daemon. Some means of
|
||||||
|
|
|
@ -5,7 +5,7 @@ Upstream-Contact: Satoshi Nakamoto <satoshin@gmx.com>
|
||||||
Source: https://github.com/bitcoin/bitcoin
|
Source: https://github.com/bitcoin/bitcoin
|
||||||
|
|
||||||
Files: *
|
Files: *
|
||||||
Copyright: 2009-2015, Bitcoin Core Developers
|
Copyright: 2009-2016, Bitcoin Core Developers
|
||||||
License: Expat
|
License: Expat
|
||||||
Comment: The Bitcoin Core Developers encompasses the current developers listed on bitcoin.org,
|
Comment: The Bitcoin Core Developers encompasses the current developers listed on bitcoin.org,
|
||||||
as well as the numerous contributors to the project.
|
as well as the numerous contributors to the project.
|
||||||
|
@ -21,6 +21,7 @@ License: GPL-3+
|
||||||
|
|
||||||
Files: src/qt/res/icons/add.png
|
Files: src/qt/res/icons/add.png
|
||||||
src/qt/res/icons/address-book.png
|
src/qt/res/icons/address-book.png
|
||||||
|
src/qt/res/icons/chevron.png
|
||||||
src/qt/res/icons/configure.png
|
src/qt/res/icons/configure.png
|
||||||
src/qt/res/icons/debugwindow.png
|
src/qt/res/icons/debugwindow.png
|
||||||
src/qt/res/icons/edit.png
|
src/qt/res/icons/edit.png
|
||||||
|
@ -56,6 +57,8 @@ Comment: Inspired by Stephan Hutchings Typicons
|
||||||
|
|
||||||
Files: src/qt/res/icons/tx_mined.png
|
Files: src/qt/res/icons/tx_mined.png
|
||||||
src/qt/res/src/mine.svg
|
src/qt/res/src/mine.svg
|
||||||
|
src/qt/res/icons/fontbigger.png
|
||||||
|
src/qt/res/icons/fontsmaller.png
|
||||||
Copyright: Jonas Schnelli
|
Copyright: Jonas Schnelli
|
||||||
License: Expat
|
License: Expat
|
||||||
Comment:
|
Comment:
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
.TH BITCOIN-CLI "1" "February 2015" "bitcoin-cli 0.10"
|
.TH BITCOIN-CLI "1" "February 2016" "bitcoin-cli 0.12"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
bitcoin-cli \- a remote procedure call client for Bitcoin Core.
|
bitcoin-cli \- a remote procedure call client for Bitcoin Core.
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
@ -11,31 +11,7 @@ This manual page documents the bitcoin-cli program. bitcoin-cli is an RPC client
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
.TP
|
.TP
|
||||||
\fB\-?\fR
|
\fB\-?\fR
|
||||||
Show the help message.
|
Show possible options.
|
||||||
.TP
|
|
||||||
\fB\-conf=\fR<file>
|
|
||||||
Specify configuration file (default: bitcoin.conf).
|
|
||||||
.TP
|
|
||||||
\fB\-datadir=\fR<dir>
|
|
||||||
Specify data directory.
|
|
||||||
.TP
|
|
||||||
\fB\-testnet\fR
|
|
||||||
Connect to a Bitcoin Core instance running in testnet mode.
|
|
||||||
.TP
|
|
||||||
\fB\-regtest\fR
|
|
||||||
Connect to a Bitcoin Core instance running in regtest mode (see documentation for -regtest on bitcoind).
|
|
||||||
.TP
|
|
||||||
\fB\-rpcuser=\fR<user>
|
|
||||||
Username for JSON\-RPC connections.
|
|
||||||
.TP
|
|
||||||
\fB\-rpcpassword=\fR<pw>
|
|
||||||
Password for JSON\-RPC connections.
|
|
||||||
.TP
|
|
||||||
\fB\-rpcport=\fR<port>
|
|
||||||
Listen for JSON\-RPC connections on <port> (default: 8332 or testnet: 18332).
|
|
||||||
.TP
|
|
||||||
\fB\-rpcconnect=\fR<ip>
|
|
||||||
Send commands to node running on <ip> (default: 127.0.0.1).
|
|
||||||
|
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
\fBbitcoind\fP, \fBbitcoin.conf\fP
|
\fBbitcoind\fP, \fBbitcoin.conf\fP
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
.TH BITCOIN-QT "1" "April 2013" "bitcoin-qt 1"
|
.TH BITCOIN-QT "1" "February 2016" "bitcoin-qt 0.12"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
bitcoin-qt \- peer-to-peer network based digital currency
|
bitcoin-qt \- peer-to-peer network based digital currency
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
|
@ -8,184 +8,6 @@ bitcoin\-qt [command\-line options]
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
.TP
|
.TP
|
||||||
\-?
|
\-?
|
||||||
This help message
|
List options.
|
||||||
.TP
|
.SH "SEE ALSO"
|
||||||
\fB\-conf=\fR<file>
|
bitcoind(1)
|
||||||
Specify configuration file (default: bitcoin.conf)
|
|
||||||
.TP
|
|
||||||
\fB\-pid=\fR<file>
|
|
||||||
Specify pid file (default: bitcoind.pid)
|
|
||||||
.TP
|
|
||||||
\fB\-gen\fR
|
|
||||||
Generate coins
|
|
||||||
.TP
|
|
||||||
\fB\-gen\fR=\fI0\fR
|
|
||||||
Don't generate coins
|
|
||||||
.TP
|
|
||||||
\fB\-datadir=\fR<dir>
|
|
||||||
Specify data directory
|
|
||||||
.TP
|
|
||||||
\fB\-dbcache=\fR<n>
|
|
||||||
Set database cache size in megabytes (default: 25)
|
|
||||||
.TP
|
|
||||||
\fB\-timeout=\fR<n>
|
|
||||||
Specify connection timeout in milliseconds (default: 5000)
|
|
||||||
.TP
|
|
||||||
\fB\-proxy=\fR<ip:port>
|
|
||||||
Connect through SOCKS5 proxy
|
|
||||||
.TP
|
|
||||||
\fB\-tor=\fR<ip:port>
|
|
||||||
Use proxy to reach tor hidden services (default: same as \fB\-proxy\fR)
|
|
||||||
.TP
|
|
||||||
\fB\-dns\fR
|
|
||||||
Allow DNS lookups for \fB\-addnode\fR, \fB\-seednode\fR and \fB\-connect\fR
|
|
||||||
.TP
|
|
||||||
\fB\-port=\fR<port>
|
|
||||||
Listen for connections on <port> (default: 8333 or testnet: 18333)
|
|
||||||
.TP
|
|
||||||
\fB\-maxconnections=\fR<n>
|
|
||||||
Maintain at most <n> connections to peers (default: 125)
|
|
||||||
.TP
|
|
||||||
\fB\-addnode=\fR<ip>
|
|
||||||
Add a node to connect to and attempt to keep the connection open
|
|
||||||
.TP
|
|
||||||
\fB\-connect=\fR<ip>
|
|
||||||
Connect only to the specified node(s)
|
|
||||||
.TP
|
|
||||||
\fB\-seednode=\fR<ip>
|
|
||||||
Connect to a node to retrieve peer addresses, and disconnect
|
|
||||||
.TP
|
|
||||||
\fB\-externalip=\fR<ip>
|
|
||||||
Specify your own public address
|
|
||||||
.TP
|
|
||||||
\fB\-onlynet=\fR<net>
|
|
||||||
Only connect to nodes in network <net> (IPv4, IPv6 or Tor)
|
|
||||||
.TP
|
|
||||||
\fB\-discover\fR
|
|
||||||
Discover own IP address (default: 1 when listening and no \fB\-externalip\fR)
|
|
||||||
.TP
|
|
||||||
\fB\-checkpoints\fR
|
|
||||||
Only accept block chain matching built\-in checkpoints (default: 1)
|
|
||||||
.TP
|
|
||||||
\fB\-listen\fR
|
|
||||||
Accept connections from outside (default: 1 if no \fB\-proxy\fR or \fB\-connect\fR)
|
|
||||||
.TP
|
|
||||||
\fB\-bind=\fR<addr>
|
|
||||||
Bind to given address and always listen on it. Use [host]:port notation for IPv6
|
|
||||||
.TP
|
|
||||||
\fB\-dnsseed\fR
|
|
||||||
Find peers using DNS lookup (default: 1 unless \fB\-connect\fR)
|
|
||||||
.TP
|
|
||||||
\fB\-banscore=\fR<n>
|
|
||||||
Threshold for disconnecting misbehaving peers (default: 100)
|
|
||||||
.TP
|
|
||||||
\fB\-bantime=\fR<n>
|
|
||||||
Number of seconds to keep misbehaving peers from reconnecting (default: 86400)
|
|
||||||
.TP
|
|
||||||
\fB\-maxreceivebuffer=\fR<n>
|
|
||||||
Maximum per\-connection receive buffer, <n>*1000 bytes (default: 5000)
|
|
||||||
.TP
|
|
||||||
\fB\-maxsendbuffer=\fR<n>
|
|
||||||
Maximum per\-connection send buffer, <n>*1000 bytes (default: 1000)
|
|
||||||
.TP
|
|
||||||
\fB\-upnp\fR
|
|
||||||
Use UPnP to map the listening port (default: 1 when listening)
|
|
||||||
.TP
|
|
||||||
\fB\-paytxfee=\fR<amt>
|
|
||||||
Fee per KB to add to transactions you send
|
|
||||||
.TP
|
|
||||||
\fB\-server\fR
|
|
||||||
Accept command line and JSON\-RPC commands
|
|
||||||
.TP
|
|
||||||
\fB\-testnet\fR
|
|
||||||
Use the test network
|
|
||||||
.TP
|
|
||||||
\fB\-debug\fR
|
|
||||||
Output extra debugging information. Implies all other \fB\-debug\fR* options
|
|
||||||
.TP
|
|
||||||
\fB\-debugnet\fR
|
|
||||||
Output extra network debugging information
|
|
||||||
.TP
|
|
||||||
\fB\-logtimestamps\fR
|
|
||||||
Prepend debug output with timestamp
|
|
||||||
.TP
|
|
||||||
\fB\-shrinkdebugfile\fR
|
|
||||||
Shrink debug.log file on client startup (default: 1 when no \fB\-debug\fR)
|
|
||||||
.TP
|
|
||||||
\fB\-printtoconsole\fR
|
|
||||||
Send trace/debug info to console instead of debug.log file
|
|
||||||
.TP
|
|
||||||
\fB\-rpcuser=\fR<user>
|
|
||||||
Username for JSON\-RPC connections
|
|
||||||
.TP
|
|
||||||
\fB\-rpcpassword=\fR<pw>
|
|
||||||
Password for JSON\-RPC connections
|
|
||||||
.TP
|
|
||||||
\fB\-rpcport=\fR<port>
|
|
||||||
Listen for JSON\-RPC connections on <port> (default: 8332 or testnet: 18332)
|
|
||||||
.TP
|
|
||||||
\fB\-rpcallowip=\fR<ip>
|
|
||||||
Allow JSON\-RPC connections from specified IP address
|
|
||||||
.TP
|
|
||||||
\fB\-rpcthreads=\fR<n>
|
|
||||||
Set the number of threads to service RPC calls (default: 4)
|
|
||||||
.TP
|
|
||||||
\fB\-blocknotify=\fR<cmd>
|
|
||||||
Execute command when the best block changes (%s in cmd is replaced by block hash)
|
|
||||||
.TP
|
|
||||||
\fB\-walletnotify=\fR<cmd>
|
|
||||||
Execute command when a wallet transaction changes (%s in cmd is replaced by TxID)
|
|
||||||
.TP
|
|
||||||
\fB\-alertnotify=\fR<cmd>
|
|
||||||
Execute command when a relevant alert is received (%s in cmd is replaced by message)
|
|
||||||
.TP
|
|
||||||
\fB\-upgradewallet\fR
|
|
||||||
Upgrade wallet to latest format
|
|
||||||
.TP
|
|
||||||
\fB\-keypool=\fR<n>
|
|
||||||
Set key pool size to <n> (default: 100)
|
|
||||||
.TP
|
|
||||||
\fB\-rescan\fR
|
|
||||||
Rescan the block chain for missing wallet transactions
|
|
||||||
.TP
|
|
||||||
\fB\-salvagewallet\fR
|
|
||||||
Attempt to recover private keys from a corrupt wallet.dat
|
|
||||||
.TP
|
|
||||||
\fB\-checkblocks=\fR<n>
|
|
||||||
How many blocks to check at startup (default: 288, 0 = all)
|
|
||||||
.TP
|
|
||||||
\fB\-checklevel=\fR<n>
|
|
||||||
How thorough the block verification is (0\-4, default: 3)
|
|
||||||
.TP
|
|
||||||
\fB\-txindex\fR
|
|
||||||
Maintain a full transaction index (default: 0)
|
|
||||||
.TP
|
|
||||||
\fB\-loadblock=\fR<file>
|
|
||||||
Imports blocks from external blk000??.dat file
|
|
||||||
.TP
|
|
||||||
\fB\-reindex\fR
|
|
||||||
Rebuild block chain index from current blk000??.dat files
|
|
||||||
.TP
|
|
||||||
\fB\-par=\fR<n>
|
|
||||||
Set the number of script verification threads (1\-16, 0=auto, default: 0)
|
|
||||||
.SS "Block creation options:"
|
|
||||||
.TP
|
|
||||||
\fB\-blockminsize=\fR<n>
|
|
||||||
Set minimum block size in bytes (default: 0)
|
|
||||||
.TP
|
|
||||||
\fB\-blockmaxsize=\fR<n>
|
|
||||||
Set maximum block size in bytes (default: 250000)
|
|
||||||
.HP
|
|
||||||
\fB\-blockprioritysize=\fR<n> Set maximum size of high\-priority/low\-fee transactions in bytes (default: 27000)
|
|
||||||
.PP
|
|
||||||
Acceptable ciphers (default: TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!AH:!3DES:@STRENGTH)
|
|
||||||
.SS "UI options:"
|
|
||||||
.TP
|
|
||||||
\fB\-lang=\fR<lang>
|
|
||||||
Set language, for example "de_DE" (default: system locale)
|
|
||||||
.TP
|
|
||||||
\fB\-min\fR
|
|
||||||
Start minimized
|
|
||||||
.TP
|
|
||||||
\fB\-splash\fR
|
|
||||||
Show splash screen on startup (default: 1)
|
|
||||||
|
|
|
@ -1,75 +1,15 @@
|
||||||
.TH BITCOIN.CONF "5" "January 2011" "bitcoin.conf 3.19"
|
.TH BITCOIN.CONF "5" "February 2016" "bitcoin.conf 0.12"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
bitcoin.conf \- bitcoin configuration file
|
bitcoin.conf \- bitcoin configuration file
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
All command-line options (except for '\-conf') may be specified in a configuration file, and all configuration file options may also be specified on the command line. Command-line options override values set in the configuration file.
|
All command-line options (except for '\-conf') may be specified in a configuration file, and all configuration file options may also be specified on the command line. Command-line options override values set in the configuration file.
|
||||||
.TP
|
.TP
|
||||||
The configuration file is a list of 'setting=value' pairs, one per line, with optional comments starting with the '#' character.
|
The configuration file is a list of 'setting=value' pairs, one per line, with optional comments starting with the '#' character. Please refer to bitcoind(1) for a up to date list of valid options.
|
||||||
.TP
|
.TP
|
||||||
The configuration file is not automatically created; you can create it using your favorite plain-text editor. By default, bitcoind(1) will look for a file named bitcoin.conf(5) in the bitcoin data directory, but both the data directory and the configuration file path may be changed using the '\-datadir' and '\-conf' command-line arguments.
|
The configuration file is not automatically created; you can create it using your favorite plain-text editor. By default, bitcoind(1) will look for a file named bitcoin.conf(5) in the bitcoin data directory, but both the data directory and the configuration file path may be changed using the '\-datadir' and '\-conf' command-line arguments.
|
||||||
.SH LOCATION
|
.SH LOCATION
|
||||||
bitcoin.conf should be located in $HOME/.bitcoin
|
bitcoin.conf should be located in $HOME/.bitcoin
|
||||||
.SH NETWORK-RELATED SETTINGS
|
|
||||||
.TP
|
|
||||||
.TP
|
|
||||||
\fBtestnet=\fR[\fI'1'\fR|\fI'0'\fR]
|
|
||||||
Enable or disable run on the test network instead of the real *bitcoin* network.
|
|
||||||
.TP
|
|
||||||
\fBproxy=\fR\fI'127.0.0.1:9050'\fR
|
|
||||||
Connect via a socks4 proxy.
|
|
||||||
.TP
|
|
||||||
\fBaddnode=\fR\fI'10.0.0.2:8333'\fR
|
|
||||||
Use as many *addnode=* settings as you like to connect to specific peers.
|
|
||||||
.TP
|
|
||||||
\fBconnect=\fR\fI'10.0.0.1:8333'\fR
|
|
||||||
Use as many *connect=* settings as you like to connect ONLY to specific peers.
|
|
||||||
.TP
|
|
||||||
\fRmaxconnections=\fR\fI'value'\fR
|
|
||||||
Maximum number of inbound+outbound connections.
|
|
||||||
.SH JSON-RPC OPTIONS
|
|
||||||
.TP
|
|
||||||
\fBserver=\fR[\fI'1'\fR|\fI'0'\fR]
|
|
||||||
Tells *bitcoin* to accept or not accept JSON-RPC commands.
|
|
||||||
.TP
|
|
||||||
\fBrpcuser=\fR\fI'username'\fR
|
|
||||||
You must set *rpcuser* to secure the JSON-RPC api.
|
|
||||||
.TP
|
|
||||||
\fBrpcpassword=\fR\fI'password'\fR
|
|
||||||
You must set *rpcpassword* to secure the JSON-RPC api.
|
|
||||||
.TP
|
|
||||||
\fBrpcallowip=\fR\fI'192.168.1.*'\fR
|
|
||||||
By default, only RPC connections from localhost are allowed. Specify as many *rpcallowip=* settings as you like to allow connections from other hosts (and you may use * as a wildcard character).
|
|
||||||
.TP
|
|
||||||
\fBrpcport=\fR\fI'8332'\fR
|
|
||||||
Listen for RPC connections on this TCP port.
|
|
||||||
.TP
|
|
||||||
\fBrpcconnect=\fR\fI'127.0.0.1'\fR
|
|
||||||
You can use *bitcoin* or *bitcoind(1)* to send commands to *bitcoin*/*bitcoind(1)* running on another host using this option.
|
|
||||||
.TP
|
|
||||||
.SH MISCELLANEOUS OPTIONS
|
|
||||||
.TP
|
|
||||||
\fBgen=\fR[\fI'0'\fR|\fI'1'\fR]
|
|
||||||
Enable or disable attempt to generate bitcoins.
|
|
||||||
.TP
|
|
||||||
\fB4way=\fR[\fI'0'\fR|\fI'1'\fR]
|
|
||||||
Enable or disable use SSE instructions to try to generate bitcoins faster.
|
|
||||||
.TP
|
|
||||||
\fBkeypool=\fR\fI'100'\fR
|
|
||||||
Pre-generate this many public/private key pairs, so wallet backups will be valid for both prior transactions and several dozen future transactions.
|
|
||||||
.TP
|
|
||||||
\fBpaytxfee=\fR\fI'0.00'\fR
|
|
||||||
Pay an optional transaction fee every time you send bitcoins. Transactions with fees are more likely than free transactions to be included in generated blocks, so may be validated sooner.
|
|
||||||
.TP
|
|
||||||
\fBallowreceivebyip=\fR\fI'1'\fR
|
|
||||||
Allow direct connections for the 'pay via IP address' feature.
|
|
||||||
.TP
|
|
||||||
.SH USER INTERFACE OPTIONS
|
|
||||||
.TP
|
|
||||||
\fBmin=\fR[\fI'0'\fR|\fI'1'\fR]
|
|
||||||
Enable or disable start bitcoind minimized.
|
|
||||||
.TP
|
|
||||||
\fBminimizetotray=\fR[\fI'0'\fR|\fI'1'\fR]
|
|
||||||
Enable or disable minimize to the system tray.
|
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
bitcoind(1)
|
bitcoind(1)
|
||||||
.SH AUTHOR
|
.SH AUTHOR
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
.TH BITCOIND "1" "January 2011" "bitcoind 3.19"
|
.TH BITCOIND "1" "February 2016" "bitcoind 0.12"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
bitcoind \- peer-to-peer network based digital currency
|
bitcoind \- peer-to-peer network based digital currency
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
|
@ -6,185 +6,20 @@ bitcoin [options] <command> [params]
|
||||||
.TP
|
.TP
|
||||||
bitcoin [options] help <command> \- Get help for a command
|
bitcoin [options] help <command> \- Get help for a command
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
This manual page documents the bitcoind program. Bitcoin is a peer-to-peer digital currency. Peer-to-peer (P2P) means that there is no central authority to issue new money or keep track of transactions. Instead, these tasks are managed collectively by the nodes of the network. Advantages:
|
This manual page documents the bitcoind program. Bitcoin is an experimental new digital currency that enables instant payments to anyone, anywhere in the world. Bitcoin uses peer-to-peer technology to operate with no central authority: managing transactions and issuing money are carried out collectively by the network. Bitcoin Core is the name of open source software which enables the use of this currency.
|
||||||
|
|
||||||
Bitcoins can be sent easily through the Internet, without having to trust middlemen. Transactions are designed to be irreversible. Be safe from instability caused by fractional reserve banking and central banks. The limited inflation of the Bitcoin system’s money supply is distributed evenly (by CPU power) throughout the network, not monopolized by banks.
|
|
||||||
|
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
.TP
|
.TP
|
||||||
\fB\-conf=\fR<file>
|
|
||||||
Specify configuration file (default: bitcoin.conf)
|
|
||||||
.TP
|
|
||||||
\fB\-gen\fR
|
|
||||||
Generate coins
|
|
||||||
.TP
|
|
||||||
\fB\-gen\fR=\fI0\fR
|
|
||||||
Don't generate coins
|
|
||||||
.TP
|
|
||||||
\fB\-min\fR
|
|
||||||
Start minimized
|
|
||||||
.TP
|
|
||||||
\fB\-datadir=\fR<dir>
|
|
||||||
Specify data directory
|
|
||||||
.TP
|
|
||||||
\fB\-proxy=\fR<ip:port>
|
|
||||||
Connect through SOCKS5 proxy
|
|
||||||
.TP
|
|
||||||
\fB\-addnode=\fR<ip>
|
|
||||||
Add a node to connect to
|
|
||||||
.TP
|
|
||||||
\fB\-connect=\fR<ip>
|
|
||||||
Connect only to the specified node
|
|
||||||
.TP
|
|
||||||
\fB\-paytxfee=\fR<amt>
|
|
||||||
Fee per KB to add to transactions you send
|
|
||||||
.TP
|
|
||||||
\fB\-server\fR
|
|
||||||
Accept command line and JSON\-RPC commands
|
|
||||||
.TP
|
|
||||||
\fB\-daemon\fR
|
|
||||||
Run in the background as a daemon and accept commands
|
|
||||||
.TP
|
|
||||||
\fB\-testnet\fR
|
|
||||||
Use the test network
|
|
||||||
.TP
|
|
||||||
\fB\-rpcuser=\fR<user>
|
|
||||||
Username for JSON\-RPC connections
|
|
||||||
.TP
|
|
||||||
\fB\-rpcpassword=\fR<pw>
|
|
||||||
Password for JSON\-RPC connections
|
|
||||||
.TP
|
|
||||||
\fB\-rpcport=\fR<port>
|
|
||||||
Listen for JSON\-RPC connections on <port>
|
|
||||||
.TP
|
|
||||||
\fB\-rpcallowip=\fR<ip>
|
|
||||||
Allow JSON\-RPC connections from specified IP address
|
|
||||||
.TP
|
|
||||||
\fB\-rpcconnect=\fR<ip>
|
|
||||||
Send commands to node running on <ip>
|
|
||||||
.TP
|
|
||||||
\-?
|
\-?
|
||||||
This help message
|
List of possible options.
|
||||||
.SH COMMANDS
|
.SH COMMANDS
|
||||||
.TP
|
.TP
|
||||||
\fBbackupwallet 'destination'\fR
|
\fBhelp\fR
|
||||||
Safely copies *wallet.dat* to 'destination', which can be a directory or a path with filename.
|
List commands.
|
||||||
.TP
|
|
||||||
\fBgetaccount 'bitcoinaddress'\fR
|
|
||||||
DEPRECATED. Returns the account associated with the given address.
|
|
||||||
.TP
|
|
||||||
\fBsetaccount 'bitcoinaddress' ['account']\fR
|
|
||||||
DEPRECATED. Sets the ['account'] associated with the given address. ['account'] may be omitted to remove an address from ['account'].
|
|
||||||
.TP
|
|
||||||
\fBgetaccountaddress 'account'\fR
|
|
||||||
DEPRECATED. Returns a new bitcoin address for 'account'.
|
|
||||||
.TP
|
|
||||||
\fBgetaddressesbyaccount 'account'\fR
|
|
||||||
DEPRECATED. Returns the list of addresses associated with the given 'account'.
|
|
||||||
.TP
|
|
||||||
\fBgetbalance 'account'\fR
|
|
||||||
Returns the server's available balance, or the balance for 'account' (accounts are deprecated).
|
|
||||||
.TP
|
|
||||||
\fBgetblockcount\fR
|
|
||||||
Returns the number of blocks in the longest block chain.
|
|
||||||
.TP
|
|
||||||
\fBgetblocknumber\fR
|
|
||||||
Returns the block number of the latest block in the longest block chain.
|
|
||||||
.TP
|
|
||||||
\fBgetconnectioncount\fR
|
|
||||||
Returns the number of connections to other nodes.
|
|
||||||
.TP
|
|
||||||
\fBgetdifficulty\fR
|
|
||||||
Returns the proof-of-work difficulty as a multiple of the minimum difficulty.
|
|
||||||
.TP
|
|
||||||
\fBgetgenerate\fR
|
|
||||||
Returns boolean true if server is trying to generate bitcoins, false otherwise.
|
|
||||||
.TP
|
|
||||||
\fBsetgenerate 'generate' ['genproclimit']\fR
|
|
||||||
Generation is limited to ['genproclimit'] processors, \-1 is unlimited.
|
|
||||||
.TP
|
|
||||||
\fBgethashespersec\fR
|
|
||||||
Returns a recent hashes per second performance measurement while generating.
|
|
||||||
.TP
|
|
||||||
\fBgetinfo\fR
|
|
||||||
Returns an object containing server information.
|
|
||||||
.TP
|
|
||||||
\fBgetnewaddress 'account'\fR
|
|
||||||
Returns a new bitcoin address for receiving payments. If 'account' is specified (deprecated), it is added to the address book so payments received with the address will be credited to 'account'.
|
|
||||||
.TP
|
|
||||||
\fBgetreceivedbyaccount 'account' ['minconf=1']\fR
|
|
||||||
DEPRECATED. Returns the total amount received by addresses associated with 'account' in transactions with at least ['minconf'] confirmations.
|
|
||||||
.TP
|
|
||||||
\fBgetreceivedbyaddress 'bitcoinaddress' ['minconf=1']\fR
|
|
||||||
Returns the total amount received by 'bitcoinaddress' in transactions with at least ['minconf'] confirmations.
|
|
||||||
.TP
|
|
||||||
\fBgettransaction 'txid'\fR
|
|
||||||
Returns information about a specific transaction, given hexadecimal transaction ID.
|
|
||||||
.TP
|
|
||||||
\fBgetwork 'data'\fR
|
|
||||||
If 'data' is specified, tries to solve the block and returns true if it was successful. If 'data' is not specified, returns formatted hash 'data' to work on:
|
|
||||||
|
|
||||||
"midstate" : precomputed hash state after hashing the first half of the data.
|
|
||||||
"data" : block data.
|
|
||||||
"hash1" : formatted hash buffer for second hash.
|
|
||||||
"target" : little endian hash target.
|
|
||||||
.TP
|
.TP
|
||||||
\fBhelp 'command'\fR
|
\fBhelp 'command'\fR
|
||||||
List commands, or get help for a command.
|
Get help for a command.
|
||||||
.TP
|
|
||||||
\fBlistaccounts ['minconf=1']\fR
|
|
||||||
DEPRECATED. List accounts and their current balances.
|
|
||||||
*note: requires bitcoin 0.3.20 or later.
|
|
||||||
.TP
|
|
||||||
\fBlistreceivedbyaccount ['minconf=1'] ['includeempty=false']\fR
|
|
||||||
['minconf'] is the minimum number of confirmations before payments are included. ['includeempty'] whether to include addresses that haven't received any payments. Returns an array of objects containing:
|
|
||||||
|
|
||||||
"account" : DEPRECATED. the account of the receiving address.
|
|
||||||
"amount" : total amount received by the address.
|
|
||||||
"confirmations" : number of confirmations of the most recent transaction included.
|
|
||||||
.TP
|
|
||||||
\fBlistreceivedbyaddress ['minconf=1'] ['includeempty=false']\fR
|
|
||||||
['minconf'] is the minimum number of confirmations before payments are included. ['includeempty'] whether to include addresses that haven't received any payments. Returns an array of objects containing:
|
|
||||||
|
|
||||||
"address" : receiving address.
|
|
||||||
"account" : DEPRECATED. the account of the receiving address.
|
|
||||||
"amount" : total amount received by the address.
|
|
||||||
"confirmations" : number of confirmations of the most recent transaction included.
|
|
||||||
.TP
|
|
||||||
\fBlisttransactions 'account' ['count=10']\fR
|
|
||||||
Returns a list of the last ['count'] transactions for 'account' \- for all accounts if 'account' is not specified or is "*". Each entry in the list may contain:
|
|
||||||
|
|
||||||
"category" : will be generate, send, receive, or move.
|
|
||||||
"amount" : amount of transaction.
|
|
||||||
"fee" : Fee (if any) paid (only for send transactions).
|
|
||||||
"confirmations" : number of confirmations (only for generate/send/receive).
|
|
||||||
"txid" : transaction ID (only for generate/send/receive).
|
|
||||||
"otheraccount" : account funds were moved to or from (only for move).
|
|
||||||
"message" : message associated with transaction (only for send).
|
|
||||||
"to" : message-to associated with transaction (only for send).
|
|
||||||
|
|
||||||
*note: requires bitcoin 0.3.20 or later.
|
|
||||||
.TP
|
|
||||||
\fBmove <'fromaccount'> <'toaccount'> <'amount'> ['minconf=1'] ['comment']\fR
|
|
||||||
DEPRECATED. Moves funds between accounts.
|
|
||||||
.TP
|
|
||||||
\fBsendfrom* <'account'> <'bitcoinaddress'> <'amount'> ['minconf=1'] ['comment'] ['comment-to']\fR
|
|
||||||
DEPRECATED. Sends amount from account's balance to 'bitcoinaddress'. This method will fail if there is less than amount bitcoins with ['minconf'] confirmations in the account's balance (unless account is the empty-string-named default account; it behaves like the *sendtoaddress* method). Returns transaction ID on success.
|
|
||||||
.TP
|
|
||||||
\fBsendtoaddress 'bitcoinaddress' 'amount' ['comment'] ['comment-to']\fR
|
|
||||||
Sends amount from the server's available balance to 'bitcoinaddress'. amount is a real and is rounded to the nearest 0.01. Returns transaction id on success.
|
|
||||||
.TP
|
|
||||||
\fBstop\fR
|
|
||||||
Stops the bitcoin server.
|
|
||||||
.TP
|
|
||||||
\fBvalidateaddress 'bitcoinaddress'\fR
|
|
||||||
Checks that 'bitcoinaddress' looks like a proper bitcoin address. Returns an object containing:
|
|
||||||
|
|
||||||
"isvalid" : true or false.
|
|
||||||
"ismine" : true if the address is in the server's wallet.
|
|
||||||
"address" : bitcoinaddress.
|
|
||||||
|
|
||||||
*note: ismine and address are only returned if the address is valid.
|
|
||||||
|
|
||||||
.SH "SEE ALSO"
|
.SH "SEE ALSO"
|
||||||
bitcoin.conf(5)
|
bitcoin.conf(5)
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
# Run the "uscan" command to check for upstream updates and more.
|
# Run the "uscan" command to check for upstream updates and more.
|
||||||
version=3
|
version=3
|
||||||
# use qa.debian.org redirector; see man uscan
|
# use qa.debian.org redirector; see man uscan
|
||||||
opts=uversionmangle=s/(\d)(alpha|beta|rc)/$1~$2/;s/\-src//,dversionmangle=s/~dfsg\d*// \
|
|
||||||
http://sf.net/bitcoin/bitcoin-(\d.*)-linux\.tar\.gz debian
|
|
||||||
opts=uversionmangle=s/(\d)(alpha|beta|rc)/$1~$2/,dversionmangle=s/~dfsg\d*// \
|
opts=uversionmangle=s/(\d)(alpha|beta|rc)/$1~$2/,dversionmangle=s/~dfsg\d*// \
|
||||||
http://githubredir.debian.net/github/bitcoin/bitcoin v(.*).tar.gz
|
http://githubredir.debian.net/github/bitcoin/bitcoin v(.*).tar.gz
|
||||||
|
|
|
@ -1,15 +1,69 @@
|
||||||
Contents
|
Contents
|
||||||
===========
|
========
|
||||||
This directory contains tools for developers working on this repository.
|
This directory contains tools for developers working on this repository.
|
||||||
|
|
||||||
github-merge.sh
|
check-doc.py
|
||||||
==================
|
============
|
||||||
|
|
||||||
|
Check if all command line args are documented. The return value indicates the
|
||||||
|
number of undocumented args.
|
||||||
|
|
||||||
|
clang-format.py
|
||||||
|
===============
|
||||||
|
|
||||||
|
A script to format cpp source code according to [.clang-format](../../src/.clang-format). This should only be applied to new files or files which are currently not actively developed on. Also, git subtrees are not subject to formatting.
|
||||||
|
|
||||||
|
clang-format-diff.py
|
||||||
|
===================
|
||||||
|
|
||||||
|
A script to format unified git diffs according to [.clang-format](../../src/.clang-format).
|
||||||
|
|
||||||
|
For instance, to format the last commit with 0 lines of context,
|
||||||
|
the script should be called from the git root folder as follows.
|
||||||
|
|
||||||
|
```
|
||||||
|
git diff -U0 HEAD~1.. | ./contrib/devtools/clang-format-diff.py -p1 -i -v
|
||||||
|
```
|
||||||
|
|
||||||
|
fix-copyright-headers.py
|
||||||
|
========================
|
||||||
|
|
||||||
|
Every year newly updated files need to have its copyright headers updated to reflect the current year.
|
||||||
|
If you run this script from the root folder it will automatically update the year on the copyright header for all
|
||||||
|
source files if these have a git commit from the current year.
|
||||||
|
|
||||||
|
For example a file changed in 2015 (with 2015 being the current year):
|
||||||
|
|
||||||
|
```// Copyright (c) 2009-2013 The Bitcoin Core developers```
|
||||||
|
|
||||||
|
would be changed to:
|
||||||
|
|
||||||
|
```// Copyright (c) 2009-2015 The Bitcoin Core developers```
|
||||||
|
|
||||||
|
git-subtree-check.sh
|
||||||
|
====================
|
||||||
|
|
||||||
|
Run this script from the root of the repository to verify that a subtree matches the contents of
|
||||||
|
the commit it claims to have been updated to.
|
||||||
|
|
||||||
|
To use, make sure that you have fetched the upstream repository branch in which the subtree is
|
||||||
|
maintained:
|
||||||
|
* for `src/secp256k1`: https://github.com/bitcoin/secp256k1.git (branch master)
|
||||||
|
* for `src/leveldb`: https://github.com/bitcoin/leveldb.git (branch bitcoin-fork)
|
||||||
|
* for `src/univalue`: https://github.com/bitcoin/univalue.git (branch master)
|
||||||
|
|
||||||
|
Usage: `git-subtree-check.sh DIR COMMIT`
|
||||||
|
|
||||||
|
`COMMIT` may be omitted, in which case `HEAD` is used.
|
||||||
|
|
||||||
|
github-merge.py
|
||||||
|
===============
|
||||||
|
|
||||||
A small script to automate merging pull-requests securely and sign them with GPG.
|
A small script to automate merging pull-requests securely and sign them with GPG.
|
||||||
|
|
||||||
For example:
|
For example:
|
||||||
|
|
||||||
./github-merge.sh bitcoin/bitcoin 3077
|
./github-merge.py 3077
|
||||||
|
|
||||||
(in any git repository) will help you merge pull request #3077 for the
|
(in any git repository) will help you merge pull request #3077 for the
|
||||||
bitcoin/bitcoin repository.
|
bitcoin/bitcoin repository.
|
||||||
|
@ -36,24 +90,22 @@ Configuring the github-merge tool for the bitcoin repository is done in the foll
|
||||||
git config githubmerge.testcmd "make -j4 check" (adapt to whatever you want to use for testing)
|
git config githubmerge.testcmd "make -j4 check" (adapt to whatever you want to use for testing)
|
||||||
git config --global user.signingkey mykeyid (if you want to GPG sign)
|
git config --global user.signingkey mykeyid (if you want to GPG sign)
|
||||||
|
|
||||||
fix-copyright-headers.py
|
optimize-pngs.py
|
||||||
===========================
|
================
|
||||||
|
|
||||||
Every year newly updated files need to have its copyright headers updated to reflect the current year.
|
A script to optimize png files in the bitcoin
|
||||||
If you run this script from src/ it will automatically update the year on the copyright header for all
|
repository (requires pngcrush).
|
||||||
.cpp and .h files if these have a git commit from the current year.
|
|
||||||
|
|
||||||
For example a file changed in 2014 (with 2014 being the current year):
|
security-check.py and test-security-check.py
|
||||||
```// Copyright (c) 2009-2013 The Bitcoin Core developers```
|
============================================
|
||||||
|
|
||||||
would be changed to:
|
Perform basic ELF security checks on a series of executables.
|
||||||
```// Copyright (c) 2009-2014 The Bitcoin Core developers```
|
|
||||||
|
|
||||||
symbol-check.py
|
symbol-check.py
|
||||||
==================
|
===============
|
||||||
|
|
||||||
A script to check that the (Linux) executables produced by gitian only contain
|
A script to check that the (Linux) executables produced by gitian only contain
|
||||||
allowed gcc, glibc and libstdc++ version symbols. This makes sure they are
|
allowed gcc, glibc and libstdc++ version symbols. This makes sure they are
|
||||||
still compatible with the minimum supported Linux distribution versions.
|
still compatible with the minimum supported Linux distribution versions.
|
||||||
|
|
||||||
Example usage after a gitian build:
|
Example usage after a gitian build:
|
||||||
|
@ -70,7 +122,7 @@ If there are 'unsupported' symbols, the return value will be 1 a list like this
|
||||||
.../64/test_bitcoin: symbol _ZNSt8__detail15_List_nod from unsupported version GLIBCXX_3.4.15
|
.../64/test_bitcoin: symbol _ZNSt8__detail15_List_nod from unsupported version GLIBCXX_3.4.15
|
||||||
|
|
||||||
update-translations.py
|
update-translations.py
|
||||||
=======================
|
======================
|
||||||
|
|
||||||
Run this script from the root of the repository to update all translations from transifex.
|
Run this script from the root of the repository to update all translations from transifex.
|
||||||
It will do the following automatically:
|
It will do the following automatically:
|
||||||
|
@ -80,17 +132,3 @@ It will do the following automatically:
|
||||||
- add missing translations to the build system (TODO)
|
- add missing translations to the build system (TODO)
|
||||||
|
|
||||||
See doc/translation-process.md for more information.
|
See doc/translation-process.md for more information.
|
||||||
|
|
||||||
git-subtree-check.sh
|
|
||||||
====================
|
|
||||||
|
|
||||||
Run this script from the root of the repository to verify that a subtree matches the contents of
|
|
||||||
the commit it claims to have been updated to.
|
|
||||||
|
|
||||||
To use, make sure that you have fetched the upstream repository branch in which the subtree is
|
|
||||||
maintained:
|
|
||||||
* for src/secp256k1: https://github.com/bitcoin/secp256k1.git (branch master)
|
|
||||||
* for sec/leveldb: https://github.com/bitcoin/leveldb.git (branch bitcoin-fork)
|
|
||||||
|
|
||||||
Usage: git-subtree-check.sh DIR COMMIT
|
|
||||||
COMMIT may be omitted, in which case HEAD is used.
|
|
||||||
|
|
45
contrib/devtools/check-doc.py
Executable file
45
contrib/devtools/check-doc.py
Executable file
|
@ -0,0 +1,45 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# Copyright (c) 2015 The Bitcoin Core developers
|
||||||
|
# Distributed under the MIT software license, see the accompanying
|
||||||
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
'''
|
||||||
|
This checks if all command line args are documented.
|
||||||
|
Return value is 0 to indicate no error.
|
||||||
|
|
||||||
|
Author: @MarcoFalke
|
||||||
|
'''
|
||||||
|
|
||||||
|
from subprocess import check_output
|
||||||
|
import re
|
||||||
|
|
||||||
|
FOLDER_GREP = 'src'
|
||||||
|
FOLDER_TEST = 'src/test/'
|
||||||
|
CMD_ROOT_DIR = '`git rev-parse --show-toplevel`/%s' % FOLDER_GREP
|
||||||
|
CMD_GREP_ARGS = r"egrep -r -I '(map(Multi)?Args(\.count\(|\[)|Get(Bool)?Arg\()\"\-[^\"]+?\"' %s | grep -v '%s'" % (CMD_ROOT_DIR, FOLDER_TEST)
|
||||||
|
CMD_GREP_DOCS = r"egrep -r -I 'HelpMessageOpt\(\"\-[^\"=]+?(=|\")' %s" % (CMD_ROOT_DIR)
|
||||||
|
REGEX_ARG = re.compile(r'(?:map(?:Multi)?Args(?:\.count\(|\[)|Get(?:Bool)?Arg\()\"(\-[^\"]+?)\"')
|
||||||
|
REGEX_DOC = re.compile(r'HelpMessageOpt\(\"(\-[^\"=]+?)(?:=|\")')
|
||||||
|
# list unsupported, deprecated and duplicate args as they need no documentation
|
||||||
|
SET_DOC_OPTIONAL = set(['-rpcssl', '-benchmark', '-h', '-help', '-socks', '-tor', '-debugnet', '-whitelistalwaysrelay'])
|
||||||
|
|
||||||
|
def main():
|
||||||
|
used = check_output(CMD_GREP_ARGS, shell=True)
|
||||||
|
docd = check_output(CMD_GREP_DOCS, shell=True)
|
||||||
|
|
||||||
|
args_used = set(re.findall(REGEX_ARG,used))
|
||||||
|
args_docd = set(re.findall(REGEX_DOC,docd)).union(SET_DOC_OPTIONAL)
|
||||||
|
args_need_doc = args_used.difference(args_docd)
|
||||||
|
args_unknown = args_docd.difference(args_used)
|
||||||
|
|
||||||
|
print "Args used : %s" % len(args_used)
|
||||||
|
print "Args documented : %s" % len(args_docd)
|
||||||
|
print "Args undocumented: %s" % len(args_need_doc)
|
||||||
|
print args_need_doc
|
||||||
|
print "Args unknown : %s" % len(args_unknown)
|
||||||
|
print args_unknown
|
||||||
|
|
||||||
|
exit(len(args_need_doc))
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
164
contrib/devtools/clang-format-diff.py
Executable file
164
contrib/devtools/clang-format-diff.py
Executable file
|
@ -0,0 +1,164 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
#
|
||||||
|
#===- clang-format-diff.py - ClangFormat Diff Reformatter ----*- python -*--===#
|
||||||
|
#
|
||||||
|
# The LLVM Compiler Infrastructure
|
||||||
|
#
|
||||||
|
# This file is distributed under the University of Illinois Open Source
|
||||||
|
# License.
|
||||||
|
#
|
||||||
|
# ============================================================
|
||||||
|
#
|
||||||
|
# University of Illinois/NCSA
|
||||||
|
# Open Source License
|
||||||
|
#
|
||||||
|
# Copyright (c) 2007-2015 University of Illinois at Urbana-Champaign.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Developed by:
|
||||||
|
#
|
||||||
|
# LLVM Team
|
||||||
|
#
|
||||||
|
# University of Illinois at Urbana-Champaign
|
||||||
|
#
|
||||||
|
# http://llvm.org
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
# this software and associated documentation files (the "Software"), to deal with
|
||||||
|
# the Software without restriction, including without limitation the rights to
|
||||||
|
# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
# of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
|
# so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# * Redistributions of source code must retain the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimers.
|
||||||
|
#
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
# this list of conditions and the following disclaimers in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# * Neither the names of the LLVM Team, University of Illinois at
|
||||||
|
# Urbana-Champaign, nor the names of its contributors may be used to
|
||||||
|
# endorse or promote products derived from this Software without specific
|
||||||
|
# prior written permission.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
|
||||||
|
# SOFTWARE.
|
||||||
|
#
|
||||||
|
# ============================================================
|
||||||
|
#
|
||||||
|
#===------------------------------------------------------------------------===#
|
||||||
|
|
||||||
|
r"""
|
||||||
|
ClangFormat Diff Reformatter
|
||||||
|
============================
|
||||||
|
|
||||||
|
This script reads input from a unified diff and reformats all the changed
|
||||||
|
lines. This is useful to reformat all the lines touched by a specific patch.
|
||||||
|
Example usage for git/svn users:
|
||||||
|
|
||||||
|
git diff -U0 HEAD^ | clang-format-diff.py -p1 -i
|
||||||
|
svn diff --diff-cmd=diff -x-U0 | clang-format-diff.py -i
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import difflib
|
||||||
|
import re
|
||||||
|
import string
|
||||||
|
import subprocess
|
||||||
|
import StringIO
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
# Change this to the full path if clang-format is not on the path.
|
||||||
|
binary = 'clang-format'
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(description=
|
||||||
|
'Reformat changed lines in diff. Without -i '
|
||||||
|
'option just output the diff that would be '
|
||||||
|
'introduced.')
|
||||||
|
parser.add_argument('-i', action='store_true', default=False,
|
||||||
|
help='apply edits to files instead of displaying a diff')
|
||||||
|
parser.add_argument('-p', metavar='NUM', default=0,
|
||||||
|
help='strip the smallest prefix containing P slashes')
|
||||||
|
parser.add_argument('-regex', metavar='PATTERN', default=None,
|
||||||
|
help='custom pattern selecting file paths to reformat '
|
||||||
|
'(case sensitive, overrides -iregex)')
|
||||||
|
parser.add_argument('-iregex', metavar='PATTERN', default=
|
||||||
|
r'.*\.(cpp|cc|c\+\+|cxx|c|cl|h|hpp|m|mm|inc|js|ts|proto'
|
||||||
|
r'|protodevel|java)',
|
||||||
|
help='custom pattern selecting file paths to reformat '
|
||||||
|
'(case insensitive, overridden by -regex)')
|
||||||
|
parser.add_argument('-sort-includes', action='store_true', default=False,
|
||||||
|
help='let clang-format sort include blocks')
|
||||||
|
parser.add_argument('-v', '--verbose', action='store_true',
|
||||||
|
help='be more verbose, ineffective without -i')
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
# Extract changed lines for each file.
|
||||||
|
filename = None
|
||||||
|
lines_by_file = {}
|
||||||
|
for line in sys.stdin:
|
||||||
|
match = re.search('^\+\+\+\ (.*?/){%s}(\S*)' % args.p, line)
|
||||||
|
if match:
|
||||||
|
filename = match.group(2)
|
||||||
|
if filename == None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if args.regex is not None:
|
||||||
|
if not re.match('^%s$' % args.regex, filename):
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
if not re.match('^%s$' % args.iregex, filename, re.IGNORECASE):
|
||||||
|
continue
|
||||||
|
|
||||||
|
match = re.search('^@@.*\+(\d+)(,(\d+))?', line)
|
||||||
|
if match:
|
||||||
|
start_line = int(match.group(1))
|
||||||
|
line_count = 1
|
||||||
|
if match.group(3):
|
||||||
|
line_count = int(match.group(3))
|
||||||
|
if line_count == 0:
|
||||||
|
continue
|
||||||
|
end_line = start_line + line_count - 1;
|
||||||
|
lines_by_file.setdefault(filename, []).extend(
|
||||||
|
['-lines', str(start_line) + ':' + str(end_line)])
|
||||||
|
|
||||||
|
# Reformat files containing changes in place.
|
||||||
|
for filename, lines in lines_by_file.iteritems():
|
||||||
|
if args.i and args.verbose:
|
||||||
|
print 'Formatting', filename
|
||||||
|
command = [binary, filename]
|
||||||
|
if args.i:
|
||||||
|
command.append('-i')
|
||||||
|
if args.sort_includes:
|
||||||
|
command.append('-sort-includes')
|
||||||
|
command.extend(lines)
|
||||||
|
command.extend(['-style=file', '-fallback-style=none'])
|
||||||
|
p = subprocess.Popen(command, stdout=subprocess.PIPE,
|
||||||
|
stderr=None, stdin=subprocess.PIPE)
|
||||||
|
stdout, stderr = p.communicate()
|
||||||
|
if p.returncode != 0:
|
||||||
|
sys.exit(p.returncode);
|
||||||
|
|
||||||
|
if not args.i:
|
||||||
|
with open(filename) as f:
|
||||||
|
code = f.readlines()
|
||||||
|
formatted_code = StringIO.StringIO(stdout).readlines()
|
||||||
|
diff = difflib.unified_diff(code, formatted_code,
|
||||||
|
filename, filename,
|
||||||
|
'(before formatting)', '(after formatting)')
|
||||||
|
diff_string = string.join(diff, '')
|
||||||
|
if len(diff_string) > 0:
|
||||||
|
sys.stdout.write(diff_string)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
62
contrib/devtools/clang-format.py
Executable file
62
contrib/devtools/clang-format.py
Executable file
|
@ -0,0 +1,62 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
'''
|
||||||
|
Wrapper script for clang-format
|
||||||
|
|
||||||
|
Copyright (c) 2015 MarcoFalke
|
||||||
|
Copyright (c) 2015 The Bitcoin Core developers
|
||||||
|
Distributed under the MIT software license, see the accompanying
|
||||||
|
file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
'''
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
tested_versions = ['3.6.0', '3.6.1', '3.6.2'] # A set of versions known to produce the same output
|
||||||
|
accepted_file_extensions = ('.h', '.cpp') # Files to format
|
||||||
|
|
||||||
|
def check_clang_format_version(clang_format_exe):
|
||||||
|
try:
|
||||||
|
output = subprocess.check_output([clang_format_exe, '-version'])
|
||||||
|
for ver in tested_versions:
|
||||||
|
if ver in output:
|
||||||
|
print "Detected clang-format version " + ver
|
||||||
|
return
|
||||||
|
raise RuntimeError("Untested version: " + output)
|
||||||
|
except Exception as e:
|
||||||
|
print 'Could not verify version of ' + clang_format_exe + '.'
|
||||||
|
raise e
|
||||||
|
|
||||||
|
def check_command_line_args(argv):
|
||||||
|
required_args = ['{clang-format-exe}', '{files}']
|
||||||
|
example_args = ['clang-format-3.x', 'src/main.cpp', 'src/wallet/*']
|
||||||
|
|
||||||
|
if(len(argv) < len(required_args) + 1):
|
||||||
|
for word in (['Usage:', argv[0]] + required_args):
|
||||||
|
print word,
|
||||||
|
print ''
|
||||||
|
for word in (['E.g:', argv[0]] + example_args):
|
||||||
|
print word,
|
||||||
|
print ''
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
def run_clang_format(clang_format_exe, files):
|
||||||
|
for target in files:
|
||||||
|
if os.path.isdir(target):
|
||||||
|
for path, dirs, files in os.walk(target):
|
||||||
|
run_clang_format(clang_format_exe, (os.path.join(path, f) for f in files))
|
||||||
|
elif target.endswith(accepted_file_extensions):
|
||||||
|
print "Format " + target
|
||||||
|
subprocess.check_call([clang_format_exe, '-i', '-style=file', target], stdout=open(os.devnull, 'wb'), stderr=subprocess.STDOUT)
|
||||||
|
else:
|
||||||
|
print "Skip " + target
|
||||||
|
|
||||||
|
def main(argv):
|
||||||
|
check_command_line_args(argv)
|
||||||
|
clang_format_exe = argv[1]
|
||||||
|
files = argv[2:]
|
||||||
|
check_clang_format_version(clang_format_exe)
|
||||||
|
run_clang_format(clang_format_exe, files)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main(sys.argv)
|
|
@ -1,53 +1,46 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
'''
|
'''
|
||||||
Run this script inside of src/ and it will look for all the files
|
Run this script to update all the copyright headers of files
|
||||||
that were changed this year that still have the last year in the
|
that were changed this year.
|
||||||
copyright headers, and it will fix the headers on that file using
|
|
||||||
a perl regex one liner.
|
|
||||||
|
|
||||||
For example: if it finds something like this and we're in 2014
|
For example:
|
||||||
|
|
||||||
// Copyright (c) 2009-2013 The Bitcoin Core developers
|
// Copyright (c) 2009-2012 The Bitcoin Core developers
|
||||||
|
|
||||||
it will change it to
|
it will change it to
|
||||||
|
|
||||||
// Copyright (c) 2009-2014 The Bitcoin Core developers
|
// Copyright (c) 2009-2015 The Bitcoin Core developers
|
||||||
|
|
||||||
It will do this for all the files in the folder and its children.
|
|
||||||
|
|
||||||
Author: @gubatron
|
|
||||||
'''
|
'''
|
||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
|
import re
|
||||||
|
|
||||||
year = time.gmtime()[0]
|
year = time.gmtime()[0]
|
||||||
last_year = year - 1
|
CMD_GIT_DATE = 'git log --format=@%%at -1 %s | date +"%%Y" -u -f -'
|
||||||
command = "perl -pi -e 's/%s The Bitcoin/%s The Bitcoin/' %s"
|
CMD_REGEX= "perl -pi -e 's/(20\d\d)(?:-20\d\d)? The Bitcoin/$1-%s The Bitcoin/' %s"
|
||||||
listFilesCommand = "find . | grep %s"
|
REGEX_CURRENT= re.compile("%s The Bitcoin" % year)
|
||||||
|
CMD_LIST_FILES= "find %s | grep %s"
|
||||||
|
|
||||||
extensions = [".cpp",".h"]
|
FOLDERS = ["./qa", "./src"]
|
||||||
|
EXTENSIONS = [".cpp",".h", ".py"]
|
||||||
|
|
||||||
def getLastGitModifiedDate(filePath):
|
def get_git_date(file_path):
|
||||||
gitGetLastCommitDateCommand = "git log " + filePath +" | grep Date | head -n 1"
|
r = os.popen(CMD_GIT_DATE % file_path)
|
||||||
p = os.popen(gitGetLastCommitDateCommand)
|
for l in r:
|
||||||
result = ""
|
# Result is one line, so just return
|
||||||
for l in p:
|
return l.replace("\n","")
|
||||||
result = l
|
return ""
|
||||||
break
|
|
||||||
result = result.replace("\n","")
|
|
||||||
return result
|
|
||||||
|
|
||||||
n=1
|
n=1
|
||||||
for extension in extensions:
|
for folder in FOLDERS:
|
||||||
foundFiles = os.popen(listFilesCommand % extension)
|
for extension in EXTENSIONS:
|
||||||
for filePath in foundFiles:
|
for file_path in os.popen(CMD_LIST_FILES % (folder, extension)):
|
||||||
filePath = filePath[1:-1]
|
file_path = os.getcwd() + file_path[1:-1]
|
||||||
if filePath.endswith(extension):
|
if file_path.endswith(extension):
|
||||||
filePath = os.getcwd() + filePath
|
git_date = get_git_date(file_path)
|
||||||
modifiedTime = getLastGitModifiedDate(filePath)
|
if str(year) == git_date:
|
||||||
if len(modifiedTime) > 0 and str(year) in modifiedTime:
|
# Only update if current year is not found
|
||||||
print n,"Last Git Modified: ", modifiedTime, " - ", filePath
|
if REGEX_CURRENT.search(open(file_path, "r").read()) is None:
|
||||||
os.popen(command % (last_year,year,filePath))
|
print n,"Last git edit", git_date, "-", file_path
|
||||||
n = n + 1
|
os.popen(CMD_REGEX % (year,file_path))
|
||||||
|
n = n + 1
|
||||||
|
|
||||||
|
|
251
contrib/devtools/github-merge.py
Executable file
251
contrib/devtools/github-merge.py
Executable file
|
@ -0,0 +1,251 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# Copyright (c) 2016 Bitcoin Core Developers
|
||||||
|
# Distributed under the MIT software license, see the accompanying
|
||||||
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
# This script will locally construct a merge commit for a pull request on a
|
||||||
|
# github repository, inspect it, sign it and optionally push it.
|
||||||
|
|
||||||
|
# The following temporary branches are created/overwritten and deleted:
|
||||||
|
# * pull/$PULL/base (the current master we're merging onto)
|
||||||
|
# * pull/$PULL/head (the current state of the remote pull request)
|
||||||
|
# * pull/$PULL/merge (github's merge)
|
||||||
|
# * pull/$PULL/local-merge (our merge)
|
||||||
|
|
||||||
|
# In case of a clean merge that is accepted by the user, the local branch with
|
||||||
|
# name $BRANCH is overwritten with the merged result, and optionally pushed.
|
||||||
|
from __future__ import division,print_function,unicode_literals
|
||||||
|
import os,sys
|
||||||
|
from sys import stdin,stdout,stderr
|
||||||
|
import argparse
|
||||||
|
import subprocess
|
||||||
|
import json,codecs
|
||||||
|
try:
|
||||||
|
from urllib.request import Request,urlopen
|
||||||
|
except:
|
||||||
|
from urllib2 import Request,urlopen
|
||||||
|
|
||||||
|
# External tools (can be overridden using environment)
|
||||||
|
GIT = os.getenv('GIT','git')
|
||||||
|
BASH = os.getenv('BASH','bash')
|
||||||
|
|
||||||
|
# OS specific configuration for terminal attributes
|
||||||
|
ATTR_RESET = ''
|
||||||
|
ATTR_PR = ''
|
||||||
|
COMMIT_FORMAT = '%h %s (%an)%d'
|
||||||
|
if os.name == 'posix': # if posix, assume we can use basic terminal escapes
|
||||||
|
ATTR_RESET = '\033[0m'
|
||||||
|
ATTR_PR = '\033[1;36m'
|
||||||
|
COMMIT_FORMAT = '%C(bold blue)%h%Creset %s %C(cyan)(%an)%Creset%C(green)%d%Creset'
|
||||||
|
|
||||||
|
def git_config_get(option, default=None):
|
||||||
|
'''
|
||||||
|
Get named configuration option from git repository.
|
||||||
|
'''
|
||||||
|
try:
|
||||||
|
return subprocess.check_output([GIT,'config','--get',option]).rstrip().decode('utf-8')
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
return default
|
||||||
|
|
||||||
|
def retrieve_pr_info(repo,pull):
|
||||||
|
'''
|
||||||
|
Retrieve pull request information from github.
|
||||||
|
Return None if no title can be found, or an error happens.
|
||||||
|
'''
|
||||||
|
try:
|
||||||
|
req = Request("https://api.github.com/repos/"+repo+"/pulls/"+pull)
|
||||||
|
result = urlopen(req)
|
||||||
|
reader = codecs.getreader('utf-8')
|
||||||
|
obj = json.load(reader(result))
|
||||||
|
return obj
|
||||||
|
except Exception as e:
|
||||||
|
print('Warning: unable to retrieve pull information from github: %s' % e)
|
||||||
|
return None
|
||||||
|
|
||||||
|
def ask_prompt(text):
|
||||||
|
print(text,end=" ",file=stderr)
|
||||||
|
stderr.flush()
|
||||||
|
reply = stdin.readline().rstrip()
|
||||||
|
print("",file=stderr)
|
||||||
|
return reply
|
||||||
|
|
||||||
|
def parse_arguments():
|
||||||
|
epilog = '''
|
||||||
|
In addition, you can set the following git configuration variables:
|
||||||
|
githubmerge.repository (mandatory),
|
||||||
|
user.signingkey (mandatory),
|
||||||
|
githubmerge.host (default: git@github.com),
|
||||||
|
githubmerge.branch (no default),
|
||||||
|
githubmerge.testcmd (default: none).
|
||||||
|
'''
|
||||||
|
parser = argparse.ArgumentParser(description='Utility to merge, sign and push github pull requests',
|
||||||
|
epilog=epilog)
|
||||||
|
parser.add_argument('pull', metavar='PULL', type=int, nargs=1,
|
||||||
|
help='Pull request ID to merge')
|
||||||
|
parser.add_argument('branch', metavar='BRANCH', type=str, nargs='?',
|
||||||
|
default=None, help='Branch to merge against (default: githubmerge.branch setting, or base branch for pull, or \'master\')')
|
||||||
|
return parser.parse_args()
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# Extract settings from git repo
|
||||||
|
repo = git_config_get('githubmerge.repository')
|
||||||
|
host = git_config_get('githubmerge.host','git@github.com')
|
||||||
|
opt_branch = git_config_get('githubmerge.branch',None)
|
||||||
|
testcmd = git_config_get('githubmerge.testcmd')
|
||||||
|
signingkey = git_config_get('user.signingkey')
|
||||||
|
if repo is None:
|
||||||
|
print("ERROR: No repository configured. Use this command to set:", file=stderr)
|
||||||
|
print("git config githubmerge.repository <owner>/<repo>", file=stderr)
|
||||||
|
exit(1)
|
||||||
|
if signingkey is None:
|
||||||
|
print("ERROR: No GPG signing key set. Set one using:",file=stderr)
|
||||||
|
print("git config --global user.signingkey <key>",file=stderr)
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
host_repo = host+":"+repo # shortcut for push/pull target
|
||||||
|
|
||||||
|
# Extract settings from command line
|
||||||
|
args = parse_arguments()
|
||||||
|
pull = str(args.pull[0])
|
||||||
|
|
||||||
|
# Receive pull information from github
|
||||||
|
info = retrieve_pr_info(repo,pull)
|
||||||
|
if info is None:
|
||||||
|
exit(1)
|
||||||
|
title = info['title']
|
||||||
|
# precedence order for destination branch argument:
|
||||||
|
# - command line argument
|
||||||
|
# - githubmerge.branch setting
|
||||||
|
# - base branch for pull (as retrieved from github)
|
||||||
|
# - 'master'
|
||||||
|
branch = args.branch or opt_branch or info['base']['ref'] or 'master'
|
||||||
|
|
||||||
|
# Initialize source branches
|
||||||
|
head_branch = 'pull/'+pull+'/head'
|
||||||
|
base_branch = 'pull/'+pull+'/base'
|
||||||
|
merge_branch = 'pull/'+pull+'/merge'
|
||||||
|
local_merge_branch = 'pull/'+pull+'/local-merge'
|
||||||
|
|
||||||
|
devnull = open(os.devnull,'w')
|
||||||
|
try:
|
||||||
|
subprocess.check_call([GIT,'checkout','-q',branch])
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print("ERROR: Cannot check out branch %s." % (branch), file=stderr)
|
||||||
|
exit(3)
|
||||||
|
try:
|
||||||
|
subprocess.check_call([GIT,'fetch','-q',host_repo,'+refs/pull/'+pull+'/*:refs/heads/pull/'+pull+'/*'])
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print("ERROR: Cannot find pull request #%s on %s." % (pull,host_repo), file=stderr)
|
||||||
|
exit(3)
|
||||||
|
try:
|
||||||
|
subprocess.check_call([GIT,'log','-q','-1','refs/heads/'+head_branch], stdout=devnull, stderr=stdout)
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print("ERROR: Cannot find head of pull request #%s on %s." % (pull,host_repo), file=stderr)
|
||||||
|
exit(3)
|
||||||
|
try:
|
||||||
|
subprocess.check_call([GIT,'log','-q','-1','refs/heads/'+merge_branch], stdout=devnull, stderr=stdout)
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print("ERROR: Cannot find merge of pull request #%s on %s." % (pull,host_repo), file=stderr)
|
||||||
|
exit(3)
|
||||||
|
try:
|
||||||
|
subprocess.check_call([GIT,'fetch','-q',host_repo,'+refs/heads/'+branch+':refs/heads/'+base_branch])
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print("ERROR: Cannot find branch %s on %s." % (branch,host_repo), file=stderr)
|
||||||
|
exit(3)
|
||||||
|
subprocess.check_call([GIT,'checkout','-q',base_branch])
|
||||||
|
subprocess.call([GIT,'branch','-q','-D',local_merge_branch], stderr=devnull)
|
||||||
|
subprocess.check_call([GIT,'checkout','-q','-b',local_merge_branch])
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Create unsigned merge commit.
|
||||||
|
if title:
|
||||||
|
firstline = 'Merge #%s: %s' % (pull,title)
|
||||||
|
else:
|
||||||
|
firstline = 'Merge #%s' % (pull,)
|
||||||
|
message = firstline + '\n\n'
|
||||||
|
message += subprocess.check_output([GIT,'log','--no-merges','--topo-order','--pretty=format:%h %s (%an)',base_branch+'..'+head_branch]).decode('utf-8')
|
||||||
|
try:
|
||||||
|
subprocess.check_call([GIT,'merge','-q','--commit','--no-edit','--no-ff','-m',message.encode('utf-8'),head_branch])
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print("ERROR: Cannot be merged cleanly.",file=stderr)
|
||||||
|
subprocess.check_call([GIT,'merge','--abort'])
|
||||||
|
exit(4)
|
||||||
|
logmsg = subprocess.check_output([GIT,'log','--pretty=format:%s','-n','1']).decode('utf-8')
|
||||||
|
if logmsg.rstrip() != firstline.rstrip():
|
||||||
|
print("ERROR: Creating merge failed (already merged?).",file=stderr)
|
||||||
|
exit(4)
|
||||||
|
|
||||||
|
print('%s#%s%s %s %sinto %s%s' % (ATTR_RESET+ATTR_PR,pull,ATTR_RESET,title,ATTR_RESET+ATTR_PR,branch,ATTR_RESET))
|
||||||
|
subprocess.check_call([GIT,'log','--graph','--topo-order','--pretty=format:'+COMMIT_FORMAT,base_branch+'..'+head_branch])
|
||||||
|
print()
|
||||||
|
# Run test command if configured.
|
||||||
|
if testcmd:
|
||||||
|
# Go up to the repository's root.
|
||||||
|
toplevel = subprocess.check_output([GIT,'rev-parse','--show-toplevel']).strip()
|
||||||
|
os.chdir(toplevel)
|
||||||
|
if subprocess.call(testcmd,shell=True):
|
||||||
|
print("ERROR: Running %s failed." % testcmd,file=stderr)
|
||||||
|
exit(5)
|
||||||
|
|
||||||
|
# Show the created merge.
|
||||||
|
diff = subprocess.check_output([GIT,'diff',merge_branch+'..'+local_merge_branch])
|
||||||
|
subprocess.check_call([GIT,'diff',base_branch+'..'+local_merge_branch])
|
||||||
|
if diff:
|
||||||
|
print("WARNING: merge differs from github!",file=stderr)
|
||||||
|
reply = ask_prompt("Type 'ignore' to continue.")
|
||||||
|
if reply.lower() == 'ignore':
|
||||||
|
print("Difference with github ignored.",file=stderr)
|
||||||
|
else:
|
||||||
|
exit(6)
|
||||||
|
reply = ask_prompt("Press 'd' to accept the diff.")
|
||||||
|
if reply.lower() == 'd':
|
||||||
|
print("Diff accepted.",file=stderr)
|
||||||
|
else:
|
||||||
|
print("ERROR: Diff rejected.",file=stderr)
|
||||||
|
exit(6)
|
||||||
|
else:
|
||||||
|
# Verify the result manually.
|
||||||
|
print("Dropping you on a shell so you can try building/testing the merged source.",file=stderr)
|
||||||
|
print("Run 'git diff HEAD~' to show the changes being merged.",file=stderr)
|
||||||
|
print("Type 'exit' when done.",file=stderr)
|
||||||
|
if os.path.isfile('/etc/debian_version'): # Show pull number on Debian default prompt
|
||||||
|
os.putenv('debian_chroot',pull)
|
||||||
|
subprocess.call([BASH,'-i'])
|
||||||
|
reply = ask_prompt("Type 'm' to accept the merge.")
|
||||||
|
if reply.lower() == 'm':
|
||||||
|
print("Merge accepted.",file=stderr)
|
||||||
|
else:
|
||||||
|
print("ERROR: Merge rejected.",file=stderr)
|
||||||
|
exit(7)
|
||||||
|
|
||||||
|
# Sign the merge commit.
|
||||||
|
reply = ask_prompt("Type 's' to sign off on the merge.")
|
||||||
|
if reply == 's':
|
||||||
|
try:
|
||||||
|
subprocess.check_call([GIT,'commit','-q','--gpg-sign','--amend','--no-edit'])
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print("Error signing, exiting.",file=stderr)
|
||||||
|
exit(1)
|
||||||
|
else:
|
||||||
|
print("Not signing off on merge, exiting.",file=stderr)
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
# Put the result in branch.
|
||||||
|
subprocess.check_call([GIT,'checkout','-q',branch])
|
||||||
|
subprocess.check_call([GIT,'reset','-q','--hard',local_merge_branch])
|
||||||
|
finally:
|
||||||
|
# Clean up temporary branches.
|
||||||
|
subprocess.call([GIT,'checkout','-q',branch])
|
||||||
|
subprocess.call([GIT,'branch','-q','-D',head_branch],stderr=devnull)
|
||||||
|
subprocess.call([GIT,'branch','-q','-D',base_branch],stderr=devnull)
|
||||||
|
subprocess.call([GIT,'branch','-q','-D',merge_branch],stderr=devnull)
|
||||||
|
subprocess.call([GIT,'branch','-q','-D',local_merge_branch],stderr=devnull)
|
||||||
|
|
||||||
|
# Push the result.
|
||||||
|
reply = ask_prompt("Type 'push' to push the result to %s, branch %s." % (host_repo,branch))
|
||||||
|
if reply.lower() == 'push':
|
||||||
|
subprocess.check_call([GIT,'push',host_repo,'refs/heads/'+branch])
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
|
|
|
@ -1,185 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# This script will locally construct a merge commit for a pull request on a
|
|
||||||
# github repository, inspect it, sign it and optionally push it.
|
|
||||||
|
|
||||||
# The following temporary branches are created/overwritten and deleted:
|
|
||||||
# * pull/$PULL/base (the current master we're merging onto)
|
|
||||||
# * pull/$PULL/head (the current state of the remote pull request)
|
|
||||||
# * pull/$PULL/merge (github's merge)
|
|
||||||
# * pull/$PULL/local-merge (our merge)
|
|
||||||
|
|
||||||
# In case of a clean merge that is accepted by the user, the local branch with
|
|
||||||
# name $BRANCH is overwritten with the merged result, and optionally pushed.
|
|
||||||
|
|
||||||
REPO="$(git config --get githubmerge.repository)"
|
|
||||||
if [[ "d$REPO" == "d" ]]; then
|
|
||||||
echo "ERROR: No repository configured. Use this command to set:" >&2
|
|
||||||
echo "git config githubmerge.repository <owner>/<repo>" >&2
|
|
||||||
echo "In addition, you can set the following variables:" >&2
|
|
||||||
echo "- githubmerge.host (default git@github.com)" >&2
|
|
||||||
echo "- githubmerge.branch (default master)" >&2
|
|
||||||
echo "- githubmerge.testcmd (default none)" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
HOST="$(git config --get githubmerge.host)"
|
|
||||||
if [[ "d$HOST" == "d" ]]; then
|
|
||||||
HOST="git@github.com"
|
|
||||||
fi
|
|
||||||
|
|
||||||
BRANCH="$(git config --get githubmerge.branch)"
|
|
||||||
if [[ "d$BRANCH" == "d" ]]; then
|
|
||||||
BRANCH="master"
|
|
||||||
fi
|
|
||||||
|
|
||||||
TESTCMD="$(git config --get githubmerge.testcmd)"
|
|
||||||
|
|
||||||
PULL="$1"
|
|
||||||
|
|
||||||
if [[ "d$PULL" == "d" ]]; then
|
|
||||||
echo "Usage: $0 pullnumber [branch]" >&2
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "d$2" != "d" ]]; then
|
|
||||||
BRANCH="$2"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Initialize source branches.
|
|
||||||
git checkout -q "$BRANCH"
|
|
||||||
if git fetch -q "$HOST":"$REPO" "+refs/pull/$PULL/*:refs/heads/pull/$PULL/*"; then
|
|
||||||
if ! git log -q -1 "refs/heads/pull/$PULL/head" >/dev/null 2>&1; then
|
|
||||||
echo "ERROR: Cannot find head of pull request #$PULL on $HOST:$REPO." >&2
|
|
||||||
exit 3
|
|
||||||
fi
|
|
||||||
if ! git log -q -1 "refs/heads/pull/$PULL/merge" >/dev/null 2>&1; then
|
|
||||||
echo "ERROR: Cannot find merge of pull request #$PULL on $HOST:$REPO." >&2
|
|
||||||
exit 3
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "ERROR: Cannot find pull request #$PULL on $HOST:$REPO." >&2
|
|
||||||
exit 3
|
|
||||||
fi
|
|
||||||
if git fetch -q "$HOST":"$REPO" +refs/heads/"$BRANCH":refs/heads/pull/"$PULL"/base; then
|
|
||||||
true
|
|
||||||
else
|
|
||||||
echo "ERROR: Cannot find branch $BRANCH on $HOST:$REPO." >&2
|
|
||||||
exit 3
|
|
||||||
fi
|
|
||||||
git checkout -q pull/"$PULL"/base
|
|
||||||
git branch -q -D pull/"$PULL"/local-merge 2>/dev/null
|
|
||||||
git checkout -q -b pull/"$PULL"/local-merge
|
|
||||||
TMPDIR="$(mktemp -d -t ghmXXXXX)"
|
|
||||||
|
|
||||||
function cleanup() {
|
|
||||||
git checkout -q "$BRANCH"
|
|
||||||
git branch -q -D pull/"$PULL"/head 2>/dev/null
|
|
||||||
git branch -q -D pull/"$PULL"/base 2>/dev/null
|
|
||||||
git branch -q -D pull/"$PULL"/merge 2>/dev/null
|
|
||||||
git branch -q -D pull/"$PULL"/local-merge 2>/dev/null
|
|
||||||
rm -rf "$TMPDIR"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Create unsigned merge commit.
|
|
||||||
(
|
|
||||||
echo "Merge pull request #$PULL"
|
|
||||||
echo ""
|
|
||||||
git log --no-merges --topo-order --pretty='format:%h %s (%an)' pull/"$PULL"/base..pull/"$PULL"/head
|
|
||||||
)>"$TMPDIR/message"
|
|
||||||
if git merge -q --commit --no-edit --no-ff -m "$(<"$TMPDIR/message")" pull/"$PULL"/head; then
|
|
||||||
if [ "d$(git log --pretty='format:%s' -n 1)" != "dMerge pull request #$PULL" ]; then
|
|
||||||
echo "ERROR: Creating merge failed (already merged?)." >&2
|
|
||||||
cleanup
|
|
||||||
exit 4
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "ERROR: Cannot be merged cleanly." >&2
|
|
||||||
git merge --abort
|
|
||||||
cleanup
|
|
||||||
exit 4
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Run test command if configured.
|
|
||||||
if [[ "d$TESTCMD" != "d" ]]; then
|
|
||||||
# Go up to the repository's root.
|
|
||||||
while [ ! -d .git ]; do cd ..; done
|
|
||||||
if ! $TESTCMD; then
|
|
||||||
echo "ERROR: Running $TESTCMD failed." >&2
|
|
||||||
cleanup
|
|
||||||
exit 5
|
|
||||||
fi
|
|
||||||
# Show the created merge.
|
|
||||||
git diff pull/"$PULL"/merge..pull/"$PULL"/local-merge >"$TMPDIR"/diff
|
|
||||||
git diff pull/"$PULL"/base..pull/"$PULL"/local-merge
|
|
||||||
if [[ "$(<"$TMPDIR"/diff)" != "" ]]; then
|
|
||||||
echo "WARNING: merge differs from github!" >&2
|
|
||||||
read -p "Type 'ignore' to continue. " -r >&2
|
|
||||||
if [[ "d$REPLY" =~ ^d[iI][gG][nN][oO][rR][eE]$ ]]; then
|
|
||||||
echo "Difference with github ignored." >&2
|
|
||||||
else
|
|
||||||
cleanup
|
|
||||||
exit 6
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
read -p "Press 'd' to accept the diff. " -n 1 -r >&2
|
|
||||||
echo
|
|
||||||
if [[ "d$REPLY" =~ ^d[dD]$ ]]; then
|
|
||||||
echo "Diff accepted." >&2
|
|
||||||
else
|
|
||||||
echo "ERROR: Diff rejected." >&2
|
|
||||||
cleanup
|
|
||||||
exit 6
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
# Verify the result.
|
|
||||||
echo "Dropping you on a shell so you can try building/testing the merged source." >&2
|
|
||||||
echo "Run 'git diff HEAD~' to show the changes being merged." >&2
|
|
||||||
echo "Type 'exit' when done." >&2
|
|
||||||
if [[ -f /etc/debian_version ]]; then # Show pull number in prompt on Debian default prompt
|
|
||||||
export debian_chroot="$PULL"
|
|
||||||
fi
|
|
||||||
bash -i
|
|
||||||
read -p "Press 'm' to accept the merge. " -n 1 -r >&2
|
|
||||||
echo
|
|
||||||
if [[ "d$REPLY" =~ ^d[Mm]$ ]]; then
|
|
||||||
echo "Merge accepted." >&2
|
|
||||||
else
|
|
||||||
echo "ERROR: Merge rejected." >&2
|
|
||||||
cleanup
|
|
||||||
exit 7
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Sign the merge commit.
|
|
||||||
read -p "Press 's' to sign off on the merge. " -n 1 -r >&2
|
|
||||||
echo
|
|
||||||
if [[ "d$REPLY" =~ ^d[Ss]$ ]]; then
|
|
||||||
if [[ "$(git config --get user.signingkey)" == "" ]]; then
|
|
||||||
echo "ERROR: No GPG signing key set, not signing. Set one using:" >&2
|
|
||||||
echo "git config --global user.signingkey <key>" >&2
|
|
||||||
cleanup
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
if ! git commit -q --gpg-sign --amend --no-edit; then
|
|
||||||
echo "Error signing, exiting."
|
|
||||||
cleanup
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "Not signing off on merge, exiting."
|
|
||||||
cleanup
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Clean up temporary branches, and put the result in $BRANCH.
|
|
||||||
git checkout -q "$BRANCH"
|
|
||||||
git reset -q --hard pull/"$PULL"/local-merge
|
|
||||||
cleanup
|
|
||||||
|
|
||||||
# Push the result.
|
|
||||||
read -p "Type 'push' to push the result to $HOST:$REPO, branch $BRANCH. " -r >&2
|
|
||||||
if [[ "d$REPLY" =~ ^d[Pp][Uu][Ss][Hh]$ ]]; then
|
|
||||||
git push "$HOST":"$REPO" refs/heads/"$BRANCH"
|
|
||||||
fi
|
|
181
contrib/devtools/security-check.py
Executable file
181
contrib/devtools/security-check.py
Executable file
|
@ -0,0 +1,181 @@
|
||||||
|
#!/usr/bin/python2
|
||||||
|
'''
|
||||||
|
Perform basic ELF security checks on a series of executables.
|
||||||
|
Exit status will be 0 if successful, and the program will be silent.
|
||||||
|
Otherwise the exit status will be 1 and it will log which executables failed which checks.
|
||||||
|
Needs `readelf` (for ELF) and `objdump` (for PE).
|
||||||
|
'''
|
||||||
|
from __future__ import division,print_function,unicode_literals
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
READELF_CMD = os.getenv('READELF', '/usr/bin/readelf')
|
||||||
|
OBJDUMP_CMD = os.getenv('OBJDUMP', '/usr/bin/objdump')
|
||||||
|
|
||||||
|
def check_ELF_PIE(executable):
|
||||||
|
'''
|
||||||
|
Check for position independent executable (PIE), allowing for address space randomization.
|
||||||
|
'''
|
||||||
|
p = subprocess.Popen([READELF_CMD, '-h', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
|
||||||
|
(stdout, stderr) = p.communicate()
|
||||||
|
if p.returncode:
|
||||||
|
raise IOError('Error opening file')
|
||||||
|
|
||||||
|
ok = False
|
||||||
|
for line in stdout.split(b'\n'):
|
||||||
|
line = line.split()
|
||||||
|
if len(line)>=2 and line[0] == b'Type:' and line[1] == b'DYN':
|
||||||
|
ok = True
|
||||||
|
return ok
|
||||||
|
|
||||||
|
def get_ELF_program_headers(executable):
|
||||||
|
'''Return type and flags for ELF program headers'''
|
||||||
|
p = subprocess.Popen([READELF_CMD, '-l', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
|
||||||
|
(stdout, stderr) = p.communicate()
|
||||||
|
if p.returncode:
|
||||||
|
raise IOError('Error opening file')
|
||||||
|
in_headers = False
|
||||||
|
count = 0
|
||||||
|
headers = []
|
||||||
|
for line in stdout.split(b'\n'):
|
||||||
|
if line.startswith(b'Program Headers:'):
|
||||||
|
in_headers = True
|
||||||
|
if line == b'':
|
||||||
|
in_headers = False
|
||||||
|
if in_headers:
|
||||||
|
if count == 1: # header line
|
||||||
|
ofs_typ = line.find(b'Type')
|
||||||
|
ofs_offset = line.find(b'Offset')
|
||||||
|
ofs_flags = line.find(b'Flg')
|
||||||
|
ofs_align = line.find(b'Align')
|
||||||
|
if ofs_typ == -1 or ofs_offset == -1 or ofs_flags == -1 or ofs_align == -1:
|
||||||
|
raise ValueError('Cannot parse elfread -lW output')
|
||||||
|
elif count > 1:
|
||||||
|
typ = line[ofs_typ:ofs_offset].rstrip()
|
||||||
|
flags = line[ofs_flags:ofs_align].rstrip()
|
||||||
|
headers.append((typ, flags))
|
||||||
|
count += 1
|
||||||
|
return headers
|
||||||
|
|
||||||
|
def check_ELF_NX(executable):
|
||||||
|
'''
|
||||||
|
Check that no sections are writable and executable (including the stack)
|
||||||
|
'''
|
||||||
|
have_wx = False
|
||||||
|
have_gnu_stack = False
|
||||||
|
for (typ, flags) in get_ELF_program_headers(executable):
|
||||||
|
if typ == b'GNU_STACK':
|
||||||
|
have_gnu_stack = True
|
||||||
|
if b'W' in flags and b'E' in flags: # section is both writable and executable
|
||||||
|
have_wx = True
|
||||||
|
return have_gnu_stack and not have_wx
|
||||||
|
|
||||||
|
def check_ELF_RELRO(executable):
|
||||||
|
'''
|
||||||
|
Check for read-only relocations.
|
||||||
|
GNU_RELRO program header must exist
|
||||||
|
Dynamic section must have BIND_NOW flag
|
||||||
|
'''
|
||||||
|
have_gnu_relro = False
|
||||||
|
for (typ, flags) in get_ELF_program_headers(executable):
|
||||||
|
# Note: not checking flags == 'R': here as linkers set the permission differently
|
||||||
|
# This does not affect security: the permission flags of the GNU_RELRO program header are ignored, the PT_LOAD header determines the effective permissions.
|
||||||
|
# However, the dynamic linker need to write to this area so these are RW.
|
||||||
|
# Glibc itself takes care of mprotecting this area R after relocations are finished.
|
||||||
|
# See also http://permalink.gmane.org/gmane.comp.gnu.binutils/71347
|
||||||
|
if typ == b'GNU_RELRO':
|
||||||
|
have_gnu_relro = True
|
||||||
|
|
||||||
|
have_bindnow = False
|
||||||
|
p = subprocess.Popen([READELF_CMD, '-d', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
|
||||||
|
(stdout, stderr) = p.communicate()
|
||||||
|
if p.returncode:
|
||||||
|
raise IOError('Error opening file')
|
||||||
|
for line in stdout.split(b'\n'):
|
||||||
|
tokens = line.split()
|
||||||
|
if len(tokens)>1 and tokens[1] == b'(BIND_NOW)' or (len(tokens)>2 and tokens[1] == b'(FLAGS)' and b'BIND_NOW' in tokens[2]):
|
||||||
|
have_bindnow = True
|
||||||
|
return have_gnu_relro and have_bindnow
|
||||||
|
|
||||||
|
def check_ELF_Canary(executable):
|
||||||
|
'''
|
||||||
|
Check for use of stack canary
|
||||||
|
'''
|
||||||
|
p = subprocess.Popen([READELF_CMD, '--dyn-syms', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
|
||||||
|
(stdout, stderr) = p.communicate()
|
||||||
|
if p.returncode:
|
||||||
|
raise IOError('Error opening file')
|
||||||
|
ok = False
|
||||||
|
for line in stdout.split(b'\n'):
|
||||||
|
if b'__stack_chk_fail' in line:
|
||||||
|
ok = True
|
||||||
|
return ok
|
||||||
|
|
||||||
|
def get_PE_dll_characteristics(executable):
|
||||||
|
'''
|
||||||
|
Get PE DllCharacteristics bits
|
||||||
|
'''
|
||||||
|
p = subprocess.Popen([OBJDUMP_CMD, '-x', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
|
||||||
|
(stdout, stderr) = p.communicate()
|
||||||
|
if p.returncode:
|
||||||
|
raise IOError('Error opening file')
|
||||||
|
for line in stdout.split('\n'):
|
||||||
|
tokens = line.split()
|
||||||
|
if len(tokens)>=2 and tokens[0] == 'DllCharacteristics':
|
||||||
|
return int(tokens[1],16)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
def check_PE_PIE(executable):
|
||||||
|
'''PIE: DllCharacteristics bit 0x40 signifies dynamicbase (ASLR)'''
|
||||||
|
return bool(get_PE_dll_characteristics(executable) & 0x40)
|
||||||
|
|
||||||
|
def check_PE_NX(executable):
|
||||||
|
'''NX: DllCharacteristics bit 0x100 signifies nxcompat (DEP)'''
|
||||||
|
return bool(get_PE_dll_characteristics(executable) & 0x100)
|
||||||
|
|
||||||
|
CHECKS = {
|
||||||
|
'ELF': [
|
||||||
|
('PIE', check_ELF_PIE),
|
||||||
|
('NX', check_ELF_NX),
|
||||||
|
('RELRO', check_ELF_RELRO),
|
||||||
|
('Canary', check_ELF_Canary)
|
||||||
|
],
|
||||||
|
'PE': [
|
||||||
|
('PIE', check_PE_PIE),
|
||||||
|
('NX', check_PE_NX)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
def identify_executable(executable):
|
||||||
|
with open(filename, 'rb') as f:
|
||||||
|
magic = f.read(4)
|
||||||
|
if magic.startswith(b'MZ'):
|
||||||
|
return 'PE'
|
||||||
|
elif magic.startswith(b'\x7fELF'):
|
||||||
|
return 'ELF'
|
||||||
|
return None
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
retval = 0
|
||||||
|
for filename in sys.argv[1:]:
|
||||||
|
try:
|
||||||
|
etype = identify_executable(filename)
|
||||||
|
if etype is None:
|
||||||
|
print('%s: unknown format' % filename)
|
||||||
|
retval = 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
failed = []
|
||||||
|
for (name, func) in CHECKS[etype]:
|
||||||
|
if not func(filename):
|
||||||
|
failed.append(name)
|
||||||
|
if failed:
|
||||||
|
print('%s: failed %s' % (filename, ' '.join(failed)))
|
||||||
|
retval = 1
|
||||||
|
except IOError:
|
||||||
|
print('%s: cannot open' % filename)
|
||||||
|
retval = 1
|
||||||
|
exit(retval)
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#!/usr/bin/python
|
#!/usr/bin/python2
|
||||||
# Copyright (c) 2014 Wladimir J. van der Laan
|
# Copyright (c) 2014 Wladimir J. van der Laan
|
||||||
# Distributed under the MIT software license, see the accompanying
|
# Distributed under the MIT software license, see the accompanying
|
||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
@ -11,10 +11,11 @@ Example usage:
|
||||||
|
|
||||||
find ../gitian-builder/build -type f -executable | xargs python contrib/devtools/symbol-check.py
|
find ../gitian-builder/build -type f -executable | xargs python contrib/devtools/symbol-check.py
|
||||||
'''
|
'''
|
||||||
from __future__ import division, print_function
|
from __future__ import division, print_function, unicode_literals
|
||||||
import subprocess
|
import subprocess
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
# Debian 6.0.9 (Squeeze) has:
|
# Debian 6.0.9 (Squeeze) has:
|
||||||
#
|
#
|
||||||
|
@ -41,12 +42,34 @@ MAX_VERSIONS = {
|
||||||
'GLIBCXX': (3,4,13),
|
'GLIBCXX': (3,4,13),
|
||||||
'GLIBC': (2,11)
|
'GLIBC': (2,11)
|
||||||
}
|
}
|
||||||
|
# See here for a description of _IO_stdin_used:
|
||||||
|
# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=634261#109
|
||||||
|
|
||||||
# Ignore symbols that are exported as part of every executable
|
# Ignore symbols that are exported as part of every executable
|
||||||
IGNORE_EXPORTS = {
|
IGNORE_EXPORTS = {
|
||||||
'_edata', '_end', '_init', '__bss_start', '_fini'
|
b'_edata', b'_end', b'_init', b'__bss_start', b'_fini', b'_IO_stdin_used'
|
||||||
|
}
|
||||||
|
READELF_CMD = os.getenv('READELF', '/usr/bin/readelf')
|
||||||
|
CPPFILT_CMD = os.getenv('CPPFILT', '/usr/bin/c++filt')
|
||||||
|
# Allowed NEEDED libraries
|
||||||
|
ALLOWED_LIBRARIES = {
|
||||||
|
# bitcoind and bitcoin-qt
|
||||||
|
b'libgcc_s.so.1', # GCC base support
|
||||||
|
b'libc.so.6', # C library
|
||||||
|
b'libpthread.so.0', # threading
|
||||||
|
b'libanl.so.1', # DNS resolve
|
||||||
|
b'libm.so.6', # math library
|
||||||
|
b'librt.so.1', # real-time (clock)
|
||||||
|
b'ld-linux-x86-64.so.2', # 64-bit dynamic linker
|
||||||
|
b'ld-linux.so.2', # 32-bit dynamic linker
|
||||||
|
# bitcoin-qt only
|
||||||
|
b'libX11-xcb.so.1', # part of X11
|
||||||
|
b'libX11.so.6', # part of X11
|
||||||
|
b'libxcb.so.1', # part of X11
|
||||||
|
b'libfontconfig.so.1', # font support
|
||||||
|
b'libfreetype.so.6', # font parsing
|
||||||
|
b'libdl.so.2' # programming interface to dynamic linker
|
||||||
}
|
}
|
||||||
READELF_CMD = '/usr/bin/readelf'
|
|
||||||
CPPFILT_CMD = '/usr/bin/c++filt'
|
|
||||||
|
|
||||||
class CPPFilt(object):
|
class CPPFilt(object):
|
||||||
'''
|
'''
|
||||||
|
@ -58,7 +81,8 @@ class CPPFilt(object):
|
||||||
self.proc = subprocess.Popen(CPPFILT_CMD, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
|
self.proc = subprocess.Popen(CPPFILT_CMD, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||||
|
|
||||||
def __call__(self, mangled):
|
def __call__(self, mangled):
|
||||||
self.proc.stdin.write(mangled + '\n')
|
self.proc.stdin.write(mangled + b'\n')
|
||||||
|
self.proc.stdin.flush()
|
||||||
return self.proc.stdout.readline().rstrip()
|
return self.proc.stdout.readline().rstrip()
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
|
@ -76,28 +100,44 @@ def read_symbols(executable, imports=True):
|
||||||
if p.returncode:
|
if p.returncode:
|
||||||
raise IOError('Could not read symbols for %s: %s' % (executable, stderr.strip()))
|
raise IOError('Could not read symbols for %s: %s' % (executable, stderr.strip()))
|
||||||
syms = []
|
syms = []
|
||||||
for line in stdout.split('\n'):
|
for line in stdout.split(b'\n'):
|
||||||
line = line.split()
|
line = line.split()
|
||||||
if len(line)>7 and re.match('[0-9]+:$', line[0]):
|
if len(line)>7 and re.match(b'[0-9]+:$', line[0]):
|
||||||
(sym, _, version) = line[7].partition('@')
|
(sym, _, version) = line[7].partition(b'@')
|
||||||
is_import = line[6] == 'UND'
|
is_import = line[6] == b'UND'
|
||||||
if version.startswith('@'):
|
if version.startswith(b'@'):
|
||||||
version = version[1:]
|
version = version[1:]
|
||||||
if is_import == imports:
|
if is_import == imports:
|
||||||
syms.append((sym, version))
|
syms.append((sym, version))
|
||||||
return syms
|
return syms
|
||||||
|
|
||||||
def check_version(max_versions, version):
|
def check_version(max_versions, version):
|
||||||
if '_' in version:
|
if b'_' in version:
|
||||||
(lib, _, ver) = version.rpartition('_')
|
(lib, _, ver) = version.rpartition(b'_')
|
||||||
else:
|
else:
|
||||||
lib = version
|
lib = version
|
||||||
ver = '0'
|
ver = '0'
|
||||||
ver = tuple([int(x) for x in ver.split('.')])
|
ver = tuple([int(x) for x in ver.split(b'.')])
|
||||||
if not lib in max_versions:
|
if not lib in max_versions:
|
||||||
return False
|
return False
|
||||||
return ver <= max_versions[lib]
|
return ver <= max_versions[lib]
|
||||||
|
|
||||||
|
def read_libraries(filename):
|
||||||
|
p = subprocess.Popen([READELF_CMD, '-d', '-W', filename], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
|
||||||
|
(stdout, stderr) = p.communicate()
|
||||||
|
if p.returncode:
|
||||||
|
raise IOError('Error opening file')
|
||||||
|
libraries = []
|
||||||
|
for line in stdout.split(b'\n'):
|
||||||
|
tokens = line.split()
|
||||||
|
if len(tokens)>2 and tokens[1] == b'(NEEDED)':
|
||||||
|
match = re.match(b'^Shared library: \[(.*)\]$', b' '.join(tokens[2:]))
|
||||||
|
if match:
|
||||||
|
libraries.append(match.group(1))
|
||||||
|
else:
|
||||||
|
raise ValueError('Unparseable (NEEDED) specification')
|
||||||
|
return libraries
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
cppfilt = CPPFilt()
|
cppfilt = CPPFilt()
|
||||||
retval = 0
|
retval = 0
|
||||||
|
@ -105,14 +145,19 @@ if __name__ == '__main__':
|
||||||
# Check imported symbols
|
# Check imported symbols
|
||||||
for sym,version in read_symbols(filename, True):
|
for sym,version in read_symbols(filename, True):
|
||||||
if version and not check_version(MAX_VERSIONS, version):
|
if version and not check_version(MAX_VERSIONS, version):
|
||||||
print('%s: symbol %s from unsupported version %s' % (filename, cppfilt(sym), version))
|
print('%s: symbol %s from unsupported version %s' % (filename, cppfilt(sym).decode('utf-8'), version.decode('utf-8')))
|
||||||
retval = 1
|
retval = 1
|
||||||
# Check exported symbols
|
# Check exported symbols
|
||||||
for sym,version in read_symbols(filename, False):
|
for sym,version in read_symbols(filename, False):
|
||||||
if sym in IGNORE_EXPORTS:
|
if sym in IGNORE_EXPORTS:
|
||||||
continue
|
continue
|
||||||
print('%s: export of symbol %s not allowed' % (filename, cppfilt(sym)))
|
print('%s: export of symbol %s not allowed' % (filename, cppfilt(sym).decode('utf-8')))
|
||||||
retval = 1
|
retval = 1
|
||||||
|
# Check dependency libraries
|
||||||
|
for library_name in read_libraries(filename):
|
||||||
|
if library_name not in ALLOWED_LIBRARIES:
|
||||||
|
print('%s: NEEDED library %s is not allowed' % (filename, library_name.decode('utf-8')))
|
||||||
|
retval = 1
|
||||||
|
|
||||||
exit(retval)
|
exit(retval)
|
||||||
|
|
||||||
|
|
60
contrib/devtools/test-security-check.py
Executable file
60
contrib/devtools/test-security-check.py
Executable file
|
@ -0,0 +1,60 @@
|
||||||
|
#!/usr/bin/python2
|
||||||
|
'''
|
||||||
|
Test script for security-check.py
|
||||||
|
'''
|
||||||
|
from __future__ import division,print_function
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
def write_testcode(filename):
|
||||||
|
with open(filename, 'w') as f:
|
||||||
|
f.write('''
|
||||||
|
#include <stdio.h>
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
printf("the quick brown fox jumps over the lazy god\\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
''')
|
||||||
|
|
||||||
|
def call_security_check(cc, source, executable, options):
|
||||||
|
subprocess.check_call([cc,source,'-o',executable] + options)
|
||||||
|
p = subprocess.Popen(['./security-check.py',executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
|
||||||
|
(stdout, stderr) = p.communicate()
|
||||||
|
return (p.returncode, stdout.rstrip())
|
||||||
|
|
||||||
|
class TestSecurityChecks(unittest.TestCase):
|
||||||
|
def test_ELF(self):
|
||||||
|
source = 'test1.c'
|
||||||
|
executable = 'test1'
|
||||||
|
cc = 'gcc'
|
||||||
|
write_testcode(source)
|
||||||
|
|
||||||
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-zexecstack','-fno-stack-protector','-Wl,-znorelro']),
|
||||||
|
(1, executable+': failed PIE NX RELRO Canary'))
|
||||||
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fno-stack-protector','-Wl,-znorelro']),
|
||||||
|
(1, executable+': failed PIE RELRO Canary'))
|
||||||
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-znorelro']),
|
||||||
|
(1, executable+': failed PIE RELRO'))
|
||||||
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-znorelro','-pie','-fPIE']),
|
||||||
|
(1, executable+': failed RELRO'))
|
||||||
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-zrelro','-Wl,-z,now','-pie','-fPIE']),
|
||||||
|
(0, ''))
|
||||||
|
|
||||||
|
def test_PE(self):
|
||||||
|
source = 'test1.c'
|
||||||
|
executable = 'test1.exe'
|
||||||
|
cc = 'i686-w64-mingw32-gcc'
|
||||||
|
write_testcode(source)
|
||||||
|
|
||||||
|
self.assertEqual(call_security_check(cc, source, executable, []),
|
||||||
|
(1, executable+': failed PIE NX'))
|
||||||
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,--nxcompat']),
|
||||||
|
(1, executable+': failed PIE'))
|
||||||
|
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,--nxcompat','-Wl,--dynamicbase']),
|
||||||
|
(0, ''))
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
unittest.main()
|
||||||
|
|
|
@ -29,6 +29,8 @@ TX = 'tx'
|
||||||
SOURCE_LANG = 'bitcoin_en.ts'
|
SOURCE_LANG = 'bitcoin_en.ts'
|
||||||
# Directory with locale files
|
# Directory with locale files
|
||||||
LOCALE_DIR = 'src/qt/locale'
|
LOCALE_DIR = 'src/qt/locale'
|
||||||
|
# Minimum number of messages for translation to be considered at all
|
||||||
|
MIN_NUM_MESSAGES = 10
|
||||||
|
|
||||||
def check_at_repository_root():
|
def check_at_repository_root():
|
||||||
if not os.path.exists('.git'):
|
if not os.path.exists('.git'):
|
||||||
|
@ -37,7 +39,7 @@ def check_at_repository_root():
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
def fetch_all_translations():
|
def fetch_all_translations():
|
||||||
if subprocess.call([TX, 'pull', '-f']):
|
if subprocess.call([TX, 'pull', '-f', '-a']):
|
||||||
print('Error while fetching translations', file=sys.stderr)
|
print('Error while fetching translations', file=sys.stderr)
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
|
@ -70,7 +72,7 @@ def sanitize_string(s):
|
||||||
'''Sanitize string for printing'''
|
'''Sanitize string for printing'''
|
||||||
return s.replace('\n',' ')
|
return s.replace('\n',' ')
|
||||||
|
|
||||||
def check_format_specifiers(source, translation, errors):
|
def check_format_specifiers(source, translation, errors, numerus):
|
||||||
source_f = split_format_specifiers(find_format_specifiers(source))
|
source_f = split_format_specifiers(find_format_specifiers(source))
|
||||||
# assert that no source messages contain both Qt and strprintf format specifiers
|
# assert that no source messages contain both Qt and strprintf format specifiers
|
||||||
# if this fails, go change the source as this is hacky and confusing!
|
# if this fails, go change the source as this is hacky and confusing!
|
||||||
|
@ -78,10 +80,13 @@ def check_format_specifiers(source, translation, errors):
|
||||||
try:
|
try:
|
||||||
translation_f = split_format_specifiers(find_format_specifiers(translation))
|
translation_f = split_format_specifiers(find_format_specifiers(translation))
|
||||||
except IndexError:
|
except IndexError:
|
||||||
errors.append("Parse error in translation '%s'" % sanitize_string(translation))
|
errors.append("Parse error in translation for '%s': '%s'" % (sanitize_string(source), sanitize_string(translation)))
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
if source_f != translation_f:
|
if source_f != translation_f:
|
||||||
|
if numerus and source_f == (set(), ['n']) and translation_f == (set(), []) and translation.find('%') == -1:
|
||||||
|
# Allow numerus translations to omit %n specifier (usually when it only has one possible value)
|
||||||
|
return True
|
||||||
errors.append("Mismatch between '%s' and '%s'" % (sanitize_string(source), sanitize_string(translation)))
|
errors.append("Mismatch between '%s' and '%s'" % (sanitize_string(source), sanitize_string(translation)))
|
||||||
return False
|
return False
|
||||||
return True
|
return True
|
||||||
|
@ -148,7 +153,7 @@ def postprocess_translations(reduce_diff_hacks=False):
|
||||||
if translation is None:
|
if translation is None:
|
||||||
continue
|
continue
|
||||||
errors = []
|
errors = []
|
||||||
valid = check_format_specifiers(source, translation, errors)
|
valid = check_format_specifiers(source, translation, errors, numerus)
|
||||||
|
|
||||||
for error in errors:
|
for error in errors:
|
||||||
print('%s: %s' % (filename, error))
|
print('%s: %s' % (filename, error))
|
||||||
|
@ -166,6 +171,15 @@ def postprocess_translations(reduce_diff_hacks=False):
|
||||||
if translation_node.get('type') == 'unfinished':
|
if translation_node.get('type') == 'unfinished':
|
||||||
context.remove(message)
|
context.remove(message)
|
||||||
|
|
||||||
|
# check if document is (virtually) empty, and remove it if so
|
||||||
|
num_messages = 0
|
||||||
|
for context in root.findall('context'):
|
||||||
|
for message in context.findall('message'):
|
||||||
|
num_messages += 1
|
||||||
|
if num_messages < MIN_NUM_MESSAGES:
|
||||||
|
print('Removing %s, as it contains only %i messages' % (filepath, num_messages))
|
||||||
|
continue
|
||||||
|
|
||||||
# write fixed-up tree
|
# write fixed-up tree
|
||||||
# if diff reduction requested, replace some XML to 'sanitize' to qt formatting
|
# if diff reduction requested, replace some XML to 'sanitize' to qt formatting
|
||||||
if reduce_diff_hacks:
|
if reduce_diff_hacks:
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
### Gavin's notes on getting gitian builds up and running using KVM:###
|
### Gavin's notes on getting gitian builds up and running using KVM
|
||||||
|
|
||||||
These instructions distilled from:
|
These instructions distilled from
|
||||||
[ https://help.ubuntu.com/community/KVM/Installation]( https://help.ubuntu.com/community/KVM/Installation)
|
[https://help.ubuntu.com/community/KVM/Installation](https://help.ubuntu.com/community/KVM/Installation).
|
||||||
... see there for complete details.
|
|
||||||
|
|
||||||
You need the right hardware: you need a 64-bit-capable CPU with hardware virtualization support (Intel VT-x or AMD-V). Not all modern CPUs support hardware virtualization.
|
You need the right hardware: you need a 64-bit-capable CPU with hardware virtualization support (Intel VT-x or AMD-V). Not all modern CPUs support hardware virtualization.
|
||||||
|
|
||||||
|
@ -27,20 +26,20 @@ Once you've got the right hardware and software:
|
||||||
|
|
||||||
# Create base images
|
# Create base images
|
||||||
cd gitian-builder
|
cd gitian-builder
|
||||||
bin/make-base-vm --suite precise --arch amd64
|
bin/make-base-vm --suite trusty --arch amd64
|
||||||
cd ..
|
cd ..
|
||||||
|
|
||||||
# Get inputs (see doc/release-process.md for exact inputs needed and where to get them)
|
# Get inputs (see doc/release-process.md for exact inputs needed and where to get them)
|
||||||
...
|
...
|
||||||
|
|
||||||
# For further build instructions see doc/release-notes.md
|
# For further build instructions see doc/release-process.md
|
||||||
...
|
...
|
||||||
|
|
||||||
---------------------
|
---------------------
|
||||||
|
|
||||||
`gitian-builder` now also supports building using LXC. See
|
`gitian-builder` now also supports building using LXC. See
|
||||||
[ https://help.ubuntu.com/12.04/serverguide/lxc.html]( https://help.ubuntu.com/12.04/serverguide/lxc.html)
|
[help.ubuntu.com](https://help.ubuntu.com/14.04/serverguide/lxc.html)
|
||||||
... for how to get LXC up and running under Ubuntu.
|
for how to get LXC up and running under Ubuntu.
|
||||||
|
|
||||||
If your main machine is a 64-bit Mac or PC with a few gigabytes of memory
|
If your main machine is a 64-bit Mac or PC with a few gigabytes of memory
|
||||||
and at least 10 gigabytes of free disk space, you can `gitian-build` using
|
and at least 10 gigabytes of free disk space, you can `gitian-build` using
|
||||||
|
|
|
@ -1,22 +1,24 @@
|
||||||
---
|
---
|
||||||
name: "bitcoin-linux-0.12"
|
name: "bitcoin-linux-0.13"
|
||||||
enable_cache: true
|
enable_cache: true
|
||||||
suites:
|
suites:
|
||||||
- "precise"
|
- "trusty"
|
||||||
architectures:
|
architectures:
|
||||||
- "amd64"
|
- "amd64"
|
||||||
packages:
|
packages:
|
||||||
|
- "curl"
|
||||||
- "g++-multilib"
|
- "g++-multilib"
|
||||||
- "git-core"
|
- "git-core"
|
||||||
- "pkg-config"
|
- "pkg-config"
|
||||||
- "autoconf2.13"
|
- "autoconf"
|
||||||
- "libtool"
|
- "libtool"
|
||||||
- "automake"
|
- "automake"
|
||||||
- "faketime"
|
- "faketime"
|
||||||
- "bsdmainutils"
|
- "bsdmainutils"
|
||||||
- "binutils-gold"
|
- "binutils-gold"
|
||||||
- "libstdc++6-4.6-pic"
|
- "ca-certificates"
|
||||||
reference_datetime: "2015-06-01 00:00:00"
|
- "python"
|
||||||
|
reference_datetime: "2016-01-01 00:00:00"
|
||||||
remotes:
|
remotes:
|
||||||
- "url": "https://github.com/bitcoin/bitcoin.git"
|
- "url": "https://github.com/bitcoin/bitcoin.git"
|
||||||
"dir": "bitcoin"
|
"dir": "bitcoin"
|
||||||
|
@ -24,7 +26,7 @@ files: []
|
||||||
script: |
|
script: |
|
||||||
WRAP_DIR=$HOME/wrapped
|
WRAP_DIR=$HOME/wrapped
|
||||||
HOSTS="i686-pc-linux-gnu x86_64-unknown-linux-gnu"
|
HOSTS="i686-pc-linux-gnu x86_64-unknown-linux-gnu"
|
||||||
CONFIGFLAGS="--enable-glibc-back-compat --enable-reduce-exports LDFLAGS=-static-libstdc++"
|
CONFIGFLAGS="--enable-glibc-back-compat --enable-reduce-exports --disable-bench --disable-gui-tests LDFLAGS=-static-libstdc++"
|
||||||
FAKETIME_HOST_PROGS=""
|
FAKETIME_HOST_PROGS=""
|
||||||
FAKETIME_PROGS="date ar ranlib nm strip"
|
FAKETIME_PROGS="date ar ranlib nm strip"
|
||||||
|
|
||||||
|
@ -44,7 +46,7 @@ script: |
|
||||||
for prog in ${FAKETIME_PROGS}; do
|
for prog in ${FAKETIME_PROGS}; do
|
||||||
echo '#!/bin/bash' > ${WRAP_DIR}/${prog}
|
echo '#!/bin/bash' > ${WRAP_DIR}/${prog}
|
||||||
echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog}
|
echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog}
|
||||||
echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog}
|
echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog}
|
||||||
echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${prog}
|
echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${prog}
|
||||||
echo "\$REAL \$@" >> $WRAP_DIR/${prog}
|
echo "\$REAL \$@" >> $WRAP_DIR/${prog}
|
||||||
chmod +x ${WRAP_DIR}/${prog}
|
chmod +x ${WRAP_DIR}/${prog}
|
||||||
|
@ -55,7 +57,7 @@ script: |
|
||||||
for prog in ${FAKETIME_HOST_PROGS}; do
|
for prog in ${FAKETIME_HOST_PROGS}; do
|
||||||
echo '#!/bin/bash' > ${WRAP_DIR}/${i}-${prog}
|
echo '#!/bin/bash' > ${WRAP_DIR}/${i}-${prog}
|
||||||
echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog}
|
echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog}
|
||||||
echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog}
|
echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog}
|
||||||
echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${i}-${prog}
|
echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${i}-${prog}
|
||||||
echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog}
|
echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog}
|
||||||
chmod +x ${WRAP_DIR}/${i}-${prog}
|
chmod +x ${WRAP_DIR}/${i}-${prog}
|
||||||
|
@ -70,14 +72,6 @@ script: |
|
||||||
make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}"
|
make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}"
|
||||||
done
|
done
|
||||||
|
|
||||||
# Ubuntu precise hack: Not an issue in later versions.
|
|
||||||
# Precise's libstdc++.a is non-pic. There's an optional libstdc++6-4.6-pic
|
|
||||||
# package which provides libstdc++_pic.a, but the linker can't find it.
|
|
||||||
# Symlink it to a path that will be included in our link-line so that the
|
|
||||||
# linker picks it up before the default libstdc++.a.
|
|
||||||
# This is only necessary for 64bit.
|
|
||||||
ln -s /usr/lib/gcc/x86_64-linux-gnu/4.6/libstdc++_pic.a ${BASEPREFIX}/x86_64-unknown-linux-gnu/lib/libstdc++.a
|
|
||||||
|
|
||||||
# Create the release tarball using (arbitrarily) the first host
|
# Create the release tarball using (arbitrarily) the first host
|
||||||
./autogen.sh
|
./autogen.sh
|
||||||
./configure --prefix=${BASEPREFIX}/`echo "${HOSTS}" | awk '{print $1;}'`
|
./configure --prefix=${BASEPREFIX}/`echo "${HOSTS}" | awk '{print $1;}'`
|
||||||
|
@ -103,6 +97,8 @@ script: |
|
||||||
|
|
||||||
./configure --prefix=${BASEPREFIX}/${i} --bindir=${INSTALLPATH}/bin --includedir=${INSTALLPATH}/include --libdir=${INSTALLPATH}/lib --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS}
|
./configure --prefix=${BASEPREFIX}/${i} --bindir=${INSTALLPATH}/bin --includedir=${INSTALLPATH}/include --libdir=${INSTALLPATH}/lib --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS}
|
||||||
make ${MAKEOPTS}
|
make ${MAKEOPTS}
|
||||||
|
make ${MAKEOPTS} -C src check-security
|
||||||
|
make ${MAKEOPTS} -C src check-symbols
|
||||||
make install-strip
|
make install-strip
|
||||||
cd installed
|
cd installed
|
||||||
find . -name "lib*.la" -delete
|
find . -name "lib*.la" -delete
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
---
|
---
|
||||||
name: "bitcoin-dmg-signer"
|
name: "bitcoin-dmg-signer"
|
||||||
suites:
|
suites:
|
||||||
- "precise"
|
- "trusty"
|
||||||
architectures:
|
architectures:
|
||||||
- "amd64"
|
- "amd64"
|
||||||
packages:
|
packages:
|
||||||
- "libc6:i386"
|
|
||||||
- "faketime"
|
- "faketime"
|
||||||
reference_datetime: "2015-06-01 00:00:00"
|
reference_datetime: "2016-01-01 00:00:00"
|
||||||
remotes:
|
remotes:
|
||||||
- "url": "https://github.com/bitcoin/bitcoin-detached-sigs.git"
|
- "url": "https://github.com/bitcoin/bitcoin-detached-sigs.git"
|
||||||
"dir": "signature"
|
"dir": "signature"
|
||||||
|
@ -23,7 +22,7 @@ script: |
|
||||||
for prog in ${FAKETIME_PROGS}; do
|
for prog in ${FAKETIME_PROGS}; do
|
||||||
echo '#!/bin/bash' > ${WRAP_DIR}/${prog}
|
echo '#!/bin/bash' > ${WRAP_DIR}/${prog}
|
||||||
echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog}
|
echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog}
|
||||||
echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog}
|
echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog}
|
||||||
echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${prog}
|
echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${prog}
|
||||||
echo "\$REAL \$@" >> $WRAP_DIR/${prog}
|
echo "\$REAL \$@" >> $WRAP_DIR/${prog}
|
||||||
chmod +x ${WRAP_DIR}/${prog}
|
chmod +x ${WRAP_DIR}/${prog}
|
||||||
|
@ -33,6 +32,7 @@ script: |
|
||||||
SIGNED=bitcoin-osx-signed.dmg
|
SIGNED=bitcoin-osx-signed.dmg
|
||||||
|
|
||||||
tar -xf ${UNSIGNED}
|
tar -xf ${UNSIGNED}
|
||||||
|
OSX_VOLNAME="$(cat osx_volname)"
|
||||||
./detached-sig-apply.sh ${UNSIGNED} signature/osx
|
./detached-sig-apply.sh ${UNSIGNED} signature/osx
|
||||||
${WRAP_DIR}/genisoimage -no-cache-inodes -D -l -probe -V "Bitcoin-Core" -no-pad -r -apple -o uncompressed.dmg signed-app
|
${WRAP_DIR}/genisoimage -no-cache-inodes -D -l -probe -V "${OSX_VOLNAME}" -no-pad -r -apple -o uncompressed.dmg signed-app
|
||||||
${WRAP_DIR}/dmg dmg uncompressed.dmg ${OUTDIR}/${SIGNED}
|
${WRAP_DIR}/dmg dmg uncompressed.dmg ${OUTDIR}/${SIGNED}
|
||||||
|
|
|
@ -1,24 +1,33 @@
|
||||||
---
|
---
|
||||||
name: "bitcoin-osx-0.12"
|
name: "bitcoin-osx-0.13"
|
||||||
enable_cache: true
|
enable_cache: true
|
||||||
suites:
|
suites:
|
||||||
- "precise"
|
- "trusty"
|
||||||
architectures:
|
architectures:
|
||||||
- "amd64"
|
- "amd64"
|
||||||
packages:
|
packages:
|
||||||
|
- "ca-certificates"
|
||||||
|
- "curl"
|
||||||
- "g++"
|
- "g++"
|
||||||
- "git-core"
|
- "git-core"
|
||||||
- "pkg-config"
|
- "pkg-config"
|
||||||
- "autoconf2.13"
|
- "autoconf"
|
||||||
|
- "librsvg2-bin"
|
||||||
|
- "libtiff-tools"
|
||||||
- "libtool"
|
- "libtool"
|
||||||
- "automake"
|
- "automake"
|
||||||
- "faketime"
|
- "faketime"
|
||||||
- "bsdmainutils"
|
- "bsdmainutils"
|
||||||
- "cmake"
|
- "cmake"
|
||||||
|
- "imagemagick"
|
||||||
- "libcap-dev"
|
- "libcap-dev"
|
||||||
- "libz-dev"
|
- "libz-dev"
|
||||||
- "libbz2-dev"
|
- "libbz2-dev"
|
||||||
reference_datetime: "2015-06-01 00:00:00"
|
- "python"
|
||||||
|
- "python-dev"
|
||||||
|
- "python-setuptools"
|
||||||
|
- "fonts-tuffy"
|
||||||
|
reference_datetime: "2016-01-01 00:00:00"
|
||||||
remotes:
|
remotes:
|
||||||
- "url": "https://github.com/bitcoin/bitcoin.git"
|
- "url": "https://github.com/bitcoin/bitcoin.git"
|
||||||
"dir": "bitcoin"
|
"dir": "bitcoin"
|
||||||
|
@ -27,7 +36,7 @@ files:
|
||||||
script: |
|
script: |
|
||||||
WRAP_DIR=$HOME/wrapped
|
WRAP_DIR=$HOME/wrapped
|
||||||
HOSTS="x86_64-apple-darwin11"
|
HOSTS="x86_64-apple-darwin11"
|
||||||
CONFIGFLAGS="--enable-reduce-exports GENISOIMAGE=$WRAP_DIR/genisoimage"
|
CONFIGFLAGS="--enable-reduce-exports --disable-bench --disable-gui-tests GENISOIMAGE=$WRAP_DIR/genisoimage"
|
||||||
FAKETIME_HOST_PROGS=""
|
FAKETIME_HOST_PROGS=""
|
||||||
FAKETIME_PROGS="ar ranlib date dmg genisoimage"
|
FAKETIME_PROGS="ar ranlib date dmg genisoimage"
|
||||||
|
|
||||||
|
@ -49,7 +58,7 @@ script: |
|
||||||
for prog in ${FAKETIME_PROGS}; do
|
for prog in ${FAKETIME_PROGS}; do
|
||||||
echo '#!/bin/bash' > ${WRAP_DIR}/${prog}
|
echo '#!/bin/bash' > ${WRAP_DIR}/${prog}
|
||||||
echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog}
|
echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog}
|
||||||
echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog}
|
echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog}
|
||||||
echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${prog}
|
echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${prog}
|
||||||
echo "\$REAL \$@" >> $WRAP_DIR/${prog}
|
echo "\$REAL \$@" >> $WRAP_DIR/${prog}
|
||||||
chmod +x ${WRAP_DIR}/${prog}
|
chmod +x ${WRAP_DIR}/${prog}
|
||||||
|
@ -60,7 +69,7 @@ script: |
|
||||||
for prog in ${FAKETIME_HOST_PROGS}; do
|
for prog in ${FAKETIME_HOST_PROGS}; do
|
||||||
echo '#!/bin/bash' > ${WRAP_DIR}/${i}-${prog}
|
echo '#!/bin/bash' > ${WRAP_DIR}/${i}-${prog}
|
||||||
echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog}
|
echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog}
|
||||||
echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog}
|
echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog}
|
||||||
echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${i}-${prog}
|
echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${i}-${prog}
|
||||||
echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog}
|
echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog}
|
||||||
chmod +x ${WRAP_DIR}/${i}-${prog}
|
chmod +x ${WRAP_DIR}/${i}-${prog}
|
||||||
|
@ -107,8 +116,11 @@ script: |
|
||||||
make ${MAKEOPTS}
|
make ${MAKEOPTS}
|
||||||
make install-strip
|
make install-strip
|
||||||
|
|
||||||
|
make osx_volname
|
||||||
make deploydir
|
make deploydir
|
||||||
|
OSX_VOLNAME="$(cat osx_volname)"
|
||||||
mkdir -p unsigned-app-${i}
|
mkdir -p unsigned-app-${i}
|
||||||
|
cp osx_volname unsigned-app-${i}/
|
||||||
cp contrib/macdeploy/detached-sig-apply.sh unsigned-app-${i}
|
cp contrib/macdeploy/detached-sig-apply.sh unsigned-app-${i}
|
||||||
cp contrib/macdeploy/detached-sig-create.sh unsigned-app-${i}
|
cp contrib/macdeploy/detached-sig-create.sh unsigned-app-${i}
|
||||||
cp ${BASEPREFIX}/${i}/native/bin/dmg ${BASEPREFIX}/${i}/native/bin/genisoimage unsigned-app-${i}
|
cp ${BASEPREFIX}/${i}/native/bin/dmg ${BASEPREFIX}/${i}/native/bin/genisoimage unsigned-app-${i}
|
||||||
|
@ -120,7 +132,7 @@ script: |
|
||||||
popd
|
popd
|
||||||
|
|
||||||
make deploy
|
make deploy
|
||||||
${WRAP_DIR}/dmg dmg Bitcoin-Core.dmg ${OUTDIR}/${DISTNAME}-osx-unsigned.dmg
|
${WRAP_DIR}/dmg dmg "${OSX_VOLNAME}.dmg" ${OUTDIR}/${DISTNAME}-osx-unsigned.dmg
|
||||||
|
|
||||||
cd installed
|
cd installed
|
||||||
find . -name "lib*.la" -delete
|
find . -name "lib*.la" -delete
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
---
|
---
|
||||||
name: "bitcoin-win-signer"
|
name: "bitcoin-win-signer"
|
||||||
suites:
|
suites:
|
||||||
- "precise"
|
- "trusty"
|
||||||
architectures:
|
architectures:
|
||||||
- "amd64"
|
- "amd64"
|
||||||
packages:
|
packages:
|
||||||
- "libssl-dev"
|
- "libssl-dev"
|
||||||
- "autoconf"
|
- "autoconf"
|
||||||
reference_datetime: "2015-06-01 00:00:00"
|
reference_datetime: "2016-01-01 00:00:00"
|
||||||
remotes:
|
remotes:
|
||||||
- "url": "https://github.com/bitcoin/bitcoin-detached-sigs.git"
|
- "url": "https://github.com/bitcoin/bitcoin-detached-sigs.git"
|
||||||
"dir": "signature"
|
"dir": "signature"
|
||||||
|
|
|
@ -1,15 +1,16 @@
|
||||||
---
|
---
|
||||||
name: "bitcoin-win-0.12"
|
name: "bitcoin-win-0.13"
|
||||||
enable_cache: true
|
enable_cache: true
|
||||||
suites:
|
suites:
|
||||||
- "precise"
|
- "trusty"
|
||||||
architectures:
|
architectures:
|
||||||
- "amd64"
|
- "amd64"
|
||||||
packages:
|
packages:
|
||||||
|
- "curl"
|
||||||
- "g++"
|
- "g++"
|
||||||
- "git-core"
|
- "git-core"
|
||||||
- "pkg-config"
|
- "pkg-config"
|
||||||
- "autoconf2.13"
|
- "autoconf"
|
||||||
- "libtool"
|
- "libtool"
|
||||||
- "automake"
|
- "automake"
|
||||||
- "faketime"
|
- "faketime"
|
||||||
|
@ -18,7 +19,9 @@ packages:
|
||||||
- "g++-mingw-w64"
|
- "g++-mingw-w64"
|
||||||
- "nsis"
|
- "nsis"
|
||||||
- "zip"
|
- "zip"
|
||||||
reference_datetime: "2015-06-01 00:00:00"
|
- "ca-certificates"
|
||||||
|
- "python"
|
||||||
|
reference_datetime: "2016-01-01 00:00:00"
|
||||||
remotes:
|
remotes:
|
||||||
- "url": "https://github.com/bitcoin/bitcoin.git"
|
- "url": "https://github.com/bitcoin/bitcoin.git"
|
||||||
"dir": "bitcoin"
|
"dir": "bitcoin"
|
||||||
|
@ -26,7 +29,7 @@ files: []
|
||||||
script: |
|
script: |
|
||||||
WRAP_DIR=$HOME/wrapped
|
WRAP_DIR=$HOME/wrapped
|
||||||
HOSTS="x86_64-w64-mingw32 i686-w64-mingw32"
|
HOSTS="x86_64-w64-mingw32 i686-w64-mingw32"
|
||||||
CONFIGFLAGS="--enable-reduce-exports"
|
CONFIGFLAGS="--enable-reduce-exports --disable-gui-tests"
|
||||||
FAKETIME_HOST_PROGS="g++ ar ranlib nm windres strip"
|
FAKETIME_HOST_PROGS="g++ ar ranlib nm windres strip"
|
||||||
FAKETIME_PROGS="date makensis zip"
|
FAKETIME_PROGS="date makensis zip"
|
||||||
|
|
||||||
|
@ -46,7 +49,7 @@ script: |
|
||||||
for prog in ${FAKETIME_PROGS}; do
|
for prog in ${FAKETIME_PROGS}; do
|
||||||
echo '#!/bin/bash' > ${WRAP_DIR}/${prog}
|
echo '#!/bin/bash' > ${WRAP_DIR}/${prog}
|
||||||
echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog}
|
echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog}
|
||||||
echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog}
|
echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog}
|
||||||
echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${prog}
|
echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${prog}
|
||||||
echo "\$REAL \$@" >> $WRAP_DIR/${prog}
|
echo "\$REAL \$@" >> $WRAP_DIR/${prog}
|
||||||
chmod +x ${WRAP_DIR}/${prog}
|
chmod +x ${WRAP_DIR}/${prog}
|
||||||
|
@ -57,12 +60,36 @@ script: |
|
||||||
for prog in ${FAKETIME_HOST_PROGS}; do
|
for prog in ${FAKETIME_HOST_PROGS}; do
|
||||||
echo '#!/bin/bash' > ${WRAP_DIR}/${i}-${prog}
|
echo '#!/bin/bash' > ${WRAP_DIR}/${i}-${prog}
|
||||||
echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog}
|
echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog}
|
||||||
echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog}
|
echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog}
|
||||||
echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${i}-${prog}
|
echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${i}-${prog}
|
||||||
echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog}
|
echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog}
|
||||||
chmod +x ${WRAP_DIR}/${i}-${prog}
|
chmod +x ${WRAP_DIR}/${i}-${prog}
|
||||||
done
|
done
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# Create per-host linker wrapper
|
||||||
|
# This is only needed for trusty, as the mingw linker leaks a few bytes of
|
||||||
|
# heap, causing non-determinism. See discussion in https://github.com/bitcoin/bitcoin/pull/6900
|
||||||
|
for i in $HOSTS; do
|
||||||
|
mkdir -p ${WRAP_DIR}/${i}
|
||||||
|
for prog in collect2; do
|
||||||
|
echo '#!/bin/bash' > ${WRAP_DIR}/${i}/${prog}
|
||||||
|
REAL=$(${i}-gcc -print-prog-name=${prog})
|
||||||
|
echo "export MALLOC_PERTURB_=255" >> ${WRAP_DIR}/${i}/${prog}
|
||||||
|
echo "${REAL} \$@" >> $WRAP_DIR/${i}/${prog}
|
||||||
|
chmod +x ${WRAP_DIR}/${i}/${prog}
|
||||||
|
done
|
||||||
|
for prog in gcc g++; do
|
||||||
|
echo '#!/bin/bash' > ${WRAP_DIR}/${i}-${prog}
|
||||||
|
echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog}
|
||||||
|
echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog}
|
||||||
|
echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${i}-${prog}
|
||||||
|
echo "export COMPILER_PATH=${WRAP_DIR}/${i}" >> ${WRAP_DIR}/${i}-${prog}
|
||||||
|
echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog}
|
||||||
|
chmod +x ${WRAP_DIR}/${i}-${prog}
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
export PATH=${WRAP_DIR}:${PATH}
|
export PATH=${WRAP_DIR}:${PATH}
|
||||||
|
|
||||||
cd bitcoin
|
cd bitcoin
|
||||||
|
@ -100,6 +127,7 @@ script: |
|
||||||
|
|
||||||
./configure --prefix=${BASEPREFIX}/${i} --bindir=${INSTALLPATH}/bin --includedir=${INSTALLPATH}/include --libdir=${INSTALLPATH}/lib --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS}
|
./configure --prefix=${BASEPREFIX}/${i} --bindir=${INSTALLPATH}/bin --includedir=${INSTALLPATH}/include --libdir=${INSTALLPATH}/lib --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS}
|
||||||
make ${MAKEOPTS}
|
make ${MAKEOPTS}
|
||||||
|
make ${MAKEOPTS} -C src check-security
|
||||||
make deploy
|
make deploy
|
||||||
make install-strip
|
make install-strip
|
||||||
cp -f bitcoin-*setup*.exe $OUTDIR/
|
cp -f bitcoin-*setup*.exe $OUTDIR/
|
||||||
|
|
Binary file not shown.
|
@ -1,45 +0,0 @@
|
||||||
---
|
|
||||||
name: bitcoin
|
|
||||||
urls:
|
|
||||||
- http://bitcoin.org/bitcoin-latest-linux-gitian.zip
|
|
||||||
rss:
|
|
||||||
- url:
|
|
||||||
xpath: //item/link/text()
|
|
||||||
pattern: bitcoin-\d+.\d+.\d+-linux-gitian.zip
|
|
||||||
signers:
|
|
||||||
0A82509767C7D4A5D14DA2301AE1D35043E08E54:
|
|
||||||
name: BlueMatt
|
|
||||||
key: bluematt
|
|
||||||
BF6273FAEF7CC0BA1F562E50989F6B3048A116B5:
|
|
||||||
name: Devrandom
|
|
||||||
key: devrandom
|
|
||||||
E463A93F5F3117EEDE6C7316BD02942421F4889F:
|
|
||||||
name: Luke-Jr
|
|
||||||
key: luke-jr
|
|
||||||
D762373D24904A3E42F33B08B9A408E71DAAC974:
|
|
||||||
name: "Pieter Wuille"
|
|
||||||
key: sipa
|
|
||||||
77E72E69DA7EE0A148C06B21B34821D4944DE5F7:
|
|
||||||
name: tcatm
|
|
||||||
key: tcatm
|
|
||||||
01CDF4627A3B88AAE4A571C87588242FBE38D3A8:
|
|
||||||
name: "Gavin Andresen"
|
|
||||||
key: gavinandresen
|
|
||||||
71A3B16735405025D447E8F274810B012346C9A6:
|
|
||||||
name: "Wladimir J. van der Laan"
|
|
||||||
key: laanwj
|
|
||||||
AEC1884398647C47413C1C3FB1179EB7347DC10D:
|
|
||||||
name: "Warren Togami"
|
|
||||||
key: wtogami
|
|
||||||
9692B91BBF0E8D34DFD33B1882C5C009628ECF0C:
|
|
||||||
name: michagogo
|
|
||||||
key: michagogo
|
|
||||||
E944AE667CF960B1004BC32FCA662BE18B877A60:
|
|
||||||
name: "Andreas Schildbach"
|
|
||||||
key: aschildbach
|
|
||||||
C060A6635913D98A3587D7DB1C2491FFEB0EF770:
|
|
||||||
name: "Cory Fields"
|
|
||||||
key: "cfields"
|
|
||||||
37EC7D7B0A217CDB4B4E007E7FAB114267E4FA04:
|
|
||||||
name: "Peter Todd"
|
|
||||||
key: "petertodd"
|
|
|
@ -1,45 +0,0 @@
|
||||||
---
|
|
||||||
name: bitcoin
|
|
||||||
urls:
|
|
||||||
- http://bitcoin.org/bitcoin-latest-win32-gitian.zip
|
|
||||||
rss:
|
|
||||||
- url:
|
|
||||||
xpath: //item/link/text()
|
|
||||||
pattern: bitcoin-\d+.\d+.\d+-win32-gitian.zip
|
|
||||||
signers:
|
|
||||||
0A82509767C7D4A5D14DA2301AE1D35043E08E54:
|
|
||||||
name: BlueMatt
|
|
||||||
key: bluematt
|
|
||||||
BF6273FAEF7CC0BA1F562E50989F6B3048A116B5:
|
|
||||||
name: Devrandom
|
|
||||||
key: devrandom
|
|
||||||
E463A93F5F3117EEDE6C7316BD02942421F4889F:
|
|
||||||
name: Luke-Jr
|
|
||||||
key: luke-jr
|
|
||||||
D762373D24904A3E42F33B08B9A408E71DAAC974:
|
|
||||||
name: "Pieter Wuille"
|
|
||||||
key: sipa
|
|
||||||
77E72E69DA7EE0A148C06B21B34821D4944DE5F7:
|
|
||||||
name: tcatm
|
|
||||||
key: tcatm
|
|
||||||
01CDF4627A3B88AAE4A571C87588242FBE38D3A8:
|
|
||||||
name: "Gavin Andresen"
|
|
||||||
key: gavinandresen
|
|
||||||
71A3B16735405025D447E8F274810B012346C9A6:
|
|
||||||
name: "Wladimir J. van der Laan"
|
|
||||||
key: laanwj
|
|
||||||
AEC1884398647C47413C1C3FB1179EB7347DC10D:
|
|
||||||
name: "Warren Togami"
|
|
||||||
key: wtogami
|
|
||||||
9692B91BBF0E8D34DFD33B1882C5C009628ECF0C:
|
|
||||||
name: michagogo
|
|
||||||
key: michagogo
|
|
||||||
E944AE667CF960B1004BC32FCA662BE18B877A60:
|
|
||||||
name: "Andreas Schildbach"
|
|
||||||
key: aschildbach
|
|
||||||
C060A6635913D98A3587D7DB1C2491FFEB0EF770:
|
|
||||||
name: "Cory Fields"
|
|
||||||
key: "cfields"
|
|
||||||
37EC7D7B0A217CDB4B4E007E7FAB114267E4FA04:
|
|
||||||
name: "Peter Todd"
|
|
||||||
key: "petertodd"
|
|
52
contrib/gitian-keys/achow101-key.pgp
Normal file
52
contrib/gitian-keys/achow101-key.pgp
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
Version: GnuPG v1
|
||||||
|
|
||||||
|
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
|
||||||
|
Khvd4+XHE/ecjLOPvLweAg==
|
||||||
|
=+hz7
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
105
contrib/gitian-keys/jl2012-key.pgp
Normal file
105
contrib/gitian-keys/jl2012-key.pgp
Normal file
|
@ -0,0 +1,105 @@
|
||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
Comment: GPGTools - https://gpgtools.org
|
||||||
|
|
||||||
|
mQINBFYhRd0BEAC+2VU+8+f9RTPLtl0C815oxaOCA9Tle13xNER8NjFrVwIuFQ64
|
||||||
|
nO8Fbhd5KEEARuMS/lc5G6IV0QxBpDGE1sEjPQXrA6UnX8SDkNGhmoAsV07MP2Xl
|
||||||
|
glN9qqYUEoVD7ueh7Cp3A9rFjg7wcMJCPQDP6lZY4cPgYlE1C31TCrEdAsVVTQg+
|
||||||
|
xIYWnhB92VxOJhk0N0h6xtCQ2MOtYDjYcBndQ5iK7L5jy5LI89YVRfbKtWqWZdwR
|
||||||
|
lgj2JCLeXKauXBI1qbedCJrz5e8nXcdqZt9TXSHo/XhNlqvsLiqBq4aXNU3xRkrv
|
||||||
|
fcweZ9jR9DjyQzefYFGaiCk37R4qLbaqQRm0luUizkCegIuTv44e/zig0im8yPAI
|
||||||
|
WtGnmBPSy4MpvvWiVVb+jHikdQG1T7g9kF6gEmj4kj9UseWnasiq+kkSNE67vLxb
|
||||||
|
uZDfA3QhavRMJbCNEY49/IX6urIsiCLFbe6C7JVWvJ7d5l3MAHE8Sut+ytjX7z7O
|
||||||
|
LFt7YD6loxGAdopEUZm50xs8PswKDajlzWGFXjDZdzQA1tb2CpHUtDkAInYDutR4
|
||||||
|
qA29qtxaBswozzUYiDptGSkBqD1Nus7UAJYkwe2EjeszNPhmIAQXGWx2yWplPOJk
|
||||||
|
ZWDuhQtrDXZikl70q0ekIJ7bxkpMO8xUuhsBCS3Wn6GAtySy0XTttmItfQARAQAB
|
||||||
|
tBZqbDIwMTIgPGpsMjAxMkB4YnQuaGs+iQI3BBMBCgAhBQJWIUXdAhsBBQsJCAcD
|
||||||
|
BRUKCQgLBRYCAwEAAh4BAheAAAoJEMUkKhqzk2UXsbIQAJnXDjhEoKSILJRrKbg+
|
||||||
|
MXP3Rhxc/ThXu5C8yhfYqKblqCaNNfEmrlercJKJVMvjY0tVTXYo8BEJmNN7nSNI
|
||||||
|
su8NheJ9vXacN3XrgkMPuFiUyKj9PGpSsM6Q8MjT0Bzd0pxodk+g0UEjyMktfu/3
|
||||||
|
TqLsnoFPOtIjMOkr/uBzZn5d0AXIZQbAz4Xa2zBW+uR3OSXRRXCRJjCSWGIfDX0Y
|
||||||
|
i/Ea+3Be+y9bMqDa3nPULEkW7+RNuyjLr6QwPZ0/BpTTDcM6Vic2daFPO5B0+o3z
|
||||||
|
PMFmPcEd4nRHTPM9A5SaJtC8MjF/89mjhpxG3v8RqkqCdqdM2cezi/T4YD4jcynE
|
||||||
|
F36Ya3GuuewxEZci/N5ySG5gG8Y+80Wgc1e+sNtvIffHk3Wju2kOvNcBA2TBw36V
|
||||||
|
XCJXHROTA5+Cx4lUxOkQTJoYSVzx852WS6WHeLg1+XnDZvT7ciVIV0ExJQ9C1XOM
|
||||||
|
wjFMRsTWl+vflxmgCeHCIari57Jw3ij7ghRCgeqLp7FIXK5qSI4Tw2eajJpoTKPs
|
||||||
|
wlaO6kvOXtaCDH30FuVhKbPxII01Xi/A2ALtTkpA6mfnf19orQjv+HxX/iwUlpHM
|
||||||
|
UwsuhpZSQYIxIv/BOQnXDfw4TcjnHsqXZbqNzzFEjGurMTlOUX4KeTPscdOLUpnO
|
||||||
|
1FM4JIVybHHfhCH9Mpq+MIwCiQGBBBMBCABrBQJWpym9BYMJZgGAXhSAAAAAABUA
|
||||||
|
QGJsb2NraGFzaEBiaXRjb2luLm9yZzAwMDAwMDAwMDAwMDAwMDAwNWJiZWZkNGM3
|
||||||
|
Mzk5OTE0OGRmZDQ1MjA5ZjA2MTUwMTljMTNjMGVjOWUwYmQ4MzUACgkQf6sRQmfk
|
||||||
|
+gQcZAgApPqnaIIE8Q5sruzua50RFRmmBtQys8sM95ciWYE4QaTXUnlhHl4QR4z/
|
||||||
|
TQTRSBqXpdHQ9HBWrhFb6E0ykDEVx9zdEt0fvtlhHx1ItrZetfiA4PwidnyoDKs/
|
||||||
|
/nt01RGreKSMDGInaQVEQxvEW+A0fwvcCdE8Mh3LcIydohfqUViB0c5zb7rUmize
|
||||||
|
+2Kt4Uth9T+ooo+UE87pHSJcxlcPOv6Dc7KeoUicD8DwWdsT7oxAMk9jj/ut4UNx
|
||||||
|
xOEp9Sa3sFN20tHMqyOZwnl22Py0y4ayJnceawpuka/bx7samg/2uUrO+dNKXObN
|
||||||
|
trebP83+8UFHOo7VGhesuawgwNjWW7kBjQRWIUbHAQwAy6re/3ur/fgNfE9yKivp
|
||||||
|
Bqmjq0eU5l3iT59hvKr7S+6GHUa+YvE9BBsawDSI4UILNQX0YGT1LRa20mC1okBX
|
||||||
|
5SIEpWzoZhybTMVMwS2ZHkUyO6VBAieUVojP3XQHFcDAiBvW7RRhJ2BU+v9DGo88
|
||||||
|
HAYqKEB85P/i/E/a1xUfTWiiIhA8Dd/Hv6pzIG5QvN8XfrMIayLwpOV1G6KvBIJb
|
||||||
|
zyUVUvLyQySiZOyDczrAxzYq7b1qv8xwHDUzyUl6skPqbex1cFWIeiML9EY4DnZ9
|
||||||
|
l3qb31Bhp+EHydv0esclM5XKQriSg/hsnJOLlCS45z/YhqGOCoD8QxXUJ71NhD/H
|
||||||
|
QR/AvGyTDcPr1/U1DJ0lG778wCOEe1Nad0G/8rcpHSY66RZR/Wf318S7uJt0mUw2
|
||||||
|
JMt1BRxfbdgJaleUAqYjNQAMDb8LfPO6jhQnmf0nN99dpdzkwV/drVRcLDEnupDr
|
||||||
|
keBsokcuohzE0gbjUT4cNc0DuUsIELMTApG8KQCgzJy/ABEBAAGJA8QEGAEKAA8C
|
||||||
|
GwIFAlbi67wFCQGu8u4BqcDdIAQZAQoABgUCViFGxwAKCRDunlUgNL4k0qceC/91
|
||||||
|
2ocEDwiu9kpBGCW0HD+VSyMVjLWMiClk+jPngvNEt63ZkYqRiy7fwnPuJrLFlaL0
|
||||||
|
E0JLIweihC5AyPSJT1Q0LnOwbqCHn1s+9RfIodG/v6M48Ez4GffOtmYwW9KqogK7
|
||||||
|
4FwdIx/wOIYDeh4rT7LRaWBNcIXO8J1+v/83u+Vx6TWKZTiZKQMEV8VOJWfSmTCE
|
||||||
|
6HVgUYvLCPB6DI+X4aVead1kayKOSuXlG/l94B5RHlJB/xQXZd1INyrZetTZxYzZ
|
||||||
|
CBhIWaZ/ji5vqFot0xVNYplRkbg1Mc96X+hwee8eiB/ySSWxUV/DDkA5ZzuE8n8R
|
||||||
|
EEjzqazjMNe50P7XKVg/eBE+TpgCDlqv69dqnOF326m6T3+FH/LDOHguQfB7pQKx
|
||||||
|
siviqjO3molBSyMHL39XFWyteVbgbbSaTRkpX//b7dQoFMiVhigcM78qoymBi6yX
|
||||||
|
qwpN13JoNuNJhEOwex5eEEUCVibFReUkBrYoGnWbwuOxiLORx/IbuNYOvsTGYEAJ
|
||||||
|
EMUkKhqzk2UXWScQAIvAgEpQpzuE1CWMBWcM/n4ruUrOVTeo6dYpUGN1LI0758xm
|
||||||
|
4VI47I8wPEy4pAbdPcqoaNnMcA/NpSYa3hV0svQDLqT96qKTrN71N1gNJa+5w+KN
|
||||||
|
rwev8MRpjuze9b4dn3avs4L9f0fkpzjSzezKwVb7loFSZqgKAaI0aSoOUTec9+OU
|
||||||
|
5ymgkYPEEF12ydkyMzLwyKrtEnIqgwQpjYTN/3P1x7Gkhv+E8Lz06TSga84yVy5I
|
||||||
|
5gO1Hklc3MW0J9jPJe3uALUtEh49KxCE2rdbIX7YbkxWaHHfK98Mu998IXr/4eUe
|
||||||
|
Zhf2CLC2cuuYbk1/rOcxPmeIJKa6S5PlWOf3Y2yLRO0VKcjD5pcGxiImoDVXC4VM
|
||||||
|
hztCVLddjU70c1ktSIBQBu9gkpPcECrzjYtpeAavOUgmpP/zQ8X2NGp6+5n9Wwii
|
||||||
|
tAgByNCg0s+PqcAZxup34b3ZY/t475tDlAmIOovH14Aa8g+0Ketj++9rPpmg9kGs
|
||||||
|
sGmn4mVItClaA7L9vZQQFnSxjyfICKsSxBhqded0lsinlzBfXDEh3N6fEXh81/Gg
|
||||||
|
zLUmTlkhcGaFXplYqrUIlkdO9PD4R2h5P6laLhK2dAf7oKavWHZQp02Yb5nVBiDc
|
||||||
|
KiVWKBP4nuTkWZCG5R966wpR1IOQQ3LykSd5SstcZX6iTpv4NZpCxI4CXpaCuQGN
|
||||||
|
BFYhSHABDADHaEJVygBdwU81c4YynyTOnWTZX+BR3EvRW51GcnfvjqkqgmlWNLET
|
||||||
|
JkswQ8+s0mjKGVnz4dkdr4cUbVegj/St7wzoO+m5mYIDMJf1j83Vo6lTo9FJFzbc
|
||||||
|
HrYC9RS7NkQmD7qzJz4KY/h0n5szFIC/JpYECBNzYrJQc8m2kZiSlyUQJve5/I5J
|
||||||
|
iI6QnM0x4kixNe32GITmKw9s3E2iRf6yXVlsrPouNS33lPXKtvmO1ae7R+G8Ve+D
|
||||||
|
JDv+TLxccy2iU9wuz4I3k20+rlmEwk17feDhfleh5Q+qjI4vkaNcXFa5coZE0HyW
|
||||||
|
SwAtLPSOv2vWkuFeYncXRyzg/CvKR57i9wnqMzNTMt3bHY2HezE13bHln5B/Jqr4
|
||||||
|
ihhFQBqPG+UZlGYRfAI60PLh2yftX5xkm/POiLgEKF76/yIZI8wcPzzurAhFaZBp
|
||||||
|
8/MUv2ZJ/OUT4rdEVV+6XnrijNqVBU8mf8BML5CvjyhsU69yf1mvpiLQr34FNEcn
|
||||||
|
JekDGPIk97cAEQEAAYkCJQQYAQoADwIbDAUCVuLr0AUJAa7xWwAKCRDFJCoas5Nl
|
||||||
|
F8NMD/4hRoOKENEq940Z0iJg0TDvRvRnaIYsbneRQ3yg1DGVIQ+4RHmzQdpN9MW0
|
||||||
|
5RTRLqJsW25ydWwh7y0O/oBRjaoDRAkMSIyOo/Fy+E9WWBmAwzeYCi91MyfetKIO
|
||||||
|
ocrXxpXXKnotAFDOgWGF8K+LlTDH/biOrd8ftgOVJWhz3X04ma7xvT2tQTqfFdbt
|
||||||
|
EivA+jFExq3No0Iq+Ctt/e0H2d9np62SeKBVdpbx9xAc2tPKKDSl+FyB7lj5CK5/
|
||||||
|
FKhotl2bJhVXET48P6e+bFVwfRO7o48zuK5CJVbbdjhavQGhQoxfedW2dn9y7QoM
|
||||||
|
qayUuVIhULE/k+y3jsJBUT7p567nSdUGbc3uKt1sfPKYTdsFbHiTRltXmsIiv4bG
|
||||||
|
PslbXSvOQblFOXWrAE22CdKmGzhlEiFnbviZCCl0BFf4CwEVBJ3p9Lcoir1l9Aty
|
||||||
|
HIIFI3z1mmTz4F9BMbe6saNwBzO+Kh4+US5NV/hqvyz0aOLltb6KfI8WF8kOa1Cx
|
||||||
|
Djz/DTHnvMWO/dIOJuKsThfuxZZq3R1w3O36RB8XzDT/8NV86gfQwN07NWz1rdy4
|
||||||
|
60fK36EjOJDqm/434/BDzWh8TqmnSamENxBTbICmWOj/25M26tA2S9zcPLJHTGMA
|
||||||
|
3yL3QlBtjWY2uNqr51cnZHgPKxBWzaRvcrZ+lUq5EG+F4J7q5rkBjQRWIUitAQwA
|
||||||
|
5A2AhW9DFxVsM105WEErD2NuM2rvtq7dTwArBEi2KdWkSGQvCE9xgyH8u5AEWxj8
|
||||||
|
XXHE/rfunW0d9oF7Z9FbOuV+1HQOAj5hQQWLWHERwZ4gOAqG8ZKAbuwTlqitdiXE
|
||||||
|
PZiJYZSq0NXtngyeTx7XqzQSatfFOIQLzIiwPQXX0Tt+JB3B2SN/D2NP7rubzfS2
|
||||||
|
Bg0ErhV20fPDl8YloEJFfj9lpF0ZJnJ5hXYP9Fl4MoPkyBkGPrJPooZ4FqUFHDiw
|
||||||
|
mttzP1BzFlwpAPGpI0NrkBdBlfFAtvhjreeB5Z4VYwt1xqoXgI+jYXAxoMl+rtkK
|
||||||
|
FdWaoT7wHwqDBeBWYXoyXA2dYIY8Ux1jeDBnREck7vaXhln6zXqMAQowE+F9OQnr
|
||||||
|
Wgf/LoOn5MYxsBDY9mPAO8urxUDE+Dq43JBXlS+jybMNZWdtkaBrIde7dw9IT8Fn
|
||||||
|
p8pG78DmgPxmRFH9QoypTqMfB+x7ZuB0fk1ud4ut33qLo78BWZoW0H++13CbSmrZ
|
||||||
|
ABEBAAGJAiUEGAEKAA8CGyAFAlbi690FCQGu8SoACgkQxSQqGrOTZRcNQBAAmeL1
|
||||||
|
8Wr7vuvL5dySoYmWqHFvM8gRUwIGza5c3D29NYZJcPJRRkdGCV2IXEuUSOLtnjAN
|
||||||
|
kTM1TVMMnetqNR8Uryr7z3XjqYLnVwGqOPnFnlkE2zS3pG8AGG6OxxBhuEMvkwcd
|
||||||
|
1s3tWUlJYRWi1XhEjVZ5Km2pHsVxvoXeJCUVsa8nSXzqF8gOLm409NFMiKkp8QOG
|
||||||
|
heEV4yWrHkySi1fVfOdrHfBzu2lUmHGgSbmJIpLcK+cL3TjpJ+DkSNbniI13I/Eb
|
||||||
|
PO4Uai4a3QYz6sspZ7UzF/pjY5v6WpWXiVB5PP2Y5BrMUgWRlFxPYTc3KiIHUYVi
|
||||||
|
IjVtSOsVaRCHL/SYRq/qHs63XxlxKIhhilbR4OO+CvJ6N/vEpSbx69SqlxgDArZy
|
||||||
|
g3QQqerlLGpSFim9iWk3QBGWtQ96Ek6rjLLOn7b34I6bxXtfcOEo7gl0Y1TFkfOp
|
||||||
|
nsXAcRLrrXCpAhgC/vIQRTMKEcC18kj/vY144DwefzYCBhbI/rCSohAq8a/zhq2T
|
||||||
|
E+xlCYy931HWlUAGx/hms/0q+KQ712Zgk4XxXEx4RZiv3zl9Uph6c7SXxAMb8o2v
|
||||||
|
PzAxd3ShNOnng9hAl8zk5O1RZPa5u51ppkO1FsJ9zjb2Kvdg4ZEBtK8jETv9ckuq
|
||||||
|
yj9YmZZSRRQ2dujg81sLQ9CrO7WB3IGpwh+4lHQ=
|
||||||
|
=1irw
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
110
contrib/gitian-keys/jonasschnelli-key.pgp
Normal file
110
contrib/gitian-keys/jonasschnelli-key.pgp
Normal file
|
@ -0,0 +1,110 @@
|
||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
Version: GnuPG v1
|
||||||
|
|
||||||
|
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
|
||||||
|
S5rowLE=
|
||||||
|
=ZVPf
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
69
contrib/gitian-keys/marcofalke-key.pgp
Normal file
69
contrib/gitian-keys/marcofalke-key.pgp
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||||
|
Version: GnuPG v1
|
||||||
|
|
||||||
|
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
|
||||||
|
=GC3s
|
||||||
|
-----END PGP PUBLIC KEY BLOCK-----
|
Binary file not shown.
|
@ -5,6 +5,7 @@ Upstart: bitcoind.conf
|
||||||
OpenRC: bitcoind.openrc
|
OpenRC: bitcoind.openrc
|
||||||
bitcoind.openrcconf
|
bitcoind.openrcconf
|
||||||
CentOS: bitcoind.init
|
CentOS: bitcoind.init
|
||||||
|
OS X: org.bitcoin.bitcoind.plist
|
||||||
|
|
||||||
have been made available to assist packagers in creating node packages here.
|
have been made available to assist packagers in creating node packages here.
|
||||||
|
|
||||||
|
|
15
contrib/init/org.bitcoin.bitcoind.plist
Normal file
15
contrib/init/org.bitcoin.bitcoind.plist
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>Label</key>
|
||||||
|
<string>org.bitcoin.bitcoind</string>
|
||||||
|
<key>ProgramArguments</key>
|
||||||
|
<array>
|
||||||
|
<string>/usr/local/bin/bitcoind</string>
|
||||||
|
<string>-daemon</string>
|
||||||
|
</array>
|
||||||
|
<key>RunAtLoad</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
|
@ -1 +0,0 @@
|
||||||
{ CFBundleDisplayName = "Bitcoin Core"; CFBundleName = "Bitcoin Core"; }
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
34
contrib/macdeploy/background.svg
Normal file
34
contrib/macdeploy/background.svg
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
<?xml version="1.0" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
|
||||||
|
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||||
|
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="1000pt" height="640pt" viewBox="0 0 1000 640" preserveAspectRatio="xMidYMid meet">
|
||||||
|
<!-- kate: space-indent off;
|
||||||
|
Copyright (c) 2015 The Bitcoin Core developers
|
||||||
|
Distributed under the MIT software license, see the accompanying
|
||||||
|
file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
-->
|
||||||
|
<style type="text/css"><![CDATA[
|
||||||
|
text {
|
||||||
|
font-family: "Tuffy";
|
||||||
|
font-size: 86px;
|
||||||
|
fill: gray;
|
||||||
|
text-anchor: middle;
|
||||||
|
}
|
||||||
|
]]></style>
|
||||||
|
<defs>
|
||||||
|
<linearGradient id="gradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
||||||
|
<stop offset="0%" style="stop-color:rgb(239,239,239);stop-opacity:1" />
|
||||||
|
<stop offset="33%" style="stop-color:rgb(239,239,239);stop-opacity:1" />
|
||||||
|
<stop offset="80%" style="stop-color:rgb(205,205,205);stop-opacity:1" />
|
||||||
|
<stop offset="100%" style="stop-color:rgb(204,204,204);stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<rect width="1000" height="640" style="fill:url(#gradient);stroke-width:0" />
|
||||||
|
<g transform="translate(500,0) scale(0.9, 1)">
|
||||||
|
<text x="0" y="114">PACKAGE_NAME</text>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(0.000000,640.000000) scale(0.100000,-0.100000)"
|
||||||
|
fill="#000000" stroke="none">
|
||||||
|
<path d="M4995 3705 c-24 -23 -25 -29 -25 -165 l0 -140 -306 0 -306 0 -29 -29 c-29 -29 -29 -31 -29 -141 0 -110 0 -112 29 -141 l29 -29 306 0 306 0 0 -140 c0 -136 1 -142 25 -165 16 -17 35 -25 57 -25 29 0 72 32 306 226 180 149 274 233 278 250 13 53 -2 70 -278 299 -235 194 -277 225 -306 225 -22 0 -41 -8 -57 -25z" fixlter="url(#glow)"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Binary file not shown.
Binary file not shown.
60
contrib/macdeploy/custom_dsstore.py
Executable file
60
contrib/macdeploy/custom_dsstore.py
Executable file
|
@ -0,0 +1,60 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# Copyright (c) 2013-2015 The Bitcoin Core developers
|
||||||
|
# Distributed under the MIT software license, see the accompanying
|
||||||
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
from __future__ import division,print_function,unicode_literals
|
||||||
|
import biplist
|
||||||
|
from ds_store import DSStore
|
||||||
|
from mac_alias import Alias
|
||||||
|
import sys
|
||||||
|
|
||||||
|
output_file = sys.argv[1]
|
||||||
|
package_name_ns = sys.argv[2]
|
||||||
|
|
||||||
|
ds = DSStore.open(output_file, 'w+')
|
||||||
|
ds['.']['bwsp'] = {
|
||||||
|
'ShowStatusBar': False,
|
||||||
|
'WindowBounds': b'{{300, 280}, {500, 343}}',
|
||||||
|
'ContainerShowSidebar': False,
|
||||||
|
'SidebarWidth': 0,
|
||||||
|
'ShowTabView': False,
|
||||||
|
'PreviewPaneVisibility': False,
|
||||||
|
'ShowToolbar': False,
|
||||||
|
'ShowSidebar': False,
|
||||||
|
'ShowPathbar': True
|
||||||
|
}
|
||||||
|
|
||||||
|
icvp = {
|
||||||
|
'gridOffsetX': 0.0,
|
||||||
|
'textSize': 12.0,
|
||||||
|
'viewOptionsVersion': 1,
|
||||||
|
'backgroundImageAlias': b'\x00\x00\x00\x00\x02\x1e\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd1\x94\\\xb0H+\x00\x05\x00\x00\x00\x98\x0fbackground.tiff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\xd19\xb0\xf8\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\x00\x00\r\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0b.background\x00\x00\x10\x00\x08\x00\x00\xd1\x94\\\xb0\x00\x00\x00\x11\x00\x08\x00\x00\xd19\xb0\xf8\x00\x00\x00\x01\x00\x04\x00\x00\x00\x98\x00\x0e\x00 \x00\x0f\x00b\x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\x00d\x00.\x00t\x00i\x00f\x00f\x00\x0f\x00\x02\x00\x00\x00\x12\x00\x1c/.background/background.tiff\x00\x14\x01\x06\x00\x00\x00\x00\x01\x06\x00\x02\x00\x00\x0cMacintosh HD\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xce\x97\xab\xc3H+\x00\x00\x01\x88[\x88\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02u\xab\x8d\xd1\x94\\\xb0devrddsk\xff\xff\xff\xff\x00\x00\t \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x07bitcoin\x00\x00\x10\x00\x08\x00\x00\xce\x97\xab\xc3\x00\x00\x00\x11\x00\x08\x00\x00\xd1\x94\\\xb0\x00\x00\x00\x01\x00\x14\x01\x88[\x88\x00\x16\xa9\t\x00\x08\xfaR\x00\x08\xfaQ\x00\x02d\x8e\x00\x0e\x00\x02\x00\x00\x00\x0f\x00\x1a\x00\x0c\x00M\x00a\x00c\x00i\x00n\x00t\x00o\x00s\x00h\x00 \x00H\x00D\x00\x13\x00\x01/\x00\x00\x15\x00\x02\x00\x14\xff\xff\x00\x00\xff\xff\x00\x00',
|
||||||
|
'backgroundColorBlue': 1.0,
|
||||||
|
'iconSize': 96.0,
|
||||||
|
'backgroundColorGreen': 1.0,
|
||||||
|
'arrangeBy': 'none',
|
||||||
|
'showIconPreview': True,
|
||||||
|
'gridSpacing': 100.0,
|
||||||
|
'gridOffsetY': 0.0,
|
||||||
|
'showItemInfo': False,
|
||||||
|
'labelOnBottom': True,
|
||||||
|
'backgroundType': 2,
|
||||||
|
'backgroundColorRed': 1.0
|
||||||
|
}
|
||||||
|
alias = Alias.from_bytes(icvp['backgroundImageAlias'])
|
||||||
|
alias.volume.name = package_name_ns
|
||||||
|
alias.volume.posix_path = '/Volumes/' + package_name_ns
|
||||||
|
alias.volume.disk_image_alias.target.filename = package_name_ns + '.temp.dmg'
|
||||||
|
alias.volume.disk_image_alias.target.carbon_path = 'Macintosh HD:Users:\x00bitcoinuser:\x00Documents:\x00bitcoin:\x00bitcoin:\x00' + package_name_ns + '.temp.dmg'
|
||||||
|
alias.volume.disk_image_alias.target.posix_path = 'Users/bitcoinuser/Documents/bitcoin/bitcoin/' + package_name_ns + '.temp.dmg'
|
||||||
|
alias.target.carbon_path = package_name_ns + ':.background:\x00background.tiff'
|
||||||
|
icvp['backgroundImageAlias'] = biplist.Data(alias.to_bytes())
|
||||||
|
ds['.']['icvp'] = icvp
|
||||||
|
|
||||||
|
ds['.']['vSrn'] = ('long', 1)
|
||||||
|
|
||||||
|
ds['Applications']['Iloc'] = (370, 156)
|
||||||
|
ds['Bitcoin-Qt.app']['Iloc'] = (128, 156)
|
||||||
|
|
||||||
|
ds.flush()
|
||||||
|
ds.close()
|
|
@ -1,5 +1,5 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
from __future__ import division, print_function, unicode_literals
|
||||||
#
|
#
|
||||||
# Copyright (C) 2011 Patrick "p2k" Schneider <me@p2k-network.org>
|
# Copyright (C) 2011 Patrick "p2k" Schneider <me@p2k-network.org>
|
||||||
#
|
#
|
||||||
|
@ -201,7 +201,7 @@ class DeploymentInfo(object):
|
||||||
|
|
||||||
def getFrameworks(binaryPath, verbose):
|
def getFrameworks(binaryPath, verbose):
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print "Inspecting with otool: " + binaryPath
|
print("Inspecting with otool: " + binaryPath)
|
||||||
otoolbin=os.getenv("OTOOL", "otool")
|
otoolbin=os.getenv("OTOOL", "otool")
|
||||||
otool = subprocess.Popen([otoolbin, "-L", binaryPath], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
otool = subprocess.Popen([otoolbin, "-L", binaryPath], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
o_stdout, o_stderr = otool.communicate()
|
o_stdout, o_stderr = otool.communicate()
|
||||||
|
@ -222,8 +222,8 @@ def getFrameworks(binaryPath, verbose):
|
||||||
info = FrameworkInfo.fromOtoolLibraryLine(line.strip())
|
info = FrameworkInfo.fromOtoolLibraryLine(line.strip())
|
||||||
if info is not None:
|
if info is not None:
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print "Found framework:"
|
print("Found framework:")
|
||||||
print info
|
print(info)
|
||||||
libraries.append(info)
|
libraries.append(info)
|
||||||
|
|
||||||
return libraries
|
return libraries
|
||||||
|
@ -234,24 +234,24 @@ def runInstallNameTool(action, *args):
|
||||||
|
|
||||||
def changeInstallName(oldName, newName, binaryPath, verbose):
|
def changeInstallName(oldName, newName, binaryPath, verbose):
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print "Using install_name_tool:"
|
print("Using install_name_tool:")
|
||||||
print " in", binaryPath
|
print(" in", binaryPath)
|
||||||
print " change reference", oldName
|
print(" change reference", oldName)
|
||||||
print " to", newName
|
print(" to", newName)
|
||||||
runInstallNameTool("change", oldName, newName, binaryPath)
|
runInstallNameTool("change", oldName, newName, binaryPath)
|
||||||
|
|
||||||
def changeIdentification(id, binaryPath, verbose):
|
def changeIdentification(id, binaryPath, verbose):
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print "Using install_name_tool:"
|
print("Using install_name_tool:")
|
||||||
print " change identification in", binaryPath
|
print(" change identification in", binaryPath)
|
||||||
print " to", id
|
print(" to", id)
|
||||||
runInstallNameTool("id", id, binaryPath)
|
runInstallNameTool("id", id, binaryPath)
|
||||||
|
|
||||||
def runStrip(binaryPath, verbose):
|
def runStrip(binaryPath, verbose):
|
||||||
stripbin=os.getenv("STRIP", "strip")
|
stripbin=os.getenv("STRIP", "strip")
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print "Using strip:"
|
print("Using strip:")
|
||||||
print " stripped", binaryPath
|
print(" stripped", binaryPath)
|
||||||
subprocess.check_call([stripbin, "-x", binaryPath])
|
subprocess.check_call([stripbin, "-x", binaryPath])
|
||||||
|
|
||||||
def copyFramework(framework, path, verbose):
|
def copyFramework(framework, path, verbose):
|
||||||
|
@ -274,8 +274,8 @@ def copyFramework(framework, path, verbose):
|
||||||
|
|
||||||
shutil.copy2(fromPath, toPath)
|
shutil.copy2(fromPath, toPath)
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print "Copied:", fromPath
|
print("Copied:", fromPath)
|
||||||
print " to:", toPath
|
print(" to:", toPath)
|
||||||
|
|
||||||
permissions = os.stat(toPath)
|
permissions = os.stat(toPath)
|
||||||
if not permissions.st_mode & stat.S_IWRITE:
|
if not permissions.st_mode & stat.S_IWRITE:
|
||||||
|
@ -288,14 +288,14 @@ def copyFramework(framework, path, verbose):
|
||||||
if not os.path.exists(linkfrom):
|
if not os.path.exists(linkfrom):
|
||||||
os.symlink(linkto, linkfrom)
|
os.symlink(linkto, linkfrom)
|
||||||
if verbose >= 2:
|
if verbose >= 2:
|
||||||
print "Linked:", linkfrom, "->", linkto
|
print("Linked:", linkfrom, "->", linkto)
|
||||||
fromResourcesDir = framework.sourceResourcesDirectory
|
fromResourcesDir = framework.sourceResourcesDirectory
|
||||||
if os.path.exists(fromResourcesDir):
|
if os.path.exists(fromResourcesDir):
|
||||||
toResourcesDir = os.path.join(path, framework.destinationResourcesDirectory)
|
toResourcesDir = os.path.join(path, framework.destinationResourcesDirectory)
|
||||||
shutil.copytree(fromResourcesDir, toResourcesDir, symlinks=True)
|
shutil.copytree(fromResourcesDir, toResourcesDir, symlinks=True)
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print "Copied resources:", fromResourcesDir
|
print("Copied resources:", fromResourcesDir)
|
||||||
print " to:", toResourcesDir
|
print(" to:", toResourcesDir)
|
||||||
fromContentsDir = framework.sourceVersionContentsDirectory
|
fromContentsDir = framework.sourceVersionContentsDirectory
|
||||||
if not os.path.exists(fromContentsDir):
|
if not os.path.exists(fromContentsDir):
|
||||||
fromContentsDir = framework.sourceContentsDirectory
|
fromContentsDir = framework.sourceContentsDirectory
|
||||||
|
@ -304,16 +304,16 @@ def copyFramework(framework, path, verbose):
|
||||||
shutil.copytree(fromContentsDir, toContentsDir, symlinks=True)
|
shutil.copytree(fromContentsDir, toContentsDir, symlinks=True)
|
||||||
contentslinkfrom = os.path.join(path, framework.destinationContentsDirectory)
|
contentslinkfrom = os.path.join(path, framework.destinationContentsDirectory)
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print "Copied Contents:", fromContentsDir
|
print("Copied Contents:", fromContentsDir)
|
||||||
print " to:", toContentsDir
|
print(" to:", toContentsDir)
|
||||||
elif framework.frameworkName.startswith("libQtGui"): # Copy qt_menu.nib (applies to non-framework layout)
|
elif framework.frameworkName.startswith("libQtGui"): # Copy qt_menu.nib (applies to non-framework layout)
|
||||||
qtMenuNibSourcePath = os.path.join(framework.frameworkDirectory, "Resources", "qt_menu.nib")
|
qtMenuNibSourcePath = os.path.join(framework.frameworkDirectory, "Resources", "qt_menu.nib")
|
||||||
qtMenuNibDestinationPath = os.path.join(path, "Contents", "Resources", "qt_menu.nib")
|
qtMenuNibDestinationPath = os.path.join(path, "Contents", "Resources", "qt_menu.nib")
|
||||||
if os.path.exists(qtMenuNibSourcePath) and not os.path.exists(qtMenuNibDestinationPath):
|
if os.path.exists(qtMenuNibSourcePath) and not os.path.exists(qtMenuNibDestinationPath):
|
||||||
shutil.copytree(qtMenuNibSourcePath, qtMenuNibDestinationPath, symlinks=True)
|
shutil.copytree(qtMenuNibSourcePath, qtMenuNibDestinationPath, symlinks=True)
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print "Copied for libQtGui:", qtMenuNibSourcePath
|
print("Copied for libQtGui:", qtMenuNibSourcePath)
|
||||||
print " to:", qtMenuNibDestinationPath
|
print(" to:", qtMenuNibDestinationPath)
|
||||||
|
|
||||||
return toPath
|
return toPath
|
||||||
|
|
||||||
|
@ -326,7 +326,7 @@ def deployFrameworks(frameworks, bundlePath, binaryPath, strip, verbose, deploym
|
||||||
deploymentInfo.deployedFrameworks.append(framework.frameworkName)
|
deploymentInfo.deployedFrameworks.append(framework.frameworkName)
|
||||||
|
|
||||||
if verbose >= 2:
|
if verbose >= 2:
|
||||||
print "Processing", framework.frameworkName, "..."
|
print("Processing", framework.frameworkName, "...")
|
||||||
|
|
||||||
# Get the Qt path from one of the Qt frameworks
|
# Get the Qt path from one of the Qt frameworks
|
||||||
if deploymentInfo.qtPath is None and framework.isQtFramework():
|
if deploymentInfo.qtPath is None and framework.isQtFramework():
|
||||||
|
@ -334,7 +334,7 @@ def deployFrameworks(frameworks, bundlePath, binaryPath, strip, verbose, deploym
|
||||||
|
|
||||||
if framework.installName.startswith("@executable_path") or framework.installName.startswith(bundlePath):
|
if framework.installName.startswith("@executable_path") or framework.installName.startswith(bundlePath):
|
||||||
if verbose >= 2:
|
if verbose >= 2:
|
||||||
print framework.frameworkName, "already deployed, skipping."
|
print(framework.frameworkName, "already deployed, skipping.")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# install_name_tool the new id into the binary
|
# install_name_tool the new id into the binary
|
||||||
|
@ -366,7 +366,7 @@ def deployFrameworks(frameworks, bundlePath, binaryPath, strip, verbose, deploym
|
||||||
def deployFrameworksForAppBundle(applicationBundle, strip, verbose):
|
def deployFrameworksForAppBundle(applicationBundle, strip, verbose):
|
||||||
frameworks = getFrameworks(applicationBundle.binaryPath, verbose)
|
frameworks = getFrameworks(applicationBundle.binaryPath, verbose)
|
||||||
if len(frameworks) == 0 and verbose >= 1:
|
if len(frameworks) == 0 and verbose >= 1:
|
||||||
print "Warning: Could not find any external frameworks to deploy in %s." % (applicationBundle.path)
|
print("Warning: Could not find any external frameworks to deploy in %s." % (applicationBundle.path))
|
||||||
return DeploymentInfo()
|
return DeploymentInfo()
|
||||||
else:
|
else:
|
||||||
return deployFrameworks(frameworks, applicationBundle.path, applicationBundle.binaryPath, strip, verbose)
|
return deployFrameworks(frameworks, applicationBundle.path, applicationBundle.binaryPath, strip, verbose)
|
||||||
|
@ -444,7 +444,7 @@ def deployPlugins(appBundleInfo, deploymentInfo, strip, verbose):
|
||||||
|
|
||||||
for pluginDirectory, pluginName in plugins:
|
for pluginDirectory, pluginName in plugins:
|
||||||
if verbose >= 2:
|
if verbose >= 2:
|
||||||
print "Processing plugin", os.path.join(pluginDirectory, pluginName), "..."
|
print("Processing plugin", os.path.join(pluginDirectory, pluginName), "...")
|
||||||
|
|
||||||
sourcePath = os.path.join(deploymentInfo.pluginPath, pluginDirectory, pluginName)
|
sourcePath = os.path.join(deploymentInfo.pluginPath, pluginDirectory, pluginName)
|
||||||
destinationDirectory = os.path.join(appBundleInfo.pluginPath, pluginDirectory)
|
destinationDirectory = os.path.join(appBundleInfo.pluginPath, pluginDirectory)
|
||||||
|
@ -454,8 +454,8 @@ def deployPlugins(appBundleInfo, deploymentInfo, strip, verbose):
|
||||||
destinationPath = os.path.join(destinationDirectory, pluginName)
|
destinationPath = os.path.join(destinationDirectory, pluginName)
|
||||||
shutil.copy2(sourcePath, destinationPath)
|
shutil.copy2(sourcePath, destinationPath)
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print "Copied:", sourcePath
|
print("Copied:", sourcePath)
|
||||||
print " to:", destinationPath
|
print(" to:", destinationPath)
|
||||||
|
|
||||||
if strip:
|
if strip:
|
||||||
runStrip(destinationPath, verbose)
|
runStrip(destinationPath, verbose)
|
||||||
|
@ -495,6 +495,7 @@ ap.add_argument("-fancy", nargs=1, metavar="plist", default=[], help="make a fan
|
||||||
ap.add_argument("-add-qt-tr", nargs=1, metavar="languages", default=[], help="add Qt translation files to the bundle's ressources; the language list must be separated with commas, not with whitespace")
|
ap.add_argument("-add-qt-tr", nargs=1, metavar="languages", default=[], help="add Qt translation files to the bundle's ressources; the language list must be separated with commas, not with whitespace")
|
||||||
ap.add_argument("-translations-dir", nargs=1, metavar="path", default=None, help="Path to Qt's translation files")
|
ap.add_argument("-translations-dir", nargs=1, metavar="path", default=None, help="Path to Qt's translation files")
|
||||||
ap.add_argument("-add-resources", nargs="+", metavar="path", default=[], help="list of additional files or folders to be copied into the bundle's resources; must be the last argument")
|
ap.add_argument("-add-resources", nargs="+", metavar="path", default=[], help="list of additional files or folders to be copied into the bundle's resources; must be the last argument")
|
||||||
|
ap.add_argument("-volname", nargs=1, metavar="volname", default=[], help="custom volume name for dmg")
|
||||||
|
|
||||||
config = ap.parse_args()
|
config = ap.parse_args()
|
||||||
|
|
||||||
|
@ -524,7 +525,7 @@ if config.translations_dir and config.translations_dir[0]:
|
||||||
|
|
||||||
for p in config.add_resources:
|
for p in config.add_resources:
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print "Checking for \"%s\"..." % p
|
print("Checking for \"%s\"..." % p)
|
||||||
if not os.path.exists(p):
|
if not os.path.exists(p):
|
||||||
if verbose >= 1:
|
if verbose >= 1:
|
||||||
sys.stderr.write("Error: Could not find additional resource file \"%s\"\n" % (p))
|
sys.stderr.write("Error: Could not find additional resource file \"%s\"\n" % (p))
|
||||||
|
@ -534,7 +535,7 @@ for p in config.add_resources:
|
||||||
|
|
||||||
if len(config.fancy) == 1:
|
if len(config.fancy) == 1:
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print "Fancy: Importing plistlib..."
|
print("Fancy: Importing plistlib...")
|
||||||
try:
|
try:
|
||||||
import plistlib
|
import plistlib
|
||||||
except ImportError:
|
except ImportError:
|
||||||
|
@ -544,7 +545,7 @@ if len(config.fancy) == 1:
|
||||||
|
|
||||||
p = config.fancy[0]
|
p = config.fancy[0]
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print "Fancy: Loading \"%s\"..." % p
|
print("Fancy: Loading \"%s\"..." % p)
|
||||||
if not os.path.exists(p):
|
if not os.path.exists(p):
|
||||||
if verbose >= 1:
|
if verbose >= 1:
|
||||||
sys.stderr.write("Error: Could not find fancy disk image plist at \"%s\"\n" % (p))
|
sys.stderr.write("Error: Could not find fancy disk image plist at \"%s\"\n" % (p))
|
||||||
|
@ -558,23 +559,23 @@ if len(config.fancy) == 1:
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
assert not fancy.has_key("window_bounds") or (isinstance(fancy["window_bounds"], list) and len(fancy["window_bounds"]) == 4)
|
assert "window_bounds" not in fancy or (isinstance(fancy["window_bounds"], list) and len(fancy["window_bounds"]) == 4)
|
||||||
assert not fancy.has_key("background_picture") or isinstance(fancy["background_picture"], str)
|
assert "background_picture" not in fancy or isinstance(fancy["background_picture"], str)
|
||||||
assert not fancy.has_key("icon_size") or isinstance(fancy["icon_size"], int)
|
assert "icon_size" not in fancy or isinstance(fancy["icon_size"], int)
|
||||||
assert not fancy.has_key("applications_symlink") or isinstance(fancy["applications_symlink"], bool)
|
assert "applications_symlink" not in fancy or isinstance(fancy["applications_symlink"], bool)
|
||||||
if fancy.has_key("items_position"):
|
if "items_position" in fancy:
|
||||||
assert isinstance(fancy["items_position"], dict)
|
assert isinstance(fancy["items_position"], dict)
|
||||||
for key, value in fancy["items_position"].iteritems():
|
for key, value in fancy["items_position"].items():
|
||||||
assert isinstance(value, list) and len(value) == 2 and isinstance(value[0], int) and isinstance(value[1], int)
|
assert isinstance(value, list) and len(value) == 2 and isinstance(value[0], int) and isinstance(value[1], int)
|
||||||
except:
|
except:
|
||||||
if verbose >= 1:
|
if verbose >= 1:
|
||||||
sys.stderr.write("Error: Bad format of fancy disk image plist at \"%s\"\n" % (p))
|
sys.stderr.write("Error: Bad format of fancy disk image plist at \"%s\"\n" % (p))
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
if fancy.has_key("background_picture"):
|
if "background_picture" in fancy:
|
||||||
bp = fancy["background_picture"]
|
bp = fancy["background_picture"]
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print "Fancy: Resolving background picture \"%s\"..." % bp
|
print("Fancy: Resolving background picture \"%s\"..." % bp)
|
||||||
if not os.path.exists(bp):
|
if not os.path.exists(bp):
|
||||||
bp = os.path.join(os.path.dirname(p), bp)
|
bp = os.path.join(os.path.dirname(p), bp)
|
||||||
if not os.path.exists(bp):
|
if not os.path.exists(bp):
|
||||||
|
@ -590,18 +591,25 @@ else:
|
||||||
|
|
||||||
if os.path.exists("dist"):
|
if os.path.exists("dist"):
|
||||||
if verbose >= 2:
|
if verbose >= 2:
|
||||||
print "+ Removing old dist folder +"
|
print("+ Removing old dist folder +")
|
||||||
|
|
||||||
shutil.rmtree("dist")
|
shutil.rmtree("dist")
|
||||||
|
|
||||||
# ------------------------------------------------
|
# ------------------------------------------------
|
||||||
|
|
||||||
|
if len(config.volname) == 1:
|
||||||
|
volname = config.volname[0]
|
||||||
|
else:
|
||||||
|
volname = app_bundle_name
|
||||||
|
|
||||||
|
# ------------------------------------------------
|
||||||
|
|
||||||
target = os.path.join("dist", "Bitcoin-Qt.app")
|
target = os.path.join("dist", "Bitcoin-Qt.app")
|
||||||
|
|
||||||
if verbose >= 2:
|
if verbose >= 2:
|
||||||
print "+ Copying source bundle +"
|
print("+ Copying source bundle +")
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print app_bundle, "->", target
|
print(app_bundle, "->", target)
|
||||||
|
|
||||||
os.mkdir("dist")
|
os.mkdir("dist")
|
||||||
shutil.copytree(app_bundle, target, symlinks=True)
|
shutil.copytree(app_bundle, target, symlinks=True)
|
||||||
|
@ -611,7 +619,7 @@ applicationBundle = ApplicationBundleInfo(target)
|
||||||
# ------------------------------------------------
|
# ------------------------------------------------
|
||||||
|
|
||||||
if verbose >= 2:
|
if verbose >= 2:
|
||||||
print "+ Deploying frameworks +"
|
print("+ Deploying frameworks +")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
deploymentInfo = deployFrameworksForAppBundle(applicationBundle, config.strip, verbose)
|
deploymentInfo = deployFrameworksForAppBundle(applicationBundle, config.strip, verbose)
|
||||||
|
@ -630,7 +638,7 @@ except RuntimeError as e:
|
||||||
|
|
||||||
if config.plugins:
|
if config.plugins:
|
||||||
if verbose >= 2:
|
if verbose >= 2:
|
||||||
print "+ Deploying plugins +"
|
print("+ Deploying plugins +")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
deployPlugins(applicationBundle, deploymentInfo, config.strip, verbose)
|
deployPlugins(applicationBundle, deploymentInfo, config.strip, verbose)
|
||||||
|
@ -656,7 +664,7 @@ else:
|
||||||
for lng_file in add_qt_tr:
|
for lng_file in add_qt_tr:
|
||||||
p = os.path.join(qt_tr_dir, lng_file)
|
p = os.path.join(qt_tr_dir, lng_file)
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print "Checking for \"%s\"..." % p
|
print("Checking for \"%s\"..." % p)
|
||||||
if not os.path.exists(p):
|
if not os.path.exists(p):
|
||||||
if verbose >= 1:
|
if verbose >= 1:
|
||||||
sys.stderr.write("Error: Could not find Qt translation file \"%s\"\n" % (lng_file))
|
sys.stderr.write("Error: Could not find Qt translation file \"%s\"\n" % (lng_file))
|
||||||
|
@ -665,7 +673,7 @@ else:
|
||||||
# ------------------------------------------------
|
# ------------------------------------------------
|
||||||
|
|
||||||
if verbose >= 2:
|
if verbose >= 2:
|
||||||
print "+ Installing qt.conf +"
|
print("+ Installing qt.conf +")
|
||||||
|
|
||||||
f = open(os.path.join(applicationBundle.resourcesPath, "qt.conf"), "wb")
|
f = open(os.path.join(applicationBundle.resourcesPath, "qt.conf"), "wb")
|
||||||
f.write(qt_conf)
|
f.write(qt_conf)
|
||||||
|
@ -674,22 +682,22 @@ f.close()
|
||||||
# ------------------------------------------------
|
# ------------------------------------------------
|
||||||
|
|
||||||
if len(add_qt_tr) > 0 and verbose >= 2:
|
if len(add_qt_tr) > 0 and verbose >= 2:
|
||||||
print "+ Adding Qt translations +"
|
print("+ Adding Qt translations +")
|
||||||
|
|
||||||
for lng_file in add_qt_tr:
|
for lng_file in add_qt_tr:
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print os.path.join(qt_tr_dir, lng_file), "->", os.path.join(applicationBundle.resourcesPath, lng_file)
|
print(os.path.join(qt_tr_dir, lng_file), "->", os.path.join(applicationBundle.resourcesPath, lng_file))
|
||||||
shutil.copy2(os.path.join(qt_tr_dir, lng_file), os.path.join(applicationBundle.resourcesPath, lng_file))
|
shutil.copy2(os.path.join(qt_tr_dir, lng_file), os.path.join(applicationBundle.resourcesPath, lng_file))
|
||||||
|
|
||||||
# ------------------------------------------------
|
# ------------------------------------------------
|
||||||
|
|
||||||
if len(config.add_resources) > 0 and verbose >= 2:
|
if len(config.add_resources) > 0 and verbose >= 2:
|
||||||
print "+ Adding additional resources +"
|
print("+ Adding additional resources +")
|
||||||
|
|
||||||
for p in config.add_resources:
|
for p in config.add_resources:
|
||||||
t = os.path.join(applicationBundle.resourcesPath, os.path.basename(p))
|
t = os.path.join(applicationBundle.resourcesPath, os.path.basename(p))
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print p, "->", t
|
print(p, "->", t)
|
||||||
if os.path.isdir(p):
|
if os.path.isdir(p):
|
||||||
shutil.copytree(p, t, symlinks=True)
|
shutil.copytree(p, t, symlinks=True)
|
||||||
else:
|
else:
|
||||||
|
@ -698,10 +706,10 @@ for p in config.add_resources:
|
||||||
# ------------------------------------------------
|
# ------------------------------------------------
|
||||||
|
|
||||||
if config.sign and 'CODESIGNARGS' not in os.environ:
|
if config.sign and 'CODESIGNARGS' not in os.environ:
|
||||||
print "You must set the CODESIGNARGS environment variable. Skipping signing."
|
print("You must set the CODESIGNARGS environment variable. Skipping signing.")
|
||||||
elif config.sign:
|
elif config.sign:
|
||||||
if verbose >= 1:
|
if verbose >= 1:
|
||||||
print "Code-signing app bundle %s"%(target,)
|
print("Code-signing app bundle %s"%(target,))
|
||||||
subprocess.check_call("codesign --force %s %s"%(os.environ['CODESIGNARGS'], target), shell=True)
|
subprocess.check_call("codesign --force %s %s"%(os.environ['CODESIGNARGS'], target), shell=True)
|
||||||
|
|
||||||
# ------------------------------------------------
|
# ------------------------------------------------
|
||||||
|
@ -726,7 +734,7 @@ if config.dmg is not None:
|
||||||
|
|
||||||
def runHDIUtil(verb, image_basename, **kwargs):
|
def runHDIUtil(verb, image_basename, **kwargs):
|
||||||
hdiutil_args = ["hdiutil", verb, image_basename + ".dmg"]
|
hdiutil_args = ["hdiutil", verb, image_basename + ".dmg"]
|
||||||
if kwargs.has_key("capture_stdout"):
|
if "capture_stdout" in kwargs:
|
||||||
del kwargs["capture_stdout"]
|
del kwargs["capture_stdout"]
|
||||||
run = subprocess.check_output
|
run = subprocess.check_output
|
||||||
else:
|
else:
|
||||||
|
@ -736,7 +744,7 @@ if config.dmg is not None:
|
||||||
hdiutil_args.append("-verbose")
|
hdiutil_args.append("-verbose")
|
||||||
run = subprocess.check_call
|
run = subprocess.check_call
|
||||||
|
|
||||||
for key, value in kwargs.iteritems():
|
for key, value in kwargs.items():
|
||||||
hdiutil_args.append("-" + key)
|
hdiutil_args.append("-" + key)
|
||||||
if not value is True:
|
if not value is True:
|
||||||
hdiutil_args.append(str(value))
|
hdiutil_args.append(str(value))
|
||||||
|
@ -745,9 +753,9 @@ if config.dmg is not None:
|
||||||
|
|
||||||
if verbose >= 2:
|
if verbose >= 2:
|
||||||
if fancy is None:
|
if fancy is None:
|
||||||
print "+ Creating .dmg disk image +"
|
print("+ Creating .dmg disk image +")
|
||||||
else:
|
else:
|
||||||
print "+ Preparing .dmg disk image +"
|
print("+ Preparing .dmg disk image +")
|
||||||
|
|
||||||
if config.dmg != "":
|
if config.dmg != "":
|
||||||
dmg_name = config.dmg
|
dmg_name = config.dmg
|
||||||
|
@ -757,12 +765,12 @@ if config.dmg is not None:
|
||||||
|
|
||||||
if fancy is None:
|
if fancy is None:
|
||||||
try:
|
try:
|
||||||
runHDIUtil("create", dmg_name, srcfolder="dist", format="UDBZ", volname="Bitcoin-Core", ov=True)
|
runHDIUtil("create", dmg_name, srcfolder="dist", format="UDBZ", volname=volname, ov=True)
|
||||||
except subprocess.CalledProcessError as e:
|
except subprocess.CalledProcessError as e:
|
||||||
sys.exit(e.returncode)
|
sys.exit(e.returncode)
|
||||||
else:
|
else:
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print "Determining size of \"dist\"..."
|
print("Determining size of \"dist\"...")
|
||||||
size = 0
|
size = 0
|
||||||
for path, dirs, files in os.walk("dist"):
|
for path, dirs, files in os.walk("dist"):
|
||||||
for file in files:
|
for file in files:
|
||||||
|
@ -770,14 +778,14 @@ if config.dmg is not None:
|
||||||
size += int(size * 0.15)
|
size += int(size * 0.15)
|
||||||
|
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print "Creating temp image for modification..."
|
print("Creating temp image for modification...")
|
||||||
try:
|
try:
|
||||||
runHDIUtil("create", dmg_name + ".temp", srcfolder="dist", format="UDRW", size=size, volname="Bitcoin-Core", ov=True)
|
runHDIUtil("create", dmg_name + ".temp", srcfolder="dist", format="UDRW", size=size, volname=volname, ov=True)
|
||||||
except subprocess.CalledProcessError as e:
|
except subprocess.CalledProcessError as e:
|
||||||
sys.exit(e.returncode)
|
sys.exit(e.returncode)
|
||||||
|
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print "Attaching temp image..."
|
print("Attaching temp image...")
|
||||||
try:
|
try:
|
||||||
output = runHDIUtil("attach", dmg_name + ".temp", readwrite=True, noverify=True, noautoopen=True, capture_stdout=True)
|
output = runHDIUtil("attach", dmg_name + ".temp", readwrite=True, noverify=True, noautoopen=True, capture_stdout=True)
|
||||||
except subprocess.CalledProcessError as e:
|
except subprocess.CalledProcessError as e:
|
||||||
|
@ -788,13 +796,13 @@ if config.dmg is not None:
|
||||||
disk_name = m.group(1)
|
disk_name = m.group(1)
|
||||||
|
|
||||||
if verbose >= 2:
|
if verbose >= 2:
|
||||||
print "+ Applying fancy settings +"
|
print("+ Applying fancy settings +")
|
||||||
|
|
||||||
if fancy.has_key("background_picture"):
|
if "background_picture" in fancy:
|
||||||
bg_path = os.path.join(disk_root, ".background", os.path.basename(fancy["background_picture"]))
|
bg_path = os.path.join(disk_root, ".background", os.path.basename(fancy["background_picture"]))
|
||||||
os.mkdir(os.path.dirname(bg_path))
|
os.mkdir(os.path.dirname(bg_path))
|
||||||
if verbose >= 3:
|
if verbose >= 3:
|
||||||
print fancy["background_picture"], "->", bg_path
|
print(fancy["background_picture"], "->", bg_path)
|
||||||
shutil.copy2(fancy["background_picture"], bg_path)
|
shutil.copy2(fancy["background_picture"], bg_path)
|
||||||
else:
|
else:
|
||||||
bg_path = None
|
bg_path = None
|
||||||
|
@ -831,21 +839,21 @@ if config.dmg is not None:
|
||||||
|
|
||||||
itemscript = Template('set position of item "${item}" of container window to {${position}}')
|
itemscript = Template('set position of item "${item}" of container window to {${position}}')
|
||||||
items_positions = []
|
items_positions = []
|
||||||
if fancy.has_key("items_position"):
|
if "items_position" in fancy:
|
||||||
for name, position in fancy["items_position"].iteritems():
|
for name, position in fancy["items_position"].items():
|
||||||
params = { "item" : name, "position" : ",".join([str(p) for p in position]) }
|
params = { "item" : name, "position" : ",".join([str(p) for p in position]) }
|
||||||
items_positions.append(itemscript.substitute(params))
|
items_positions.append(itemscript.substitute(params))
|
||||||
|
|
||||||
params = {
|
params = {
|
||||||
"disk" : "Bitcoin-Core",
|
"disk" : volname,
|
||||||
"window_bounds" : "300,300,800,620",
|
"window_bounds" : "300,300,800,620",
|
||||||
"icon_size" : "96",
|
"icon_size" : "96",
|
||||||
"background_commands" : "",
|
"background_commands" : "",
|
||||||
"items_positions" : "\n ".join(items_positions)
|
"items_positions" : "\n ".join(items_positions)
|
||||||
}
|
}
|
||||||
if fancy.has_key("window_bounds"):
|
if "window_bounds" in fancy:
|
||||||
params["window.bounds"] = ",".join([str(p) for p in fancy["window_bounds"]])
|
params["window.bounds"] = ",".join([str(p) for p in fancy["window_bounds"]])
|
||||||
if fancy.has_key("icon_size"):
|
if "icon_size" in fancy:
|
||||||
params["icon_size"] = str(fancy["icon_size"])
|
params["icon_size"] = str(fancy["icon_size"])
|
||||||
if bg_path is not None:
|
if bg_path is not None:
|
||||||
# Set background file, then call SetFile to make it invisible.
|
# Set background file, then call SetFile to make it invisible.
|
||||||
|
@ -865,7 +873,7 @@ if config.dmg is not None:
|
||||||
print("Error running osascript.")
|
print("Error running osascript.")
|
||||||
|
|
||||||
if verbose >= 2:
|
if verbose >= 2:
|
||||||
print "+ Finalizing .dmg disk image +"
|
print("+ Finalizing .dmg disk image +")
|
||||||
time.sleep(5)
|
time.sleep(5)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -878,6 +886,6 @@ if config.dmg is not None:
|
||||||
# ------------------------------------------------
|
# ------------------------------------------------
|
||||||
|
|
||||||
if verbose >= 2:
|
if verbose >= 2:
|
||||||
print "+ Done +"
|
print("+ Done +")
|
||||||
|
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
185
contrib/rpm/README.md
Normal file
185
contrib/rpm/README.md
Normal file
|
@ -0,0 +1,185 @@
|
||||||
|
RPM Spec File Notes
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
The RPM spec file provided here is for Bitcoin-Core 0.12.0 and builds on CentOS
|
||||||
|
7 with either the CentOS provided OpenSSL library or with LibreSSL as packaged
|
||||||
|
at [LibreLAMP.com](https://librelamp.com/). It should hopefully not be too
|
||||||
|
difficult to port the RPM spec file to most RPM based Linux distributions.
|
||||||
|
|
||||||
|
When porting the spec file to build for a particular distribution, there are
|
||||||
|
some important notes.
|
||||||
|
|
||||||
|
## Sources
|
||||||
|
|
||||||
|
It is considered good form for all sources to reference a URL where the source
|
||||||
|
can be downloaded.
|
||||||
|
|
||||||
|
Sources 0-9 should be reserved for source code tarballs. `Source0` should
|
||||||
|
reference the release tarball available from https://bitcoin.org/bin/ and
|
||||||
|
`Source1` should reference the BerkeleyDB source.
|
||||||
|
|
||||||
|
Sources 10-99 are for source files that are maintained in the
|
||||||
|
[Bitcoin git repository](https://github.com/bitcoin/bitcoin) but are not part of
|
||||||
|
the release tarball. Most of these will reside in the `contrib` sub-directory.
|
||||||
|
|
||||||
|
Sources 10-19 should be reserved for miscellaneous configuration files.
|
||||||
|
Currently only `Source10` is used, for the example `bitcoin.conf` file.
|
||||||
|
|
||||||
|
Sources 20-29 should be reserved for man pages. Currently only `Source20`
|
||||||
|
through `Source23` are used.
|
||||||
|
|
||||||
|
Sources 30-39 should be reserved for SELinux related files. Currently only
|
||||||
|
`Source30` through `Source32` are used. Until those files are in a tagged
|
||||||
|
release, the full URL specified in the RPM spec file will not work. You can get
|
||||||
|
them from the git ropository where you retrieved this file.
|
||||||
|
|
||||||
|
Sources 100+ are for files that are not source tarballs and are not maintained
|
||||||
|
in the bitcoin git repository. At present only an SVG version of the Bitcoin
|
||||||
|
icon is used.
|
||||||
|
|
||||||
|
## Patches
|
||||||
|
|
||||||
|
In general, patches should be avoided. When a packager feels a patch is
|
||||||
|
necessary, the packager should bring the problem to the attention of the bitcoin
|
||||||
|
developers so that an official fix to the issue can make it into the next
|
||||||
|
release.
|
||||||
|
|
||||||
|
### Patch0 bitcoin-0.12.0-libressl.patch
|
||||||
|
|
||||||
|
This patch is only needed if building against LibreSSL. LibreSSL is not the
|
||||||
|
standard TLS library on most Linux distributions. The patch will likely not be
|
||||||
|
needed when 0.12.1 is released, a proper fix is already in the Bitcoin git
|
||||||
|
master branch.
|
||||||
|
|
||||||
|
## BuildRequires
|
||||||
|
|
||||||
|
The packages specified in the `BuildRequires` are specified according to the
|
||||||
|
package naming convention currently used in CentOS 7 and EPEL for CentOS 7. You
|
||||||
|
may need to change some of the package names for other distributions. This is
|
||||||
|
most likely to be the case with the Qt packages.
|
||||||
|
|
||||||
|
## BerkeleyDB
|
||||||
|
|
||||||
|
The `build-unix.md` file recommends building against BerkeleyDB 4.8.30. Even if
|
||||||
|
that is the version your Linux distribution ships with, it probably is a good
|
||||||
|
idea to build Bitcoin Core against a static version of that library compiled
|
||||||
|
according to the instructions in the `build-unix.md` file so that any changes
|
||||||
|
the distribution may make in the future will not result in a problem for users.
|
||||||
|
|
||||||
|
The problem that can exist, clients built against different versions of
|
||||||
|
BerkeleyDB may not be able read each other's `wallet.dat` file which can make it
|
||||||
|
difficult for a user to recover from backup in the event of a system failure.
|
||||||
|
|
||||||
|
## Graphical User Interface and Qt Version
|
||||||
|
|
||||||
|
The RPM spec file will by default build the GUI client linked against the Qt5
|
||||||
|
libraries. If you wish instead to link against the Qt4 libraries you need to
|
||||||
|
pass the switch `-D '_use_qt4 1'` at build time to the `rpmbuild` or `mock`
|
||||||
|
command used to build the packages.
|
||||||
|
|
||||||
|
If you would prefer not to build the GUI at all, you can pass the switch
|
||||||
|
`-D '_no_gui 1'` to the `rpmbuild` or `mock` build command.
|
||||||
|
|
||||||
|
## Desktop and KDE Files
|
||||||
|
|
||||||
|
The desktop and KDE meta files are created in the spec file itself with the
|
||||||
|
`cat` command. This is done to allow easy distribution specific changes without
|
||||||
|
needing to use any patches. A specific time stamp is given to the files so that
|
||||||
|
it does not they do not appear to have been updated every time the package is
|
||||||
|
built. If you do make changes to them, you probably should update time stamp
|
||||||
|
assigned to them in the `touch` command that specifies the time stamp.
|
||||||
|
|
||||||
|
## SVG, PNG, and XPM Icons
|
||||||
|
|
||||||
|
The `bitcoin.svg` file is from the source listed as `Source100`. It is used as
|
||||||
|
the source for the PNG and XPM files. The generated PNG and XPM files are given
|
||||||
|
the same time stamp as the source SVG file as a means of indicating they are
|
||||||
|
derived from it.
|
||||||
|
|
||||||
|
## Systemd
|
||||||
|
|
||||||
|
This spec file assumes the target distribution uses systemd. That really only
|
||||||
|
matters for the `bitcoin-server` package. At this point, most RPM based
|
||||||
|
distributions that still receive vendor updates do in fact use systemd.
|
||||||
|
|
||||||
|
The files to control the service are created in the RPM spec file itself using
|
||||||
|
the `cat` command. This is done to make it easy to modify for other
|
||||||
|
distributions that may implement things differently without needing to patch
|
||||||
|
source. A specific time stamp is given to the files so that they do not appear
|
||||||
|
to have been updated every time the package is built. If you do make changes to
|
||||||
|
them, you probably should update the time stamp assigned to them in the `touch`
|
||||||
|
command that specifies the time stamp.
|
||||||
|
|
||||||
|
## SELinux
|
||||||
|
|
||||||
|
The `bitcoin-server` package should have SELinux support. How to properly do
|
||||||
|
that *may* vary by distribution and version of distribution.
|
||||||
|
|
||||||
|
The SELinux stuff in this RPM spec file *should* be correct for CentOS, RHEL,
|
||||||
|
and Fedora but it would be a good idea to review it before building the package
|
||||||
|
on other distributions.
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
|
||||||
|
The `%check` section takes a very long time to run. If your build system has a
|
||||||
|
time limit for package build, you may need to make an exception for this
|
||||||
|
package. On CentOS 7 the `%check` section completes successfully with both
|
||||||
|
OpenSSL and LibreSSL, a failure really does mean something is wrong.
|
||||||
|
|
||||||
|
## LibreSSL Build Notes
|
||||||
|
|
||||||
|
To build against LibreSSL you will need to pass the switch
|
||||||
|
`-D '_use_libressl 1'` to the `rpmbuild` or `mock` command or the spec file will
|
||||||
|
want the OpenSSL development files.
|
||||||
|
|
||||||
|
### LibreSSL and Boost
|
||||||
|
|
||||||
|
LibreSSL (and some newer builds of OpenSSL) do not have support for SSLv3. This
|
||||||
|
can cause issues with the Boost package if the Boost package has not been
|
||||||
|
patched accordingly. On those distributions, you will either need to build
|
||||||
|
Bitcoin-Core against OpenSSL or use a patched version of Boost in the build
|
||||||
|
system.
|
||||||
|
|
||||||
|
As SSLv3 is no longer safe, distributions that have not patched Boost to work
|
||||||
|
with TLS libraries that do not support SSLv3 should have bug reports filed
|
||||||
|
against the Boost package. This bug report has already been filed for RHEL 7 but
|
||||||
|
it may need to be filed for other distributions.
|
||||||
|
|
||||||
|
A patch for Boost: https://github.com/boostorg/asio/pull/23/files
|
||||||
|
|
||||||
|
## ZeroMQ
|
||||||
|
|
||||||
|
At this time, this RPM spec file does not support the ZeroMQ build options. A
|
||||||
|
suitable version of ZeroMQ is not available for the platform this spec file was
|
||||||
|
developed on (CentOS 7).
|
||||||
|
|
||||||
|
## Legacy Credit
|
||||||
|
|
||||||
|
This RPM spec file is largely based upon the work of Michael Hampton at
|
||||||
|
[Ringing Liberty](https://www.ringingliberty.com/bitcoin/). He has been
|
||||||
|
packaging Bitcoin for Fedora at least since 2012.
|
||||||
|
|
||||||
|
Most of the differences between his packaging and this package are stylistic in
|
||||||
|
nature. The major differences:
|
||||||
|
|
||||||
|
1. He builds from a github tagged release rather than a release tarball. This
|
||||||
|
should not result in different source code.
|
||||||
|
|
||||||
|
2. He does not build BerkeleyDB but instead uses the BerkeleyDB provided by the
|
||||||
|
Linux distribution. For the distributions he packages for, they currently all
|
||||||
|
use the same version of BerkeleyDB so that difference is *probably* just
|
||||||
|
academic.
|
||||||
|
|
||||||
|
3. As of his 10.11.2 package he did not allow for building against LibreSSL,
|
||||||
|
specifying a build without the Qt GUI, or specifying which version of the Qt
|
||||||
|
libraries to use.
|
||||||
|
|
||||||
|
4. I renamed the `bitcoin` package that contains the Qt GUI to `bitcoin-core` as
|
||||||
|
that appears to be how the general population refers to it, in contrast to
|
||||||
|
`bitcoin-xt` or `bitcoin-classic`. I wanted to make sure the general population
|
||||||
|
knows what they are getting when installing the GUI package.
|
||||||
|
|
||||||
|
As far as minor differences, I generally prefer to assign the file permissions
|
||||||
|
in the `%files` portion of an RPM spec file rather than specifying the
|
||||||
|
permissions of a file during `%install` and other minor things like that that
|
||||||
|
are largely just cosmetic.
|
24
contrib/rpm/bitcoin-0.12.0-libressl.patch
Normal file
24
contrib/rpm/bitcoin-0.12.0-libressl.patch
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
diff -ur bitcoin-0.12.0.orig/src/init.cpp bitcoin-0.12.0/src/init.cpp
|
||||||
|
--- bitcoin-0.12.0.orig/src/init.cpp 2015-12-31 16:00:00.000000000 -0800
|
||||||
|
+++ bitcoin-0.12.0/src/init.cpp 2016-02-23 06:03:47.133227757 -0800
|
||||||
|
@@ -1075,7 +1075,7 @@
|
||||||
|
if (fPrintToDebugLog)
|
||||||
|
OpenDebugLog();
|
||||||
|
|
||||||
|
-#if (OPENSSL_VERSION_NUMBER < 0x10100000L)
|
||||||
|
+#if defined(LIBRESSL_VERSION_NUMBER) || (OPENSSL_VERSION_NUMBER < 0x10100000L)
|
||||||
|
LogPrintf("Using OpenSSL version %s\n", SSLeay_version(SSLEAY_VERSION));
|
||||||
|
#else
|
||||||
|
LogPrintf("Using OpenSSL version %s\n", OpenSSL_version(OPENSSL_VERSION));
|
||||||
|
diff -ur bitcoin-0.12.0.orig/src/qt/rpcconsole.cpp bitcoin-0.12.0/src/qt/rpcconsole.cpp
|
||||||
|
--- bitcoin-0.12.0.orig/src/qt/rpcconsole.cpp 2015-12-31 16:00:00.000000000 -0800
|
||||||
|
+++ bitcoin-0.12.0/src/qt/rpcconsole.cpp 2016-02-23 15:09:42.881126841 -0800
|
||||||
|
@@ -264,7 +264,7 @@
|
||||||
|
|
||||||
|
// set library version labels
|
||||||
|
|
||||||
|
-#if (OPENSSL_VERSION_NUMBER < 0x10100000L)
|
||||||
|
+#if defined(LIBRESSL_VERSION_NUMBER) || (OPENSSL_VERSION_NUMBER < 0x10100000L)
|
||||||
|
ui->openSSLVersion->setText(SSLeay_version(SSLEAY_VERSION));
|
||||||
|
#else
|
||||||
|
ui->openSSLVersion->setText(OpenSSL_version(OPENSSL_VERSION));
|
8
contrib/rpm/bitcoin.fc
Normal file
8
contrib/rpm/bitcoin.fc
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
/usr/bin/bitcoin-cli -- gen_context(system_u:object_r:bitcoin_exec_t,s0)
|
||||||
|
/usr/sbin/bitcoind -- gen_context(system_u:object_r:bitcoin_exec_t,s0)
|
||||||
|
/usr/lib(64)?/bitcoin/bitcoind -- gen_context(system_u:object_r:bitcoin_exec_t,s0)
|
||||||
|
|
||||||
|
/etc/bitcoin(/.*)? gen_context(system_u:object_r:bitcoin_conf_t,s0)
|
||||||
|
/var/lib/bitcoin(/.*)? gen_context(system_u:object_r:bitcoin_var_lib_t,s0)
|
||||||
|
|
||||||
|
(/var)?/run/bitcoind(/.*)? gen_context(system_u:object_r:bitcoin_var_run_t,s0)
|
157
contrib/rpm/bitcoin.if
Normal file
157
contrib/rpm/bitcoin.if
Normal file
|
@ -0,0 +1,157 @@
|
||||||
|
|
||||||
|
## <summary>policy for bitcoin</summary>
|
||||||
|
|
||||||
|
|
||||||
|
########################################
|
||||||
|
## <summary>
|
||||||
|
## Transition to bitcoin.
|
||||||
|
## </summary>
|
||||||
|
## <param name="domain">
|
||||||
|
## <summary>
|
||||||
|
## Domain allowed to transition.
|
||||||
|
## </summary>
|
||||||
|
## </param>
|
||||||
|
#
|
||||||
|
interface(`bitcoin_domtrans',`
|
||||||
|
gen_require(`
|
||||||
|
type bitcoin_t, bitcoin_exec_t;
|
||||||
|
')
|
||||||
|
|
||||||
|
corecmd_search_bin($1)
|
||||||
|
domtrans_pattern($1, bitcoin_exec_t, bitcoin_t)
|
||||||
|
')
|
||||||
|
|
||||||
|
|
||||||
|
########################################
|
||||||
|
## <summary>
|
||||||
|
## Execute bitcoin server in the bitcoin domain.
|
||||||
|
## </summary>
|
||||||
|
## <param name="domain">
|
||||||
|
## <summary>
|
||||||
|
## Domain allowed access.
|
||||||
|
## </summary>
|
||||||
|
## </param>
|
||||||
|
#
|
||||||
|
interface(`bitcoin_initrc_domtrans',`
|
||||||
|
gen_require(`
|
||||||
|
type bitcoin_initrc_exec_t;
|
||||||
|
')
|
||||||
|
|
||||||
|
init_labeled_script_domtrans($1, bitcoin_initrc_exec_t)
|
||||||
|
')
|
||||||
|
|
||||||
|
|
||||||
|
########################################
|
||||||
|
## <summary>
|
||||||
|
## Search bitcoin lib directories.
|
||||||
|
## </summary>
|
||||||
|
## <param name="domain">
|
||||||
|
## <summary>
|
||||||
|
## Domain allowed access.
|
||||||
|
## </summary>
|
||||||
|
## </param>
|
||||||
|
#
|
||||||
|
interface(`bitcoin_search_lib',`
|
||||||
|
gen_require(`
|
||||||
|
type bitcoin_var_lib_t;
|
||||||
|
')
|
||||||
|
|
||||||
|
allow $1 bitcoin_var_lib_t:dir search_dir_perms;
|
||||||
|
files_search_var_lib($1)
|
||||||
|
')
|
||||||
|
|
||||||
|
########################################
|
||||||
|
## <summary>
|
||||||
|
## Read bitcoin lib files.
|
||||||
|
## </summary>
|
||||||
|
## <param name="domain">
|
||||||
|
## <summary>
|
||||||
|
## Domain allowed access.
|
||||||
|
## </summary>
|
||||||
|
## </param>
|
||||||
|
#
|
||||||
|
interface(`bitcoin_read_lib_files',`
|
||||||
|
gen_require(`
|
||||||
|
type bitcoin_var_lib_t;
|
||||||
|
')
|
||||||
|
|
||||||
|
files_search_var_lib($1)
|
||||||
|
read_files_pattern($1, bitcoin_var_lib_t, bitcoin_var_lib_t)
|
||||||
|
')
|
||||||
|
|
||||||
|
########################################
|
||||||
|
## <summary>
|
||||||
|
## Manage bitcoin lib files.
|
||||||
|
## </summary>
|
||||||
|
## <param name="domain">
|
||||||
|
## <summary>
|
||||||
|
## Domain allowed access.
|
||||||
|
## </summary>
|
||||||
|
## </param>
|
||||||
|
#
|
||||||
|
interface(`bitcoin_manage_lib_files',`
|
||||||
|
gen_require(`
|
||||||
|
type bitcoin_var_lib_t;
|
||||||
|
')
|
||||||
|
|
||||||
|
files_search_var_lib($1)
|
||||||
|
manage_files_pattern($1, bitcoin_var_lib_t, bitcoin_var_lib_t)
|
||||||
|
')
|
||||||
|
|
||||||
|
########################################
|
||||||
|
## <summary>
|
||||||
|
## Manage bitcoin lib directories.
|
||||||
|
## </summary>
|
||||||
|
## <param name="domain">
|
||||||
|
## <summary>
|
||||||
|
## Domain allowed access.
|
||||||
|
## </summary>
|
||||||
|
## </param>
|
||||||
|
#
|
||||||
|
interface(`bitcoin_manage_lib_dirs',`
|
||||||
|
gen_require(`
|
||||||
|
type bitcoin_var_lib_t;
|
||||||
|
')
|
||||||
|
|
||||||
|
files_search_var_lib($1)
|
||||||
|
manage_dirs_pattern($1, bitcoin_var_lib_t, bitcoin_var_lib_t)
|
||||||
|
')
|
||||||
|
|
||||||
|
|
||||||
|
########################################
|
||||||
|
## <summary>
|
||||||
|
## All of the rules required to administrate
|
||||||
|
## an bitcoin environment
|
||||||
|
## </summary>
|
||||||
|
## <param name="domain">
|
||||||
|
## <summary>
|
||||||
|
## Domain allowed access.
|
||||||
|
## </summary>
|
||||||
|
## </param>
|
||||||
|
## <param name="role">
|
||||||
|
## <summary>
|
||||||
|
## Role allowed access.
|
||||||
|
## </summary>
|
||||||
|
## </param>
|
||||||
|
## <rolecap/>
|
||||||
|
#
|
||||||
|
interface(`bitcoin_admin',`
|
||||||
|
gen_require(`
|
||||||
|
type bitcoin_t;
|
||||||
|
type bitcoin_initrc_exec_t;
|
||||||
|
type bitcoin_var_lib_t;
|
||||||
|
')
|
||||||
|
|
||||||
|
allow $1 bitcoin_t:process { ptrace signal_perms };
|
||||||
|
ps_process_pattern($1, bitcoin_t)
|
||||||
|
|
||||||
|
bitcoin_initrc_domtrans($1)
|
||||||
|
domain_system_change_exemption($1)
|
||||||
|
role_transition $2 bitcoin_initrc_exec_t system_r;
|
||||||
|
allow $2 system_r;
|
||||||
|
|
||||||
|
files_search_var_lib($1)
|
||||||
|
admin_pattern($1, bitcoin_var_lib_t)
|
||||||
|
|
||||||
|
')
|
||||||
|
|
444
contrib/rpm/bitcoin.spec
Normal file
444
contrib/rpm/bitcoin.spec
Normal file
|
@ -0,0 +1,444 @@
|
||||||
|
%define bdbv 4.8.30
|
||||||
|
%global selinux_variants mls strict targeted
|
||||||
|
|
||||||
|
%if 0%{?_no_gui:1}
|
||||||
|
%define _buildqt 0
|
||||||
|
%define buildargs --with-gui=no
|
||||||
|
%else
|
||||||
|
%define _buildqt 1
|
||||||
|
%if 0%{?_use_qt4}
|
||||||
|
%define buildargs --with-qrencode --with-gui=qt4
|
||||||
|
%else
|
||||||
|
%define buildargs --with-qrencode --with-gui=qt5
|
||||||
|
%endif
|
||||||
|
%endif
|
||||||
|
|
||||||
|
Name: bitcoin
|
||||||
|
Version: 0.12.0
|
||||||
|
Release: 2%{?dist}
|
||||||
|
Summary: Peer to Peer Cryptographic Currency
|
||||||
|
|
||||||
|
Group: Applications/System
|
||||||
|
License: MIT
|
||||||
|
URL: https://bitcoin.org/
|
||||||
|
Source0: https://bitcoin.org/bin/bitcoin-core-%{version}/bitcoin-%{version}.tar.gz
|
||||||
|
Source1: http://download.oracle.com/berkeley-db/db-%{bdbv}.NC.tar.gz
|
||||||
|
|
||||||
|
Source10: https://raw.githubusercontent.com/bitcoin/bitcoin/v%{version}/contrib/debian/examples/bitcoin.conf
|
||||||
|
|
||||||
|
#man pages
|
||||||
|
Source20: https://raw.githubusercontent.com/bitcoin/bitcoin/v%{version}/contrib/debian/manpages/bitcoind.1
|
||||||
|
Source21: https://raw.githubusercontent.com/bitcoin/bitcoin/v%{version}/contrib/debian/manpages/bitcoin-cli.1
|
||||||
|
Source22: https://raw.githubusercontent.com/bitcoin/bitcoin/v%{version}/contrib/debian/manpages/bitcoin-qt.1
|
||||||
|
Source23: https://raw.githubusercontent.com/bitcoin/bitcoin/v%{version}/contrib/debian/manpages/bitcoin.conf.5
|
||||||
|
|
||||||
|
#selinux
|
||||||
|
Source30: https://raw.githubusercontent.com/bitcoin/bitcoin/v%{version}/contrib/rpm/bitcoin.te
|
||||||
|
# Source31 - what about bitcoin-tx and bench_bitcoin ???
|
||||||
|
Source31: https://raw.githubusercontent.com/bitcoin/bitcoin/v%{version}/contrib/rpm/bitcoin.fc
|
||||||
|
Source32: https://raw.githubusercontent.com/bitcoin/bitcoin/v%{version}/contrib/rpm/bitcoin.if
|
||||||
|
|
||||||
|
Source100: https://upload.wikimedia.org/wikipedia/commons/4/46/Bitcoin.svg
|
||||||
|
|
||||||
|
%if 0%{?_use_libressl:1}
|
||||||
|
BuildRequires: libressl-devel
|
||||||
|
%else
|
||||||
|
BuildRequires: openssl-devel
|
||||||
|
%endif
|
||||||
|
BuildRequires: boost-devel
|
||||||
|
BuildRequires: miniupnpc-devel
|
||||||
|
BuildRequires: autoconf automake libtool
|
||||||
|
BuildRequires: libevent-devel
|
||||||
|
|
||||||
|
|
||||||
|
Patch0: bitcoin-0.12.0-libressl.patch
|
||||||
|
|
||||||
|
|
||||||
|
%description
|
||||||
|
Bitcoin is a digital cryptographic currency that uses peer-to-peer technology to
|
||||||
|
operate with no central authority or banks; managing transactions and the
|
||||||
|
issuing of bitcoins is carried out collectively by the network.
|
||||||
|
|
||||||
|
%if %{_buildqt}
|
||||||
|
%package core
|
||||||
|
Summary: Peer to Peer Cryptographic Currency
|
||||||
|
Group: Applications/System
|
||||||
|
Obsoletes: %{name} < %{version}-%{release}
|
||||||
|
Provides: %{name} = %{version}-%{release}
|
||||||
|
%if 0%{?_use_qt4}
|
||||||
|
BuildRequires: qt-devel
|
||||||
|
%else
|
||||||
|
BuildRequires: qt5-qtbase-devel
|
||||||
|
# for /usr/bin/lrelease-qt5
|
||||||
|
BuildRequires: qt5-linguist
|
||||||
|
%endif
|
||||||
|
BuildRequires: protobuf-devel
|
||||||
|
BuildRequires: qrencode-devel
|
||||||
|
BuildRequires: %{_bindir}/desktop-file-validate
|
||||||
|
# for icon generation from SVG
|
||||||
|
BuildRequires: %{_bindir}/inkscape
|
||||||
|
BuildRequires: %{_bindir}/convert
|
||||||
|
|
||||||
|
%description core
|
||||||
|
Bitcoin is a digital cryptographic currency that uses peer-to-peer technology to
|
||||||
|
operate with no central authority or banks; managing transactions and the
|
||||||
|
issuing of bitcoins is carried out collectively by the network.
|
||||||
|
|
||||||
|
This package contains the Qt based graphical client and node. If you are looking
|
||||||
|
to run a Bitcoin wallet, this is probably the package you want.
|
||||||
|
%endif
|
||||||
|
|
||||||
|
|
||||||
|
%package libs
|
||||||
|
Summary: Bitcoin shared libraries
|
||||||
|
Group: System Environment/Libraries
|
||||||
|
|
||||||
|
%description libs
|
||||||
|
This package provides the bitcoinconsensus shared libraries. These libraries
|
||||||
|
may be used by third party software to provide consensus verification
|
||||||
|
functionality.
|
||||||
|
|
||||||
|
Unless you know need this package, you probably do not.
|
||||||
|
|
||||||
|
%package devel
|
||||||
|
Summary: Development files for bitcoin
|
||||||
|
Group: Development/Libraries
|
||||||
|
Requires: %{name}-libs = %{version}-%{release}
|
||||||
|
|
||||||
|
%description devel
|
||||||
|
This package contains the header files and static library for the
|
||||||
|
bitcoinconsensus shared library. If you are developing or compiling software
|
||||||
|
that wants to link against that library, then you need this package installed.
|
||||||
|
|
||||||
|
Most people do not need this package installed.
|
||||||
|
|
||||||
|
%package server
|
||||||
|
Summary: The bitcoin daemon
|
||||||
|
Group: System Environment/Daemons
|
||||||
|
Requires: bitcoin-utils = %{version}-%{release}
|
||||||
|
Requires: selinux-policy policycoreutils-python
|
||||||
|
Requires(pre): shadow-utils
|
||||||
|
Requires(post): %{_sbindir}/semodule %{_sbindir}/restorecon %{_sbindir}/fixfiles %{_sbindir}/sestatus
|
||||||
|
Requires(postun): %{_sbindir}/semodule %{_sbindir}/restorecon %{_sbindir}/fixfiles %{_sbindir}/sestatus
|
||||||
|
BuildRequires: systemd
|
||||||
|
BuildRequires: checkpolicy
|
||||||
|
BuildRequires: %{_datadir}/selinux/devel/Makefile
|
||||||
|
|
||||||
|
%description server
|
||||||
|
This package provides a stand-alone bitcoin-core daemon. For most users, this
|
||||||
|
package is only needed if they need a full-node without the graphical client.
|
||||||
|
|
||||||
|
Some third party wallet software will want this package to provide the actual
|
||||||
|
bitcoin-core node they use to connect to the network.
|
||||||
|
|
||||||
|
If you use the graphical bitcoin-core client then you almost certainly do not
|
||||||
|
need this package.
|
||||||
|
|
||||||
|
%package utils
|
||||||
|
Summary: Bitcoin utilities
|
||||||
|
Group: Applications/System
|
||||||
|
|
||||||
|
%description utils
|
||||||
|
This package provides several command line utilities for interacting with a
|
||||||
|
bitcoin-core daemon.
|
||||||
|
|
||||||
|
The bitcoin-cli utility allows you to communicate and control a bitcoin daemon
|
||||||
|
over RPC, the bitcoin-tx utility allows you to create a custom transaction, and
|
||||||
|
the bench_bitcoin utility can be used to perform some benchmarks.
|
||||||
|
|
||||||
|
This package contains utilities needed by the bitcoin-server package.
|
||||||
|
|
||||||
|
|
||||||
|
%prep
|
||||||
|
%setup -q
|
||||||
|
%patch0 -p1 -b .libressl
|
||||||
|
cp -p %{SOURCE10} ./bitcoin.conf.example
|
||||||
|
tar -zxf %{SOURCE1}
|
||||||
|
cp -p db-%{bdbv}.NC/LICENSE ./db-%{bdbv}.NC-LICENSE
|
||||||
|
mkdir db4 SELinux
|
||||||
|
cp -p %{SOURCE30} %{SOURCE31} %{SOURCE32} SELinux/
|
||||||
|
|
||||||
|
|
||||||
|
%build
|
||||||
|
CWD=`pwd`
|
||||||
|
cd db-%{bdbv}.NC/build_unix/
|
||||||
|
../dist/configure --enable-cxx --disable-shared --with-pic --prefix=${CWD}/db4
|
||||||
|
make install
|
||||||
|
cd ../..
|
||||||
|
|
||||||
|
./autogen.sh
|
||||||
|
%configure LDFLAGS="-L${CWD}/db4/lib/" CPPFLAGS="-I${CWD}/db4/include/" --with-miniupnpc --enable-glibc-back-compat %{buildargs}
|
||||||
|
make %{?_smp_mflags}
|
||||||
|
|
||||||
|
pushd SELinux
|
||||||
|
for selinuxvariant in %{selinux_variants}; do
|
||||||
|
make NAME=${selinuxvariant} -f %{_datadir}/selinux/devel/Makefile
|
||||||
|
mv bitcoin.pp bitcoin.pp.${selinuxvariant}
|
||||||
|
make NAME=${selinuxvariant} -f %{_datadir}/selinux/devel/Makefile clean
|
||||||
|
done
|
||||||
|
popd
|
||||||
|
|
||||||
|
|
||||||
|
%install
|
||||||
|
make install DESTDIR=%{buildroot}
|
||||||
|
|
||||||
|
mkdir -p -m755 %{buildroot}%{_sbindir}
|
||||||
|
mv %{buildroot}%{_bindir}/bitcoind %{buildroot}%{_sbindir}/bitcoind
|
||||||
|
|
||||||
|
# systemd stuff
|
||||||
|
mkdir -p %{buildroot}%{_tmpfilesdir}
|
||||||
|
cat <<EOF > %{buildroot}%{_tmpfilesdir}/bitcoin.conf
|
||||||
|
d /run/bitcoind 0750 bitcoin bitcoin -
|
||||||
|
EOF
|
||||||
|
touch -a -m -t 201504280000 %{buildroot}%{_tmpfilesdir}/bitcoin.conf
|
||||||
|
|
||||||
|
mkdir -p %{buildroot}%{_sysconfdir}/sysconfig
|
||||||
|
cat <<EOF > %{buildroot}%{_sysconfdir}/sysconfig/bitcoin
|
||||||
|
# Provide options to the bitcoin daemon here, for example
|
||||||
|
# OPTIONS="-testnet -disable-wallet"
|
||||||
|
|
||||||
|
OPTIONS=""
|
||||||
|
|
||||||
|
# System service defaults.
|
||||||
|
# Don't change these unless you know what you're doing.
|
||||||
|
CONFIG_FILE="%{_sysconfdir}/bitcoin/bitcoin.conf"
|
||||||
|
DATA_DIR="%{_localstatedir}/lib/bitcoin"
|
||||||
|
PID_FILE="/run/bitcoind/bitcoind.pid"
|
||||||
|
EOF
|
||||||
|
touch -a -m -t 201504280000 %{buildroot}%{_sysconfdir}/sysconfig/bitcoin
|
||||||
|
|
||||||
|
mkdir -p %{buildroot}%{_unitdir}
|
||||||
|
cat <<EOF > %{buildroot}%{_unitdir}/bitcoin.service
|
||||||
|
[Unit]
|
||||||
|
Description=Bitcoin daemon
|
||||||
|
After=syslog.target network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=forking
|
||||||
|
ExecStart=%{_sbindir}/bitcoind -daemon -conf=\${CONFIG_FILE} -datadir=\${DATA_DIR} -pid=\${PID_FILE} \$OPTIONS
|
||||||
|
EnvironmentFile=%{_sysconfdir}/sysconfig/bitcoin
|
||||||
|
User=bitcoin
|
||||||
|
Group=bitcoin
|
||||||
|
|
||||||
|
Restart=on-failure
|
||||||
|
PrivateTmp=true
|
||||||
|
TimeoutStopSec=120
|
||||||
|
TimeoutStartSec=60
|
||||||
|
StartLimitInterval=240
|
||||||
|
StartLimitBurst=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
touch -a -m -t 201504280000 %{buildroot}%{_unitdir}/bitcoin.service
|
||||||
|
#end systemd stuff
|
||||||
|
|
||||||
|
mkdir %{buildroot}%{_sysconfdir}/bitcoin
|
||||||
|
mkdir -p %{buildroot}%{_localstatedir}/lib/bitcoin
|
||||||
|
|
||||||
|
#SELinux
|
||||||
|
for selinuxvariant in %{selinux_variants}; do
|
||||||
|
install -d %{buildroot}%{_datadir}/selinux/${selinuxvariant}
|
||||||
|
install -p -m 644 SELinux/bitcoin.pp.${selinuxvariant} %{buildroot}%{_datadir}/selinux/${selinuxvariant}/bitcoin.pp
|
||||||
|
done
|
||||||
|
|
||||||
|
%if %{_buildqt}
|
||||||
|
# qt icons
|
||||||
|
install -D -p share/pixmaps/bitcoin.ico %{buildroot}%{_datadir}/pixmaps/bitcoin.ico
|
||||||
|
install -p share/pixmaps/nsis-header.bmp %{buildroot}%{_datadir}/pixmaps/
|
||||||
|
install -p share/pixmaps/nsis-wizard.bmp %{buildroot}%{_datadir}/pixmaps/
|
||||||
|
install -p %{SOURCE100} %{buildroot}%{_datadir}/pixmaps/bitcoin.svg
|
||||||
|
%{_bindir}/inkscape %{SOURCE100} --export-png=%{buildroot}%{_datadir}/pixmaps/bitcoin16.png -w16 -h16
|
||||||
|
%{_bindir}/inkscape %{SOURCE100} --export-png=%{buildroot}%{_datadir}/pixmaps/bitcoin32.png -w32 -h32
|
||||||
|
%{_bindir}/inkscape %{SOURCE100} --export-png=%{buildroot}%{_datadir}/pixmaps/bitcoin64.png -w64 -h64
|
||||||
|
%{_bindir}/inkscape %{SOURCE100} --export-png=%{buildroot}%{_datadir}/pixmaps/bitcoin128.png -w128 -h128
|
||||||
|
%{_bindir}/inkscape %{SOURCE100} --export-png=%{buildroot}%{_datadir}/pixmaps/bitcoin256.png -w256 -h256
|
||||||
|
%{_bindir}/convert -resize 16x16 %{buildroot}%{_datadir}/pixmaps/bitcoin256.png %{buildroot}%{_datadir}/pixmaps/bitcoin16.xpm
|
||||||
|
%{_bindir}/convert -resize 32x32 %{buildroot}%{_datadir}/pixmaps/bitcoin256.png %{buildroot}%{_datadir}/pixmaps/bitcoin32.xpm
|
||||||
|
%{_bindir}/convert -resize 64x64 %{buildroot}%{_datadir}/pixmaps/bitcoin256.png %{buildroot}%{_datadir}/pixmaps/bitcoin64.xpm
|
||||||
|
%{_bindir}/convert -resize 128x128 %{buildroot}%{_datadir}/pixmaps/bitcoin256.png %{buildroot}%{_datadir}/pixmaps/bitcoin128.xpm
|
||||||
|
%{_bindir}/convert %{buildroot}%{_datadir}/pixmaps/bitcoin256.png %{buildroot}%{_datadir}/pixmaps/bitcoin256.xpm
|
||||||
|
touch %{buildroot}%{_datadir}/pixmaps/*.png -r %{SOURCE100}
|
||||||
|
touch %{buildroot}%{_datadir}/pixmaps/*.xpm -r %{SOURCE100}
|
||||||
|
|
||||||
|
# Desktop File - change the touch timestamp if modifying
|
||||||
|
mkdir -p %{buildroot}%{_datadir}/applications
|
||||||
|
cat <<EOF > %{buildroot}%{_datadir}/applications/bitcoin-core.desktop
|
||||||
|
[Desktop Entry]
|
||||||
|
Encoding=UTF-8
|
||||||
|
Name=Bitcoin
|
||||||
|
Comment=Bitcoin P2P Cryptocurrency
|
||||||
|
Comment[fr]=Bitcoin, monnaie virtuelle cryptographique pair à pair
|
||||||
|
Comment[tr]=Bitcoin, eşten eşe kriptografik sanal para birimi
|
||||||
|
Exec=bitcoin-qt %u
|
||||||
|
Terminal=false
|
||||||
|
Type=Application
|
||||||
|
Icon=bitcoin128
|
||||||
|
MimeType=x-scheme-handler/bitcoin;
|
||||||
|
Categories=Office;Finance;
|
||||||
|
EOF
|
||||||
|
# change touch date when modifying desktop
|
||||||
|
touch -a -m -t 201511100546 %{buildroot}%{_datadir}/applications/bitcoin-core.desktop
|
||||||
|
%{_bindir}/desktop-file-validate %{buildroot}%{_datadir}/applications/bitcoin-core.desktop
|
||||||
|
|
||||||
|
# KDE protocol - change the touch timestamp if modifying
|
||||||
|
mkdir -p %{buildroot}%{_datadir}/kde4/services
|
||||||
|
cat <<EOF > %{buildroot}%{_datadir}/kde4/services/bitcoin-core.protocol
|
||||||
|
[Protocol]
|
||||||
|
exec=bitcoin-qt '%u'
|
||||||
|
protocol=bitcoin
|
||||||
|
input=none
|
||||||
|
output=none
|
||||||
|
helper=true
|
||||||
|
listing=
|
||||||
|
reading=false
|
||||||
|
writing=false
|
||||||
|
makedir=false
|
||||||
|
deleting=false
|
||||||
|
EOF
|
||||||
|
# change touch date when modifying protocol
|
||||||
|
touch -a -m -t 201511100546 %{buildroot}%{_datadir}/kde4/services/bitcoin-core.protocol
|
||||||
|
%endif
|
||||||
|
|
||||||
|
# man pages
|
||||||
|
install -D -p %{SOURCE20} %{buildroot}%{_mandir}/man1/bitcoind.1
|
||||||
|
install -p %{SOURCE21} %{buildroot}%{_mandir}/man1/bitcoin-cli.1
|
||||||
|
%if %{_buildqt}
|
||||||
|
install -p %{SOURCE22} %{buildroot}%{_mandir}/man1/bitcoin-qt.1
|
||||||
|
%endif
|
||||||
|
install -D -p %{SOURCE23} %{buildroot}%{_mandir}/man5/bitcoin.conf.5
|
||||||
|
|
||||||
|
# nuke these, we do extensive testing of binaries in %%check before packaging
|
||||||
|
rm -f %{buildroot}%{_bindir}/test_*
|
||||||
|
|
||||||
|
%check
|
||||||
|
make check
|
||||||
|
pushd src
|
||||||
|
srcdir=. test/bitcoin-util-test.py
|
||||||
|
popd
|
||||||
|
qa/pull-tester/rpc-tests.py -extended
|
||||||
|
|
||||||
|
%post libs -p /sbin/ldconfig
|
||||||
|
|
||||||
|
%postun libs -p /sbin/ldconfig
|
||||||
|
|
||||||
|
%pre server
|
||||||
|
getent group bitcoin >/dev/null || groupadd -r bitcoin
|
||||||
|
getent passwd bitcoin >/dev/null ||
|
||||||
|
useradd -r -g bitcoin -d /var/lib/bitcoin -s /sbin/nologin \
|
||||||
|
-c "Bitcoin wallet server" bitcoin
|
||||||
|
exit 0
|
||||||
|
|
||||||
|
%post server
|
||||||
|
%systemd_post bitcoin.service
|
||||||
|
# SELinux
|
||||||
|
if [ `%{_sbindir}/sestatus |grep -c "disabled"` -eq 0 ]; then
|
||||||
|
for selinuxvariant in %{selinux_variants}; do
|
||||||
|
%{_sbindir}/semodule -s ${selinuxvariant} -i %{_datadir}/selinux/${selinuxvariant}/bitcoin.pp &> /dev/null || :
|
||||||
|
done
|
||||||
|
%{_sbindir}/semanage port -a -t bitcoin_port_t -p tcp 8332
|
||||||
|
%{_sbindir}/semanage port -a -t bitcoin_port_t -p tcp 8333
|
||||||
|
%{_sbindir}/semanage port -a -t bitcoin_port_t -p tcp 18332
|
||||||
|
%{_sbindir}/semanage port -a -t bitcoin_port_t -p tcp 18333
|
||||||
|
%{_sbindir}/fixfiles -R bitcoin-server restore &> /dev/null || :
|
||||||
|
%{_sbindir}/restorecon -R %{_localstatedir}/lib/bitcoin || :
|
||||||
|
fi
|
||||||
|
|
||||||
|
%posttrans server
|
||||||
|
%{_bindir}/systemd-tmpfiles --create
|
||||||
|
|
||||||
|
%preun server
|
||||||
|
%systemd_preun bitcoin.service
|
||||||
|
|
||||||
|
%postun server
|
||||||
|
%systemd_postun bitcoin.service
|
||||||
|
# SELinux
|
||||||
|
if [ $1 -eq 0 ]; then
|
||||||
|
if [ `%{_sbindir}/sestatus |grep -c "disabled"` -eq 0 ]; then
|
||||||
|
%{_sbindir}/semanage port -d -p tcp 8332
|
||||||
|
%{_sbindir}/semanage port -d -p tcp 8333
|
||||||
|
%{_sbindir}/semanage port -d -p tcp 18332
|
||||||
|
%{_sbindir}/semanage port -d -p tcp 18333
|
||||||
|
for selinuxvariant in %{selinux_variants}; do
|
||||||
|
%{_sbindir}/semodule -s ${selinuxvariant} -r bitcoin &> /dev/null || :
|
||||||
|
done
|
||||||
|
%{_sbindir}/fixfiles -R bitcoin-server restore &> /dev/null || :
|
||||||
|
[ -d %{_localstatedir}/lib/bitcoin ] && \
|
||||||
|
%{_sbindir}/restorecon -R %{_localstatedir}/lib/bitcoin &> /dev/null || :
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
%clean
|
||||||
|
rm -rf %{buildroot}
|
||||||
|
|
||||||
|
%if %{_buildqt}
|
||||||
|
%files core
|
||||||
|
%defattr(-,root,root,-)
|
||||||
|
%license COPYING db-%{bdbv}.NC-LICENSE
|
||||||
|
%doc COPYING bitcoin.conf.example doc/README.md doc/bips.md doc/files.md doc/multiwallet-qt.md doc/reduce-traffic.md doc/release-notes.md doc/tor.md
|
||||||
|
%attr(0755,root,root) %{_bindir}/bitcoin-qt
|
||||||
|
%attr(0644,root,root) %{_datadir}/applications/bitcoin-core.desktop
|
||||||
|
%attr(0644,root,root) %{_datadir}/kde4/services/bitcoin-core.protocol
|
||||||
|
%attr(0644,root,root) %{_datadir}/pixmaps/*.ico
|
||||||
|
%attr(0644,root,root) %{_datadir}/pixmaps/*.bmp
|
||||||
|
%attr(0644,root,root) %{_datadir}/pixmaps/*.svg
|
||||||
|
%attr(0644,root,root) %{_datadir}/pixmaps/*.png
|
||||||
|
%attr(0644,root,root) %{_datadir}/pixmaps/*.xpm
|
||||||
|
%attr(0644,root,root) %{_mandir}/man1/bitcoin-qt.1*
|
||||||
|
%endif
|
||||||
|
|
||||||
|
%files libs
|
||||||
|
%defattr(-,root,root,-)
|
||||||
|
%license COPYING
|
||||||
|
%doc COPYING doc/README.md doc/shared-libraries.md
|
||||||
|
%{_libdir}/lib*.so.*
|
||||||
|
|
||||||
|
%files devel
|
||||||
|
%defattr(-,root,root,-)
|
||||||
|
%license COPYING
|
||||||
|
%doc COPYING doc/README.md doc/developer-notes.md doc/shared-libraries.md
|
||||||
|
%attr(0644,root,root) %{_includedir}/*.h
|
||||||
|
%{_libdir}/*.so
|
||||||
|
%{_libdir}/*.a
|
||||||
|
%{_libdir}/*.la
|
||||||
|
%attr(0644,root,root) %{_libdir}/pkgconfig/*.pc
|
||||||
|
|
||||||
|
%files server
|
||||||
|
%defattr(-,root,root,-)
|
||||||
|
%license COPYING db-%{bdbv}.NC-LICENSE
|
||||||
|
%doc COPYING bitcoin.conf.example doc/README.md doc/REST-interface.md doc/bips.md doc/dnsseed-policy.md doc/files.md doc/reduce-traffic.md doc/release-notes.md doc/tor.md
|
||||||
|
%attr(0755,root,root) %{_sbindir}/bitcoind
|
||||||
|
%attr(0644,root,root) %{_tmpfilesdir}/bitcoin.conf
|
||||||
|
%attr(0644,root,root) %{_unitdir}/bitcoin.service
|
||||||
|
%dir %attr(0750,bitcoin,bitcoin) %{_sysconfdir}/bitcoin
|
||||||
|
%dir %attr(0750,bitcoin,bitcoin) %{_localstatedir}/lib/bitcoin
|
||||||
|
%config(noreplace) %attr(0600,root,root) %{_sysconfdir}/sysconfig/bitcoin
|
||||||
|
%attr(0644,root,root) %{_datadir}/selinux/*/*.pp
|
||||||
|
%attr(0644,root,root) %{_mandir}/man1/bitcoind.1*
|
||||||
|
%attr(0644,root,root) %{_mandir}/man5/bitcoin.conf.5*
|
||||||
|
|
||||||
|
%files utils
|
||||||
|
%defattr(-,root,root,-)
|
||||||
|
%license COPYING
|
||||||
|
%doc COPYING bitcoin.conf.example doc/README.md
|
||||||
|
%attr(0755,root,root) %{_bindir}/bitcoin-cli
|
||||||
|
%attr(0755,root,root) %{_bindir}/bitcoin-tx
|
||||||
|
%attr(0755,root,root) %{_bindir}/bench_bitcoin
|
||||||
|
%attr(0644,root,root) %{_mandir}/man1/bitcoin-cli.1*
|
||||||
|
%attr(0644,root,root) %{_mandir}/man5/bitcoin.conf.5*
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
%changelog
|
||||||
|
* Fri Feb 26 2016 Alice Wonder <buildmaster@librelamp.com> - 0.12.0-2
|
||||||
|
- Rename Qt package from bitcoin to bitcoin-core
|
||||||
|
- Make building of the Qt package optional
|
||||||
|
- When building the Qt package, default to Qt5 but allow building
|
||||||
|
- against Qt4
|
||||||
|
- Only run SELinux stuff in post scripts if it is not set to disabled
|
||||||
|
|
||||||
|
* Wed Feb 24 2016 Alice Wonder <buildmaster@librelamp.com> - 0.12.0-1
|
||||||
|
- Initial spec file for 0.12.0 release
|
||||||
|
|
||||||
|
# This spec file is written from scratch but a lot of the packaging decisions are directly
|
||||||
|
# based upon the 0.11.2 package spec file from https://www.ringingliberty.com/bitcoin/
|
81
contrib/rpm/bitcoin.te
Normal file
81
contrib/rpm/bitcoin.te
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
policy_module(bitcoin, 1.100.1)
|
||||||
|
|
||||||
|
########################################
|
||||||
|
#
|
||||||
|
# Declarations
|
||||||
|
#
|
||||||
|
|
||||||
|
type bitcoin_t;
|
||||||
|
type bitcoin_exec_t;
|
||||||
|
init_daemon_domain(bitcoin_t, bitcoin_exec_t)
|
||||||
|
|
||||||
|
permissive bitcoin_t;
|
||||||
|
|
||||||
|
type bitcoin_initrc_exec_t;
|
||||||
|
init_script_file(bitcoin_initrc_exec_t)
|
||||||
|
|
||||||
|
type bitcoin_conf_t;
|
||||||
|
files_type(bitcoin_conf_t)
|
||||||
|
|
||||||
|
type bitcoin_var_lib_t;
|
||||||
|
files_type(bitcoin_var_lib_t)
|
||||||
|
|
||||||
|
type bitcoin_var_run_t;
|
||||||
|
files_type(bitcoin_var_run_t)
|
||||||
|
|
||||||
|
type bitcoin_port_t;
|
||||||
|
corenet_port(bitcoin_port_t)
|
||||||
|
|
||||||
|
########################################
|
||||||
|
#
|
||||||
|
# bitcoin local policy
|
||||||
|
#
|
||||||
|
allow bitcoin_t self:process { fork };
|
||||||
|
|
||||||
|
allow bitcoin_t self:fifo_file rw_fifo_file_perms;
|
||||||
|
allow bitcoin_t self:unix_stream_socket create_stream_socket_perms;
|
||||||
|
|
||||||
|
manage_dirs_pattern(bitcoin_t, bitcoin_conf_t, bitcoin_conf_t)
|
||||||
|
manage_files_pattern(bitcoin_t, bitcoin_conf_t, bitcoin_conf_t)
|
||||||
|
|
||||||
|
manage_dirs_pattern(bitcoin_t, bitcoin_var_lib_t, bitcoin_var_lib_t)
|
||||||
|
manage_files_pattern(bitcoin_t, bitcoin_var_lib_t, bitcoin_var_lib_t)
|
||||||
|
files_var_lib_filetrans(bitcoin_t, bitcoin_var_lib_t, { dir file })
|
||||||
|
|
||||||
|
manage_dirs_pattern(bitcoin_t, bitcoin_var_run_t, bitcoin_var_run_t)
|
||||||
|
manage_files_pattern(bitcoin_t, bitcoin_var_run_t, bitcoin_var_run_t)
|
||||||
|
|
||||||
|
sysnet_dns_name_resolve(bitcoin_t)
|
||||||
|
corenet_all_recvfrom_unlabeled(bitcoin_t)
|
||||||
|
|
||||||
|
allow bitcoin_t self:tcp_socket create_stream_socket_perms;
|
||||||
|
corenet_tcp_sendrecv_generic_if(bitcoin_t)
|
||||||
|
corenet_tcp_sendrecv_generic_node(bitcoin_t)
|
||||||
|
corenet_tcp_sendrecv_all_ports(bitcoin_t)
|
||||||
|
corenet_tcp_bind_generic_node(bitcoin_t)
|
||||||
|
|
||||||
|
gen_require(`
|
||||||
|
type bitcoin_port_t;
|
||||||
|
')
|
||||||
|
allow bitcoin_t bitcoin_port_t:tcp_socket name_bind;
|
||||||
|
|
||||||
|
gen_require(`
|
||||||
|
type bitcoin_port_t;
|
||||||
|
')
|
||||||
|
allow bitcoin_t bitcoin_port_t:tcp_socket name_connect;
|
||||||
|
|
||||||
|
domain_use_interactive_fds(bitcoin_t)
|
||||||
|
|
||||||
|
files_read_etc_files(bitcoin_t)
|
||||||
|
|
||||||
|
miscfiles_read_localization(bitcoin_t)
|
||||||
|
|
||||||
|
sysnet_dns_name_resolve(bitcoin_t)
|
||||||
|
|
||||||
|
allow bitcoin_t bitcoin_exec_t:file execute_no_trans;
|
||||||
|
allow bitcoin_t self:process setsched;
|
||||||
|
corecmd_exec_ls(bitcoin_t)
|
||||||
|
corenet_tcp_connect_http_port(bitcoin_t)
|
||||||
|
dev_read_urand(bitcoin_t)
|
||||||
|
fs_getattr_xattr_fs(bitcoin_t)
|
||||||
|
kernel_read_system_state(bitcoin_t)
|
|
@ -3,6 +3,9 @@
|
||||||
Utility to generate the seeds.txt list that is compiled into the client
|
Utility to generate the seeds.txt list that is compiled into the client
|
||||||
(see [src/chainparamsseeds.h](/src/chainparamsseeds.h) and other utilities in [contrib/seeds](/contrib/seeds)).
|
(see [src/chainparamsseeds.h](/src/chainparamsseeds.h) and other utilities in [contrib/seeds](/contrib/seeds)).
|
||||||
|
|
||||||
The 512 seeds compiled into the 0.10 release were created from sipa's DNS seed data, like this:
|
The seeds compiled into the release are created from sipa's DNS seed data, like this:
|
||||||
|
|
||||||
|
curl -s http://bitcoin.sipa.be/seeds.txt > seeds_main.txt
|
||||||
|
python makeseeds.py < seeds_main.txt > nodes_main.txt
|
||||||
|
python generate-seeds.py . > ../../src/chainparamsseeds.h
|
||||||
|
|
||||||
curl -s http://bitcoin.sipa.be/seeds.txt | makeseeds.py
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#!/usr/bin/python
|
#!/usr/bin/python
|
||||||
# Copyright (c) 2014 Wladmir J. van der Laan
|
# Copyright (c) 2014 Wladimir J. van der Laan
|
||||||
# Distributed under the MIT software license, see the accompanying
|
# Distributed under the MIT software license, see the accompanying
|
||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
'''
|
'''
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
52.27.78.56
|
52.27.78.56:9246
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
### Test Patches ###
|
|
||||||
|
|
||||||
These patches are applied when the automated pull-tester
|
|
||||||
tests each pull and when master is tested using jenkins.
|
|
||||||
You can find more information about the tests run at
|
|
||||||
[http://jenkins.bluematt.me/pull-tester/files/
|
|
||||||
](http://jenkins.bluematt.me/pull-tester/files/)
|
|
|
@ -1,20 +0,0 @@
|
||||||
commit cfae26916dba311f6f75d444301c1f9362267c3e
|
|
||||||
Author: Matt Corallo <git@bluematt.me>
|
|
||||||
Date: Sun Mar 24 20:45:50 2013 -0400
|
|
||||||
|
|
||||||
Revert "Checkpoint at first block in 11 March chain fork"
|
|
||||||
|
|
||||||
This reverts commit f817c496a1482d05b22c8e539de67f07db1c09d9.
|
|
||||||
|
|
||||||
diff --git a/src/checkpoints.cpp b/src/checkpoints.cpp
|
|
||||||
index 62234b9..9b11f0b 100644
|
|
||||||
--- a/src/checkpoints.cpp
|
|
||||||
+++ b/src/checkpoints.cpp
|
|
||||||
@@ -44,7 +44,6 @@ namespace Checkpoints
|
|
||||||
(193000, uint256("0x000000000000059f452a5f7340de6682a977387c17010ff6e6c3bd83ca8b1317"))
|
|
||||||
(210000, uint256("0x000000000000048b95347e83192f69cf0366076336c639f9b7228e9ba171342e"))
|
|
||||||
(216116, uint256("0x00000000000001b4f4b433e81ee46494af945cf96014816a4e2370f11b23df4e"))
|
|
||||||
- (225430, uint256("0x00000000000001c108384350f74090433e7fcf79a606b8e797f065b130575932"))
|
|
||||||
;
|
|
||||||
static const CCheckpointData data = {
|
|
||||||
&mapCheckpoints,
|
|
2
contrib/verify-commits/allow-revsig-commits
Normal file
2
contrib/verify-commits/allow-revsig-commits
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
586a29253dabec3ca0f1ccba9091daabd16b8411
|
||||||
|
eddaba7b5692288087a926da5733e86b47274e4e
|
|
@ -1,15 +1,33 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
INPUT=$(</dev/stdin)
|
INPUT=$(</dev/stdin)
|
||||||
VALID=false
|
VALID=false
|
||||||
|
REVSIG=false
|
||||||
IFS=$'\n'
|
IFS=$'\n'
|
||||||
for LINE in $(echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null); do
|
for LINE in $(echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null); do
|
||||||
case "$LINE" in "[GNUPG:] VALIDSIG"*)
|
case "$LINE" in
|
||||||
|
"[GNUPG:] VALIDSIG "*)
|
||||||
while read KEY; do
|
while read KEY; do
|
||||||
case "$LINE" in "[GNUPG:] VALIDSIG $KEY "*) VALID=true;; esac
|
case "$LINE" in "[GNUPG:] VALIDSIG $KEY "*) VALID=true;; esac
|
||||||
done < ./contrib/verify-commits/trusted-keys
|
done < ./contrib/verify-commits/trusted-keys
|
||||||
|
;;
|
||||||
|
"[GNUPG:] REVKEYSIG "*)
|
||||||
|
[ "$BITCOIN_VERIFY_COMMITS_ALLOW_REVSIG" != 1 ] && exit 1
|
||||||
|
while read KEY; do
|
||||||
|
case "$LINE" in "[GNUPG:] REVKEYSIG ${KEY:24:40} "*)
|
||||||
|
REVSIG=true
|
||||||
|
GOODREVSIG="[GNUPG:] GOODSIG ${KEY:24:40} "
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done < ./contrib/verify-commits/trusted-keys
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
if ! $VALID; then
|
if ! $VALID; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null
|
if $VALID && $REVSIG; then
|
||||||
|
echo "$INPUT" | gpg --trust-model always "$@" | grep "\[GNUPG:\] \(NEWSIG\|SIG_ID\|VALIDSIG\)" 2>/dev/null
|
||||||
|
echo "$GOODREVSIG"
|
||||||
|
else
|
||||||
|
echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null
|
||||||
|
fi
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
if ! [[ "$2" =~ [git@]?[www.]?github.com[:|/]bitcoin/bitcoin[.git]? ]]; then
|
if ! [[ "$2" =~ ^(git@)?(www.)?github.com(:|/)bitcoin/bitcoin(.git)?$ ]]; then
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -3,3 +3,5 @@
|
||||||
01CDF4627A3B88AAE4A571C87588242FBE38D3A8
|
01CDF4627A3B88AAE4A571C87588242FBE38D3A8
|
||||||
AF8BE07C7049F3A26B239D5325B3083201782B2F
|
AF8BE07C7049F3A26B239D5325B3083201782B2F
|
||||||
81291FA67D2C379A006A053FEAB5AF94D9E9ABE7
|
81291FA67D2C379A006A053FEAB5AF94D9E9ABE7
|
||||||
|
3F1888C6DCA92A6499C4911FDBA1A67379A1A931
|
||||||
|
32EE5C4C3FA15CCADB46ABE529D4BCB6416F53EC
|
||||||
|
|
|
@ -7,11 +7,23 @@ git log "$DIR"
|
||||||
|
|
||||||
VERIFIED_ROOT=$(cat "${DIR}/trusted-git-root")
|
VERIFIED_ROOT=$(cat "${DIR}/trusted-git-root")
|
||||||
|
|
||||||
|
IS_REVSIG_ALLOWED () {
|
||||||
|
while read LINE; do
|
||||||
|
[ "$LINE" = "$1" ] && return 0
|
||||||
|
done < "${DIR}/allow-revsig-commits"
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
HAVE_FAILED=false
|
HAVE_FAILED=false
|
||||||
IS_SIGNED () {
|
IS_SIGNED () {
|
||||||
if [ $1 = $VERIFIED_ROOT ]; then
|
if [ $1 = $VERIFIED_ROOT ]; then
|
||||||
return 0;
|
return 0;
|
||||||
fi
|
fi
|
||||||
|
if IS_REVSIG_ALLOWED "$1"; then
|
||||||
|
export BITCOIN_VERIFY_COMMITS_ALLOW_REVSIG=1
|
||||||
|
else
|
||||||
|
export BITCOIN_VERIFY_COMMITS_ALLOW_REVSIG=0
|
||||||
|
fi
|
||||||
if ! git -c "gpg.program=${DIR}/gpg.sh" verify-commit $1 > /dev/null 2>&1; then
|
if ! git -c "gpg.program=${DIR}/gpg.sh" verify-commit $1 > /dev/null 2>&1; then
|
||||||
return 1;
|
return 1;
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
### Verify SF Binaries ###
|
### Verify Binaries ###
|
||||||
This script attempts to download the signature file `SHA256SUMS.asc` from https://bitcoin.org.
|
This script attempts to download the signature file `SHA256SUMS.asc` from https://bitcoin.org.
|
||||||
|
|
||||||
It first checks if the signature passes, and then downloads the files specified in the file, and checks if the hashes of these files match those that are specified in the signature file.
|
It first checks if the signature passes, and then downloads the files specified in the file, and checks if the hashes of these files match those that are specified in the signature file.
|
||||||
|
|
||||||
The script returns 0 if everything passes the checks. It returns 1 if either the signature check or the hash check doesn't pass. If an error occurs the return value is 2.
|
The script returns 0 if everything passes the checks. It returns 1 if either the signature check or the hash check doesn't pass. If an error occurs the return value is 2.
|
||||||
|
|
|
@ -17,15 +17,15 @@ function clean_up {
|
||||||
WORKINGDIR="/tmp/bitcoin"
|
WORKINGDIR="/tmp/bitcoin"
|
||||||
TMPFILE="hashes.tmp"
|
TMPFILE="hashes.tmp"
|
||||||
|
|
||||||
#this URL is used if a version number is not specified as an argument to the script
|
|
||||||
SIGNATUREFILE="https://bitcoin.org/bin/0.9.2.1/SHA256SUMS.asc"
|
|
||||||
|
|
||||||
SIGNATUREFILENAME="SHA256SUMS.asc"
|
SIGNATUREFILENAME="SHA256SUMS.asc"
|
||||||
RCSUBDIR="test/"
|
RCSUBDIR="test/"
|
||||||
BASEDIR="https://bitcoin.org/bin/"
|
BASEDIR="https://bitcoin.org/bin/"
|
||||||
VERSIONPREFIX="bitcoin-"
|
VERSIONPREFIX="bitcoin-core-"
|
||||||
RCVERSIONSTRING="rc"
|
RCVERSIONSTRING="rc"
|
||||||
|
|
||||||
|
#this URL is used if a version number is not specified as an argument to the script
|
||||||
|
SIGNATUREFILE="$BASEDIR""$VERSIONPREFIX""0.10.4/""$RCSUBDIR""$SIGNATUREFILENAME"
|
||||||
|
|
||||||
if [ ! -d "$WORKINGDIR" ]; then
|
if [ ! -d "$WORKINGDIR" ]; then
|
||||||
mkdir "$WORKINGDIR"
|
mkdir "$WORKINGDIR"
|
||||||
fi
|
fi
|
||||||
|
@ -62,7 +62,7 @@ WGETOUT=$(wget -N "$BASEDIR$SIGNATUREFILENAME" 2>&1)
|
||||||
#and then see if wget completed successfully
|
#and then see if wget completed successfully
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
echo "Error: couldn't fetch signature file. Have you specified the version number in the following format?"
|
echo "Error: couldn't fetch signature file. Have you specified the version number in the following format?"
|
||||||
echo "[bitcoin-]<version>-[rc[0-9]] (example: bitcoin-0.9.2-rc1)"
|
echo "[$VERSIONPREFIX]<version>-[$RCVERSIONSTRING[0-9]] (example: "$VERSIONPREFIX"0.10.4-"$RCVERSIONSTRING"1)"
|
||||||
echo "wget output:"
|
echo "wget output:"
|
||||||
echo "$WGETOUT"|sed 's/^/\t/g'
|
echo "$WGETOUT"|sed 's/^/\t/g'
|
||||||
exit 2
|
exit 2
|
||||||
|
@ -82,7 +82,7 @@ if [ $RET -ne 0 ]; then
|
||||||
echo "Bad signature."
|
echo "Bad signature."
|
||||||
elif [ $RET -eq 2 ]; then
|
elif [ $RET -eq 2 ]; then
|
||||||
#or if a gpg error has occurred
|
#or if a gpg error has occurred
|
||||||
echo "gpg error. Do you have Gavin's code signing key installed?"
|
echo "gpg error. Do you have the Bitcoin Core binary release signing key installed?"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "gpg output:"
|
echo "gpg output:"
|
||||||
|
@ -116,4 +116,6 @@ fi
|
||||||
#everything matches! clean up the mess
|
#everything matches! clean up the mess
|
||||||
clean_up $FILES $SIGNATUREFILENAME $TMPFILE
|
clean_up $FILES $SIGNATUREFILENAME $TMPFILE
|
||||||
|
|
||||||
|
echo -e "Verified hashes of \n$FILES"
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
|
|
|
@ -15,6 +15,8 @@ BASEDIR = $(CURDIR)
|
||||||
HASH_LENGTH:=11
|
HASH_LENGTH:=11
|
||||||
DOWNLOAD_CONNECT_TIMEOUT:=10
|
DOWNLOAD_CONNECT_TIMEOUT:=10
|
||||||
DOWNLOAD_RETRIES:=3
|
DOWNLOAD_RETRIES:=3
|
||||||
|
HOST_ID_SALT ?= salt
|
||||||
|
BUILD_ID_SALT ?= salt
|
||||||
|
|
||||||
host:=$(BUILD)
|
host:=$(BUILD)
|
||||||
ifneq ($(HOST),)
|
ifneq ($(HOST),)
|
||||||
|
@ -73,6 +75,20 @@ include builders/$(build_os).mk
|
||||||
include builders/default.mk
|
include builders/default.mk
|
||||||
include packages/packages.mk
|
include packages/packages.mk
|
||||||
|
|
||||||
|
build_id_string:=$(BUILD_ID_SALT)
|
||||||
|
build_id_string+=$(shell $(build_CC) --version 2>/dev/null)
|
||||||
|
build_id_string+=$(shell $(build_AR) --version 2>/dev/null)
|
||||||
|
build_id_string+=$(shell $(build_CXX) --version 2>/dev/null)
|
||||||
|
build_id_string+=$(shell $(build_RANLIB) --version 2>/dev/null)
|
||||||
|
build_id_string+=$(shell $(build_STRIP) --version 2>/dev/null)
|
||||||
|
|
||||||
|
$(host_arch)_$(host_os)_id_string:=$(HOST_ID_SALT)
|
||||||
|
$(host_arch)_$(host_os)_id_string+=$(shell $(host_CC) --version 2>/dev/null)
|
||||||
|
$(host_arch)_$(host_os)_id_string+=$(shell $(host_AR) --version 2>/dev/null)
|
||||||
|
$(host_arch)_$(host_os)_id_string+=$(shell $(host_CXX) --version 2>/dev/null)
|
||||||
|
$(host_arch)_$(host_os)_id_string+=$(shell $(host_RANLIB) --version 2>/dev/null)
|
||||||
|
$(host_arch)_$(host_os)_id_string+=$(shell $(host_STRIP) --version 2>/dev/null)
|
||||||
|
|
||||||
qt_packages_$(NO_QT) = $(qt_packages) $(qt_$(host_os)_packages)
|
qt_packages_$(NO_QT) = $(qt_packages) $(qt_$(host_os)_packages)
|
||||||
qt_native_packages_$(NO_QT) = $(qt_native_packages)
|
qt_native_packages_$(NO_QT) = $(qt_native_packages)
|
||||||
wallet_packages_$(NO_WALLET) = $(wallet_packages)
|
wallet_packages_$(NO_WALLET) = $(wallet_packages)
|
||||||
|
@ -90,7 +106,7 @@ include funcs.mk
|
||||||
|
|
||||||
toolchain_path=$($($(host_arch)_$(host_os)_native_toolchain)_prefixbin)
|
toolchain_path=$($($(host_arch)_$(host_os)_native_toolchain)_prefixbin)
|
||||||
final_build_id_long+=$(shell $(build_SHA256SUM) config.site.in)
|
final_build_id_long+=$(shell $(build_SHA256SUM) config.site.in)
|
||||||
final_build_id+=$(shell echo -n $(final_build_id_long) | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH))
|
final_build_id+=$(shell echo -n "$(final_build_id_long)" | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH))
|
||||||
$(host_prefix)/.stamp_$(final_build_id): $(native_packages) $(packages)
|
$(host_prefix)/.stamp_$(final_build_id): $(native_packages) $(packages)
|
||||||
$(AT)rm -rf $(@D)
|
$(AT)rm -rf $(@D)
|
||||||
$(AT)mkdir -p $(@D)
|
$(AT)mkdir -p $(@D)
|
||||||
|
@ -131,9 +147,9 @@ endef
|
||||||
|
|
||||||
define check_or_remove_sources
|
define check_or_remove_sources
|
||||||
mkdir -p $($(package)_source_dir); cd $($(package)_source_dir); \
|
mkdir -p $($(package)_source_dir); cd $($(package)_source_dir); \
|
||||||
$(build_SHA256SUM) -c $($(package)_fetched) >/dev/null 2>/dev/null || \
|
test -f $($(package)_fetched) && ( $(build_SHA256SUM) -c $($(package)_fetched) >/dev/null 2>/dev/null || \
|
||||||
( if test -f $($(package)_all_sources); then echo "Checksum missing or mismatched for $(package) source. Forcing re-download."; fi; \
|
( echo "Checksum missing or mismatched for $(package) source. Forcing re-download."; \
|
||||||
rm -f $($(package)_all_sources) $($(1)_fetched))
|
rm -f $($(package)_all_sources) $($(1)_fetched))) || true
|
||||||
endef
|
endef
|
||||||
|
|
||||||
check-packages:
|
check-packages:
|
||||||
|
|
|
@ -38,6 +38,8 @@ The following can be set when running make: make FOO=bar
|
||||||
NO_WALLET: Don't download/build/cache libs needed to enable the wallet
|
NO_WALLET: Don't download/build/cache libs needed to enable the wallet
|
||||||
NO_UPNP: Don't download/build/cache packages needed for enabling upnp
|
NO_UPNP: Don't download/build/cache packages needed for enabling upnp
|
||||||
DEBUG: disable some optimizations and enable more runtime checking
|
DEBUG: disable some optimizations and enable more runtime checking
|
||||||
|
HOST_ID_SALT: Optional salt to use when generating host package ids
|
||||||
|
BUILD_ID_SALT: Optional salt to use when generating build package ids
|
||||||
|
|
||||||
If some packages are not built, for example `make NO_WALLET=1`, the appropriate
|
If some packages are not built, for example `make NO_WALLET=1`, the appropriate
|
||||||
options will be passed to bitcoin's configure. In this case, `--disable-wallet`.
|
options will be passed to bitcoin's configure. In this case, `--disable-wallet`.
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue