From b905716763693c867bbadd99630f69269adb6b78 Mon Sep 17 00:00:00 2001 From: 2a5A1Ghu1 <13294167+2a5A1Ghu1@users.noreply.github.com> Date: Sat, 7 Nov 2020 23:06:22 -0800 Subject: [PATCH 01/35] Autotools Build --- .gitignore | 94 ++- DigitalNote.pro | 642 ---------------- Makefile.am | 159 ++++ README.md | 14 +- autogen.sh | 15 + configure.ac | 713 ++++++++++++++++++ contrib/DigitalNote.pro | 26 + contrib/gitian-descriptors/boost-win32.yml | 32 + contrib/gitian-descriptors/deps-win32.yml | 81 ++ contrib/gitian-descriptors/gitian-win32.yml | 56 ++ contrib/gitian-descriptors/gitian.yml | 69 ++ contrib/gitian-descriptors/protobuf-win32.yml | 38 + contrib/gitian-descriptors/qt-win32.yml | 57 ++ contrib/macdeploy/macdeployqtplus | 157 ++-- contrib/macdeploy/notes.txt | 24 +- doc/{readme-qt.rst => readme-qt.md} | 0 pkg.m4 | 201 +++++ qa/pull-tester/build-tests.sh.in | 45 ++ qa/pull-tester/pull-tester.sh | 15 + qa/pull-tester/run-bitcoind-for-test.sh.in | 27 + share/genbuild.sh | 9 +- share/qt/Info.plist | 33 - share/qt/Info.plist.in | 75 ++ share/{setup.nsi => setup.nsi.in} | 69 +- src/MakeFile.am | 48 ++ src/MakeFile.include | 67 ++ src/clientversion.h | 13 +- src/m4/ax_boost_base.m4 | 281 +++++++ src/m4/ax_boost_chrono.m4 | 119 +++ src/m4/ax_boost_filesystem.m4 | 119 +++ src/m4/ax_boost_program_options.m4 | 109 +++ src/m4/ax_boost_system.m4 | 121 +++ src/m4/ax_boost_thread.m4 | 150 ++++ src/m4/ax_boost_unit_test_framework.m4 | 138 ++++ src/m4/ax_check_compile_flag.m4 | 72 ++ src/m4/ax_check_link_flag.m4 | 71 ++ src/m4/ax_check_preproc_flag.m4 | 72 ++ src/m4/ax_pthread.m4 | 332 ++++++++ src/m4/bitcoin_find_bdb48.m4 | 66 ++ src/m4/bitcoin_qt.m4 | 393 ++++++++++ src/m4/bitcoin_subdir_to_include.m4 | 14 + src/main.h | 5 + src/makefile.linux-mingw | 164 ---- src/makefile.mingw | 165 ---- src/makefile.osx | 213 ------ src/makefile.unix | 235 ------ src/qt/addressbookpage.cpp | 4 + src/qt/notificator.h | 4 + src/qt/optionsdialog.cpp | 6 +- src/qt/optionsmodel.cpp | 10 +- .../res/{bitcoin-qt.rc => bitcoin-qt-res.rc} | 0 src/qt/test/MakeFile.am | 25 + src/qt/test/paymentservertests.cpp | 111 +++ src/test/MakeFile.am | 38 + src/util.h | 9 +- 55 files changed, 4217 insertions(+), 1608 deletions(-) delete mode 100644 DigitalNote.pro create mode 100644 Makefile.am create mode 100755 autogen.sh create mode 100644 configure.ac create mode 100644 contrib/DigitalNote.pro create mode 100644 contrib/gitian-descriptors/boost-win32.yml create mode 100644 contrib/gitian-descriptors/deps-win32.yml create mode 100644 contrib/gitian-descriptors/gitian-win32.yml create mode 100644 contrib/gitian-descriptors/gitian.yml create mode 100644 contrib/gitian-descriptors/protobuf-win32.yml create mode 100644 contrib/gitian-descriptors/qt-win32.yml rename doc/{readme-qt.rst => readme-qt.md} (100%) create mode 100644 pkg.m4 create mode 100644 qa/pull-tester/build-tests.sh.in create mode 100644 qa/pull-tester/pull-tester.sh create mode 100644 qa/pull-tester/run-bitcoind-for-test.sh.in delete mode 100644 share/qt/Info.plist create mode 100644 share/qt/Info.plist.in rename share/{setup.nsi => setup.nsi.in} (69%) create mode 100644 src/MakeFile.am create mode 100644 src/MakeFile.include create mode 100644 src/m4/ax_boost_base.m4 create mode 100644 src/m4/ax_boost_chrono.m4 create mode 100644 src/m4/ax_boost_filesystem.m4 create mode 100644 src/m4/ax_boost_program_options.m4 create mode 100644 src/m4/ax_boost_system.m4 create mode 100644 src/m4/ax_boost_thread.m4 create mode 100644 src/m4/ax_boost_unit_test_framework.m4 create mode 100644 src/m4/ax_check_compile_flag.m4 create mode 100644 src/m4/ax_check_link_flag.m4 create mode 100644 src/m4/ax_check_preproc_flag.m4 create mode 100644 src/m4/ax_pthread.m4 create mode 100644 src/m4/bitcoin_find_bdb48.m4 create mode 100644 src/m4/bitcoin_qt.m4 create mode 100644 src/m4/bitcoin_subdir_to_include.m4 delete mode 100644 src/makefile.linux-mingw delete mode 100644 src/makefile.mingw delete mode 100644 src/makefile.osx delete mode 100644 src/makefile.unix rename src/qt/res/{bitcoin-qt.rc => bitcoin-qt-res.rc} (100%) create mode 100644 src/qt/test/MakeFile.am create mode 100644 src/qt/test/paymentservertests.cpp create mode 100644 src/test/MakeFile.am diff --git a/.gitignore b/.gitignore index eeccbcf5..291b20f8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,46 @@ +*.tar.gz + +*.exe src/*.exe -src/DigitalNote -src/DigitalNoted -src/test_DigitalNote -src/build.h +src/*/*.exe +src/bitcoin +src/bitcoind +src/test/test_bitcoin +src/qt/test/test_bitcoin-qt + +Makefile.in +aclocal.m4 +autom4te.cache/ +config.log +config.status +configure +src/.deps/ +src/Makefile.in +src/bitcoin-config.h +src/bitcoin-config.h.in +src/build-aux/ +src/qt/Makefile.in +src/stamp-h1 +share/setup.nsi +share/qt/Info.plist + +src/leveldb/.deps/ + +src/test/.deps +src/test/.dirstamp + +src/qt/.deps/ +src/qt/.dirstamp +src/qt/*.moc +src/qt/moc_*.cpp +src/qt/forms/ui_*.h + +src/qt/test/.deps/ +src/qt/test/.dirstamp +src/qt/test/moc*.cpp +src/qt/res/.deps/ +src/qt/res/.dirstamp + .*.swp *.*~* *.bak @@ -10,19 +48,47 @@ src/build.h *.orig *.o *.patch -.DigitalNote -#compilation and Qt preprocessor part -.qmake.stash +.bitcoin +*.a +*.pb.cc +*.pb.h + +*.log +*.trs +*.dmg + +# Compilation and Qt preprocessor part +*.qm Makefile -DigitalNote-qt -DigitalNote-Qt.dmg -DigitalNote-Qt.app -#resources cpp +bitcoin-qt +Bitcoin-Qt.app + +# Unit-tests +Makefile.test +bitcoin-qt_test + +# Resources cpp qrc_*.cpp -#qt creator + +# Qt creator *.pro.user -#mac specific + +# Mac specific .DS_Store build -!src/leveldb/Makefile \ No newline at end of file +#lcov +*.gcno +/*.info +test_bitcoin.coverage/ +total.coverage/ +coverage_percent.txt + +#build tests +linux-coverage-build +linux-build +win32-build +qa/pull-tester/run-bitcoind-for-test.sh +qa/pull-tester/build-tests.sh + +!src/leveldb-*/Makefile \ No newline at end of file diff --git a/DigitalNote.pro b/DigitalNote.pro deleted file mode 100644 index bc95b7e0..00000000 --- a/DigitalNote.pro +++ /dev/null @@ -1,642 +0,0 @@ -TEMPLATE = app -TARGET = DigitalNote-qt -VERSION = 1.0.3.4 -INCLUDEPATH += src src/json src/qt src/qt/plugins/mrichtexteditor -QT += core gui widgets network printsupport -DEFINES += ENABLE_WALLET -DEFINES += QT_GUI BOOST_THREAD_USE_LIB BOOST_SPIRIT_THREADSAFE -CONFIG += no_include_pwd -CONFIG += thread -CONFIG += widgets -CONFIG += static -CONFIG += openssl - -greaterThan(QT_MAJOR_VERSION, 4) { - QT += widgets - DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 -} - -win32{ -BOOST_LIB_SUFFIX=-mgw8-mt-s-x32-1_74 -BOOST_INCLUDE_PATH=C:/deps/boost_1_74_0 -BOOST_LIB_PATH=C:/deps/boost_1_74_0/stage/lib -BDB_INCLUDE_PATH=C:/deps/db-6.2.32.NC/build_unix -BDB_LIB_PATH=C:/deps/db-6.2.32.NC/build_unix -OPENSSL_INCLUDE_PATH=C:/deps/openssl-1.0.2u/include -OPENSSL_LIB_PATH=C:/deps/openssl-1.0.2u -MINIUPNPC_INCLUDE_PATH=C:/deps/ -MINIUPNPC_LIB_PATH=C:/deps/miniupnpc-2.1 -QRENCODE_INCLUDE_PATH=C:/deps/qrencode-4.0.2 -QRENCODE_LIB_PATH=C:/deps/qrencode-4.0.2/.libs -SECP256K1_INCLUDE_PATH=C:/deps/secp256k1/include -SECP256K1_LIB_PATH=C:/deps/secp256k1 -} - -# for boost 1.37, add -mt to the boost libraries -# use: qmake BOOST_LIB_SUFFIX=-mt -# for boost thread win32 with _win32 sufix -# use: BOOST_THREAD_LIB_SUFFIX=_win32-... -# or when linking against a specific BerkelyDB version: BDB_LIB_SUFFIX=-4.8 - -# Dependency library locations can be customized with: -# BOOST_INCLUDE_PATH, BOOST_LIB_PATH, BDB_INCLUDE_PATH, -# BDB_LIB_PATH, OPENSSL_INCLUDE_PATH and OPENSSL_LIB_PATH respectively - -# workaround for boost 1.58 -DEFINES += BOOST_VARIANT_USE_RELAXED_GET_BY_DEFAULT - -OBJECTS_DIR = build -MOC_DIR = build -UI_DIR = build - -# use: qmake "RELEASE=1" -contains(RELEASE, 1) { - # Mac: compile for maximum compatibility (10.15, 64-bit) - macx:QMAKE_CXXFLAGS += -mmacosx-version-min=10.13 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk - macx:QMAKE_CFLAGS += -mmacosx-version-min=10.13 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk - macx:QMAKE_LFLAGS += -mmacosx-version-min=10.13 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk - macx:QMAKE_OBJECTIVE_CFLAGS += -mmacosx-version-min=10.13 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk - - - !windows:!macx { - # Linux: static link - # LIBS += -Wl,-Bstatic - } -} - -!win32 { -# for extra security against potential buffer overflows: enable GCCs Stack Smashing Protection -QMAKE_CXXFLAGS *= -fstack-protector-all --param ssp-buffer-size=1 -QMAKE_LFLAGS *= -fstack-protector-all --param ssp-buffer-size=1 -# We need to exclude this for Windows cross compile with MinGW 4.2.x, as it will result in a non-working executable! -# This can be enabled for Windows, when we switch to MinGW >= 4.4.x. -} -# for extra security (see: https://wiki.debian.org/Hardening): this flag is GCC compiler-specific -QMAKE_CXXFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -# for extra security on Windows: enable ASLR and DEP via GCC linker flags -win32:QMAKE_LFLAGS *= -Wl,--dynamicbase -Wl,--nxcompat -# on Windows: enable GCC large address aware linker flag -win32:QMAKE_LFLAGS *= -Wl,--large-address-aware -static -# i686-w64-mingw32 -win32:QMAKE_LFLAGS *= -static-libgcc -static-libstdc++ - -# use: qmake "USE_QRCODE=1" -# libqrencode (http://fukuchi.org/works/qrencode/index.en.html) must be installed for support -contains(USE_QRCODE, 1) { - message(Building with QRCode support) - DEFINES += USE_QRCODE - LIBS += -lqrencode -} - -# use: qmake "USE_UPNP=1" ( enabled by default; default) -# or: qmake "USE_UPNP=0" (disabled by default) -# or: qmake "USE_UPNP=-" (not supported) -# miniupnpc (http://miniupnp.free.fr/files/) must be installed for support -contains(USE_UPNP, -) { -message(Building without UPNP support) -} else { -message(Building with UPNP support) -count(USE_UPNP, 0) { -USE_UPNP=1 -} -DEFINES += DMINIUPNP_STATICLIB -INCLUDEPATH += $$MINIUPNPC_INCLUDE_PATH -LIBS += $$join(MINIUPNPC_LIB_PATH,,-L,) -lminiupnpc -win32:LIBS += -liphlpapi -} - -USE_DBUS=0 -# use: qmake "USE_DBUS=1" or qmake "USE_DBUS=0" -linux:count(USE_DBUS, 0) { - USE_DBUS=1 -} -contains(USE_DBUS, 1) { - message(Building with DBUS (Freedesktop notifications) support) - DEFINES += USE_DBUS - QT += dbus -} - -contains(BITCOIN_NEED_QT_PLUGINS, 1) { - DEFINES += BITCOIN_NEED_QT_PLUGINS - QTPLUGIN += qcncodecs qjpcodecs qtwcodecs qkrcodecs qtaccessiblewidgets -} - - -#Build Leveldb -INCLUDEPATH += src/leveldb/include src/leveldb/helpers -LIBS += $$PWD/src/leveldb/libleveldb.a $$PWD/src/leveldb/libmemenv.a -SOURCES += src/txdb-leveldb.cpp -!win32 { - # we use QMAKE_CXXFLAGS_RELEASE even without RELEASE=1 because we use RELEASE to indicate linking preferences not -O preferences - genleveldb.commands = cd $$PWD/src/leveldb && CC=$$QMAKE_CC CXX=$$QMAKE_CXX $(MAKE) OPT=\"$$QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS_RELEASE\" libleveldb.a libmemenv.a -} else { - # make an educated guess about what the ranlib command is called - isEmpty(QMAKE_RANLIB) { - QMAKE_RANLIB = $$replace(QMAKE_STRIP, strip, ranlib) - } - LIBS += -lshlwapi - # genleveldb.commands = cd $$PWD/src/leveldb && chmod 755 ./build_detect_platform && CC=$$QMAKE_CC CXX=$$QMAKE_CXX TARGET_OS=OS_WINDOWS_CROSSCOMPILE $(MAKE) OPT=\"$$QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS_RELEASE\" libleveldb.a libmemenv.a && $$QMAKE_RANLIB $$PWD/src/leveldb/libleveldb.a && $$QMAKE_RANLIB $$PWD/src/leveldb/libmemenv.a -} -genleveldb.target = $$PWD/src/leveldb/libleveldb.a -genleveldb.depends = FORCE -PRE_TARGETDEPS += $$PWD/src/leveldb/libleveldb.a -QMAKE_EXTRA_TARGETS += genleveldb -# Gross ugly hack that depends on qmake internals, unfortunately there is no other way to do it. -# QMAKE_CLEAN += $$PWD/src/leveldb/libleveldb.a; cd $$PWD/src/leveldb ; $(MAKE) clean - - -#Build Secp256k1 -INCLUDEPATH += src/secp256k1/include -LIBS += $$PWD/src/secp256k1/src/libsecp256k1_la-secp256k1.o -!win32 { - # we use QMAKE_CXXFLAGS_RELEASE even without RELEASE=1 because we use RELEASE to indicate linking preferences not -O preferences - gensecp256k1.commands = cd $$PWD/src/secp256k1 && chmod 755 ./autogen.sh && ./autogen.sh && ./configure --enable-module-recovery && CC=$$QMAKE_CC CXX=$$QMAKE_CXX $(MAKE) OPT=\"$$QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS_RELEASE\" -} -gensecp256k1.target = $$PWD/src/secp256k1/src/libsecp256k1_la-secp256k1.o -gensecp256k1.depends = FORCE -PRE_TARGETDEPS += $$PWD/src/secp256k1/src/libsecp256k1_la-secp256k1.o -QMAKE_EXTRA_TARGETS += gensecp256k1 - -# Gross ugly hack that depends on qmake internals, unfortunately there is no other way to do it. -# QMAKE_CLEAN += $$PWD/src/secp256k1/src/libsecp256k1_la-secp256k1.o; cd $$PWD/src/secp256k1; $(MAKE) clean - -# regenerate src/build.h -!windows|contains(USE_BUILD_INFO, 1) { - genbuild.depends = FORCE - genbuild.commands = cd $$PWD; /bin/sh share/genbuild.sh $$OUT_PWD/build/build.h - genbuild.target = $$OUT_PWD/build/build.h - PRE_TARGETDEPS += $$OUT_PWD/build/build.h - QMAKE_EXTRA_TARGETS += genbuild - DEFINES += HAVE_BUILD_INFO -} - -contains(USE_O3, 1) { - message(Building O3 optimization flag) - QMAKE_CXXFLAGS_RELEASE -= -O2 - QMAKE_CFLAGS_RELEASE -= -O2 - QMAKE_CXXFLAGS += -O3 - QMAKE_CFLAGS += -O3 -} - -contains(USE_O0, 1) { - message(Building O0 optimization flag) - QMAKE_CXXFLAGS_RELEASE -= -O2 - QMAKE_CFLAGS_RELEASE -= -O2 - QMAKE_CXXFLAGS += -O0 - QMAKE_CFLAGS += -O0 -} - -*-g++-32 { - message("32 platform, adding -msse2 flag") - - QMAKE_CXXFLAGS += -msse2 - QMAKE_CFLAGS += -msse2 -} - -QMAKE_CXXFLAGS_WARN_ON = -fdiagnostics-show-option -Wall -Wextra -Wno-ignored-qualifiers -Wformat -Wformat-security -Wno-unused-parameter -Wstack-protector -QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-variable -fpermissive - -windows:QMAKE_CXXFLAGS_WARN_ON += -Wno-cpp -Wno-maybe-uninitialized -!macx:QMAKE_CXXFLAGS_WARN_ON += -Wno-unused-local-typedefs -macx:QMAKE_CXXFLAGS_WARN_ON += -Wno-deprecated-declarations - -# Input -DEPENDPATH += src src/json src/qt -HEADERS += src/qt/bitcoingui.h \ - src/qt/transactiontablemodel.h \ - src/qt/addresstablemodel.h \ - src/qt/bantablemodel.h \ - src/qt/optionsdialog.h \ - src/qt/coincontroldialog.h \ - src/qt/coincontroltreewidget.h \ - src/qt/sendcoinsdialog.h \ - src/qt/addressbookpage.h \ - src/qt/signverifymessagedialog.h \ - src/qt/aboutdialog.h \ - src/qt/editaddressdialog.h \ - src/qt/importprivatekeydialog.h \ - src/qt/editconfigdialog.h \ - src/qt/bitcoinaddressvalidator.h \ - src/alert.h \ - src/blocksizecalculator.h \ - src/allocators.h \ - src/addrman.h \ - src/base58.h \ - src/bignum.h \ - src/blockparams.h \ - src/chainparams.h \ - src/chainparamsseeds.h \ - src/checkpoints.h \ - src/compat.h \ - src/coincontrol.h \ - src/fork.h \ - src/genesis.h \ - src/mining.h \ - src/sync.h \ - src/util.h \ - src/hash.h \ - src/uint256.h \ - src/kernel.h \ - src/pbkdf2.h \ - src/serialize.h \ - src/support/cleanse.h \ - src/chain.h \ - src/main.h \ - src/miner.h \ - src/net.h \ - src/ecwrapper.h \ - src/key.h \ - src/pubkey.h \ - src/db.h \ - src/txdb.h \ - src/txmempool.h \ - src/walletdb.h \ - src/script.h \ - src/scrypt.h \ - src/init.h \ - src/mruset.h \ - src/json/json_spirit_writer_template.h \ - src/json/json_spirit_writer.h \ - src/json/json_spirit_value.h \ - src/json/json_spirit_utils.h \ - src/json/json_spirit_stream_reader.h \ - src/json/json_spirit_reader_template.h \ - src/json/json_spirit_reader.h \ - src/json/json_spirit_error_position.h \ - src/json/json_spirit.h \ - src/qt/clientmodel.h \ - src/qt/guiutil.h \ - src/qt/transactionrecord.h \ - src/qt/guiconstants.h \ - src/qt/optionsmodel.h \ - src/qt/monitoreddatamapper.h \ - src/qt/peertablemodel.h \ - src/qt/trafficgraphwidget.h \ - src/qt/transactiondesc.h \ - src/qt/transactiondescdialog.h \ - src/qt/bitcoinamountfield.h \ - src/wallet.h \ - src/keystore.h \ - src/qt/transactionfilterproxy.h \ - src/qt/transactionview.h \ - src/qt/walletmodel.h \ - src/qt/walletmodeltransaction.h \ - src/rpcclient.h \ - src/rpcprotocol.h \ - src/rpcserver.h \ - src/rpcvelocity.h \ - src/limitedmap.h \ - src/qt/overviewpage.h \ - src/qt/csvmodelwriter.h \ - src/crypter.h \ - src/qt/sendcoinsentry.h \ - src/qt/qvalidatedlineedit.h \ - src/qt/bitcoinunits.h \ - src/qt/qvaluecombobox.h \ - src/qt/askpassphrasedialog.h \ - src/protocol.h \ - src/qt/notificator.h \ - src/qt/paymentserver.h \ - src/ui_interface.h \ - src/qt/rpcconsole.h \ - src/version.h \ - src/velocity.h \ - src/netbase.h \ - src/clientversion.h \ - src/threadsafety.h \ - src/tinyformat.h \ - src/stealth.h \ - src/qt/flowlayout.h \ - src/masternode.h \ - src/mnengine.h \ - src/instantx.h \ - src/activemasternode.h \ - src/masternodeconfig.h \ - src/masternodeman.h \ - src/masternode-payments.h \ - src/spork.h \ - src/crypto/common/common.h \ - src/crypto/common/hmac_sha256.h \ - src/crypto/common/hmac_sha512.h \ - src/crypto/common/ripemd160.h \ - src/crypto/common/sha1.h \ - src/crypto/common/sha256.h \ - src/crypto/common/sha512.h \ - src/qt/masternodemanager.h \ - src/qt/addeditadrenalinenode.h \ - src/qt/adrenalinenodeconfigdialog.h \ - src/qt/qcustomplot.h \ - src/smessage.h \ - src/webwalletconnector.h \ - src/qt/messagepage.h \ - src/qt/messagemodel.h \ - src/qt/sendmessagesdialog.h \ - src/qt/sendmessagesentry.h \ - src/qt/blockbrowser.h \ - src/qt/plugins/mrichtexteditor/mrichtextedit.h \ - src/qt/qvalidatedtextedit.h \ - src/crypto/common/sph_bmw.h \ - src/crypto/common/sph_echo.h \ - src/crypto/common/sph_types.h \ - src/crypto/bmw/bmw512.h \ - src/crypto/echo/echo512.h \ - src/limitedmap.h - -SOURCES += src/qt/bitcoin.cpp src/qt/bitcoingui.cpp \ - src/qt/transactiontablemodel.cpp \ - src/qt/addresstablemodel.cpp \ - src/qt/bantablemodel.cpp \ - src/qt/optionsdialog.cpp \ - src/qt/sendcoinsdialog.cpp \ - src/qt/coincontroldialog.cpp \ - src/qt/coincontroltreewidget.cpp \ - src/qt/addressbookpage.cpp \ - src/qt/signverifymessagedialog.cpp \ - src/qt/aboutdialog.cpp \ - src/qt/editaddressdialog.cpp \ - src/qt/importprivatekeydialog.cpp \ - src/qt/editconfigdialog.cpp \ - src/qt/bitcoinaddressvalidator.cpp \ - src/alert.cpp \ - src/blocksizecalculator.cpp \ - src/allocators.cpp \ - src/base58.cpp \ - src/blockparams.cpp \ - src/chainparams.cpp \ - src/version.cpp \ - src/velocity.cpp \ - src/sync.cpp \ - src/txmempool.cpp \ - src/util.cpp \ - src/hash.cpp \ - src/netbase.cpp \ - src/ecwrapper.cpp \ - src/key.cpp \ - src/pubkey.cpp \ - src/script.cpp \ - src/scrypt.cpp \ - src/chain.cpp \ - src/main.cpp \ - src/miner.cpp \ - src/init.cpp \ - src/net.cpp \ - src/checkpoints.cpp \ - src/addrman.cpp \ - src/db.cpp \ - src/walletdb.cpp \ - src/qt/clientmodel.cpp \ - src/qt/guiutil.cpp \ - src/qt/transactionrecord.cpp \ - src/qt/optionsmodel.cpp \ - src/qt/monitoreddatamapper.cpp \ - src/qt/peertablemodel.cpp \ - src/qt/trafficgraphwidget.cpp \ - src/qt/transactiondesc.cpp \ - src/qt/transactiondescdialog.cpp \ - src/qt/bitcoinstrings.cpp \ - src/qt/bitcoinamountfield.cpp \ - src/wallet.cpp \ - src/keystore.cpp \ - src/qt/transactionfilterproxy.cpp \ - src/qt/transactionview.cpp \ - src/qt/walletmodel.cpp \ - src/qt/walletmodeltransaction.cpp \ - src/rpcclient.cpp \ - src/rpcprotocol.cpp \ - src/rpcserver.cpp \ - src/rpcdump.cpp \ - src/rpcmisc.cpp \ - src/rpcnet.cpp \ - src/rpcmining.cpp \ - src/rpcvelocity.cpp \ - src/rpcwallet.cpp \ - src/rpcblockchain.cpp \ - src/rpcrawtransaction.cpp \ - src/qt/overviewpage.cpp \ - src/qt/csvmodelwriter.cpp \ - src/crypter.cpp \ - src/qt/sendcoinsentry.cpp \ - src/qt/qvalidatedlineedit.cpp \ - src/qt/bitcoinunits.cpp \ - src/qt/qvaluecombobox.cpp \ - src/qt/askpassphrasedialog.cpp \ - src/protocol.cpp \ - src/qt/notificator.cpp \ - src/qt/paymentserver.cpp \ - src/qt/rpcconsole.cpp \ - src/noui.cpp \ - src/kernel.cpp \ - src/pbkdf2.cpp \ - src/support/cleanse.cpp \ - src/stealth.cpp \ - src/qt/flowlayout.cpp \ - src/masternode.cpp \ - src/mnengine.cpp \ - src/rpcmnengine.cpp \ - src/instantx.cpp \ - src/activemasternode.cpp \ - src/masternodeman.cpp \ - src/masternode-payments.cpp \ - src/spork.cpp \ - src/masternodeconfig.cpp \ - src/crypto/common/hmac_sha256.cpp \ - src/crypto/common/hmac_sha512.cpp \ - src/crypto/common/ripemd160.cpp \ - src/crypto/common/sha1.cpp \ - src/crypto/common/sha256.cpp \ - src/crypto/common/sha512.cpp \ - src/qt/masternodemanager.cpp \ - src/qt/addeditadrenalinenode.cpp \ - src/qt/adrenalinenodeconfigdialog.cpp \ - src/qt/qcustomplot.cpp \ - src/smessage.cpp \ - src/webwalletconnector.cpp \ - src/qt/messagepage.cpp \ - src/qt/messagemodel.cpp \ - src/qt/sendmessagesdialog.cpp \ - src/qt/sendmessagesentry.cpp \ - src/qt/blockbrowser.cpp \ - src/qt/qvalidatedtextedit.cpp \ - src/qt/plugins/mrichtexteditor/mrichtextedit.cpp \ - src/rpcsmessage.cpp \ - src/crypto/common/aes_helper.c \ - src/crypto/common/bmw.c \ - src/crypto/common/echo.c - -RESOURCES += \ - src/qt/bitcoin.qrc - -FORMS += \ - src/qt/forms/coincontroldialog.ui \ - src/qt/forms/sendcoinsdialog.ui \ - src/qt/forms/addressbookpage.ui \ - src/qt/forms/signverifymessagedialog.ui \ - src/qt/forms/aboutdialog.ui \ - src/qt/forms/editaddressdialog.ui \ - src/qt/forms/importprivatekeydialog.ui \ - src/qt/forms/editconfigdialog.ui \ - src/qt/forms/transactiondescdialog.ui \ - src/qt/forms/overviewpage.ui \ - src/qt/forms/sendcoinsentry.ui \ - src/qt/forms/askpassphrasedialog.ui \ - src/qt/forms/rpcconsole.ui \ - src/qt/forms/optionsdialog.ui \ - src/qt/forms/masternodemanager.ui \ - src/qt/forms/addeditadrenalinenode.ui \ - src/qt/forms/adrenalinenodeconfigdialog.ui \ - src/qt/forms/messagepage.ui \ - src/qt/forms/sendmessagesentry.ui \ - src/qt/forms/sendmessagesdialog.ui \ - src/qt/forms/blockbrowser.ui \ - src/qt/plugins/mrichtexteditor/mrichtextedit.ui - -contains(USE_QRCODE, 1) { -HEADERS += src/qt/qrcodedialog.h -SOURCES += src/qt/qrcodedialog.cpp -FORMS += src/qt/forms/qrcodedialog.ui -} - -CODECFORTR = UTF-8 - -# for lrelease/lupdate -# also add new translations to src/qt/bitcoin.qrc under translations/ -TRANSLATIONS = $$files(src/qt/locale/bitcoin_*.ts) - -isEmpty(QMAKE_LRELEASE) { - win32:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]\\lrelease.exe - else:QMAKE_LRELEASE = $$[QT_INSTALL_BINS]/lrelease -} -isEmpty(QM_DIR):QM_DIR = $$PWD/src/qt/locale -# automatically build translations, so they can be included in resource file -TSQM.name = lrelease ${QMAKE_FILE_IN} -TSQM.input = TRANSLATIONS -TSQM.output = $$QM_DIR/${QMAKE_FILE_BASE}.qm -TSQM.commands = $$QMAKE_LRELEASE ${QMAKE_FILE_IN} -qm ${QMAKE_FILE_OUT} -TSQM.CONFIG = no_link -QMAKE_EXTRA_COMPILERS += TSQM - -# "Other files" to show in Qt Creator -OTHER_FILES += \ - doc/*.rst doc/*.txt doc/README README.md res/bitcoin-qt.rc - -# platform specific defaults, if not overridden on command line -isEmpty(BOOST_LIB_SUFFIX) { - macx:BOOST_LIB_SUFFIX = -mt - windows:BOOST_LIB_SUFFIX=-mgw49-mt-s-1_57 -} - -isEmpty(BOOST_THREAD_LIB_SUFFIX) { - BOOST_THREAD_LIB_SUFFIX = $$BOOST_LIB_SUFFIX - #win32:BOOST_THREAD_LIB_SUFFIX = _win32$$BOOST_LIB_SUFFIX - #else:BOOST_THREAD_LIB_SUFFIX = $$BOOST_LIB_SUFFIX -} - -isEmpty(BDB_LIB_PATH) { - macx:BDB_LIB_PATH = /usr/local/Cellar/berkeley-db@6.2.32/lib - windows:BDB_LIB_PATH=C:/dev/coindeps32/bdb-4.8/lib -} - -isEmpty(BDB_LIB_SUFFIX) { - macx:BDB_LIB_SUFFIX = -6.2 -} - -isEmpty(BDB_INCLUDE_PATH) { - macx:BDB_INCLUDE_PATH = /usr/local/Cellar/berkeley-db@6.2.32/include - windows:BDB_INCLUDE_PATH=C:/dev/coindeps32/bdb-4.8/include -} - -isEmpty(BOOST_LIB_PATH) { - macx:BOOST_LIB_PATH = /usr/local/Cellar/boost/1.73.0/lib - windows:BOOST_LIB_PATH=C:/dev/coindeps32/boost_1_57_0/lib -} - -isEmpty(BOOST_INCLUDE_PATH) { - macx:BOOST_INCLUDE_PATH = /usr/local/Cellar/boost/1.73.0/include - windows:BOOST_INCLUDE_PATH=C:/dev/coindeps32/boost_1_57_0/include -} - -isEmpty(QRENCODE_LIB_PATH) { - macx:QRENCODE_LIB_PATH = /usr/local/lib - windows:QRENCODE_LIB_PATH=C:/deps/qrencode-3.4.4/.libs -} - -isEmpty(QRENCODE_INCLUDE_PATH) { - macx:QRENCODE_INCLUDE_PATH = /usr/local/include - windows:QRENCODE_INCLUDE_PATH=C:/deps/qrencode-3.4.4/ -} - -isEmpty(MINIUPNPC_LIB_SUFFIX) { - windows:MINIUPNPC_LIB_SUFFIX=-miniupnpc -} - -isEmpty(MINIUPNPC_INCLUDE_PATH) { - macx:MINIUPNPC_INCLUDE_PATH= /usr/local/Cellar/miniupnpc/2.1/include - windows:MINIUPNPC_INCLUDE_PATH=C:/dev/coindeps32/miniupnpc-1.9 -} - -isEmpty(MINIUPNPC_LIB_PATH) { - macx:MINIUPNPC_LIB_PATH= /usr/local/Cellar/miniupnpc/2.1/lib - windows:MINIUPNPC_LIB_PATH=C:/dev/coindeps32/miniupnpc-1.9 -} - -isEmpty(OPENSSL_INCLUDE_PATH) { - macx:OPENSSL_INCLUDE_PATH = /usr/local/Cellar/openssl@1.1/1.1.1g/include - windows:OPENSSL_INCLUDE_PATH=C:/dev/coindeps32/openssl-1.0.1p/include -} - -isEmpty(OPENSSL_LIB_PATH) { - macx:OPENSSL_LIB_PATH = /usr/local/Cellar/openssl@1.1/1.1.1g/lib - windows:OPENSSL_LIB_PATH=C:/dev/coindeps32/openssl-1.0.1p/lib -} - -windows:DEFINES += WIN32 -windows:RC_FILE = src/qt/res/bitcoin-qt.rc - -windows:!contains(MINGW_THREAD_BUGFIX, 0) { - # At least qmake's win32-g++-cross profile is missing the -lmingwthrd - # thread-safety flag. GCC has -mthreads to enable this, but it doesn't - # work with static linking. -lmingwthrd must come BEFORE -lmingw, so - # it is prepended to QMAKE_LIBS_QT_ENTRY. - # It can be turned off with MINGW_THREAD_BUGFIX=0, just in case it causes - # any problems on some untested qmake profile now or in the future. - DEFINES += _MT BOOST_THREAD_PROVIDES_GENERIC_SHARED_MUTEX_ON_WIN - QMAKE_LIBS_QT_ENTRY = -lmingwthrd $$QMAKE_LIBS_QT_ENTRY -} - -macx:HEADERS += src/qt/macdockiconhandler.h src/qt/macnotificationhandler.h -macx:OBJECTIVE_SOURCES += src/qt/macdockiconhandler.mm src/qt/macnotificationhandler.mm -macx:LIBS += -framework Foundation -framework ApplicationServices -framework AppKit -framework CoreServices -macx:DEFINES += MAC_OSX MSG_NOSIGNAL=0 -macx:ICON = src/qt/res/icons/digitalnote.icns -macx:TARGET = "DigitalNote-Qt" -macx:QMAKE_CFLAGS_THREAD += -pthread -macx:QMAKE_LFLAGS_THREAD += -pthread -macx:QMAKE_CXXFLAGS_THREAD += -pthread -macx:QMAKE_INFO_PLIST = share/qt/Info.plist - -# Set libraries and includes at end, to use platform-defined defaults if not overridden -INCLUDEPATH += src/websocketapp -INCLUDEPATH += $$BOOST_INCLUDE_PATH $$BDB_INCLUDE_PATH $$OPENSSL_INCLUDE_PATH $$QRENCODE_INCLUDE_PATH -LIBS += $$join(BOOST_LIB_PATH,,-L,) $$join(BDB_LIB_PATH,,-L,) $$join(OPENSSL_LIB_PATH,,-L,) $$join(QRENCODE_LIB_PATH,,-L,) -LIBS += -lssl -lcrypto -lz -ldb_cxx$$BDB_LIB_SUFFIX -# -lgdi32 has to happen after -lcrypto (see #681) -windows:LIBS += -lws2_32 -lshlwapi -lmswsock -lole32 -loleaut32 -luuid -lgdi32 -pthread -!windows: { - LIBS += -lgmp -levent -} -LIBS += -lboost_system$$BOOST_LIB_SUFFIX -lboost_filesystem$$BOOST_LIB_SUFFIX -lboost_program_options$$BOOST_LIB_SUFFIX -lboost_thread$$BOOST_THREAD_LIB_SUFFIX -LIBS += -lboost_chrono$$BOOST_LIB_SUFFIX - -contains(RELEASE, 1) { - !windows:!macx { - # Linux: turn dynamic linking back on for c/c++ runtime libraries - LIBS += -Wl,-Bdynamic - } -} - -!windows:!macx { - DEFINES += LINUX - LIBS += -lrt -ldl -} - -system($$QMAKE_LRELEASE -silent $$_PRO_FILE_) diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 00000000..edb4168e --- /dev/null +++ b/Makefile.am @@ -0,0 +1,159 @@ +ACLOCAL_AMFLAGS = -I src/m4 +SUBDIRS = src +.PHONY: deploy + +GZIP_ENV="-9n" + +BITCOIND_BIN=$(top_builddir)/src/bitcoind$(EXEEXT) +BITCOIN_QT_BIN=$(top_builddir)/src/qt/bitcoin-qt$(EXEEXT) +BITCOIN_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win32-setup$(EXEEXT) + +OSX_APP=Bitcoin-Qt.app +OSX_DMG=Bitcoin-Qt.dmg +OSX_DEPLOY_SCRIPT=$(top_srcdir)/contrib/macdeploy/macdeployqtplus +OSX_FANCY_PLIST=$(top_srcdir)/contrib/macdeploy/fancy.plist +OSX_INSTALLER_ICONS=$(top_srcdir)/src/qt/res/icons/bitcoin.icns +OSX_PLIST=$(top_srcdir)/share/qt/Info.plist #not installed + +WINDOWS_PACKAGING = $(top_srcdir)/share/pixmaps/bitcoin.ico \ + $(top_srcdir)/share/pixmaps/nsis-header.bmp \ + $(top_srcdir)/share/pixmaps/nsis-wizard.bmp \ + $(top_srcdir)/doc/README_windows.txt + +OSX_PACKAGING = $(OSX_DEPLOY_SCRIPT) $(OSX_FANCY_PLIST) $(OSX_INSTALLER_ICONS) \ + $(top_srcdir)/contrib/macdeploy/background.png + +COVERAGE_INFO = baseline_filtered_combined.info baseline.info block_test.info \ + leveldb_baseline.info test_bitcoin_filtered.info total_coverage.info \ + baseline_filtered.info block_test_filtered.info \ + leveldb_baseline_filtered.info test_bitcoin_coverage.info test_bitcoin.info + +dist-hook: + -$(MAKE) -C $(top_distdir)/src/leveldb clean + -$(GIT) archive --format=tar HEAD -- src/version.cpp | $(AMTAR) -C $(top_distdir) -xf - + +distcheck-hook: + $(MKDIR_P) $(top_distdir)/_build/src/leveldb + cp -rf $(top_srcdir)/src/leveldb/* $(top_distdir)/_build/src/leveldb/ + -$(MAKE) -C $(top_distdir)/_build/src/leveldb clean + +distcleancheck: + @: + +$(BITCOIN_WIN_INSTALLER): $(BITCOIND_BIN) $(BITCOIN_QT_BIN) + $(MAKE) distdir + $(MKDIR_P) $(top_builddir)/release + $(INSTALL_STRIP_PROGRAM) $(top_builddir)/src/bitcoind$(EXEEXT) $(top_builddir)/release + $(INSTALL_STRIP_PROGRAM) $(top_builddir)/src/qt/bitcoin-qt$(EXEEXT) $(top_builddir)/release + @test -f $(MAKENSIS) && $(MAKENSIS) $(top_builddir)/share/setup.nsi || \ + echo error: could not build $@ + +$(BITCOIND_BIN): + make -C $(top_srcdir)/src bitcoind$(EXEEXT) + +$(BITCOIN_QT_BIN): + make -C $(top_srcdir)/src/qt bitcoin-qt$(EXEEXT) + + +$(OSX_APP)/Contents/PkgInfo: + $(MKDIR_P) $(@D) + @echo "APPL????" > $@ + +$(OSX_APP)/Contents/Resources/empty.lproj: + $(MKDIR_P) $(@D) + @touch $@ + +$(OSX_APP)/Contents/Info.plist: $(OSX_PLIST) + $(MKDIR_P) $(@D) + $(INSTALL) $< $@ + +$(OSX_APP)/Contents/Resources/bitcoin.icns: $(OSX_INSTALLER_ICONS) + $(MKDIR_P) $(@D) + $(INSTALL) $< $@ + +$(OSX_APP)/Contents/MacOS/Bitcoin-Qt: $(BITCOIN_QT_BIN) + $(MKDIR_P) $(@D) + $(INSTALL_STRIP_PROGRAM) $< $@ + +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/MacOS/Bitcoin-Qt + +$(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING) + $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -add-qt-tr da,de,es,hu,ru,uk,zh_CN,zh_TW -dmg -fancy $(OSX_FANCY_PLIST) -verbose 2 + rm -rf $(OSX_APP) + + +if TARGET_DARWIN +deploy: $(OSX_DMG) +endif +if TARGET_WINDOWS +deploy: $(BITCOIN_WIN_INSTALLER) +endif + +if USE_LCOV + +baseline.info: + $(LCOV) -c -i -d $(abs_builddir)/src -o $@ + +baseline_filtered.info: baseline.info + $(LCOV) -r $< "/usr/include/*" -o $@ + +leveldb_baseline.info: baseline_filtered.info + $(LCOV) -c -i -d $(abs_builddir)/src/leveldb -b $(abs_builddir)/src/leveldb -o $@ + +leveldb_baseline_filtered.info: leveldb_baseline.info + $(LCOV) -r $< "/usr/include/*" -o $@ + +baseline_filtered_combined.info: leveldb_baseline_filtered.info baseline_filtered.info + $(LCOV) -a leveldb_baseline_filtered.info -a baseline_filtered.info -o $@ + +test_bitcoin.info: baseline_filtered_combined.info + $(MAKE) -C src/ check + $(LCOV) -c -d $(abs_builddir)/src -t test_bitcoin -o $@ + $(LCOV) -z -d $(abs_builddir)/src + $(LCOV) -z -d $(abs_builddir)/src/leveldb + +test_bitcoin_filtered.info: test_bitcoin.info + $(LCOV) -r $< "/usr/include/*" -o $@ + +block_test.info: test_bitcoin_filtered.info + -@TIMEOUT=15 qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -Xmx2G -jar $(JAVA_COMPARISON_TOOL) 1 18444 + $(LCOV) -c -d $(abs_builddir)/src --t BitcoinJBlockTest -o $@ + $(LCOV) -z -d $(abs_builddir)/src + $(LCOV) -z -d $(abs_builddir)/src/leveldb + +block_test_filtered.info: block_test.info + $(LCOV) -r $< "/usr/include/*" -o $@ + +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 $@ + +total_coverage.info: baseline_filtered_combined.info test_bitcoin_filtered.info block_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 + +test_bitcoin.coverage/.dirstamp: test_bitcoin_coverage.info + $(GENHTML) -s $< -o $(@D) + @touch $@ + +total.coverage/.dirstamp: total_coverage.info + $(GENHTML) -s $< -o $(@D) + @touch $@ + +cov: test_bitcoin.coverage/.dirstamp total.coverage/.dirstamp + +endif + +if USE_COMPARISON_TOOL +check-local: + @qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -Xmx2G -jar $(JAVA_COMPARISON_TOOL) 1 18444 +endif + +EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/pull-tester.sh $(WINDOWS_PACKAGING) $(OSX_PACKAGING) + +CLEANFILES = $(OSX_DMG) $(BITCOIN_WIN_INSTALLER) + +.INTERMEDIATE: $(OSX_APP_BUILT) $(COVERAGE_INFO) + +clean-local: + rm -rf test_bitcoin.coverage/ total.coverage/ \ No newline at end of file diff --git a/README.md b/README.md index 477d0e15..285ece8f 100644 --- a/README.md +++ b/README.md @@ -11,11 +11,11 @@ What is the DigitalNote [XDN] Blockchain? DigitalNote is a blockchain project with the goal of offering secured messaging, Darksend, masternodes and an overall pleasing experience to the user. ### Blockchain Technology -The DigitalNote [XDN] Blockchain is an experimental smart contract platform protocol that enables -instant payments to anyone, anywhere in the world in a private, secure manner. +The DigitalNote [XDN] Blockchain is an experimental smart contract platform protocol that enables +instant payments to anyone, anywhere in the world in a private, secure manner. DigitalNote [XDN] uses peer-to-peer blockchain technology developed by DigitalNote to operate -with no central authority: managing transactions, execution of contracts, and -issuing money are carried out collectively by the network. DigitalNote [XDN] is the name of +with no central authority: managing transactions, execution of contracts, and +issuing money are carried out collectively by the network. DigitalNote [XDN] is the name of open source software which enables the use of this protocol. ### Custom Difficulty Retarget Algorithm “VRX” @@ -32,11 +32,11 @@ DigitalNote's proof of stake system utilizes Echo512 which is a super lightweigh Specifications and General info ------------------ -DigitalNote uses +DigitalNote uses libsecp256k1, libgmp, - Boost1.68, OR Boost1.58, + Boost1.68, OR Boost1.58, Openssl1.02r, Berkeley DB 6.2.32, QT5.12.1, @@ -88,7 +88,7 @@ cd ~; git clone https://github.com/DigitalNoteXDN/DigitalNote-2 DigitalNote cd ~; cd ~/DigitalNote/src; chmod a+x obj; chmod a+x leveldb/build_detect_platform; chmod a+x secp256k1; chmod a+x leveldb; chmod a+x ~/DigitalNote/src; chmod a+x ~/DigitalNote; make -f makefile.unix USE_UPNP=-; cd ~; cp -r ~/DigitalNote/src/DigitalNoted /usr/local/bin/DigitalNoted; ``` -### (Optional) Build DigitalNote-QT (GUI wallet) on Linux +### (Optional) Build DigitalNote-QT (GUI wallet) on Linux **All previous steps must be completed first.** diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 00000000..27417daf --- /dev/null +++ b/autogen.sh @@ -0,0 +1,15 @@ +#!/bin/sh +# Copyright (c) 2013-2016 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +set -e +srcdir="$(dirname $0)" +cd "$srcdir" +if [ -z ${LIBTOOLIZE} ] && GLIBTOOLIZE="`which glibtoolize 2>/dev/null`"; then + LIBTOOLIZE="${GLIBTOOLIZE}" + export LIBTOOLIZE +fi +which autoreconf >/dev/null || \ + (echo "configuration failed, please install autoconf first" && exit 1) +autoreconf --install --force --warnings=all diff --git a/configure.ac b/configure.ac new file mode 100644 index 00000000..c6b63314 --- /dev/null +++ b/configure.ac @@ -0,0 +1,713 @@ +dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N) +AC_PREREQ([2.60]) +define(_CLIENT_VERSION_MAJOR, 0) +define(_CLIENT_VERSION_MINOR, 8) +define(_CLIENT_VERSION_REVISION, 99) +define(_CLIENT_VERSION_BUILD, 0) +define(_CLIENT_VERSION_IS_RELEASE, false) +define(_COPYRIGHT_YEAR, 2013) +AC_INIT([Bitcoin],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[info@bitcoin.org],[bitcoin]) +AC_CONFIG_AUX_DIR([src/build-aux]) +AC_CONFIG_MACRO_DIR([src/m4]) +AC_CANONICAL_HOST +AH_TOP([#ifndef BITCOIN_CONFIG_H]) +AH_TOP([#define BITCOIN_CONFIG_H]) +AH_BOTTOM([#endif //BITCOIN_CONFIG_H]) + +# This m4 will only be used if a system copy cannot be found. This is helpful +# on systems where autotools are installed but the pkg-config macros are not in +# a default location. It is currently used for building on OSX where autotools +# are preinstalled but pkg-config comes from macports or homebrew. It should +# probably be removed when building on <= 10.6 is no longer supported. +m4_include([pkg.m4]) + +dnl reset CXXFLAGS if empty (autoconf adds its own defaults otherwise) +: ${CFLAGS=""} +: ${CXXFLAGS=""} + +dnl faketime breaks configure and is only needed for make. Disable it here. +unset FAKETIME + +dnl ============================================================== +dnl Setup for automake +dnl ============================================================== + +AM_INIT_AUTOMAKE([no-define subdir-objects foreign]) + +dnl faketime messes with timestamps and causes configure to be re-run. +dnl --disable-maintainer-mode can be used to bypass this. +AM_MAINTAINER_MODE([enable]) + +dnl make the compilation flags quiet unless V=1 is used +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +AC_ARG_WITH([miniupnpc], + [AS_HELP_STRING([--with-miniupnpc], + [enable UPNP (default is yes if libminiupnpc is found)])], + [use_upnp=$withval], + [use_upnp=auto]) + +AC_ARG_ENABLE([upnp-default], + [AS_HELP_STRING([--enable-upnp-default], + [if UPNP is enabled, turn it on at startup (default is no)])], + [use_upnp_default=$enableval], + [use_upnp_default=no]) + +dnl enable ipv6 support +AC_ARG_ENABLE([ipv6], + [AS_HELP_STRING([--enable-ipv6], + [enable ipv6 (default is yes)])], + [use_ipv6=$enableval], + [use_ipv6=yes]) + +dnl enable qt support +AC_ARG_WITH([qt], + [AS_HELP_STRING([--with-qt], + [enable qt (default is yes)])], + [use_qt=$withval], + [use_qt=yes]) + +dnl compile with full warnings and debugging symbols +AC_ARG_ENABLE(debug, + AS_HELP_STRING([--enable-debug],[compile with debug symbols (default is yes)]), + [use_debug=$enableval], + [use_debug=yes]) + AC_MSG_CHECKING([if compiling with debugging symbols]) + +AC_ARG_ENABLE(tests, + AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]), + [use_tests=$enableval], + [use_tests=yes]) + +AC_ARG_WITH([comparison-tool], + AS_HELP_STRING([with-comparison-tool],[path to java comparison tool (requires --enable-tests)]), + [use_comparison_tool=$withval], + [use_comparison_tool=no]) + +AC_ARG_WITH([qrencode], + [AS_HELP_STRING([--with-qrencode], + [enable QR code support (default is yes if qt is enabled and libqrencode is found)])], + [use_qr=$withval], + [use_qr=auto]) + +AC_ARG_WITH([qtdbus], + [AS_HELP_STRING([--with-qtdbus], + [enable DBus support (default is yes if qt is enabled and QtDBus is found)])], + [use_dbus=$withval], + [use_dbus=auto]) + +AC_ARG_ENABLE([hardening], + [AS_HELP_STRING([--enable-hardening], + [attempt to harden the resulting executables (default is yes)])], + [use_hardening=$enableval], + [use_hardening=yes]) + +AC_ARG_ENABLE([ccache], + [AS_HELP_STRING([--enable-ccache], + [enable building with ccache (default is yes if ccache is found)])], + [use_ccache=$enableval], + [use_ccache=auto]) + +AC_ARG_ENABLE([lcov], + [AS_HELP_STRING([--enable-lcov], + [enable lcov testing (default is no)])], + [use_lcov=yes], + [use_lcov=no]) + +AC_ARG_WITH([qt-incdir],[AS_HELP_STRING([--with-qt-incdir=INC_DIR],[specify qt include path (overridden by pkgconfig)])], [qt_include_path=$withval], []) +AC_ARG_WITH([qt-libdir],[AS_HELP_STRING([--with-qt-libdir=LIB_DIR],[specify qt lib path (overridden by pkgconfig)])], [qt_lib_path=$withval], []) +AC_ARG_WITH([qt-bindir],[AS_HELP_STRING([--with-qt-bindir=BIN_DIR],[specify qt bin path])], [qt_bin_path=$withval], []) +AC_ARG_WITH([qt-plugindir],[AS_HELP_STRING([--with-qt-plugindir=PLUGIN_DIR],[specify qt plugin path (overridden by pkgconfig)])], [qt_plugin_path=$withval], []) +AC_ARG_WITH([protoc-bindir],[AS_HELP_STRING([--with-protoc-bindir=BIN_DIR],[specify protoc bin path])], [protoc_bin_path=$withval], []) + + +AC_CONFIG_SRCDIR([src]) +AC_CONFIG_HEADERS([src/bitcoin-config.h]) + +dnl Checks for programs. +AC_PROG_CXX +AC_PROG_CC +AC_PROG_CPP +AC_PROG_INSTALL +AC_PROG_OBJC +m4_ifdef([AC_PROG_OBJCXX],[AC_PROG_OBJCXX]) +AC_PROG_MKDIR_P +AC_PROG_SED +AC_PATH_TOOL(AR, ar) +AC_PATH_TOOL(RANLIB, ranlib) +AC_PATH_TOOL(WINDRES, windres) +AC_PATH_TOOL(STRIP, strip) +AC_PATH_TOOL(GCOV, gcov) +AC_PATH_PROG(LCOV, lcov) +AC_PATH_PROG(JAVA, java) +AC_PATH_PROG(GENHTML, genhtml) +AC_PATH_PROG([GIT], [git]) +AC_PATH_PROGS([MOC], [moc moc-qt4],, $qt_bin_path:$PATH) +AC_PATH_PROGS([UIC], [uic uic-qt4],, $qt_bin_path:$PATH) +AC_PATH_PROG([RCC], [rcc],, $qt_bin_path:$PATH) +AC_PATH_PROG([LRELEASE], [lrelease],, $qt_bin_path:$PATH) +AC_PATH_PROG([PROTOC], [protoc],, $protoc_bin_path:$PATH) +AC_PATH_PROG(CCACHE,ccache) +PKG_PROG_PKG_CONFIG + +## TODO: Remove these hard-coded paths and flags. They are here for the sake of +## compatibility with the legacy buildsystem. +## +CXXFLAGS="$CXXFLAGS -Wall -Wextra -Wformat -Wformat-security -Wno-unused-parameter" +CPPFLAGS="$CPPFLAGS -DBOOST_SPIRIT_THREADSAFE -DHAVE_BUILD_INFO" +DEBUG_CXXFLAGS="-g -ggdb" +RELEASE_CXXFLAGS="-O2" + +AC_LANG_PUSH([C++]) + +use_pkgconfig=yes +case $host in + *mingw*) + + #pkgconfig does more harm than good with mingw + use_pkgconfig=no + + TARGET_OS=windows + AC_CHECK_LIB([mingwthrd], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([kernel32], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([user32], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([gdi32], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([comdlg32], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([winspool], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([winmm], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([shell32], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([comctl32], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([ole32], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([oleaut32], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([uuid], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([rpcrt4], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([advapi32], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([ws2_32], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([mswsock], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([shlwapi], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([iphlpapi], [main],, AC_MSG_ERROR(lib missing)) + + AC_PATH_PROG([MAKENSIS], [makensis], none) + if test x$MAKENSIS = xnone; then + AC_MSG_WARN("makensis not found. Cannot create installer.") + fi + + CPPFLAGS="$CPPFLAGS -D_MT -DWIN32 -D_WINDOWS -DBOOST_THREAD_USE_LIB" + LEVELDB_TARGET_FLAGS="TARGET_OS=OS_WINDOWS_CROSSCOMPILE" + CXXFLAGS="$CXXFLAGS -w" + ;; + *darwin*) + TARGET_OS=darwin + LEVELDB_TARGET_FLAGS="TARGET_OS=Darwin" + if test x$cross_compiling != xyes; then + AC_CHECK_PROG([PORT],port, port) + if test x$PORT = xport; then + dnl add default macports paths + CPPFLAGS="$CPPFLAGS -I/opt/local/include -I/opt/local/include/db48" + LIBS="$LIBS -L/opt/local/lib -L/opt/local/lib/db48" + fi + + AC_CHECK_PROG([BREW],brew, brew) + if test x$BREW = xbrew; then + dnl add default homebrew paths + openssl_prefix=`$BREW --prefix openssl` + bdb_prefix=`$BREW --prefix berkeley-db4` + export PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH" + CPPFLAGS="$CPPFLAGS -I$bdb_prefix/include" + LIBS="$LIBS -L/$bdb_prefix/lib" + fi + fi + + if test x$use_qt = xyes; then + MOC_DEFS="-DQ_OS_MAC" + base_frameworks="-framework Foundation -framework ApplicationServices -framework AppKit" + AX_CHECK_LINK_FLAG([[$base_frameworks]],[LIBS="$LIBS $base_frameworks"],[AC_MSG_ERROR(could not find base frameworks)]) + fi + + AX_CHECK_COMPILE_FLAG([-mmacosx-version-min=10.5],[RELEASE_CXXFLAGS="$RELEASE_CXXFLAGS -mmacosx-version-min=10.5"]) + AX_CHECK_COMPILE_FLAG([-arch i386],[RELEASE_CXXFLAGS="$RELEASE_CXXFLAGS -arch i386"]) + RELEASE_CXXFLAGS="$RELEASE_CXXFLAGS -O3" + CPPFLAGS="$CPPFLAGS -DMAC_OSX" + TESTDEFS="-DBOOST_TEST_DYN_LINK" + ;; + *) + TESTDEFS="-DBOOST_TEST_DYN_LINK" + ;; +esac + +if test x$use_debug == xyes; then + CXXFLAGS="$DEBUG_CXXFLAGS $CXXFLAGS" +else + CXXFLAGS="$RELEASE_CXXFLAGS $CXXFLAGS" +fi + +if test x$use_comparison_tool != xno; then + AC_SUBST(JAVA_COMPARISON_TOOL, $use_comparison_tool) +fi + +if test x$use_lcov == xyes; then + if test x$LCOV == x; then + AC_MSG_ERROR("lcov testing requested but lcov not found") + fi + if test x$GCOV == x; then + AC_MSG_ERROR("lcov testing requested but gcov not found") + fi + if test x$JAVA == x; then + AC_MSG_ERROR("lcov testing requested but java not found") + fi + if test x$GENHTML == x; then + AC_MSG_ERROR("lcov testing requested but genhtml not found") + fi + if test x$use_comparison_tool == x; then + AC_MSG_ERROR("lcov testing requested but comparison tool was not specified") + fi + LCOV="$LCOV --gcov-tool=$GCOV" + AX_CHECK_COMPILE_FLAG([--coverage],[CXXFLAGS="$CXXFLAGS --coverage"], + [AC_MSG_ERROR("lcov testing requested but --coverage flag does not work")]) +fi + +dnl Require little endian +AC_C_BIGENDIAN([AC_MSG_ERROR("Big Endian not supported")]) + +dnl Check for pthread compile/link requirements +AX_PTHREAD +INCLUDES="$INCLUDES $PTHREAD_CFLAGS" + +# The following macro will add the necessary defines to bitcoin-config.h, but +# they also need to be passed down to any subprojects. Pull the results out of +# the cache and add them to CPPFLAGS. +AC_SYS_LARGEFILE + +if test x$ac_cv_sys_file_offset_bits != x && + test x$ac_cv_sys_file_offset_bits != xno && + test x$ac_cv_sys_file_offset_bits != xunknown; then + CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits" +fi + +if test x$ac_cv_sys_large_files != x && + test x$ac_cv_sys_large_files != xno && + test x$ac_cv_sys_large_files != xunknown; then + CPPFLAGS="$CPPFLAGS -D_LARGE_FILES=$ac_cv_sys_large_files" +fi + +AX_CHECK_LINK_FLAG([[-Wl,--large-address-aware]], [LDFLAGS="$LDFLAGS -Wl,--large-address-aware"]) + +if test x$use_hardening != xno; then + AX_CHECK_COMPILE_FLAG([-Wstack-protector],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wstack-protector"]) + AX_CHECK_COMPILE_FLAG([-fPIE],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fPIE"]) + + AX_CHECK_PREPROC_FLAG([-D_FORTIFY_SOURCE=2],[HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -D_FORTIFY_SOURCE=2"]) + + AX_CHECK_LINK_FLAG([[-Wl,--dynamicbase]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--dynamicbase"]) + AX_CHECK_LINK_FLAG([[-Wl,--nxcompat]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--nxcompat"]) + AX_CHECK_LINK_FLAG([[-Wl,-z,relro]], [LDFLAGS="-Wl,-z,relro"]) + AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [LDFLAGS="-Wl,-z,now"]) + + if test x$TARGET_OS != xwindows; then + # -fstack-protector-all can produce broken binaries with mingw + AX_CHECK_COMPILE_FLAG([-fno-stack-protector],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fno-stack-protector"]) + AX_CHECK_COMPILE_FLAG([-fstack-protector-all],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fstack-protector-all"]) + + # -pie will link successfully with mingw, but it's unsupported and leads to undeterministic binaries + AX_CHECK_LINK_FLAG([[-pie]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -pie"]) + fi + + CXXFLAGS="$CXXFLAGS $HARDENED_CXXFLAGS" + CPPFLAGS="$CPPFLAGS $HARDENED_CPPFLAGS" + LDFLAGS="$LDFLAGS $HARDENED_LDFLAGS" + OBJCXXFLAGS="$CXXFLAGS" +fi + +dnl this flag screws up non-darwin gcc even when the check fails. special-case it. +if test x$TARGET_OS = xdarwin; then + AX_CHECK_LINK_FLAG([[-Wl,-dead_strip]], [LDFLAGS="$LDFLAGS -Wl,-dead_strip"]) +fi + +AC_CHECK_HEADERS([stdio.h stdlib.h unistd.h strings.h sys/types.h sys/stat.h]) + +dnl Check for MSG_NOSIGNAL +AC_MSG_CHECKING(for MSG_NOSIGNAL) +AC_TRY_COMPILE([#include ], + [ int f = MSG_NOSIGNAL; ], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_MSG_NOSIGNAL, 1,[Define this symbol if you have MSG_NOSIGNAL]) ], + [ AC_MSG_RESULT(no)] +) + +dnl Check for libdb_cxx +AC_CHECK_HEADER([db_cxx.h],,AC_MSG_ERROR(libdb_cxx headers missing)) +AC_CHECK_LIB([db_cxx], [main],, AC_MSG_ERROR(libdb_cxx missing)) + +dnl Check for libminiupnpc (optional) +if test x$use_upnp != xno; then + AC_CHECK_LIB([miniupnpc], [main],, [have_miniupnpc=no]) +fi + +dnl Check for boost libs +AX_BOOST_BASE +AX_BOOST_SYSTEM +AX_BOOST_FILESYSTEM +AX_BOOST_PROGRAM_OPTIONS +AX_BOOST_THREAD +AX_BOOST_CHRONO + +if test x$use_tests = xyes; then + AX_BOOST_UNIT_TEST_FRAMEWORK +fi + +BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRAM_OPTIONS_LIB $BOOST_THREAD_LIB" +BOOST_INCLUDES="$BOOST_CPPFLAGS" + +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 a working version is available, else fall back to sleep. sleep was removed +dnl after 1.56. +dnl If neither is available, abort. +dnl If sleep_for is used, boost_chrono becomes a requirement. +if test x$ax_cv_boost_chrono = xyes; then +TEMP_LIBS="$LIBS" +LIBS="$LIBS $BOOST_LIBS $BOOST_CHRONO_LIB" +AC_TRY_LINK([ + #include + #include + ],[ + #if BOOST_VERSION >= 105000 && (!defined(BOOST_HAS_NANOSLEEP) || BOOST_VERSION >= 105200) + boost::this_thread::sleep_for(boost::chrono::milliseconds(0)); + #else + choke me + #endif + ], + [boost_sleep=yes; BOOST_LIBS="$BOOST_LIBS $BOOST_CHRONO_LIB"; + AC_DEFINE(HAVE_WORKING_BOOST_SLEEP_FOR, 1, [Define this symbol if boost sleep_for works])], + [boost_sleep=no]) +LIBS="$TEMP_LIBS" +fi + +if test x$boost_sleep != xyes; then +TEMP_LIBS="$LIBS" +LIBS="$LIBS $BOOST_LIBS" +AC_TRY_LINK([ + #include + #include + #include + ],[ + #if BOOST_VERSION <= 105600 + boost::this_thread::sleep(boost::posix_time::milliseconds(0)); + #else + choke me + #endif + ], + [boost_sleep=yes; AC_DEFINE(HAVE_WORKING_BOOST_SLEEP, 1, [Define this symbol if boost sleep works])], + [boost_sleep=no]) +LIBS="$TEMP_LIBS" +fi + +if test x$boost_sleep != xyes; then + AC_MSG_ERROR(No working boost sleep implementation found) +fi + +if test x$use_pkgconfig = xyes; then + + if test x$PKG_CONFIG == x; then + AC_MSG_ERROR(pkg-config not found.)] + fi + + : #NOP + m4_ifdef( + [PKG_CHECK_MODULES], + [ + PKG_CHECK_MODULES([SSL], [libssl], [INCLUDES="$INCLUDES $SSL_CFLAGS"; LIBS="$LIBS $SSL_LIBS"], [AC_MSG_ERROR(openssl not found.)]) + PKG_CHECK_MODULES([CRYPTO], [libcrypto], [INCLUDES="$INCLUDES $CRYPTO_CFLAGS"; LIBS="$LIBS $CRYPTO_LIBS"], [AC_MSG_ERROR(libcrypto not found.)]) + if test x$use_qt = xyes; then + PKG_CHECK_MODULES([QT], [QtCore QtGui QtNetwork], [QT_INCLUDES="$QT_CFLAGS"; have_qt=yes], [have_qt=no]) + if test x$use_tests = xyes; then + PKG_CHECK_MODULES([QT_TEST], [QtTest], [QT_TEST_INCLUDES="$QT_TEST_CFLAGS"; have_qt_test=yes], [have_qt_test=no]) + fi + if test x$use_dbus != xno; then + PKG_CHECK_MODULES([QT_DBUS], [QtDBus], [QT_DBUS_INCLUDES="$QT_DBUS_CFLAGS"; have_qt_dbus=yes], [have_qt_dbus=no]) + fi + if test x$use_qr != xno; then + PKG_CHECK_MODULES([QR], [libqrencode], [have_qrencode=yes], [have_qrencode=no]) + fi + PKG_CHECK_MODULES([PROTOBUF], [protobuf], [have_protobuf=yes], [AC_MSG_ERROR(libprotobuf not found.)]) + fi + ] + ) +else + AC_CHECK_HEADER([openssl/crypto.h],,AC_MSG_ERROR(libcrypto headers missing)) + AC_CHECK_LIB([crypto], [main],, AC_MSG_ERROR(libcrypto missing)) + + AC_CHECK_HEADER([openssl/ssl.h],, AC_MSG_ERROR(libssl headers missing),) + AC_CHECK_LIB([ssl], [main],, AC_MSG_ERROR(libssl missing)) + + if test x$use_qt = xyes; then + TEMP_LIBS="$LIBS" + LIBS= + if test x$qt_lib_path != x; then + QT_LIBS="$QT_LIBS -L$qt_lib_path" + LIBS="$QT_LIBS" + fi + if test x$qt_plugin_path != x; then + QT_LIBS="$QT_LIBS -L$qt_plugin_path/codecs" + LIBS="$QT_LIBS" + fi + + if test x$TARGET_OS == xwindows; then + AC_CHECK_LIB([imm32], [main],, AC_MSG_ERROR(libimm32 not found. Install it or use --without-qt.)) + fi + + #TODO: These are only needed when they're linked directly to parent libs. It really has nothing to do with windows. + #Instead, check for missing functions in parent libs and assume static if they're absent. + if test x$TARGET_OS == xwindows; then + AC_CHECK_LIB([qcncodecs], [main],, AC_MSG_ERROR(libqcncodecs not found. Install it or use --without-qt.)) + AC_CHECK_LIB([qjpcodecs], [main],, AC_MSG_ERROR(libqjpcodecs not found. Install it or use --without-qt.)) + AC_CHECK_LIB([qkrcodecs], [main],, AC_MSG_ERROR(libqkrcodecs not found. Install it or use --without-qt.)) + AC_CHECK_LIB([qtwcodecs], [main],, AC_MSG_ERROR(libqtwcodecs not found. Install it or use --without-qt.)) + fi + + AC_CHECK_LIB([QtCore], [main],, AC_MSG_ERROR(libQtCore not found. Install it or use --without-qt.)) + AC_CHECK_LIB([QtGui], [main],, AC_MSG_ERROR(libQtGui not found. Install it or use --without-qt.)) + AC_CHECK_LIB([QtNetwork], [main],, AC_MSG_ERROR(libQtNetwork not found. Install it or use --without-qt.)) + AC_CHECK_LIB([protobuf], [main],, AC_MSG_ERROR(libprotobuf not found. Install it or use --without-qt.)) + QT_LIBS="$LIBS" + LIBS="$TEMP_LIBS" + + TEMP_CPPFLAGS="$CPPFLAGS" + if test x$qt_include_path != x; then + QT_INCLUDES="-I$qt_include_path -I$qt_include_path/QtCore -I$qt_include_path/QtGui -I$qt_include_path/QtNetwork -I$qt_include_path/QtTest -I$qt_include_path/QtDBus" + CPPFLAGS="$CPPFLAGS $QT_INCLUDES" + fi + AC_CHECK_HEADER([QtPlugin],, AC_MSG_ERROR(QtCore headers missing. Install them or use --without-qt.),) + AC_CHECK_HEADER([QApplication],, AC_MSG_ERROR(QtGUI headers missing. Install them or use --without-qt.),) + AC_CHECK_HEADER([QLocalSocket],, AC_MSG_ERROR(QtNetwork headers missing. Install them or use --without-qt.),) + + if test x$use_tests = xyes; then + TEMP_LIBS="$LIBS" + LIBS= + if test x$qt_lib_path != x; then + LIBS="-L$qt_lib_path" + fi + AC_CHECK_LIB([QtTest], [main],, have_qt_test=no) + AC_CHECK_HEADER([QTest],, have_qt_test=no) + QT_TEST_LIBS="$LIBS" + LIBS="$TEMP_LIBS" + fi + if test x$use_dbus != xno; then + TEMP_LIBS="$LIBS" + LIBS= + if test x$qt_lib_path != x; then + LIBS="-L$qt_lib_path" + fi + AC_CHECK_LIB([QtDBus], [main],, have_qt_dbus=no) + AC_CHECK_HEADER([QtDBus],, have_qt_dbus=no) + QT_DBUS_LIBS="$LIBS" + LIBS="$TEMP_LIBS" + fi + CPPFLAGS="$TEMP_CPPFLAGS" + if test x$use_qr != xno; then + AC_CHECK_LIB([qrencode], [main],, [have_qrencode=no]) + AC_CHECK_HEADER([qrencode.h],, have_qrencode=no) + fi + fi +fi + +if test x$use_ipv6 = xyes; then + dnl Check for ipv6 build requirements + AC_MSG_CHECKING(for IPV6 build support) + AC_TRY_LINK([ + #if defined(_WINDOWS) + #include + #else + #include + #include + #include + #endif + ],[ + #if !defined(_WINDOWS) + struct in6_addr ipv6Addr; + struct sockaddr_in6 addr; + #endif + int temp = socket(AF_INET6, SOCK_STREAM, 0);], + [AC_MSG_RESULT(yes); have_ipv6=yes; AC_DEFINE(HAVE_IPV6, 1, [Define this symbol if you have ipv6 build support])], + [AC_MSG_RESULT(no)]; have_ipv6=no) +fi +AC_LANG_POP + +if test "x$use_ccache" != "xno"; then + AC_MSG_CHECKING(if ccache should be enabled) + if test x$CCACHE = x; then + if test "x$use_ccache" = "xyes"; then + AC_MSG_ERROR([ccache not found.]); + else + AC_MSG_NOTICE([ccache not found. Falling back to default CC]) + use_ccache=no + fi + else + use_ccache=yes + CC="$ac_cv_path_CCACHE $CC" + CXX="$ac_cv_path_CCACHE $CXX" + fi + AC_MSG_RESULT($use_ccache) +fi + +dnl enable ipv6 support +AC_MSG_CHECKING([if ipv6 should be enabled]) +if test x$have_ipv6 = xno; then + if test x$use_ipv6 = xyes; then + AC_MSG_ERROR("ipv6 requested but cannot be built. use --disable-ipv6") + fi + AC_MSG_RESULT(no) +else + if test x$use_ipv6 = xyes; then + AC_MSG_RESULT(yes) + AC_DEFINE([USE_IPV6],[1],[Define if ipv6 support should be compiled in]) + else + AC_MSG_RESULT(no) + fi +fi + +dnl enable upnp support +AC_MSG_CHECKING([if upnp should be enabled]) +if test x$have_miniupnpc = xno; then + if test x$use_upnp = xyes; then + AC_MSG_ERROR("upnp requested but cannot be built. use --without-miniupnpc") + fi + AC_MSG_RESULT(no) +else + if test x$use_upnp != xno; then + AC_MSG_RESULT(yes) + AC_MSG_CHECKING([if upnp should be on by default]) + use_upnp=yes + upnp_setting=0 + if test x$use_upnp_default != xno; then + use_upnp_default=yes + upnp_setting=1 + fi + AC_MSG_RESULT($use_upnp_default) + AC_DEFINE_UNQUOTED([USE_UPNP],[$upnp_setting],[Define to 1 for upnp runtime support]) + if test x$TARGET_OS = xwindows; then + CPPFLAGS="$CPPFLAGS -DSTATICLIB" + fi + else + AC_MSG_RESULT(no) + fi +fi + +dnl enable qt support +AC_MSG_CHECKING([if qt should be enabled]) +if test x$use_qt = xyes; then + if test x$have_qt = xno; then + AC_MSG_ERROR("qt support requested but qt could not be located. use --without-qt") + fi + if test x$MOC = x; then + AC_MSG_ERROR("qt support requested but moc was not found. use --without-qt") + fi + if test x$PROTOC = x; then + AC_MSG_ERROR("qt support requested but protoc was not found. use --without-qt") + fi + if test x$UIC = x; then + AC_MSG_ERROR("qt support requested but uic was not found. use --without-qt") + fi + if test x$RCC = x; then + AC_MSG_ERROR("qt support requested but rcc was not found. use --without-qt") + fi + if test x$LRELEASE = x; then + AC_MSG_ERROR("qt support requested but lrelease was not found. use --without-qt") + fi + if test x$use_tests = xyes; then + if test x$have_qt_test = xno; then + AC_MSG_ERROR("libQtTest not found. Use --disable-tests or --without-qt.") + fi + fi + if test x$have_qt_dbus = xno; then + use_dbus=no + if test x$use_dbus = xyes; then + AC_MSG_ERROR("libQtDBus not found. Use --without-qtdbus.") + fi + fi + BUILD_QT=qt +else + use_qt=no +fi + +AC_MSG_RESULT($use_qt) + +dnl these are only used when qt is enabled +if test x$use_qt = xyes; then + + dnl enable dbus support + AC_MSG_CHECKING([if dbus should be enabled]) + if test x$use_dbus != xno; then + use_dbus=yes + AC_DEFINE([USE_DBUS],[1],[Define if dbus support should be compiled in]) + else + use_dbus=no + fi + AC_MSG_RESULT($use_dbus) + + dnl enable qr support + AC_MSG_CHECKING([if qr should be enabled]) + if test x$have_qrencode = xno; then + if test x$use_qr == xyes; then + AC_MSG_ERROR("QR support requested but cannot be built. use --without-qrencode") + fi + AC_MSG_RESULT(no) + else + if test x$use_qr != xno; then + AC_MSG_RESULT(yes) + AC_DEFINE([USE_QRCODE],[1],[Define if QR support should be compiled in]) + use_qr=yes + else + AC_MSG_RESULT(no) + fi + fi + + if test x$use_tests = xyes; then + BUILD_TEST_QT="test" + fi +fi + +if test x$use_tests = xyes; then + BUILD_TEST="test" +fi + +AM_CONDITIONAL([TARGET_DARWIN], [test x$TARGET_OS = xdarwin]) +AM_CONDITIONAL([TARGET_WINDOWS], [test x$TARGET_OS = xwindows]) +AM_CONDITIONAL([USE_QRCODE], [test x$use_qr = xyes]) +AM_CONDITIONAL([USE_LCOV],[test x$use_lcov == xyes]) +AM_CONDITIONAL([USE_COMPARISON_TOOL],[test x$use_comparison_tool != xno]) + +AC_DEFINE(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR, [Major 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_BUILD, _CLIENT_VERSION_BUILD, [Version Build]) +AC_DEFINE(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE, [Version is release]) +AC_DEFINE(COPYRIGHT_YEAR, _COPYRIGHT_YEAR, [Version is release]) +AC_SUBST(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR) +AC_SUBST(CLIENT_VERSION_MINOR, _CLIENT_VERSION_MINOR) +AC_SUBST(CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION) +AC_SUBST(CLIENT_VERSION_BUILD, _CLIENT_VERSION_BUILD) +AC_SUBST(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE) +AC_SUBST(COPYRIGHT_YEAR, _COPYRIGHT_YEAR) + + +AC_SUBST(USE_UPNP) +AC_SUBST(USE_QRCODE) +AC_SUBST(USE_IPV6) +AC_SUBST(INCLUDES) +AC_SUBST(BOOST_LIBS) +AC_SUBST(MOC_DEFS) +AC_SUBST(QT_INCLUDES) +AC_SUBST(QT_TEST_LIBS) +AC_SUBST(QT_LIBS) +AC_SUBST(QT_DBUS_LIBS) +AC_SUBST(QT_DBUS_INCLUDES) +AC_SUBST(QT_TEST_INCLUDES) +AC_SUBST(TESTDEFS) +AC_SUBST(LEVELDB_TARGET_FLAGS) +AC_SUBST(BUILD_QT) +AC_SUBST(BUILD_TEST) +AC_SUBST(BUILD_TEST_QT) +AC_CONFIG_FILES([Makefile src/Makefile src/test/Makefile src/qt/Makefile src/qt/test/Makefile share/setup.nsi share/qt/Info.plist]) +AC_CONFIG_FILES([qa/pull-tester/run-bitcoind-for-test.sh],[chmod +x qa/pull-tester/run-bitcoind-for-test.sh]) +AC_CONFIG_FILES([qa/pull-tester/build-tests.sh],[chmod +x qa/pull-tester/build-tests.sh]) +AC_OUTPUT \ No newline at end of file diff --git a/contrib/DigitalNote.pro b/contrib/DigitalNote.pro new file mode 100644 index 00000000..236d75b3 --- /dev/null +++ b/contrib/DigitalNote.pro @@ -0,0 +1,26 @@ +FORMS += \ + src/qt/forms/coincontroldialog.ui \ + src/qt/forms/sendcoinsdialog.ui \ + src/qt/forms/addressbookpage.ui \ + src/qt/forms/signverifymessagedialog.ui \ + src/qt/forms/aboutdialog.ui \ + src/qt/forms/editaddressdialog.ui \ + src/qt/forms/importprivatekeydialog.ui \ + src/qt/forms/editconfigdialog.ui \ + src/qt/forms/transactiondescdialog.ui \ + src/qt/forms/overviewpage.ui \ + src/qt/forms/sendcoinsentry.ui \ + src/qt/forms/askpassphrasedialog.ui \ + src/qt/forms/rpcconsole.ui \ + src/qt/forms/optionsdialog.ui \ + src/qt/forms/masternodemanager.ui \ + src/qt/forms/addeditadrenalinenode.ui \ + src/qt/forms/adrenalinenodeconfigdialog.ui \ + src/qt/forms/messagepage.ui \ + src/qt/forms/sendmessagesentry.ui \ + src/qt/forms/sendmessagesdialog.ui \ + src/qt/forms/blockbrowser.ui \ + src/qt/plugins/mrichtexteditor/mrichtextedit.ui + +RESOURCES += \ + src/qt/bitcoin.qrc \ No newline at end of file diff --git a/contrib/gitian-descriptors/boost-win32.yml b/contrib/gitian-descriptors/boost-win32.yml new file mode 100644 index 00000000..f5be8e1d --- /dev/null +++ b/contrib/gitian-descriptors/boost-win32.yml @@ -0,0 +1,32 @@ +--- +name: "boost" +suites: +- "lucid" +architectures: +- "i386" +packages: +- "mingw32" +- "faketime" +- "zip" +reference_datetime: "2011-01-30 00:00:00" +remotes: [] +files: +- "boost_1_59_0.tar.bz2" +script: | + INSTALLPREFIX="$OUTDIR/staging/boost" + mkdir -p "$INSTALLPREFIX" + tar xjf boost_1_59_0.tar.bz2 + cd boost_1_50_0 + echo "using gcc : 4.4 : i586-mingw32msvc-g++ + : + i586-mingw32msvc-windres + i586-mingw32msvc-ar + -frandom-seed=boost1 + ;" > user-config.jam + ./bootstrap.sh --without-icu + ./bjam toolset=gcc target-os=windows threadapi=win32 threading=multi variant=release link=static --user-config=user-config.jam --without-mpi --without-python -sNO_BZIP2=1 -sNO_ZLIB=1 --layout=tagged --build-type=complete --prefix="$INSTALLPREFIX" $MAKEOPTS install + cd "$INSTALLPREFIX" + export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 + export FAKETIME=$REFERENCE_DATETIME + zip -r boost-win32-1.59.0-gitian3.zip * + cp boost-win32-1.59.0-gitian3.zip $OUTDIR \ No newline at end of file diff --git a/contrib/gitian-descriptors/deps-win32.yml b/contrib/gitian-descriptors/deps-win32.yml new file mode 100644 index 00000000..d7936c30 --- /dev/null +++ b/contrib/gitian-descriptors/deps-win32.yml @@ -0,0 +1,81 @@ +--- +name: "bitcoin-deps" +suites: +- "lucid" +architectures: +- "i386" +packages: +- "mingw32" +- "git-core" +- "zip" +- "faketime" +- "wine" +- "psmisc" +reference_datetime: "2011-01-30 00:00:00" +remotes: [] +files: +- "openssl-1.0.1c.tar.gz" +- "db-4.8.30.NC.tar.gz" +- "miniupnpc-1.6.tar.gz" +- "zlib-1.2.6.tar.gz" +- "libpng-1.5.9.tar.gz" +- "qrencode-3.2.0.tar.bz2" +script: | + # + export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 + export FAKETIME=$REFERENCE_DATETIME + export TZ=UTC + export INSTALLPREFIX=$OUTDIR/staging/deps + export HOST=i586-mingw32msvc + # + mkdir -p $INSTALLPREFIX + tar xzf openssl-1.0.1c.tar.gz + cd openssl-1.0.1c + ./Configure --cross-compile-prefix=$HOST- mingw --openssldir=$INSTALLPREFIX + make + make install_sw + cd .. + # + tar xzf db-4.8.30.NC.tar.gz + cd db-4.8.30.NC/build_unix + ../dist/configure --prefix=$INSTALLPREFIX --enable-mingw --enable-cxx --host=$HOST + make $MAKEOPTS library_build + make install_lib install_include + cd ../.. + # + tar xzf miniupnpc-1.6.tar.gz + cd miniupnpc-1.6 + sed 's/dllwrap -k --driver-name gcc/$(DLLWRAP) -k --driver-name $(CC)/' -i Makefile.mingw + sed 's|wingenminiupnpcstrings $< $@|./wingenminiupnpcstrings $< $@|' -i Makefile.mingw + mkdir -p dll + make -f Makefile.mingw DLLWRAP=$HOST-dllwrap CC=$HOST-gcc AR=$HOST-ar libminiupnpc.a + install -d $INSTALLPREFIX/include/miniupnpc + install *.h $INSTALLPREFIX/include/miniupnpc + install libminiupnpc.a $INSTALLPREFIX/lib + cd .. + # + tar xzf zlib-1.2.6.tar.gz + cd zlib-1.2.6 + CROSS_PREFIX=$HOST- ./configure --prefix=$INSTALLPREFIX --static + make + make install + cd .. + # + tar xzf libpng-1.5.9.tar.gz + cd libpng-1.5.9 + CFLAGS="-I$INSTALLPREFIX/include" LDFLAGS="-L$INSTALLPREFIX/lib" ./configure --disable-shared --prefix=$INSTALLPREFIX --host=$HOST + make $MAKEOPTS + make install + cd .. + # + tar xjf qrencode-3.2.0.tar.bz2 + cd qrencode-3.2.0 + png_CFLAGS="-I$INSTALLPREFIX/include" png_LIBS="-L$INSTALLPREFIX/lib -lpng" ./configure --prefix=$INSTALLPREFIX --host=i586-mingw32msvc + make + make install + cd .. + # + cd $INSTALLPREFIX + zip -r $OUTDIR/bitcoin-deps-0.0.6.zip include lib + # Kill wine processes as gitian won't figure out we are done otherwise + killall wineserver services.exe explorer.exe winedevice.exe \ No newline at end of file diff --git a/contrib/gitian-descriptors/gitian-win32.yml b/contrib/gitian-descriptors/gitian-win32.yml new file mode 100644 index 00000000..7eb8d153 --- /dev/null +++ b/contrib/gitian-descriptors/gitian-win32.yml @@ -0,0 +1,56 @@ +--- +name: "bitcoin" +suites: +- "lucid" +architectures: +- "i386" +packages: +- "mingw32" +- "git-core" +- "unzip" +- "nsis" +- "faketime" +- "autoconf2.13" +- "libtool" +- "automake" +- "pkg-config" + +reference_datetime: "2013-06-01 00:00:00" +remotes: +- "url": "https://github.com/bitcoin/bitcoin.git" + "dir": "bitcoin" +files: +- "qt-win32-4.8.3-gitian-r3.zip" +- "boost-win32-1.50.0-gitian3.zip" +- "bitcoin-deps-0.0.6.zip" +- "protobuf-win32-2.5.0-gitian-r2.zip" +script: | + # + STAGING=$HOME/staging + mkdir -p $STAGING + cd $STAGING + unzip ../build/qt-win32-4.8.3-gitian-r3.zip + unzip ../build/boost-win32-1.50.0-gitian3.zip + unzip ../build/bitcoin-deps-0.0.6.zip + unzip ../build/protobuf-win32-2.5.0-gitian-r2.zip + cd $HOME/build/ + # + cd bitcoin + export PATH=$STAGING/host/bin:$PATH + export TAR_OPTIONS=--mtime=`echo $REFERENCE_DATETIME | awk '{ print $1 }'` + ./autogen.sh + ./configure --disable-debug --bindir=$OUTDIR --prefix=$STAGING --host=i586-mingw32msvc --with-qt-plugindir=$STAGING/plugins --with-qt-incdir=$STAGING/include --with-qt-bindir=$STAGING/host/bin --with-boost=$STAGING --disable-maintainer-mode --with-protoc-bindir=$STAGING/host/bin --disable-dependency-tracking CPPFLAGS="-I$STAGING/include" LDFLAGS="-L$STAGING/lib" CXXFLAGS="-frandom-seed=bitcoin" + make dist + mkdir -p distsrc + cd distsrc + tar --strip-components=1 -xf ../bitcoin-*.tar.* + ./configure --disable-debug --bindir=$OUTDIR --prefix=$STAGING --host=i586-mingw32msvc --with-qt-plugindir=$STAGING/plugins --with-qt-incdir=$STAGING/include --with-qt-bindir=$STAGING/host/bin --with-boost=$STAGING --disable-maintainer-mode --with-protoc-bindir=$STAGING/host/bin --disable-dependency-tracking CPPFLAGS="-I$STAGING/include" LDFLAGS="-L$STAGING/lib" CXXFLAGS="-frandom-seed=bitcoin" + export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 + export FAKETIME=$REFERENCE_DATETIME + export TZ=UTC + make $MAKEOPTS + make deploy + make install-strip + cp -f bitcoin-*setup*.exe $OUTDIR/ + mkdir -p $OUTDIR/src + cp -f ../bitcoin-*.tar.* $OUTDIR/src \ No newline at end of file diff --git a/contrib/gitian-descriptors/gitian.yml b/contrib/gitian-descriptors/gitian.yml new file mode 100644 index 00000000..a6c165a4 --- /dev/null +++ b/contrib/gitian-descriptors/gitian.yml @@ -0,0 +1,69 @@ +--- +name: "bitcoin" +suites: +- "lucid" +architectures: +- "i386" +- "amd64" +packages: +- "libdb4.8++-dev" +- "qt4-qmake" +- "libqt4-dev" +- "libboost-system-dev" +- "libboost-filesystem-dev" +- "libboost-program-options-dev" +- "libboost-thread-dev" +- "libboost-test-dev" +- "libssl-dev" +- "git-core" +- "unzip" +- "pkg-config" +- "libpng12-dev" +- "autoconf2.13" +- "libtool" +- "automake" +- "faketime" +reference_datetime: "2013-06-01 00:00:00" +remotes: +- "url": "https://github.com/bitcoin/bitcoin.git" + "dir": "bitcoin" +files: +- "miniupnpc-1.6.tar.gz" +- "qrencode-3.2.0.tar.bz2" +- "protobuf-2.5.0.tar.bz2" +script: | + STAGING="$HOME/install" + export LIBRARY_PATH="$STAGING/lib" + # + tar xzfm miniupnpc-1.6.tar.gz + cd miniupnpc-1.6 + INSTALLPREFIX=$STAGING make $MAKEOPTS install + cd .. + # + tar xjfm qrencode-3.2.0.tar.bz2 + cd qrencode-3.2.0 + sed -i 's/@LIBPTHREAD@//' libqrencode.pc.in + ./configure --prefix=$STAGING --enable-static --disable-shared + make $MAKEOPTS install + cd .. + # + tar xjfm protobuf-2.5.0.tar.bz2 + cd protobuf-2.5.0 + mkdir -p $STAGING/host/bin + ./configure --prefix=$STAGING --bindir=$STAGING/host/bin --enable-static --disable-shared + make $MAKEOPTS install + cd .. + # + cd bitcoin + export TAR_OPTIONS=--mtime=`echo $REFERENCE_DATETIME | awk '{ print $1 }'` + ./autogen.sh + ./configure --disable-debug --prefix=$STAGING --bindir=$OUTDIR --with-protoc-bindir=$STAGING/host/bin --disable-maintainer-mode --disable-dependency-tracking PKG_CONFIG_PATH="$STAGING/lib/pkgconfig" CPPFLAGS="-I$STAGING/include" LDFLAGS="-L$STAGING/lib" CXXFLAGS="-frandom-seed=bitcoin" + make dist + mkdir -p distsrc + cd distsrc + tar --strip-components=1 -xf ../bitcoin-*.tar.* + ./configure --disable-debug --prefix=$STAGING --bindir=$OUTDIR --with-protoc-bindir=$STAGING/host/bin --disable-maintainer-mode --disable-dependency-tracking PKG_CONFIG_PATH="$STAGING/lib/pkgconfig" CPPFLAGS="-I$STAGING/include" LDFLAGS="-L$STAGING/lib" CXXFLAGS="-frandom-seed=bitcoin" + make $MAKEOPTS + make $MAKEOPTS install-strip + mkdir -p $OUTDIR/src + cp ../bitcoin-*.tar.* $OUTDIR/src \ No newline at end of file diff --git a/contrib/gitian-descriptors/protobuf-win32.yml b/contrib/gitian-descriptors/protobuf-win32.yml new file mode 100644 index 00000000..d347ebe8 --- /dev/null +++ b/contrib/gitian-descriptors/protobuf-win32.yml @@ -0,0 +1,38 @@ +--- +name: "protobuf-win32" +suites: +- "lucid" +architectures: +- "i386" +packages: +- "mingw32" +- "zip" +- "faketime" +reference_datetime: "2013-04-15 00:00:00" +remotes: [] +files: +- "protobuf-2.5.0.tar.bz2" +script: | + # + export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 + export FAKETIME=$REFERENCE_DATETIME + export TZ=UTC + export INSTALLPREFIX=$OUTDIR/staging/deps + export HOST=i586-mingw32msvc + # + # + mkdir -p $INSTALLPREFIX + tar xjf protobuf-2.5.0.tar.bz2 + cd protobuf-2.5.0 + # First: build a native (linux) protoc + ./configure --enable-shared=no --disable-dependency-tracking + make + mkdir -p $INSTALLPREFIX/host/bin + cp src/protoc $INSTALLPREFIX/host/bin + # Now recompile with the mingw cross-compiler: + make distclean + ./configure --prefix=$INSTALLPREFIX --enable-shared=no --disable-dependency-tracking --with-protoc=$INSTALLPREFIX/host/bin/protoc --host=$HOST CXXFLAGS=-frandom-seed=11 + make + make install + cd $INSTALLPREFIX + zip -r $OUTDIR/protobuf-win32-2.5.0-gitian-r2.zip include lib host \ No newline at end of file diff --git a/contrib/gitian-descriptors/qt-win32.yml b/contrib/gitian-descriptors/qt-win32.yml new file mode 100644 index 00000000..e4976438 --- /dev/null +++ b/contrib/gitian-descriptors/qt-win32.yml @@ -0,0 +1,57 @@ +--- +name: "qt" +suites: +- "lucid" +architectures: +- "i386" +packages: +- "mingw32" +- "zip" +- "faketime" +- "unzip" +reference_datetime: "2011-01-30 00:00:00" +remotes: [] +files: +- "qt-everywhere-opensource-src-4.8.3.tar.gz" +- "bitcoin-deps-0.0.6.zip" +script: | + INSTDIR="$HOME/qt/" + mkdir $INSTDIR + mkdir -p $INSTDIR/host/bin + # + # Need mingw-compiled openssl from bitcoin-deps: + unzip bitcoin-deps-0.0.6.zip + DEPSDIR=`pwd` + # + tar xzf qt-everywhere-opensource-src-4.8.3.tar.gz + cd qt-everywhere-opensource-src-4.8.3 + sed 's/$TODAY/2011-01-30/' -i configure + sed 's/i686-pc-mingw32-/i586-mingw32msvc-/' -i mkspecs/unsupported/win32-g++-cross/qmake.conf + sed --posix 's|QMAKE_CFLAGS\t\t= -pipe|QMAKE_CFLAGS\t\t= -pipe -isystem /usr/i586-mingw32msvc/include/ -frandom-seed=qtbuild|' -i mkspecs/unsupported/win32-g++-cross/qmake.conf + sed 's/QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads/QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions/' -i mkspecs/unsupported/win32-g++-cross/qmake.conf + sed 's/QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads/QMAKE_LFLAGS_EXCEPTIONS_ON = -lmingwthrd/' -i mkspecs/unsupported/win32-g++-cross/qmake.conf + sed --posix 's/QMAKE_MOC\t\t= i586-mingw32msvc-moc/QMAKE_MOC\t\t= moc/' -i mkspecs/unsupported/win32-g++-cross/qmake.conf + sed --posix 's/QMAKE_RCC\t\t= i586-mingw32msvc-rcc/QMAKE_RCC\t\t= rcc/' -i mkspecs/unsupported/win32-g++-cross/qmake.conf + sed --posix 's/QMAKE_UIC\t\t= i586-mingw32msvc-uic/QMAKE_UIC\t\t= uic/' -i mkspecs/unsupported/win32-g++-cross/qmake.conf + # ar adds timestamps to every object file included in the static library + # providing -D as ar argument is supposed to solve it, but doesn't work as qmake strips off the arguments and adds -M to pass a script... + # which somehow cannot be combined with other flags. + # use faketime only for ar, as it confuses make/qmake into hanging sometimes + sed --posix "s|QMAKE_LIB\t\t= i586-mingw32msvc-ar -ru|QMAKE_LIB\t\t= $HOME/ar -Dr|" -i mkspecs/unsupported/win32-g++-cross/qmake.conf + echo '#!/bin/bash' > $HOME/ar + echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> $HOME/ar + echo 'i586-mingw32msvc-ar "$@"' >> $HOME/ar + chmod +x $HOME/ar + #export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 + export FAKETIME=$REFERENCE_DATETIME + export TZ=UTC + # Compile static libraries, and use statically linked openssl (-openssl-linked): + OPENSSL_LIBS="-L$DEPSDIR/lib -lssl -lcrypto -lgdi32" ./configure -prefix $INSTDIR -bindir $INSTDIR/host/bin -I $DEPSDIR/include -confirm-license -release -opensource -static -no-qt3support -xplatform unsupported/win32-g++-cross -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-declarative -no-script -no-scripttools -no-javascript-jit -no-webkit -no-svg -no-xmlpatterns -no-sql-sqlite -no-nis -no-cups -no-iconv -no-dbus -no-gif -no-libtiff -no-opengl -nomake examples -nomake demos -nomake docs -no-feature-style-plastique -no-feature-style-cleanlooks -no-feature-style-motif -no-feature-style-cde -no-feature-style-windowsce -no-feature-style-windowsmobile -no-feature-style-s60 -openssl-linked + find . -name *.prl | xargs -l sed 's|/\.||' -i + find . -name *.prl | xargs -l sed 's|/$||' -i + make $MAKEOPTS install + cd $INSTDIR + find . -name *.prl | xargs -l sed 's|/$||' -i + # as zip stores file timestamps, use faketime to intercept stat calls to set dates for all files to reference date + export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 + zip -r $OUTDIR/qt-win32-4.8.3-gitian-r3.zip * \ No newline at end of file diff --git a/contrib/macdeploy/macdeployqtplus b/contrib/macdeploy/macdeployqtplus index 7981eca4..9cd92a12 100644 --- a/contrib/macdeploy/macdeployqtplus +++ b/contrib/macdeploy/macdeployqtplus @@ -39,13 +39,13 @@ class FrameworkInfo(object): self.destinationDirectory = "" self.sourceResourcesDirectory = "" self.destinationResourcesDirectory = "" - + def __eq__(self, other): if self.__class__ == other.__class__: return self.__dict__ == other.__dict__ else: return False - + def __str__(self): return """ Framework name: %s Framework directory: %s @@ -69,51 +69,51 @@ class FrameworkInfo(object): self.deployedInstallName, self.sourceFilePath, self.destinationDirectory) - + def isDylib(self): return self.frameworkName.endswith(".dylib") - + def isQtFramework(self): if self.isDylib(): return self.frameworkName.startswith("libQt") else: return self.frameworkName.startswith("Qt") - + reOLine = re.compile(r'^(.+) \(compatibility version [0-9.]+, current version [0-9.]+\)$') bundleFrameworkDirectory = "Contents/Frameworks" bundleBinaryDirectory = "Contents/MacOS" - + @classmethod def fromOtoolLibraryLine(cls, line): # Note: line must be trimmed if line == "": return None - + # Don't deploy system libraries (exception for libQtuitools and libQtlucene). if line.startswith("/System/Library/") or line.startswith("@executable_path") or (line.startswith("/usr/lib/") and "libQt" not in line): return None - + m = cls.reOLine.match(line) if m is None: raise RuntimeError("otool line could not be parsed: " + line) - + path = m.group(1) - + info = cls() info.sourceFilePath = path info.installName = path - + if path.endswith(".dylib"): dirname, filename = os.path.split(path) info.frameworkName = filename info.frameworkDirectory = dirname info.frameworkPath = path - + info.binaryDirectory = dirname info.binaryName = filename info.binaryPath = path info.version = "-" - + info.installName = path info.deployedInstallName = "@executable_path/../Frameworks/" + info.binaryName info.sourceFilePath = path @@ -128,22 +128,22 @@ class FrameworkInfo(object): i += 1 if i == len(parts): raise RuntimeError("Could not find .framework or .dylib in otool line: " + line) - + info.frameworkName = parts[i] info.frameworkDirectory = "/".join(parts[:i]) info.frameworkPath = os.path.join(info.frameworkDirectory, info.frameworkName) - + info.binaryName = parts[i+3] info.binaryDirectory = "/".join(parts[i+1:i+3]) info.binaryPath = os.path.join(info.binaryDirectory, info.binaryName) info.version = parts[i+2] - + info.deployedInstallName = "@executable_path/../Frameworks/" + os.path.join(info.frameworkName, info.binaryPath) info.destinationDirectory = os.path.join(cls.bundleFrameworkDirectory, info.frameworkName, info.binaryDirectory) - + info.sourceResourcesDirectory = os.path.join(info.frameworkPath, "Resources") info.destinationResourcesDirectory = os.path.join(cls.bundleFrameworkDirectory, info.frameworkName, "Resources") - + return info class ApplicationBundleInfo(object): @@ -161,7 +161,7 @@ class DeploymentInfo(object): self.qtPath = None self.pluginPath = None self.deployedFrameworks = [] - + def detectQtPath(self, frameworkDirectory): parentDir = os.path.dirname(frameworkDirectory) if os.path.exists(os.path.join(parentDir, "translations")): @@ -180,7 +180,7 @@ class DeploymentInfo(object): pluginPath = os.path.join(self.qtPath, "plugins") if os.path.exists(pluginPath): self.pluginPath = pluginPath - + def usesFramework(self, name): nameDot = "%s." % name libNameDot = "lib%s." % name @@ -203,12 +203,12 @@ def getFrameworks(binaryPath, verbose): sys.stderr.write(o_stderr) sys.stderr.flush() raise RuntimeError("otool failed with return code %d" % otool.returncode) - + otoolLines = o_stdout.split("\n") otoolLines.pop(0) # First line is the inspected binary if ".framework" in binaryPath or binaryPath.endswith(".dylib"): otoolLines.pop(0) # Frameworks and dylibs list themselves as a dependency. - + libraries = [] for line in otoolLines: info = FrameworkInfo.fromOtoolLibraryLine(line.strip()) @@ -217,7 +217,7 @@ def getFrameworks(binaryPath, verbose): print "Found framework:" print info libraries.append(info) - + return libraries def runInstallNameTool(action, *args): @@ -253,16 +253,16 @@ def copyFramework(framework, path, verbose): toDir = os.path.join(path, framework.destinationDirectory) toPath = os.path.join(toDir, framework.binaryName) - + if not os.path.exists(fromPath): raise RuntimeError("No file at " + fromPath) - + if os.path.exists(toPath): return None # Already there - + if not os.path.exists(toDir): os.makedirs(toDir) - + shutil.copy2(fromPath, toPath) if verbose >= 3: print "Copied:", fromPath @@ -288,53 +288,53 @@ def copyFramework(framework, path, verbose): if verbose >= 3: print "Copied for libQtGui:", qtMenuNibSourcePath print " to:", qtMenuNibDestinationPath - + return toPath def deployFrameworks(frameworks, bundlePath, binaryPath, strip, verbose, deploymentInfo=None): if deploymentInfo is None: deploymentInfo = DeploymentInfo() - + while len(frameworks) > 0: framework = frameworks.pop(0) deploymentInfo.deployedFrameworks.append(framework.frameworkName) - + if verbose >= 2: print "Processing", framework.frameworkName, "..." - + # Get the Qt path from one of the Qt frameworks if deploymentInfo.qtPath is None and framework.isQtFramework(): deploymentInfo.detectQtPath(framework.frameworkDirectory) - + if framework.installName.startswith("@executable_path"): if verbose >= 2: print framework.frameworkName, "already deployed, skipping." continue - + # install_name_tool the new id into the binary changeInstallName(framework.installName, framework.deployedInstallName, binaryPath, verbose) - + # Copy farmework to app bundle. deployedBinaryPath = copyFramework(framework, bundlePath, verbose) # Skip the rest if already was deployed. if deployedBinaryPath is None: continue - + if strip: runStrip(deployedBinaryPath, verbose) - + # install_name_tool it a new id. changeIdentification(framework.deployedInstallName, deployedBinaryPath, verbose) # Check for framework dependencies dependencies = getFrameworks(deployedBinaryPath, verbose) - + for dependency in dependencies: changeInstallName(dependency.installName, dependency.deployedInstallName, deployedBinaryPath, verbose) - + # Deploy framework if necessary. if dependency.frameworkName not in deploymentInfo.deployedFrameworks and dependency not in frameworks: frameworks.append(dependency) - + return deploymentInfo def deployFrameworksForAppBundle(applicationBundle, strip, verbose): @@ -373,7 +373,7 @@ def deployPlugins(appBundleInfo, deploymentInfo, strip, verbose): # Deploy the bearer plugins only if QtNetwork is in use if not deploymentInfo.usesFramework("QtNetwork"): continue - + for pluginName in filenames: pluginPath = os.path.join(pluginDirectory, pluginName) if pluginName.endswith("_debug.dylib"): @@ -391,32 +391,32 @@ def deployPlugins(appBundleInfo, deploymentInfo, strip, verbose): # Deploy the opengl graphicssystem plugin only if QtOpenGL is in use if not deploymentInfo.usesFramework("QtOpenGL"): continue - + plugins.append((pluginDirectory, pluginName)) - + for pluginDirectory, pluginName in plugins: if verbose >= 2: print "Processing plugin", os.path.join(pluginDirectory, pluginName), "..." - + sourcePath = os.path.join(deploymentInfo.pluginPath, pluginDirectory, pluginName) destinationDirectory = os.path.join(appBundleInfo.pluginPath, pluginDirectory) if not os.path.exists(destinationDirectory): os.makedirs(destinationDirectory) - + destinationPath = os.path.join(destinationDirectory, pluginName) shutil.copy2(sourcePath, destinationPath) if verbose >= 3: print "Copied:", sourcePath print " to:", destinationPath - + if strip: runStrip(destinationPath, verbose) - + dependencies = getFrameworks(destinationPath, verbose) - + for dependency in dependencies: changeInstallName(dependency.installName, dependency.deployedInstallName, destinationPath, verbose) - + # Deploy framework if necessary. if dependency.frameworkName not in deploymentInfo.deployedFrameworks: deployFrameworks([dependency], appBundleInfo.path, destinationPath, strip, verbose, deploymentInfo) @@ -478,7 +478,7 @@ if len(config.fancy) == 1: if verbose >= 1: sys.stderr.write("Error: Could not import plistlib which is required for fancy disk images.\n") sys.exit(1) - + if verbose >= 3: print "Fancy: Importing appscript..." try: @@ -488,7 +488,7 @@ if len(config.fancy) == 1: sys.stderr.write("Error: Could not import appscript which is required for fancy disk images.\n") sys.stderr.write("Please install it e.g. with \"sudo easy_install appscript\".\n") sys.exit(1) - + p = config.fancy[0] if verbose >= 3: print "Fancy: Loading \"%s\"..." % p @@ -496,14 +496,14 @@ if len(config.fancy) == 1: if verbose >= 1: sys.stderr.write("Error: Could not find fancy disk image plist at \"%s\"\n" % (p)) sys.exit(1) - + try: fancy = plistlib.readPlist(p) except: if verbose >= 1: sys.stderr.write("Error: Could not parse fancy disk image plist at \"%s\"\n" % (p)) sys.exit(1) - + try: assert not fancy.has_key("window_bounds") 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) @@ -517,7 +517,7 @@ if len(config.fancy) == 1: if verbose >= 1: sys.stderr.write("Error: Bad format of fancy disk image plist at \"%s\"\n" % (p)) sys.exit(1) - + if fancy.has_key("background_picture"): bp = fancy["background_picture"] if verbose >= 3: @@ -538,7 +538,7 @@ else: if os.path.exists("dist"): if verbose >= 2: print "+ Removing old dist folder +" - + shutil.rmtree("dist") # ------------------------------------------------ @@ -578,7 +578,7 @@ except RuntimeError as e: if config.plugins: if verbose >= 2: print "+ Deploying plugins +" - + try: deployPlugins(applicationBundle, deploymentInfo, config.strip, verbose) except RuntimeError as e: @@ -638,6 +638,23 @@ for p in config.add_resources: # ------------------------------------------------ if config.dmg is not None: + + #Patch in check_output for Python 2.6 + if "check_output" not in dir( subprocess ): + def f(*popenargs, **kwargs): + if 'stdout' in kwargs: + raise ValueError('stdout argument not allowed, it will be overridden.') + process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs) + output, unused_err = process.communicate() + retcode = process.poll() + if retcode: + cmd = kwargs.get("args") + if cmd is None: + cmd = popenargs[0] + raise CalledProcessError(retcode, cmd) + return output + subprocess.check_output = f + def runHDIUtil(verb, image_basename, **kwargs): hdiutil_args = ["hdiutil", verb, image_basename + ".dmg"] if kwargs.has_key("capture_stdout"): @@ -649,26 +666,26 @@ if config.dmg is not None: elif verbose >= 3: hdiutil_args.append("-verbose") run = subprocess.check_call - + for key, value in kwargs.iteritems(): hdiutil_args.append("-" + key) if not value is True: hdiutil_args.append(str(value)) - + return run(hdiutil_args) - + if verbose >= 2: if fancy is None: print "+ Creating .dmg disk image +" else: print "+ Preparing .dmg disk image +" - + if config.dmg != "": dmg_name = config.dmg else: spl = app_bundle_name.split(" ") dmg_name = spl[0] + "".join(p.capitalize() for p in spl[1:]) - + if fancy is None: try: runHDIUtil("create", dmg_name, srcfolder="dist", format="UDBZ", volname=app_bundle_name, ov=True) @@ -682,28 +699,28 @@ if config.dmg is not None: for file in files: size += os.path.getsize(os.path.join(path, file)) size += int(size * 0.1) - + if verbose >= 3: print "Creating temp image for modification..." try: runHDIUtil("create", dmg_name + ".temp", srcfolder="dist", format="UDRW", size=size, volname=app_bundle_name, ov=True) except subprocess.CalledProcessError as e: sys.exit(e.returncode) - + if verbose >= 3: print "Attaching temp image..." try: output = runHDIUtil("attach", dmg_name + ".temp", readwrite=True, noverify=True, noautoopen=True, capture_stdout=True) except subprocess.CalledProcessError as e: sys.exit(e.returncode) - + m = re.search("/Volumes/(.+$)", output) disk_root = m.group(0) disk_name = m.group(1) - + if verbose >= 2: print "+ Applying fancy settings +" - + if fancy.has_key("background_picture"): bg_path = os.path.join(disk_root, os.path.basename(fancy["background_picture"])) if verbose >= 3: @@ -711,10 +728,10 @@ if config.dmg is not None: shutil.copy2(fancy["background_picture"], bg_path) else: bg_path = None - + if fancy.get("applications_symlink", False): os.symlink("/Applications", os.path.join(disk_root, "Applications")) - + finder = appscript.app("Finder") disk = finder.disks[disk_name] disk.open() @@ -739,15 +756,15 @@ if config.dmg is not None: disk.update(registering_applications=False) sleep(2) disk.eject() - + if verbose >= 2: print "+ Finalizing .dmg disk image +" - + try: runHDIUtil("convert", dmg_name + ".temp", format="UDBZ", o=dmg_name + ".dmg", ov=True) except subprocess.CalledProcessError as e: sys.exit(e.returncode) - + os.unlink(dmg_name + ".temp.dmg") # ------------------------------------------------ diff --git a/contrib/macdeploy/notes.txt b/contrib/macdeploy/notes.txt index 8c22fad8..28cf5e81 100644 --- a/contrib/macdeploy/notes.txt +++ b/contrib/macdeploy/notes.txt @@ -1,26 +1,14 @@ - -macdeployqtplus works best on OS X Lion, for Snow Leopard you'd need to install -Python 2.7 and make it your default Python installation. - You will need the appscript package for the fancy disk image creation to work. Install it by invoking "sudo easy_install appscript". -Ths script should be invoked in the target directory like this: -$source_dir/contrib/macdeploy/macdeployqtplus DigitalNote-Qt.app -add-qt-tr da,de,es,hu,ru,uk,zh_CN,zh_TW -dmg -fancy $source_dir/contrib/macdeploy/fancy.plist -verbose 2 +For Snow Leopard (which uses Python 2.6), you will need the param_parser package. +Install it by invoking "sudo easy_install argparse" + +This script should not be run manually, instead, after building as usual: +"make deploy" During the process, the disk image window will pop up briefly where the fancy settings are applied. This is normal, please do not interfere. -You can also set up Qt Creator for invoking the script. For this, go to the -"Projects" tab on the left side, switch to "Run Settings" above and add a -deploy configuration. Next add a deploy step choosing "Custom Process Step". -Fill in the following. - -Enable custom process step: [x] -Command: %{sourceDir}/contrib/macdeploy/macdeployqtplus -Working directory: %{buildDir} -Command arguments: DigitalNote-Qt.app -add-qt-tr da,de,es,hu,ru,uk,zh_CN,zh_TW -dmg -fancy %{sourceDir}/contrib/macdeploy/fancy.plist -verbose 2 - -After that you can start the deployment process through the menu with -Build -> Deploy Project "DigitalNote-qt" +When finished, it will produce DigitalNote-qt.dmg. diff --git a/doc/readme-qt.rst b/doc/readme-qt.md similarity index 100% rename from doc/readme-qt.rst rename to doc/readme-qt.md diff --git a/pkg.m4 b/pkg.m4 new file mode 100644 index 00000000..5599bc18 --- /dev/null +++ b/pkg.m4 @@ -0,0 +1,201 @@ +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 1 (pkg-config-0.24) +# +# Copyright © 2004 Scott James Remnant . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# PKG_PROG_PKG_CONFIG([MIN-VERSION]) +# ---------------------------------- +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])# PKG_PROG_PKG_CONFIG + +# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# +# Check to see whether a particular set of modules exists. Similar +# to PKG_CHECK_MODULES(), but does not set variables or print errors. +# +# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +# only at the first occurence in configure.ac, so if the first place +# it's called might be skipped (such as if it is within an "if", you +# have to call PKG_CHECK_EXISTS manually +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +# --------------------------------------------- +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])# _PKG_CONFIG + +# _PKG_SHORT_ERRORS_SUPPORTED +# ----------------------------- +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])# _PKG_SHORT_ERRORS_SUPPORTED + + +# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# +# +# Note that if there is a possibility the first call to +# PKG_CHECK_MODULES might not happen, you should be sure to include an +# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +# +# +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl +pkg_failed=no +AC_MSG_CHECKING([for $1]) +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: +$$1_PKG_ERRORS +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. +_PKG_TEXT +To get pkg-config, see .])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])# PKG_CHECK_MODULES + + +# PKG_INSTALLDIR(DIRECTORY) +# ------------------------- +# Substitutes the variable pkgconfigdir as the location where a module +# should install pkg-config .pc files. By default the directory is +# $libdir/pkgconfig, but the default can be changed by passing +# DIRECTORY. The user can override through the --with-pkgconfigdir +# parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +]) dnl PKG_INSTALLDIR + + +# PKG_NOARCH_INSTALLDIR(DIRECTORY) +# ------------------------- +# Substitutes the variable noarch_pkgconfigdir as the location where a +# module should install arch-independent pkg-config .pc files. By +# default the directory is $datadir/pkgconfig, but the default can be +# changed by passing DIRECTORY. The user can override through the +# --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +]) dnl PKG_NOARCH_INSTALLDIR + + +# PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# ------------------------------------------- +# Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])# PKG_CHECK_VAR \ No newline at end of file diff --git a/qa/pull-tester/build-tests.sh.in b/qa/pull-tester/build-tests.sh.in new file mode 100644 index 00000000..26e1518d --- /dev/null +++ b/qa/pull-tester/build-tests.sh.in @@ -0,0 +1,45 @@ +#!/bin/bash +# Param1: The prefix to mingw staging +# Param2: Path to java comparison tool +# Param3: Number of make jobs. Defaults to 1. + +set -e +set -o xtrace + +MINGWPREFIX=$1 +JAVA_COMPARISON_TOOL=$2 +JOBS=${3-1} + +if [ $# -lt 2 ]; then + echo "Usage: $0 [mingw-prefix] [java-comparison-tool] " + exit 1 +fi + +DISTDIR=@PACKAGE@-@VERSION@ + +cd @abs_top_srcdir@ +make distdir +mv $DISTDIR linux-build +cd linux-build +./configure --with-comparison-tool="$JAVA_COMPARISON_TOOL" +make -j$JOBS +make check + +#Test code coverage +cd @abs_top_srcdir@ +make distdir +mv $DISTDIR linux-coverage-build +cd linux-coverage-build +./configure --enable-lcov --with-comparison-tool="$JAVA_COMPARISON_TOOL" +make -j$JOBS +make cov + +# win32 build disabled until pull-tester has updated dependencies +##Test win32 build +#cd @abs_top_srcdir@ +#make distdir +#mv $DISTDIR win32-build +#cd win32-build +#./configure --prefix=$MINGWPREFIX --host=i586-mingw32msvc --with-qt-bindir=$MINGWPREFIX/host/bin --with-qt-plugindir=$MINGWPREFIX/plugins --with-qt-incdir=$MINGWPREFIX/include --with-boost=$MINGWPREFIX --with-protoc-bindir=$MINGWPREFIX/host/bin --with-comparison-tool="$JAVA_COMPARISON_TOOL" CPPFLAGS=-I$MINGWPREFIX/include LDFLAGS=-L$MINGWPREFIX/lib +#make -j$JOBS +#make check \ No newline at end of file diff --git a/qa/pull-tester/pull-tester.sh b/qa/pull-tester/pull-tester.sh new file mode 100644 index 00000000..e65e73c2 --- /dev/null +++ b/qa/pull-tester/pull-tester.sh @@ -0,0 +1,15 @@ +#!/bin/sh +# Helper script for pull-tester. +#Param 1: path to bitcoin srcroot +#Param ...: arguments for build-test.sh + +if [ $# -lt 1 ]; then + echo "usage: $0 [bitcoin srcroot] build-test arguments..." +fi + +cd $1 +shift + +./autogen.sh +./configure +./qa/pull-tester/build-tests.sh "$@" \ No newline at end of file diff --git a/qa/pull-tester/run-bitcoind-for-test.sh.in b/qa/pull-tester/run-bitcoind-for-test.sh.in new file mode 100644 index 00000000..f7b250f2 --- /dev/null +++ b/qa/pull-tester/run-bitcoind-for-test.sh.in @@ -0,0 +1,27 @@ +#!/bin/bash +DATADIR="@abs_top_builddir@/.bitcoin" +rm -rf "$DATADIR" +mkdir -p "$DATADIR"/regtest +touch "$DATADIR/regtest/debug.log" +tail -q -n 1 -F "$DATADIR/regtest/debug.log" | grep -m 1 -q "Done loading" & +WAITER=$! +"@abs_top_builddir@/src/bitcoind@EXEEXT@" -connect=0.0.0.0 -datadir="$DATADIR" -rpcuser=user -rpcpassword=pass -listen -keypool=3 -debug -logtimestamps -port=18444 -regtest & +BITCOIND=$! + +#Install a watchdog. +(sleep 10 && kill -0 $WAITER 2>/dev/null && kill -9 $BITCOIND $$)& +wait $WAITER + +if [ -n "$TIMEOUT" ]; then + timeout "$TIMEOUT"s "$@" + RETURN=$? +else + "$@" + RETURN=$? +fi + +(sleep 15 && kill -0 $BITCOIND 2>/dev/null && kill -9 $BITCOIND $$)& +kill $BITCOIND && wait $BITCOIND + +# timeout returns 124 on timeout, otherwise the return value of the child +exit $RETURN \ No newline at end of file diff --git a/share/genbuild.sh b/share/genbuild.sh index d959877d..51399e09 100644 --- a/share/genbuild.sh +++ b/share/genbuild.sh @@ -1,4 +1,7 @@ #!/bin/sh +if [ $# -gt 1 ]; then + cd "$2" +fi if [ $# -gt 0 ]; then FILE="$1" @@ -7,13 +10,13 @@ if [ $# -gt 0 ]; then INFO="$(head -n 1 "$FILE")" fi else - echo "Usage: $0 " + echo "Usage: $0 " exit 1 fi -if [ -e "$(which git)" ]; then +if [ -e "$(which git)" -a -d ".git" ]; then # clean 'dirty' status of touched files that haven't been modified - git diff >/dev/null 2>/dev/null + git diff >/dev/null 2>/dev/null # get a string like "v0.6.0-66-g59887e8-dirty" DESC="$(git describe --dirty 2>/dev/null)" diff --git a/share/qt/Info.plist b/share/qt/Info.plist deleted file mode 100644 index a455283e..00000000 --- a/share/qt/Info.plist +++ /dev/null @@ -1,33 +0,0 @@ - - - - - CFBundleIconFile - digitalnote.icns - CFBundlePackageType - APPL - CFBundleGetInfoString - DigitalNote-Qt - CFBundleSignature - ???? - CFBundleExecutable - DigitalNote-Qt - CFBundleIdentifier - co.DigitalNote.DigitalNote-Qt - CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLName - co.DigitalNote.DigitalNotePayment - CFBundleURLSchemes - - DigitalNote - - - - LSAppNapIsDisabled - True - - diff --git a/share/qt/Info.plist.in b/share/qt/Info.plist.in new file mode 100644 index 00000000..ac4d2556 --- /dev/null +++ b/share/qt/Info.plist.in @@ -0,0 +1,75 @@ + + + + + CFBundleIconFile + bitcoin.icns + CFBundlePackageType + APPL + CFBundleGetInfoString + @CLIENT_VERSION_MAJOR@.@CLIENT_VERSION_MINOR@, Copyright © 2009-@COPYRIGHT_YEAR@ The Bitcoin developers + CFBundleShortVersionString + @CLIENT_VERSION_MAJOR@.@CLIENT_VERSION_MINOR@ + CFBundleVersion + @CLIENT_VERSION_MAJOR@.@CLIENT_VERSION_MINOR@ + CFBundleSignature + ???? + CFBundleExecutable + Bitcoin-Qt + CFBundleIdentifier + org.bitcoinfoundation.Bitcoin-Qt + + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + org.bitcoin.BitcoinPayment + CFBundleURLSchemes + + bitcoin + + + + + UTExportedTypeDeclarations + + + UTTypeIdentifier + org.bitcoin.paymentrequest + UTTypeDescription + Bitcoin payment request + UTTypeConformsTo + + public.data + + UTTypeTagSpecification + + public.mime-type + application/x-bitcoin-payment-request + public.filename-extension + + bitcoinpaymentrequest + + + + + + CFBundleDocumentTypes + + + CFBundleTypeRole + Editor + LSItemContentTypes + + org.bitcoin.paymentrequest + + LSHandlerRank + Owner + + + NSHighResolutionCapable + + + \ No newline at end of file diff --git a/share/setup.nsi b/share/setup.nsi.in similarity index 69% rename from share/setup.nsi rename to share/setup.nsi.in index 00a8222d..c69d10be 100644 --- a/share/setup.nsi +++ b/share/setup.nsi.in @@ -1,28 +1,28 @@ -Name NovaCoin +Name @PACKAGE_NAME@ RequestExecutionLevel highest SetCompressor /SOLID lzma # General Symbol Definitions !define REGKEY "SOFTWARE\$(^Name)" -!define VERSION 0.3.0 -!define COMPANY "NovaCoin project" -!define URL http://www.novacoin.ru/ +!define VERSION @CLIENT_VERSION_MAJOR@.@CLIENT_VERSION_MINOR@.@CLIENT_VERSION_REVISION@ +!define COMPANY "Bitcoin project" +!define URL http://www.bitcoin.org/ # MUI Symbol Definitions -!define MUI_ICON "../share/pixmaps/novacoin.ico" -!define MUI_WELCOMEFINISHPAGE_BITMAP "../share/pixmaps/nsis-wizard.bmp" +!define MUI_ICON "@abs_top_srcdir@/share/pixmaps/bitcoin.ico" +!define MUI_WELCOMEFINISHPAGE_BITMAP "@abs_top_srcdir@/share/pixmaps/nsis-wizard.bmp" !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_RIGHT -!define MUI_HEADERIMAGE_BITMAP "../share/pixmaps/nsis-header.bmp" +!define MUI_HEADERIMAGE_BITMAP "@abs_top_srcdir@/share/pixmaps/nsis-header.bmp" !define MUI_FINISHPAGE_NOAUTOCLOSE !define MUI_STARTMENUPAGE_REGISTRY_ROOT HKLM !define MUI_STARTMENUPAGE_REGISTRY_KEY ${REGKEY} !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME StartMenuGroup -!define MUI_STARTMENUPAGE_DEFAULTFOLDER NovaCoin -#!define MUI_FINISHPAGE_RUN $INSTDIR\novacoin-qt.exe +!define MUI_STARTMENUPAGE_DEFAULTFOLDER @PACKAGE_NAME@ +!define MUI_FINISHPAGE_RUN $INSTDIR\bitcoin-qt.exe !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" -!define MUI_UNWELCOMEFINISHPAGE_BITMAP "../share/pixmaps/nsis-wizard.bmp" +!define MUI_UNWELCOMEFINISHPAGE_BITMAP "@abs_top_srcdir@/share/pixmaps/nsis-wizard.bmp" !define MUI_UNFINISHPAGE_NOAUTOCLOSE # Included files @@ -45,14 +45,14 @@ Var StartMenuGroup !insertmacro MUI_LANGUAGE English # Installer attributes -OutFile novacoin-0.3.0-win32-setup.exe -InstallDir $PROGRAMFILES\NovaCoin +OutFile @abs_top_srcdir@/bitcoin-${VERSION}-win32-setup.exe +InstallDir $PROGRAMFILES\Bitcoin CRCCheck on XPStyle on BrandingText " " ShowInstDetails show -VIProductVersion 0.3.0.0 -VIAddVersionKey ProductName NovaCoin +VIProductVersion ${VERSION}.@CLIENT_VERSION_BUILD@ +VIAddVersionKey ProductName Bitcoin VIAddVersionKey ProductVersion "${VERSION}" VIAddVersionKey CompanyName "${COMPANY}" VIAddVersionKey CompanyWebsite "${URL}" @@ -66,19 +66,19 @@ ShowUninstDetails show Section -Main SEC0000 SetOutPath $INSTDIR SetOverwrite on - #File ../release/novacoin-qt.exe - File /oname=license.txt ../COPYING - File /oname=readme.txt ../doc/README_windows.txt + File @abs_top_srcdir@/release/bitcoin-qt.exe + File /oname=COPYING.txt @abs_top_srcdir@/COPYING + File /oname=readme.txt @abs_top_srcdir@/doc/README_windows.txt SetOutPath $INSTDIR\daemon - File ../src/novacoind.exe + File @abs_top_srcdir@/release/bitcoind.exe SetOutPath $INSTDIR\src - File /r /x *.exe /x *.o ../src\*.* + File /r @abs_top_srcdir@/@PACKAGE@-@VERSION@/src\*.* SetOutPath $INSTDIR WriteRegStr HKCU "${REGKEY}\Components" Main 1 # Remove old wxwidgets-based-bitcoin executable and locales: - #Delete /REBOOTOK $INSTDIR\novacoin.exe - #RMDir /r /REBOOTOK $INSTDIR\locale + Delete /REBOOTOK $INSTDIR\bitcoin.exe + RMDir /r /REBOOTOK $INSTDIR\locale SectionEnd Section -post SEC0001 @@ -87,7 +87,8 @@ Section -post SEC0001 WriteUninstaller $INSTDIR\uninstall.exe !insertmacro MUI_STARTMENU_WRITE_BEGIN Application CreateDirectory $SMPROGRAMS\$StartMenuGroup - CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall NovaCoin.lnk" $INSTDIR\uninstall.exe + CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Bitcoin.lnk" $INSTDIR\bitcoin-qt.exe + CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall Bitcoin.lnk" $INSTDIR\uninstall.exe !insertmacro MUI_STARTMENU_WRITE_END WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayName "$(^Name)" WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayVersion "${VERSION}" @@ -97,12 +98,10 @@ Section -post SEC0001 WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" UninstallString $INSTDIR\uninstall.exe WriteRegDWORD HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoModify 1 WriteRegDWORD HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" NoRepair 1 - - # bitcoin: URI handling disabled for 0.6.0 - # WriteRegStr HKCR "bitcoin" "URL Protocol" "" - # WriteRegStr HKCR "bitcoin" "" "URL:DigitalNote" - # WriteRegStr HKCR "bitcoin\DefaultIcon" "" $INSTDIR\bitcoin-qt.exe - # WriteRegStr HKCR "bitcoin\DigitalNote\open\command" "" '"$INSTDIR\bitcoin-qt.exe" "$$1"' + WriteRegStr HKCR "bitcoin" "URL Protocol" "" + WriteRegStr HKCR "bitcoin" "" "URL:Bitcoin" + WriteRegStr HKCR "bitcoin\DefaultIcon" "" $INSTDIR\bitcoin-qt.exe + WriteRegStr HKCR "bitcoin\shell\open\command" "" '"$INSTDIR\bitcoin-qt.exe" "%1"' SectionEnd # Macro for selecting uninstaller sections @@ -120,8 +119,8 @@ done${UNSECTION_ID}: # Uninstaller sections Section /o -un.Main UNSEC0000 - #Delete /REBOOTOK $INSTDIR\novacoin-qt.exe - Delete /REBOOTOK $INSTDIR\license.txt + Delete /REBOOTOK $INSTDIR\bitcoin-qt.exe + Delete /REBOOTOK $INSTDIR\COPYING.txt Delete /REBOOTOK $INSTDIR\readme.txt RMDir /r /REBOOTOK $INSTDIR\daemon RMDir /r /REBOOTOK $INSTDIR\src @@ -130,9 +129,9 @@ SectionEnd Section -un.post UNSEC0001 DeleteRegKey HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" - Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Uninstall NovaCoin.lnk" - #Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\DigitalNote.lnk" - #Delete /REBOOTOK "$SMSTARTUP\DigitalNote.lnk" + Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Uninstall Bitcoin.lnk" + Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Bitcoin.lnk" + Delete /REBOOTOK "$SMSTARTUP\Bitcoin.lnk" Delete /REBOOTOK $INSTDIR\uninstall.exe Delete /REBOOTOK $INSTDIR\debug.log Delete /REBOOTOK $INSTDIR\db.log @@ -140,7 +139,7 @@ Section -un.post UNSEC0001 DeleteRegValue HKCU "${REGKEY}" Path DeleteRegKey /IfEmpty HKCU "${REGKEY}\Components" DeleteRegKey /IfEmpty HKCU "${REGKEY}" - DeleteRegKey HKCR "novacoin" + DeleteRegKey HKCR "bitcoin" RmDir /REBOOTOK $SMPROGRAMS\$StartMenuGroup RmDir /REBOOTOK $INSTDIR Push $R0 @@ -160,4 +159,4 @@ Function un.onInit ReadRegStr $INSTDIR HKCU "${REGKEY}" Path !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuGroup !insertmacro SELECT_UNSECTION Main ${UNSEC0000} -FunctionEnd +FunctionEnd \ No newline at end of file diff --git a/src/MakeFile.am b/src/MakeFile.am new file mode 100644 index 00000000..231888e4 --- /dev/null +++ b/src/MakeFile.am @@ -0,0 +1,48 @@ +.PHONY: FORCE + +LIBBITCOIN=$(top_builddir)/src/libbitcoin.a +LIBLEVELDB=$(top_builddir)/src/leveldb/libleveldb.a +LIBMEMENV=$(top_builddir)/src/leveldb/libmemenv.a +LIBBITCOINQT=$(top_builddir)/src/qt/libbitcoinqt.a + +$(LIBBITCOIN): + $(MAKE) -C $(top_builddir)/src $(@F) + +$(LIBLEVELDB) $(LIBMEMENV): + $(MAKE) -C $(top_builddir)/src leveldb/$(@F) + +$(LIBBITCOINQT): + $(MAKE) -C $(top_builddir)/src/qt $(@F) + +.mm.o: + $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CXXFLAGS) $(QT_INCLUDES) $(CXXFLAGS) -c -o $@ $< + +.rc.o: + @test -f $(WINDRES) && $(WINDRES) -i $< -o $@ || \ + echo error: could not build $@ + +ui_%.h: %.ui + @test -d $(abs_builddir)/$(@D) || $(MKDIR_P) $(abs_builddir)/$(@D) + @test -f $(UIC) && $(UIC) -o $(abs_builddir)/$@ $(abs_srcdir)/$< || echo error: could not build $(abs_builddir)/$@ + $(SED) -i.bak -e '/^\*\*.*Created:/d' $(abs_builddir)/$@ && rm $(abs_builddir)/$@.bak + $(SED) -i.bak -e '/^\*\*.*by:/d' $(abs_builddir)/$@ && rm $(abs_builddir)/$@.bak + +%.moc: %.cpp + $(MOC) $(QT_INCLUDES) $(MOC_DEFS) -o $@ $< + $(SED) -i.bak -e '/^\*\*.*Created:/d' $@ && rm $@.bak + $(SED) -i.bak -e '/^\*\*.*by:/d' $@ && rm $@.bak + +moc_%.cpp: %.h + $(MOC) $(QT_INCLUDES) $(MOC_DEFS) -o $@ $< + $(SED) -i.bak -e '/^\*\*.*Created:/d' $@ && rm $@.bak + $(SED) -i.bak -e '/^\*\*.*by:/d' $@ && rm $@.bak + +%.qm: %.ts + @test -d $(abs_builddir)/$(@D) || $(MKDIR_P) $(abs_builddir)/$(@D) + @test -f $(LRELEASE) && $(LRELEASE) $(abs_srcdir)/$< -qm $(abs_builddir)/$@ || \ + echo error: could not build $(abs_builddir)/$@ + +%.pb.cc %.pb.h: %.proto + test -f $(PROTOC) && $(PROTOC) --cpp_out=$(@D) --proto_path=$(abspath $(. +# +# This macro calls: +# +# AC_SUBST(BOOST_CPPFLAGS) / AC_SUBST(BOOST_LDFLAGS) +# +# And sets: +# +# HAVE_BOOST +# +# LICENSE +# +# Copyright (c) 2008 Thomas Porschberg +# Copyright (c) 2009 Peter Adolphs +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 23 + +AC_DEFUN([AX_BOOST_BASE], +[ +AC_ARG_WITH([boost], + [AS_HELP_STRING([--with-boost@<:@=ARG@:>@], + [use Boost library from a standard location (ARG=yes), + from the specified location (ARG=), + or disable it (ARG=no) + @<:@ARG=yes@:>@ ])], + [ + if test "$withval" = "no"; then + want_boost="no" + elif test "$withval" = "yes"; then + want_boost="yes" + ac_boost_path="" + else + want_boost="yes" + ac_boost_path="$withval" + fi + ], + [want_boost="yes"]) + + +AC_ARG_WITH([boost-libdir], + AS_HELP_STRING([--with-boost-libdir=LIB_DIR], + [Force given directory for boost libraries. Note that this will override library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located.]), + [ + if test -d "$withval" + then + ac_boost_lib_path="$withval" + else + AC_MSG_ERROR(--with-boost-libdir expected directory name) + fi + ], + [ac_boost_lib_path=""] +) + +if test "x$want_boost" = "xyes"; then + boost_lib_version_req=ifelse([$1], ,1.20.0,$1) + boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-9]]*\.[[0-9]]*\)'` + boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9]]*\)'` + boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]*\.\([[0-9]]*\)'` + boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` + if test "x$boost_lib_version_req_sub_minor" = "x" ; then + boost_lib_version_req_sub_minor="0" + fi + WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor` + AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req) + succeeded=no + + dnl On 64-bit systems check for system libraries in both lib64 and lib. + dnl The former is specified by FHS, but e.g. Debian does not adhere to + dnl this (as it rises problems for generic multi-arch support). + dnl The last entry in the list is chosen by default when no libraries + dnl are found, e.g. when only header-only libraries are installed! + libsubdirs="lib" + ax_arch=`uname -m` + case $ax_arch in + x86_64) + libsubdirs="lib64 libx32 lib lib64" + ;; + ppc64|s390x|sparc64|aarch64) + libsubdirs="lib64 lib lib64" + ;; + esac + + dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give + dnl them priority over the other paths since, if libs are found there, they + dnl are almost assuredly the ones desired. + AC_REQUIRE([AC_CANONICAL_HOST]) + libsubdirs="lib/${host_cpu}-${host_os} $libsubdirs" + + case ${host_cpu} in + i?86) + libsubdirs="lib/i386-${host_os} $libsubdirs" + ;; + esac + + dnl some arches may advertise a cpu type that doesn't line up with their + dnl prefix's cpu type. For example, uname may report armv7l while libs are + dnl installed to /usr/lib/arm-linux-gnueabihf. Try getting the compiler's + dnl value for an extra chance of finding the correct path. + libsubdirs="lib/`$CXX -dumpmachine 2>/dev/null` $libsubdirs" + + dnl first we check the system location for boost libraries + dnl this location ist chosen if boost libraries are installed with the --layout=system option + dnl or if you install boost with RPM + if test "$ac_boost_path" != ""; then + BOOST_CPPFLAGS="-I$ac_boost_path/include" + for ac_boost_path_tmp in $libsubdirs; do + if test -d "$ac_boost_path"/"$ac_boost_path_tmp" ; then + BOOST_LDFLAGS="-L$ac_boost_path/$ac_boost_path_tmp" + break + fi + done + elif test "$cross_compiling" != yes; then + for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do + if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then + for libsubdir in $libsubdirs ; do + if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi + done + BOOST_LDFLAGS="-L$ac_boost_path_tmp/$libsubdir" + BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include" + break; + fi + done + fi + + dnl overwrite ld flags if we have required special directory with + dnl --with-boost-libdir parameter + if test "$ac_boost_lib_path" != ""; then + BOOST_LDFLAGS="-L$ac_boost_lib_path" + fi + + CPPFLAGS_SAVED="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" + export CPPFLAGS + + LDFLAGS_SAVED="$LDFLAGS" + LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" + export LDFLAGS + + AC_REQUIRE([AC_PROG_CXX]) + AC_LANG_PUSH(C++) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + @%:@include + ]], [[ + #if BOOST_VERSION >= $WANT_BOOST_VERSION + // Everything is okay + #else + # error Boost version is too old + #endif + ]])],[ + AC_MSG_RESULT(yes) + succeeded=yes + found_system=yes + ],[: + ]) + AC_LANG_POP([C++]) + + + + 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 + if test "x$succeeded" != "xyes"; then + _version=0 + if test "$ac_boost_path" != ""; then + if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then + for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do + _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` + V_CHECK=`expr $_version_tmp \> $_version` + if test "$V_CHECK" = "1" ; then + _version=$_version_tmp + fi + VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` + BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE" + done + fi + else + if test "$cross_compiling" != yes; then + for ac_boost_path in /usr /usr/local /opt /opt/local ; do + if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then + for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do + _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` + V_CHECK=`expr $_version_tmp \> $_version` + if test "$V_CHECK" = "1" ; then + _version=$_version_tmp + best_path=$ac_boost_path + fi + done + fi + done + + VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` + BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE" + if test "$ac_boost_lib_path" = ""; then + for libsubdir in $libsubdirs ; do + if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi + done + BOOST_LDFLAGS="-L$best_path/$libsubdir" + fi + fi + + if test "x$BOOST_ROOT" != "x"; then + for libsubdir in $libsubdirs ; do + if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi + done + if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then + version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'` + stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'` + stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'` + V_CHECK=`expr $stage_version_shorten \>\= $_version` + if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then + AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT) + BOOST_CPPFLAGS="-I$BOOST_ROOT" + BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir" + fi + fi + fi + fi + + CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" + export CPPFLAGS + LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" + export LDFLAGS + + AC_LANG_PUSH(C++) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + @%:@include + ]], [[ + #if BOOST_VERSION >= $WANT_BOOST_VERSION + // Everything is okay + #else + # error Boost version is too old + #endif + ]])],[ + AC_MSG_RESULT(yes) + succeeded=yes + found_system=yes + ],[: + ]) + AC_LANG_POP([C++]) + fi + + if test "$succeeded" != "yes" ; then + if test "$_version" = "0" ; then + AC_MSG_NOTICE([[We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation.]]) + else + AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).]) + fi + # execute ACTION-IF-NOT-FOUND (if present): + ifelse([$3], , :, [$3]) + else + AC_SUBST(BOOST_CPPFLAGS) + AC_SUBST(BOOST_LDFLAGS) + AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available]) + # execute ACTION-IF-FOUND (if present): + ifelse([$2], , :, [$2]) + fi + + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" +fi + +]) diff --git a/src/m4/ax_boost_chrono.m4 b/src/m4/ax_boost_chrono.m4 new file mode 100644 index 00000000..318ecea1 --- /dev/null +++ b/src/m4/ax_boost_chrono.m4 @@ -0,0 +1,119 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_boost_chrono.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_BOOST_CHRONO +# +# DESCRIPTION +# +# Test for System library from the Boost C++ libraries. The macro requires +# a preceding call to AX_BOOST_BASE. Further documentation is available at +# . +# +# This macro calls: +# +# AC_SUBST(BOOST_CHRONO_LIB) +# +# And sets: +# +# HAVE_BOOST_CHRONO +# +# LICENSE +# +# Copyright (c) 2012 Xiyue Deng +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 1 + +AC_DEFUN([AX_BOOST_CHRONO], +[ + AC_ARG_WITH([boost-chrono], + AS_HELP_STRING([--with-boost-chrono@<:@=special-lib@:>@], + [use the Chrono library from boost - it is possible to specify a certain library for the linker + e.g. --with-boost-chrono=boost_chrono-gcc-mt ]), + [ + if test "$withval" = "no"; then + want_boost="no" + elif test "$withval" = "yes"; then + want_boost="yes" + ax_boost_user_chrono_lib="" + else + want_boost="yes" + ax_boost_user_chrono_lib="$withval" + fi + ], + [want_boost="yes"] + ) + + if test "x$want_boost" = "xyes"; then + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_BUILD]) + CPPFLAGS_SAVED="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" + export CPPFLAGS + + LDFLAGS_SAVED="$LDFLAGS" + LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" + export LDFLAGS + + AC_CACHE_CHECK(whether the Boost::Chrono library is available, + ax_cv_boost_chrono, + [AC_LANG_PUSH([C++]) + CXXFLAGS_SAVE=$CXXFLAGS + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], + [[boost::chrono::system_clock::time_point time;]])], + ax_cv_boost_chrono=yes, ax_cv_boost_chrono=no) + CXXFLAGS=$CXXFLAGS_SAVE + AC_LANG_POP([C++]) + ]) + if test "x$ax_cv_boost_chrono" = "xyes"; then + AC_SUBST(BOOST_CPPFLAGS) + + AC_DEFINE(HAVE_BOOST_CHRONO,,[define if the Boost::Chrono library is available]) + BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` + + LDFLAGS_SAVE=$LDFLAGS + if test "x$ax_boost_user_chrono_lib" = "x"; then + ax_lib= + for libextension in `ls $BOOSTLIBDIR/libboost_chrono*.so* $BOOSTLIBDIR/libboost_chrono*.dylib* $BOOSTLIBDIR/libboost_chrono*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_chrono.*\)\.so.*$;\1;' -e 's;^lib\(boost_chrono.*\)\.dylib.*$;\1;' -e 's;^lib\(boost_chrono.*\)\.a.*$;\1;'` ; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_CHRONO_LIB="-l$ax_lib"; AC_SUBST(BOOST_CHRONO_LIB) link_chrono="yes"; break], + [link_chrono="no"]) + done + if test "x$link_chrono" != "xyes"; then + for libextension in `ls $BOOSTLIBDIR/boost_chrono*.dll* $BOOSTLIBDIR/boost_chrono*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^\(boost_chrono.*\)\.dll.*$;\1;' -e 's;^\(boost_chrono.*\)\.a.*$;\1;'` ; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_CHRONO_LIB="-l$ax_lib"; AC_SUBST(BOOST_CHRONO_LIB) link_chrono="yes"; break], + [link_chrono="no"]) + done + fi + + else + for ax_lib in $ax_boost_user_chrono_lib boost_chrono-$ax_boost_user_chrono_lib; do + AC_CHECK_LIB($ax_lib, exit, + [BOOST_CHRONO_LIB="-l$ax_lib"; AC_SUBST(BOOST_CHRONO_LIB) link_chrono="yes"; break], + [link_chrono="no"]) + done + + fi + if test "x$ax_lib" = "x"; then + AC_MSG_ERROR(Could not find a version of the boost_chrono library!) + fi + if test "x$link_chrono" = "xno"; then + AC_MSG_ERROR(Could not link against $ax_lib !) + fi + fi + + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" + fi +]) diff --git a/src/m4/ax_boost_filesystem.m4 b/src/m4/ax_boost_filesystem.m4 new file mode 100644 index 00000000..f5c9d564 --- /dev/null +++ b/src/m4/ax_boost_filesystem.m4 @@ -0,0 +1,119 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_boost_filesystem.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_BOOST_FILESYSTEM +# +# DESCRIPTION +# +# Test for Filesystem library from the Boost C++ libraries. The macro +# requires a preceding call to AX_BOOST_BASE. Further documentation is +# available at . +# +# This macro calls: +# +# AC_SUBST(BOOST_FILESYSTEM_LIB) +# +# And sets: +# +# HAVE_BOOST_FILESYSTEM +# +# LICENSE +# +# Copyright (c) 2009 Thomas Porschberg +# Copyright (c) 2009 Michael Tindal +# Copyright (c) 2009 Roman Rybalko +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 26 + +AC_DEFUN([AX_BOOST_FILESYSTEM], +[ + AC_ARG_WITH([boost-filesystem], + AS_HELP_STRING([--with-boost-filesystem@<:@=special-lib@:>@], + [use the Filesystem library from boost - it is possible to specify a certain library for the linker + e.g. --with-boost-filesystem=boost_filesystem-gcc-mt ]), + [ + if test "$withval" = "no"; then + want_boost="no" + elif test "$withval" = "yes"; then + want_boost="yes" + ax_boost_user_filesystem_lib="" + else + want_boost="yes" + ax_boost_user_filesystem_lib="$withval" + fi + ], + [want_boost="yes"] + ) + + if test "x$want_boost" = "xyes"; then + AC_REQUIRE([AC_PROG_CC]) + CPPFLAGS_SAVED="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" + export CPPFLAGS + + LDFLAGS_SAVED="$LDFLAGS" + LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" + export LDFLAGS + + LIBS_SAVED=$LIBS + LIBS="$LIBS $BOOST_SYSTEM_LIB" + export LIBS + + AC_CACHE_CHECK(whether the Boost::Filesystem library is available, + ax_cv_boost_filesystem, + [AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], + [[using namespace boost::filesystem; + path my_path( "foo/bar/data.txt" ); + return 0;]])], + ax_cv_boost_filesystem=yes, ax_cv_boost_filesystem=no) + AC_LANG_POP([C++]) + ]) + if test "x$ax_cv_boost_filesystem" = "xyes"; then + AC_DEFINE(HAVE_BOOST_FILESYSTEM,,[define if the Boost::Filesystem library is available]) + BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` + ax_lib= + if test "x$ax_boost_user_filesystem_lib" = "x"; then + for libextension in `ls -r $BOOSTLIBDIR/libboost_filesystem* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'` ; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_FILESYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_FILESYSTEM_LIB) link_filesystem="yes"; break], + [link_filesystem="no"]) + done + if test "x$link_filesystem" != "xyes"; then + for libextension in `ls -r $BOOSTLIBDIR/boost_filesystem* 2>/dev/null | sed 's,.*/,,' | sed -e 's,\..*,,'` ; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_FILESYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_FILESYSTEM_LIB) link_filesystem="yes"; break], + [link_filesystem="no"]) + done + fi + else + for ax_lib in $ax_boost_user_filesystem_lib boost_filesystem-$ax_boost_user_filesystem_lib; do + AC_CHECK_LIB($ax_lib, exit, + [BOOST_FILESYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_FILESYSTEM_LIB) link_filesystem="yes"; break], + [link_filesystem="no"]) + done + + fi + if test "x$ax_lib" = "x"; then + AC_MSG_ERROR(Could not find a version of the boost_filesystem library!) + fi + if test "x$link_filesystem" != "xyes"; then + AC_MSG_ERROR(Could not link against $ax_lib !) + fi + fi + + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" + LIBS="$LIBS_SAVED" + fi +]) diff --git a/src/m4/ax_boost_program_options.m4 b/src/m4/ax_boost_program_options.m4 new file mode 100644 index 00000000..f5914418 --- /dev/null +++ b/src/m4/ax_boost_program_options.m4 @@ -0,0 +1,109 @@ +# ============================================================================ +# http://www.gnu.org/software/autoconf-archive/ax_boost_program_options.html +# ============================================================================ +# +# SYNOPSIS +# +# AX_BOOST_PROGRAM_OPTIONS +# +# DESCRIPTION +# +# Test for program options library from the Boost C++ libraries. The macro +# requires a preceding call to AX_BOOST_BASE. Further documentation is +# available at . +# +# This macro calls: +# +# AC_SUBST(BOOST_PROGRAM_OPTIONS_LIB) +# +# And sets: +# +# HAVE_BOOST_PROGRAM_OPTIONS +# +# LICENSE +# +# Copyright (c) 2009 Thomas Porschberg +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 22 + +AC_DEFUN([AX_BOOST_PROGRAM_OPTIONS], +[ + AC_ARG_WITH([boost-program-options], + AS_HELP_STRING([--with-boost-program-options@<:@=special-lib@:>@], + [use the program options library from boost - it is possible to specify a certain library for the linker + e.g. --with-boost-program-options=boost_program_options-gcc-mt-1_33_1 ]), + [ + if test "$withval" = "no"; then + want_boost="no" + elif test "$withval" = "yes"; then + want_boost="yes" + ax_boost_user_program_options_lib="" + else + want_boost="yes" + ax_boost_user_program_options_lib="$withval" + fi + ], + [want_boost="yes"] + ) + + if test "x$want_boost" = "xyes"; then + AC_REQUIRE([AC_PROG_CC]) + export want_boost + CPPFLAGS_SAVED="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" + export CPPFLAGS + LDFLAGS_SAVED="$LDFLAGS" + LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" + export LDFLAGS + AC_CACHE_CHECK([whether the Boost::Program_Options library is available], + ax_cv_boost_program_options, + [AC_LANG_PUSH(C++) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include + ]], + [[boost::program_options::options_description generic("Generic options"); + return 0;]])], + ax_cv_boost_program_options=yes, ax_cv_boost_program_options=no) + AC_LANG_POP([C++]) + ]) + if test "$ax_cv_boost_program_options" = yes; then + AC_DEFINE(HAVE_BOOST_PROGRAM_OPTIONS,,[define if the Boost::PROGRAM_OPTIONS library is available]) + BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` + 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 + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_PROGRAM_OPTIONS_LIB="-l$ax_lib"; AC_SUBST(BOOST_PROGRAM_OPTIONS_LIB) link_program_options="yes"; break], + [link_program_options="no"]) + done + if test "x$link_program_options" != "xyes"; then + for libextension in `ls $BOOSTLIBDIR/boost_program_options*.dll* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^\(boost_program_options.*\)\.dll.*$;\1;'` `ls $BOOSTLIBDIR/boost_program_options*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^\(boost_program_options.*\)\.a.*$;\1;'` ; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_PROGRAM_OPTIONS_LIB="-l$ax_lib"; AC_SUBST(BOOST_PROGRAM_OPTIONS_LIB) link_program_options="yes"; break], + [link_program_options="no"]) + done + fi + else + for ax_lib in $ax_boost_user_program_options_lib boost_program_options-$ax_boost_user_program_options_lib; do + AC_CHECK_LIB($ax_lib, main, + [BOOST_PROGRAM_OPTIONS_LIB="-l$ax_lib"; AC_SUBST(BOOST_PROGRAM_OPTIONS_LIB) link_program_options="yes"; break], + [link_program_options="no"]) + done + fi + if test "x$ax_lib" = "x"; then + AC_MSG_ERROR(Could not find a version of the boost_program_options library!) + fi + if test "x$link_program_options" != "xyes"; then + AC_MSG_ERROR([Could not link against [$ax_lib] !]) + fi + fi + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" + fi +]) diff --git a/src/m4/ax_boost_system.m4 b/src/m4/ax_boost_system.m4 new file mode 100644 index 00000000..9c78280f --- /dev/null +++ b/src/m4/ax_boost_system.m4 @@ -0,0 +1,121 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_boost_system.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_BOOST_SYSTEM +# +# DESCRIPTION +# +# Test for System library from the Boost C++ libraries. The macro requires +# a preceding call to AX_BOOST_BASE. Further documentation is available at +# . +# +# This macro calls: +# +# AC_SUBST(BOOST_SYSTEM_LIB) +# +# And sets: +# +# HAVE_BOOST_SYSTEM +# +# LICENSE +# +# Copyright (c) 2008 Thomas Porschberg +# Copyright (c) 2008 Michael Tindal +# Copyright (c) 2008 Daniel Casimiro +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 17 + +AC_DEFUN([AX_BOOST_SYSTEM], +[ + AC_ARG_WITH([boost-system], + AS_HELP_STRING([--with-boost-system@<:@=special-lib@:>@], + [use the System library from boost - it is possible to specify a certain library for the linker + e.g. --with-boost-system=boost_system-gcc-mt ]), + [ + if test "$withval" = "no"; then + want_boost="no" + elif test "$withval" = "yes"; then + want_boost="yes" + ax_boost_user_system_lib="" + else + want_boost="yes" + ax_boost_user_system_lib="$withval" + fi + ], + [want_boost="yes"] + ) + + if test "x$want_boost" = "xyes"; then + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_BUILD]) + CPPFLAGS_SAVED="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" + export CPPFLAGS + + LDFLAGS_SAVED="$LDFLAGS" + LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" + export LDFLAGS + + AC_CACHE_CHECK(whether the Boost::System library is available, + ax_cv_boost_system, + [AC_LANG_PUSH([C++]) + CXXFLAGS_SAVE=$CXXFLAGS + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], + [[boost::system::system_category]])], + ax_cv_boost_system=yes, ax_cv_boost_system=no) + CXXFLAGS=$CXXFLAGS_SAVE + AC_LANG_POP([C++]) + ]) + if test "x$ax_cv_boost_system" = "xyes"; then + AC_SUBST(BOOST_CPPFLAGS) + + AC_DEFINE(HAVE_BOOST_SYSTEM,,[define if the Boost::System library is available]) + BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` + + LDFLAGS_SAVE=$LDFLAGS + if test "x$ax_boost_user_system_lib" = "x"; then + ax_lib= + for libextension in `ls -r $BOOSTLIBDIR/libboost_system* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'` ; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break], + [link_system="no"]) + done + if test "x$link_system" != "xyes"; then + for libextension in `ls -r $BOOSTLIBDIR/boost_system* 2>/dev/null | sed 's,.*/,,' | sed -e 's,\..*,,'` ; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break], + [link_system="no"]) + done + fi + + else + for ax_lib in $ax_boost_user_system_lib boost_system-$ax_boost_user_system_lib; do + AC_CHECK_LIB($ax_lib, exit, + [BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break], + [link_system="no"]) + done + + fi + if test "x$ax_lib" = "x"; then + AC_MSG_ERROR(Could not find a version of the boost_system library!) + fi + if test "x$link_system" = "xno"; then + AC_MSG_ERROR(Could not link against $ax_lib !) + fi + fi + + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" + fi +]) diff --git a/src/m4/ax_boost_thread.m4 b/src/m4/ax_boost_thread.m4 new file mode 100644 index 00000000..9f0bd0b2 --- /dev/null +++ b/src/m4/ax_boost_thread.m4 @@ -0,0 +1,150 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_boost_thread.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_BOOST_THREAD +# +# DESCRIPTION +# +# Test for Thread library from the Boost C++ libraries. The macro requires +# a preceding call to AX_BOOST_BASE. Further documentation is available at +# . +# +# This macro calls: +# +# AC_SUBST(BOOST_THREAD_LIB) +# +# And sets: +# +# HAVE_BOOST_THREAD +# +# LICENSE +# +# Copyright (c) 2009 Thomas Porschberg +# Copyright (c) 2009 Michael Tindal +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 27 + +AC_DEFUN([AX_BOOST_THREAD], +[ + AC_ARG_WITH([boost-thread], + AS_HELP_STRING([--with-boost-thread@<:@=special-lib@:>@], + [use the Thread library from boost - it is possible to specify a certain library for the linker + e.g. --with-boost-thread=boost_thread-gcc-mt ]), + [ + if test "$withval" = "no"; then + want_boost="no" + elif test "$withval" = "yes"; then + want_boost="yes" + ax_boost_user_thread_lib="" + else + want_boost="yes" + ax_boost_user_thread_lib="$withval" + fi + ], + [want_boost="yes"] + ) + + if test "x$want_boost" = "xyes"; then + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_BUILD]) + CPPFLAGS_SAVED="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" + export CPPFLAGS + + LDFLAGS_SAVED="$LDFLAGS" + LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" + export LDFLAGS + + AC_CACHE_CHECK(whether the Boost::Thread library is available, + ax_cv_boost_thread, + [AC_LANG_PUSH([C++]) + CXXFLAGS_SAVE=$CXXFLAGS + + if test "x$host_os" = "xsolaris" ; then + CXXFLAGS="-pthreads $CXXFLAGS" + elif test "x$host_os" = "xmingw32" ; then + CXXFLAGS="-mthreads $CXXFLAGS" + else + CXXFLAGS="-pthread $CXXFLAGS" + fi + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], + [[boost::thread_group thrds; + return 0;]])], + ax_cv_boost_thread=yes, ax_cv_boost_thread=no) + CXXFLAGS=$CXXFLAGS_SAVE + AC_LANG_POP([C++]) + ]) + if test "x$ax_cv_boost_thread" = "xyes"; then + if test "x$host_os" = "xsolaris" ; then + BOOST_CPPFLAGS="-pthreads $BOOST_CPPFLAGS" + elif test "x$host_os" = "xmingw32" ; then + BOOST_CPPFLAGS="-mthreads $BOOST_CPPFLAGS" + else + BOOST_CPPFLAGS="-pthread $BOOST_CPPFLAGS" + fi + + AC_SUBST(BOOST_CPPFLAGS) + + AC_DEFINE(HAVE_BOOST_THREAD,,[define if the Boost::Thread library is available]) + BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` + + LDFLAGS_SAVE=$LDFLAGS + case "x$host_os" in + *bsd* ) + LDFLAGS="-pthread $LDFLAGS" + break; + ;; + esac + if test "x$ax_boost_user_thread_lib" = "x"; then + ax_lib= + for libextension in `ls -r $BOOSTLIBDIR/libboost_thread* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'`; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_THREAD_LIB="-l$ax_lib"; AC_SUBST(BOOST_THREAD_LIB) link_thread="yes"; break], + [link_thread="no"]) + done + if test "x$link_thread" != "xyes"; then + for libextension in `ls -r $BOOSTLIBDIR/boost_thread* 2>/dev/null | sed 's,.*/,,' | sed 's,\..*,,'`; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_THREAD_LIB="-l$ax_lib"; AC_SUBST(BOOST_THREAD_LIB) link_thread="yes"; break], + [link_thread="no"]) + done + fi + + else + for ax_lib in $ax_boost_user_thread_lib boost_thread-$ax_boost_user_thread_lib; do + AC_CHECK_LIB($ax_lib, exit, + [BOOST_THREAD_LIB="-l$ax_lib"; AC_SUBST(BOOST_THREAD_LIB) link_thread="yes"; break], + [link_thread="no"]) + done + + fi + if test "x$ax_lib" = "x"; then + AC_MSG_ERROR(Could not find a version of the boost_thread library!) + fi + if test "x$link_thread" = "xno"; then + AC_MSG_ERROR(Could not link against $ax_lib !) + else + case "x$host_os" in + *bsd* ) + BOOST_LDFLAGS="-pthread $BOOST_LDFLAGS" + break; + ;; + esac + + fi + fi + + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" + fi +]) diff --git a/src/m4/ax_boost_unit_test_framework.m4 b/src/m4/ax_boost_unit_test_framework.m4 new file mode 100644 index 00000000..4efd1e2f --- /dev/null +++ b/src/m4/ax_boost_unit_test_framework.m4 @@ -0,0 +1,138 @@ +# ================================================================================ +# http://www.gnu.org/software/autoconf-archive/ax_boost_unit_test_framework.html +# ================================================================================ +# +# SYNOPSIS +# +# AX_BOOST_UNIT_TEST_FRAMEWORK +# +# DESCRIPTION +# +# Test for Unit_Test_Framework library from the Boost C++ libraries. The +# macro requires a preceding call to AX_BOOST_BASE. Further documentation +# is available at . +# +# This macro calls: +# +# AC_SUBST(BOOST_UNIT_TEST_FRAMEWORK_LIB) +# +# And sets: +# +# HAVE_BOOST_UNIT_TEST_FRAMEWORK +# +# LICENSE +# +# Copyright (c) 2008 Thomas Porschberg +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 19 + +AC_DEFUN([AX_BOOST_UNIT_TEST_FRAMEWORK], +[ + AC_ARG_WITH([boost-unit-test-framework], + AS_HELP_STRING([--with-boost-unit-test-framework@<:@=special-lib@:>@], + [use the Unit_Test_Framework library from boost - it is possible to specify a certain library for the linker + e.g. --with-boost-unit-test-framework=boost_unit_test_framework-gcc ]), + [ + if test "$withval" = "no"; then + want_boost="no" + elif test "$withval" = "yes"; then + want_boost="yes" + ax_boost_user_unit_test_framework_lib="" + else + want_boost="yes" + ax_boost_user_unit_test_framework_lib="$withval" + fi + ], + [want_boost="yes"] + ) + + if test "x$want_boost" = "xyes"; then + AC_REQUIRE([AC_PROG_CC]) + CPPFLAGS_SAVED="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" + export CPPFLAGS + + LDFLAGS_SAVED="$LDFLAGS" + LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" + export LDFLAGS + + AC_CACHE_CHECK(whether the Boost::Unit_Test_Framework library is available, + ax_cv_boost_unit_test_framework, + [AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], + [[using boost::unit_test::test_suite; + test_suite* test= BOOST_TEST_SUITE( "Unit test example 1" ); return 0;]])], + ax_cv_boost_unit_test_framework=yes, ax_cv_boost_unit_test_framework=no) + AC_LANG_POP([C++]) + ]) + if test "x$ax_cv_boost_unit_test_framework" = "xyes"; then + AC_DEFINE(HAVE_BOOST_UNIT_TEST_FRAMEWORK,,[define if the Boost::Unit_Test_Framework library is available]) + BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` + + if test "x$ax_boost_user_unit_test_framework_lib" = "x"; then + saved_ldflags="${LDFLAGS}" + ax_lib= + for monitor_library in `ls $BOOSTLIBDIR/libboost_unit_test_framework*.so* $BOOSTLIBDIR/libboost_unit_test_framework*.dylib* $BOOSTLIBDIR/libboost_unit_test_framework*.a* 2>/dev/null` ; do + if test -r $monitor_library ; then + libextension=`echo $monitor_library | sed 's,.*/,,' | sed -e 's;^lib\(boost_unit_test_framework.*\)\.so.*$;\1;' -e 's;^lib\(boost_unit_test_framework.*\)\.dylib.*$;\1;' -e 's;^lib\(boost_unit_test_framework.*\)\.a.*$;\1;'` + ax_lib=${libextension} + link_unit_test_framework="yes" + else + link_unit_test_framework="no" + fi + + if test "x$link_unit_test_framework" = "xyes"; then + BOOST_UNIT_TEST_FRAMEWORK_LIB="-l$ax_lib" + AC_SUBST(BOOST_UNIT_TEST_FRAMEWORK_LIB) + break + fi + done + if test "x$link_unit_test_framework" != "xyes"; then + for libextension in `ls $BOOSTLIBDIR/boost_unit_test_framework*.dll* $BOOSTLIBDIR/boost_unit_test_framework*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^\(boost_unit_test_framework.*\)\.dll.*$;\1;' -e 's;^\(boost_unit_test_framework.*\)\.a.*$;\1;'` ; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_UNIT_TEST_FRAMEWORK_LIB="-l$ax_lib"; AC_SUBST(BOOST_UNIT_TEST_FRAMEWORK_LIB) link_unit_test_framework="yes"; break], + [link_unit_test_framework="no"]) + done + fi + else + link_unit_test_framework="no" + saved_ldflags="${LDFLAGS}" + for ax_lib in boost_unit_test_framework-$ax_boost_user_unit_test_framework_lib $ax_boost_user_unit_test_framework_lib ; do + if test "x$link_unit_test_framework" = "xyes"; then + break; + fi + for unittest_library in `ls $BOOSTLIBDIR/lib${ax_lib}.so* $BOOSTLIBDIR/lib${ax_lib}.a* 2>/dev/null` ; do + if test -r $unittest_library ; then + libextension=`echo $unittest_library | sed 's,.*/,,' | sed -e 's;^lib\(boost_unit_test_framework.*\)\.so.*$;\1;' -e 's;^lib\(boost_unit_test_framework.*\)\.a*$;\1;'` + ax_lib=${libextension} + link_unit_test_framework="yes" + else + link_unit_test_framework="no" + fi + + if test "x$link_unit_test_framework" = "xyes"; then + BOOST_UNIT_TEST_FRAMEWORK_LIB="-l$ax_lib" + AC_SUBST(BOOST_UNIT_TEST_FRAMEWORK_LIB) + break + fi + done + done + fi + if test "x$ax_lib" = "x"; then + AC_MSG_ERROR(Could not find a version of the boost_unit_test_framework library!) + fi + if test "x$link_unit_test_framework" != "xyes"; then + AC_MSG_ERROR(Could not link against $ax_lib !) + fi + fi + + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" + fi +]) diff --git a/src/m4/ax_check_compile_flag.m4 b/src/m4/ax_check_compile_flag.m4 new file mode 100644 index 00000000..c3a8d695 --- /dev/null +++ b/src/m4/ax_check_compile_flag.m4 @@ -0,0 +1,72 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the current language's compiler +# or gives an error. (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the current language's default +# flags (e.g. CFLAGS) when the check is done. The check is thus made with +# 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. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 2 + +AC_DEFUN([AX_CHECK_COMPILE_FLAG], +[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl +AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ + ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS + _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) +AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_COMPILE_FLAGS diff --git a/src/m4/ax_check_link_flag.m4 b/src/m4/ax_check_link_flag.m4 new file mode 100644 index 00000000..e2d0d363 --- /dev/null +++ b/src/m4/ax_check_link_flag.m4 @@ -0,0 +1,71 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the linker or gives an error. +# (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the linker's default flags +# when the check is done. The check is thus made with the flags: "LDFLAGS +# EXTRA-FLAGS FLAG". This can for example be used to force the linker to +# issue an error when a bad flag is given. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 2 + +AC_DEFUN([AX_CHECK_LINK_FLAG], +[AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl +AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [ + ax_check_save_flags=$LDFLAGS + LDFLAGS="$LDFLAGS $4 $1" + AC_LINK_IFELSE([AC_LANG_PROGRAM()], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + LDFLAGS=$ax_check_save_flags]) +AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_LINK_FLAGS diff --git a/src/m4/ax_check_preproc_flag.m4 b/src/m4/ax_check_preproc_flag.m4 new file mode 100644 index 00000000..b1cfef6b --- /dev/null +++ b/src/m4/ax_check_preproc_flag.m4 @@ -0,0 +1,72 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_check_preproc_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_PREPROC_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the current language's +# preprocessor or gives an error. (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the preprocessor's default +# flags when the check is done. The check is thus made with the flags: +# "CPPFLAGS EXTRA-FLAGS FLAG". This can for example be used to force the +# preprocessor to issue an error when a bad flag is given. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{COMPILE,LINK}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 2 + +AC_DEFUN([AX_CHECK_PREPROC_FLAG], +[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]cppflags_$4_$1])dnl +AC_CACHE_CHECK([whether _AC_LANG preprocessor accepts $1], CACHEVAR, [ + ax_check_save_flags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $4 $1" + AC_PREPROC_IFELSE([AC_LANG_PROGRAM()], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + CPPFLAGS=$ax_check_save_flags]) +AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_PREPROC_FLAGS diff --git a/src/m4/ax_pthread.m4 b/src/m4/ax_pthread.m4 new file mode 100644 index 00000000..d383ad5c --- /dev/null +++ b/src/m4/ax_pthread.m4 @@ -0,0 +1,332 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_pthread.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro figures out how to build C programs using POSIX threads. It +# sets the PTHREAD_LIBS output variable to the threads library and linker +# flags, and the PTHREAD_CFLAGS output variable to any special C compiler +# flags that are needed. (The user can also force certain compiler +# flags/libs to be tested by setting these environment variables.) +# +# Also sets PTHREAD_CC to any special C compiler that is needed for +# multi-threaded programs (defaults to the value of CC otherwise). (This +# 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, +# but also link it with them as well. e.g. you should link with +# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS +# +# If you are only building threads programs, you may wish to use these +# variables in your default LIBS, CFLAGS, and CC: +# +# LIBS="$PTHREAD_LIBS $LIBS" +# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +# CC="$PTHREAD_CC" +# +# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant +# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name +# (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# +# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the +# PTHREAD_PRIO_INHERIT symbol is defined when compiling with +# PTHREAD_CFLAGS. +# +# ACTION-IF-FOUND is a list of shell commands to run if a threads library +# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it +# is not found. If ACTION-IF-FOUND is not specified, the default action +# will define HAVE_PTHREAD. +# +# Please let the authors know if this macro fails on any platform, or if +# you have any other suggestions or comments. This macro was based on work +# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help +# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by +# Alejandro Forero Cuervo to the autoconf macro repository. We are also +# grateful for the helpful feedback of numerous users. +# +# Updated for Autoconf 2.68 by Daniel Richard G. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2011 Daniel Richard G. +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 21 + +AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) +AC_DEFUN([AX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_LANG_PUSH([C]) +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on True64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) + AC_TRY_LINK_FUNC([pthread_join], [ax_pthread_ok=yes]) + AC_MSG_RESULT([$ax_pthread_ok]) + if test x"$ax_pthread_ok" = xno; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# 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. + +ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) +# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) +# -pthreads: Solaris/gcc +# -mthreads: Mingw32/gcc, Lynx/gcc +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads too; +# also defines -D_REENTRANT) +# ... -mt is also the pthreads flag for HP/aCC +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case ${host_os} in + 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. (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" + ;; + + darwin*) + ax_pthread_flags="-pthread $ax_pthread_flags" + ;; +esac + +# Clang doesn't consider unrecognized options an error unless we specify +# -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]) +save_CFLAGS="$CFLAGS" +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 +for flag in $ax_pthread_flags; do + + case $flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $flag]) + PTHREAD_CFLAGS="$flag" + ;; + + pthread-config) + AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) + if test x"$ax_pthread_config" = xno; then continue; fi + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$flag]) + PTHREAD_LIBS="-l$flag" + ;; + esac + + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS $ax_pthread_extra_flags" + + # 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 + 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" + CFLAGS="$save_CFLAGS" + + AC_MSG_RESULT([$ax_pthread_ok]) + if test "x$ax_pthread_ok" = xyes; then + break; + fi + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$ax_pthread_ok" = xyes; then + save_LIBS="$LIBS" + LIBS="$PTHREAD_LIBS $LIBS" + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_MSG_CHECKING([for joinable pthread attribute]) + attr_name=unknown + for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [int attr = $attr; return attr /* ; */])], + [attr_name=$attr; break], + []) + done + AC_MSG_RESULT([$attr_name]) + if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then + AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], [$attr_name], + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + fi + + AC_MSG_CHECKING([if more special flags are required for pthreads]) + flag=no + case ${host_os} in + aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";; + osf* | hpux*) flag="-D_REENTRANT";; + solaris*) + if test "$GCC" = "yes"; then + flag="-D_REENTRANT" + else + # TODO: What about Clang on Solaris? + flag="-mt -D_REENTRANT" + fi + ;; + esac + AC_MSG_RESULT([$flag]) + if test "x$flag" != xno; then + PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" + fi + + AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], + [ax_cv_PTHREAD_PRIO_INHERIT], [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[int i = PTHREAD_PRIO_INHERIT;]])], + [ax_cv_PTHREAD_PRIO_INHERIT=yes], + [ax_cv_PTHREAD_PRIO_INHERIT=no]) + ]) + AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"], + [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])]) + + LIBS="$save_LIBS" + CFLAGS="$save_CFLAGS" + + # More AIX lossage: compile with *_r variant + if test "x$GCC" != xyes; then + case $host_os in + aix*) + 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], + [#handle absolute path differently from PATH based program lookup + AS_CASE(["x$CC"], + [x/*], + [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])], + [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])]) + ;; + esac + fi +fi + +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" + +AC_SUBST([PTHREAD_LIBS]) +AC_SUBST([PTHREAD_CFLAGS]) +AC_SUBST([PTHREAD_CC]) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +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]) + : +else + ax_pthread_ok=no + $2 +fi +AC_LANG_POP +])dnl AX_PTHREAD diff --git a/src/m4/bitcoin_find_bdb48.m4 b/src/m4/bitcoin_find_bdb48.m4 new file mode 100644 index 00000000..72ec49b6 --- /dev/null +++ b/src/m4/bitcoin_find_bdb48.m4 @@ -0,0 +1,66 @@ +AC_DEFUN([BITCOIN_FIND_BDB48],[ + AC_MSG_CHECKING([for Berkeley DB C++ headers]) + BDB_CPPFLAGS= + BDB_LIBS= + bdbpath=X + bdb48path=X + bdbdirlist= + for _vn in 4.8 48 4 5 ''; do + for _pfx in b lib ''; do + bdbdirlist="$bdbdirlist ${_pfx}db${_vn}" + done + done + for searchpath in $bdbdirlist ''; do + test -n "${searchpath}" && searchpath="${searchpath}/" + AC_TRY_COMPILE([ + #include <${searchpath}db_cxx.h> + ],[ + #if !((DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 8) || DB_VERSION_MAJOR > 4) + #error "failed to find bdb 4.8+" + #endif + ],[ + if test "x$bdbpath" = "xX"; then + bdbpath="${searchpath}" + fi + ],[ + continue + ]) + AC_TRY_COMPILE([ + #include <${searchpath}db_cxx.h> + ],[ + #if !(DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR == 8) + #error "failed to find bdb 4.8" + #endif + ],[ + bdb48path="${searchpath}" + break + ]) + done + if test "x$bdbpath" = "xX"; then + AC_MSG_RESULT([no]) + AC_MSG_ERROR(libdb_cxx headers missing) + elif test "x$bdb48path" = "xX"; then + 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_MSG_WARN([Found Berkeley DB other than 4.8; wallets opened by this build will not be portable!]) + ],[ + AC_MSG_ERROR([Found Berkeley DB other than 4.8, required for portable wallets (--with-incompatible-bdb to ignore)]) + ]) + else + BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdb48path}],db_cxx) + bdbpath="${bdb48path}" + fi + AC_SUBST(BDB_CPPFLAGS) + + # TODO: Ideally this could find the library version and make sure it matches the headers being used + for searchlib in db_cxx-4.8 db_cxx; do + AC_CHECK_LIB([$searchlib],[main],[ + BDB_LIBS="-l${searchlib}" + break + ]) + done + if test "x$BDB_LIBS" = "x"; then + AC_MSG_ERROR(libdb_cxx missing) + fi + AC_SUBST(BDB_LIBS) +]) diff --git a/src/m4/bitcoin_qt.m4 b/src/m4/bitcoin_qt.m4 new file mode 100644 index 00000000..d5dc3319 --- /dev/null +++ b/src/m4/bitcoin_qt.m4 @@ -0,0 +1,393 @@ +dnl Helper for cases where a qt dependency is not met. +dnl Output: If qt version is auto, set bitcoin_enable_qt to false. Else, exit. +AC_DEFUN([BITCOIN_QT_FAIL],[ + if test "x$bitcoin_qt_want_version" = "xauto" && test x$bitcoin_qt_force != xyes; then + if test x$bitcoin_enable_qt != xno; then + AC_MSG_WARN([$1; darkcoin-qt frontend will not be built]) + fi + bitcoin_enable_qt=no + else + AC_MSG_ERROR([$1]) + fi +]) + +AC_DEFUN([BITCOIN_QT_CHECK],[ + if test "x$bitcoin_enable_qt" != "xno" && test x$bitcoin_qt_want_version != xno; then + true + $1 + else + true + $2 + fi +]) + +dnl BITCOIN_QT_PATH_PROGS([FOO], [foo foo2], [/path/to/search/first], [continue if missing]) +dnl Helper for finding the path of programs needed for Qt. +dnl Inputs: $1: Variable to be set +dnl Inputs: $2: List of programs to search for +dnl Inputs: $3: Look for $2 here before $PATH +dnl Inputs: $4: If "yes", don't fail if $2 is not found. +dnl Output: $1 is set to the path of $2 if found. $2 are searched in order. +AC_DEFUN([BITCOIN_QT_PATH_PROGS],[ + BITCOIN_QT_CHECK([ + if test "x$3" != "x"; then + AC_PATH_PROGS($1,$2,,$3) + else + AC_PATH_PROGS($1,$2) + fi + if test "x$$1" = "x" && test "x$4" != "xyes"; then + BITCOIN_QT_FAIL([$1 not found]) + fi + ]) +]) + +dnl Initialize qt input. +dnl This must be called before any other BITCOIN_QT* macros to ensure that +dnl input variables are set correctly. +dnl CAUTION: Do not use this inside of a conditional. +AC_DEFUN([BITCOIN_QT_INIT],[ + dnl enable qt support + AC_ARG_WITH([gui], + [AS_HELP_STRING([--with-gui], + [with GUI (no|qt4|qt5|auto. default is auto, qt4 tried first.)])], + [ + bitcoin_qt_want_version=$withval + if test x$bitcoin_qt_want_version = xyes; then + bitcoin_qt_force=yes + bitcoin_qt_want_version=auto + fi + ], + [bitcoin_qt_want_version=auto]) + + AC_ARG_WITH([qt-incdir],[AS_HELP_STRING([--with-qt-incdir=INC_DIR],[specify qt include path (overridden by pkgconfig)])], [qt_include_path=$withval], []) + AC_ARG_WITH([qt-libdir],[AS_HELP_STRING([--with-qt-libdir=LIB_DIR],[specify qt lib path (overridden by pkgconfig)])], [qt_lib_path=$withval], []) + AC_ARG_WITH([qt-plugindir],[AS_HELP_STRING([--with-qt-plugindir=PLUGIN_DIR],[specify qt plugin path (overridden by pkgconfig)])], [qt_plugin_path=$withval], []) + AC_ARG_WITH([qt-bindir],[AS_HELP_STRING([--with-qt-bindir=BIN_DIR],[specify qt bin path])], [qt_bin_path=$withval], []) + + AC_ARG_WITH([qtdbus], + [AS_HELP_STRING([--with-qtdbus], + [enable DBus support (default is yes if qt is enabled and QtDBus is found)])], + [use_dbus=$withval], + [use_dbus=auto]) +]) + +dnl Find the appropriate version of Qt libraries and includes. +dnl Inputs: $1: Whether or not pkg-config should be used. yes|no. Default: yes. +dnl Inputs: $2: If $1 is "yes" and --with-gui=auto, which qt version should be +dnl tried first. +dnl Outputs: See _BITCOIN_QT_FIND_LIBS_* +dnl Outputs: Sets variables for all qt-related tools. +dnl Outputs: bitcoin_enable_qt, bitcoin_enable_qt_dbus, bitcoin_enable_qt_test +AC_DEFUN([BITCOIN_QT_CONFIGURE],[ + use_pkgconfig=$1 + + if test x$use_pkgconfig == x; then + use_pkgconfig=yes + fi + + if test x$use_pkgconfig = xyes; then + if test x$PKG_CONFIG == x; then + AC_MSG_ERROR(pkg-config not found.) + fi + BITCOIN_QT_CHECK([_BITCOIN_QT_FIND_LIBS_WITH_PKGCONFIG([$2])]) + else + BITCOIN_QT_CHECK([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG]) + fi + + if test x$use_pkgconfig$qt_bin_path = xyes; then + if test x$bitcoin_qt_got_major_vers = x5; then + qt_bin_path="`$PKG_CONFIG --variable=host_bins Qt5Core 2>/dev/null`" + fi + 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([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([LRELEASE], [lrelease-qt${bitcoin_qt_got_major_vers} lrelease${bitcoin_qt_got_major_vers} lrelease], $qt_bin_path) + BITCOIN_QT_PATH_PROGS([LUPDATE], [lupdate-qt${bitcoin_qt_got_major_vers} lupdate${bitcoin_qt_got_major_vers} lupdate],$qt_bin_path, yes) + + MOC_DEFS='-DHAVE_CONFIG_H -I$(top_srcdir)/src' + case $host in + *darwin*) + BITCOIN_QT_CHECK([ + MOC_DEFS="${MOC_DEFS} -DQ_OS_MAC" + base_frameworks="-framework Foundation -framework ApplicationServices -framework AppKit" + AX_CHECK_LINK_FLAG([[$base_frameworks]],[QT_LIBS="$QT_LIBS $base_frameworks"],[AC_MSG_ERROR(could not find base frameworks)]) + ]) + ;; + *mingw*) + BITCOIN_QT_CHECK([ + AX_CHECK_LINK_FLAG([[-mwindows]],[QT_LDFLAGS="$QT_LDFLAGS -mwindows"],[AC_MSG_WARN(-mwindows linker support not detected)]) + ]) + esac + + + dnl enable qt support + AC_MSG_CHECKING(whether to build Darkcoin Core GUI) + BITCOIN_QT_CHECK([ + bitcoin_enable_qt=yes + bitcoin_enable_qt_test=yes + if test x$have_qt_test = xno; then + bitcoin_enable_qt_test=no + fi + bitcoin_enable_qt_dbus=no + if test x$use_dbus != xno && test x$have_qt_dbus = xyes; then + bitcoin_enable_qt_dbus=yes + fi + if test x$use_dbus = xyes && test x$have_qt_dbus = xno; then + AC_MSG_ERROR("libQtDBus not found. Install libQtDBus or remove --with-qtdbus.") + fi + if test x$LUPDATE == x; then + AC_MSG_WARN("lupdate is required to update qt translations") + fi + ],[ + bitcoin_enable_qt=no + ]) + AC_MSG_RESULT([$bitcoin_enable_qt (Qt${bitcoin_qt_got_major_vers})]) + + AC_SUBST(QT_INCLUDES) + AC_SUBST(QT_LIBS) + AC_SUBST(QT_LDFLAGS) + AC_SUBST(QT_DBUS_INCLUDES) + AC_SUBST(QT_DBUS_LIBS) + AC_SUBST(QT_TEST_INCLUDES) + AC_SUBST(QT_TEST_LIBS) + AC_SUBST(QT_SELECT, qt${bitcoin_qt_got_major_vers}) + AC_SUBST(MOC_DEFS) +]) + +dnl All macros below are internal and should _not_ be used from the main +dnl configure.ac. +dnl ---- + +dnl Internal. Check if the included version of Qt is Qt5. +dnl Requires: INCLUDES must be populated as necessary. +dnl Output: bitcoin_cv_qt5=yes|no +AC_DEFUN([_BITCOIN_QT_CHECK_QT5],[ + AC_CACHE_CHECK(for Qt 5, bitcoin_cv_qt5,[ + AC_TRY_COMPILE( + [#include ], + [ + #if QT_VERSION < 0x050000 + choke me + #else + return 0; + #endif + ], + bitcoin_cv_qt5=yes, + bitcoin_cv_qt5=no) +])]) + +dnl Internal. Check if the linked version of Qt was built as static libs. +dnl Requires: Qt5. This check cannot determine if Qt4 is static. +dnl Requires: INCLUDES and LIBS must be populated as necessary. +dnl Output: bitcoin_cv_static_qt=yes|no +dnl Output: Defines QT_STATICPLUGIN if plugins are static. +AC_DEFUN([_BITCOIN_QT_IS_STATIC],[ + AC_CACHE_CHECK(for static Qt, bitcoin_cv_static_qt,[ + AC_TRY_COMPILE( + [#include ], + [ + #if defined(QT_STATIC) + return 0; + #else + choke me + #endif + ], + [bitcoin_cv_static_qt=yes], + [bitcoin_cv_static_qt=no]) + ]) + if test xbitcoin_cv_static_qt = xyes; then + AC_DEFINE(QT_STATICPLUGIN, 1, [Define this symbol for static Qt plugins]) + fi +]) + +dnl Internal. Check if the link-requirements for static plugins are met. +dnl Requires: INCLUDES and LIBS must be populated as necessary. +dnl Inputs: $1: A series of Q_IMPORT_PLUGIN(). +dnl Inputs: $2: The libraries that resolve $1. +dnl Output: QT_LIBS is prepended or configure exits. +AC_DEFUN([_BITCOIN_QT_CHECK_STATIC_PLUGINS],[ + AC_MSG_CHECKING(for static Qt plugins: $2) + CHECK_STATIC_PLUGINS_TEMP_LIBS="$LIBS" + LIBS="$2 $QT_LIBS $LIBS" + AC_TRY_LINK([ + #define QT_STATICPLUGIN + #include + $1], + [return 0;], + [AC_MSG_RESULT(yes); QT_LIBS="$2 $QT_LIBS"], + [AC_MSG_RESULT(no)]; BITCOIN_QT_FAIL(Could not resolve: $2)) + LIBS="$CHECK_STATIC_PLUGINS_TEMP_LIBS" +]) + +dnl Internal. Find Qt libraries using pkg-config. +dnl Inputs: bitcoin_qt_want_version (from --with-gui=). The version to check +dnl first. +dnl Inputs: $1: If bitcoin_qt_want_version is "auto", check for this version +dnl first. +dnl Outputs: All necessary QT_* variables are set. +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. +AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITH_PKGCONFIG],[ + m4_ifdef([PKG_CHECK_MODULES],[ + auto_priority_version=$1 + if test x$auto_priority_version == x; then + auto_priority_version=qt5 + fi + if test x$bitcoin_qt_want_version == xqt5 || ( test x$bitcoin_qt_want_version == xauto && test x$auto_priority_version == xqt5 ); then + QT_LIB_PREFIX=Qt5 + bitcoin_qt_got_major_vers=5 + else + QT_LIB_PREFIX=Qt + bitcoin_qt_got_major_vers=4 + fi + qt5_modules="Qt5Core Qt5Gui Qt5Network Qt5Widgets" + qt4_modules="QtCore QtGui QtNetwork" + BITCOIN_QT_CHECK([ + if test x$bitcoin_qt_want_version == xqt5 || ( test x$bitcoin_qt_want_version == xauto && test x$auto_priority_version == xqt5 ); then + PKG_CHECK_MODULES([QT], [$qt5_modules], [QT_INCLUDES="$QT_CFLAGS"; have_qt=yes],[have_qt=no]) + elif test x$bitcoin_qt_want_version == xqt4 || ( test x$bitcoin_qt_want_version == xauto && test x$auto_priority_version == xqt4 ); then + PKG_CHECK_MODULES([QT], [$qt4_modules], [QT_INCLUDES="$QT_CFLAGS"; have_qt=yes], [have_qt=no]) + fi + + 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$auto_priority_version = x$qt5; 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]) + 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]) + fi + fi + if test x$have_qt != xyes; then + have_qt=no + BITCOIN_QT_FAIL([Qt dependencies not found]) + fi + ]) + BITCOIN_QT_CHECK([ + PKG_CHECK_MODULES([QT_TEST], [${QT_LIB_PREFIX}Test], [QT_TEST_INCLUDES="$QT_TEST_CFLAGS"; have_qt_test=yes], [have_qt_test=no]) + if test x$use_dbus != xno; then + PKG_CHECK_MODULES([QT_DBUS], [${QT_LIB_PREFIX}DBus], [QT_DBUS_INCLUDES="$QT_DBUS_CFLAGS"; have_qt_dbus=yes], [have_qt_dbus=no]) + fi + ]) + ]) + true; dnl +]) + +dnl Internal. Find Qt libraries without using pkg-config. Version is deduced +dnl from the discovered headers. +dnl Inputs: bitcoin_qt_want_version (from --with-gui=). The version to use. +dnl If "auto", the version will be discovered by _BITCOIN_QT_CHECK_QT5. +dnl Outputs: All necessary QT_* variables are set. +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. +AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[ + TEMP_CPPFLAGS="$CPPFLAGS" + TEMP_LIBS="$LIBS" + BITCOIN_QT_CHECK([ + if test x$qt_include_path != x; then + QT_INCLUDES="-I$qt_include_path -I$qt_include_path/QtCore -I$qt_include_path/QtGui -I$qt_include_path/QtWidgets -I$qt_include_path/QtNetwork -I$qt_include_path/QtTest -I$qt_include_path/QtDBus" + CPPFLAGS="$QT_INCLUDES $CPPFLAGS" + fi + ]) + + BITCOIN_QT_CHECK([AC_CHECK_HEADER([QtPlugin],,BITCOIN_QT_FAIL(QtCore headers missing))]) + BITCOIN_QT_CHECK([AC_CHECK_HEADER([QApplication],, BITCOIN_QT_FAIL(QtGui headers missing))]) + BITCOIN_QT_CHECK([AC_CHECK_HEADER([QLocalSocket],, BITCOIN_QT_FAIL(QtNetwork headers missing))]) + + BITCOIN_QT_CHECK([ + if test x$bitcoin_qt_want_version = xauto; then + _BITCOIN_QT_CHECK_QT5 + fi + if test x$bitcoin_cv_qt5 == xyes || test x$bitcoin_qt_want_version = xqt5; then + QT_LIB_PREFIX=Qt5 + bitcoin_qt_got_major_vers=5 + else + QT_LIB_PREFIX=Qt + bitcoin_qt_got_major_vers=4 + fi + ]) + + BITCOIN_QT_CHECK([ + LIBS= + if test x$qt_lib_path != x; then + LIBS="$LIBS -L$qt_lib_path" + fi + if test x$qt_plugin_path != x; then + LIBS="$LIBS -L$qt_plugin_path/accessible" + if test x$bitcoin_qt_got_major_vers == x5; then + LIBS="$LIBS -L$qt_plugin_path/platforms" + else + LIBS="$LIBS -L$qt_plugin_path/codecs" + fi + fi + + if test x$TARGET_OS == xwindows; then + AC_CHECK_LIB([imm32], [main],, BITCOIN_QT_FAIL(libimm32 not found)) + fi + ]) + + BITCOIN_QT_CHECK(AC_CHECK_LIB([z] ,[main],,BITCOIN_QT_FAIL(zlib not found))) + BITCOIN_QT_CHECK(AC_CHECK_LIB([png] ,[main],,BITCOIN_QT_FAIL(png not found))) + BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Core] ,[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXCore not found))) + BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Gui] ,[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXGui not found))) + BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Network],[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXNetwork not found))) + if test x$bitcoin_qt_got_major_vers == x5; then + BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Widgets],[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXWidgets not found))) + fi + QT_LIBS="$LIBS" + LIBS="$TEMP_LIBS" + + dnl This is ugly and complicated. Yuck. Works as follows: + dnl We can't discern whether Qt4 builds are static or not. For Qt5, we can + dnl check a header to find out. When Qt is built statically, some plugins must + dnl be linked into the final binary as well. These plugins have changed between + dnl Qt4 and Qt5. With Qt5, languages moved into core and the WindowsIntegration + dnl plugin was added. Since we can't tell if Qt4 is static or not, it is + dnl assumed for all non-pkg-config builds. + dnl _BITCOIN_QT_CHECK_STATIC_PLUGINS does a quick link-check and appends the + dnl results to QT_LIBS. + BITCOIN_QT_CHECK([ + if test x$bitcoin_qt_got_major_vers == x5; then + _BITCOIN_QT_IS_STATIC + if test x$bitcoin_cv_static_qt == xyes; then + AC_DEFINE(QT_STATICPLUGIN, 1, [Define this symbol if qt plugins are static]) + _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(AccessibleFactory)], [-lqtaccessiblewidgets]) + if test x$TARGET_OS == xwindows; then + _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)],[-lqwindows]) + fi + fi + else + AC_DEFINE(QT_STATICPLUGIN, 1, [Define this symbol if qt plugins are static]) + _BITCOIN_QT_CHECK_STATIC_PLUGINS([ + Q_IMPORT_PLUGIN(qcncodecs) + Q_IMPORT_PLUGIN(qjpcodecs) + Q_IMPORT_PLUGIN(qtwcodecs) + Q_IMPORT_PLUGIN(qkrcodecs) + Q_IMPORT_PLUGIN(AccessibleFactory)], + [-lqcncodecs -lqjpcodecs -lqtwcodecs -lqkrcodecs -lqtaccessiblewidgets]) + fi + ]) + + BITCOIN_QT_CHECK([ + LIBS= + if test x$qt_lib_path != x; then + LIBS="-L$qt_lib_path" + fi + AC_CHECK_LIB([${QT_LIB_PREFIX}Test], [main],, have_qt_test=no) + AC_CHECK_HEADER([QTest],, have_qt_test=no) + QT_TEST_LIBS="$LIBS" + if test x$use_dbus != xno; then + LIBS= + if test x$qt_lib_path != x; then + LIBS="-L$qt_lib_path" + fi + AC_CHECK_LIB([${QT_LIB_PREFIX}DBus], [main],, have_qt_dbus=no) + AC_CHECK_HEADER([QtDBus],, have_qt_dbus=no) + QT_DBUS_LIBS="$LIBS" + fi + ]) + CPPFLAGS="$TEMP_CPPFLAGS" + LIBS="$TEMP_LIBS" +]) + diff --git a/src/m4/bitcoin_subdir_to_include.m4 b/src/m4/bitcoin_subdir_to_include.m4 new file mode 100644 index 00000000..66f106c7 --- /dev/null +++ b/src/m4/bitcoin_subdir_to_include.m4 @@ -0,0 +1,14 @@ +dnl BITCOIN_SUBDIR_TO_INCLUDE([CPPFLAGS-VARIABLE-NAME],[SUBDIRECTORY-NAME],[HEADER-FILE]) +dnl SUBDIRECTORY-NAME must end with a path separator +AC_DEFUN([BITCOIN_SUBDIR_TO_INCLUDE],[ + if test "x$2" = "x"; then + AC_MSG_RESULT([default]) + else + echo "#include <$2$3.h>" >conftest.cpp + newinclpath=`${CXXCPP} ${CPPFLAGS} -M conftest.cpp 2>/dev/null | [ tr -d '\\n\\r\\\\' | sed -e 's/^.*[[:space:]:]\(\/[^[:space:]]*\)]$3[\.h[[:space:]].*$/\1/' -e t -e d`] + AC_MSG_RESULT([${newinclpath}]) + if test "x${newinclpath}" != "x"; then + eval "$1=\"\$$1\"' -I${newinclpath}'" + fi + fi +]) diff --git a/src/main.h b/src/main.h index d0831856..7e7446d8 100644 --- a/src/main.h +++ b/src/main.h @@ -5,6 +5,11 @@ #ifndef BITCOIN_MAIN_H #define BITCOIN_MAIN_H +#if defined(HAVE_CONFIG_H) +#include "bitcoin-config.h" +#endif + + #include "chain.h" #include "bignum.h" #include "sync.h" diff --git a/src/makefile.linux-mingw b/src/makefile.linux-mingw deleted file mode 100644 index c5f4b9b4..00000000 --- a/src/makefile.linux-mingw +++ /dev/null @@ -1,164 +0,0 @@ -# Copyright (c) 2009-2010 Satoshi Nakamoto -# Distributed under the MIT/X11 software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -TARGET_PLATFORM:=i686 -#TARGET_PLATFORM:=x86_64 - -DEPSDIR:=/usr/$(TARGET_PLATFORM)-w64-mingw32 -CC:=$(TARGET_PLATFORM)-w64-mingw32-gcc -CXX:=$(TARGET_PLATFORM)-w64-mingw32-g++ -RANLIB=$(TARGET_PLATFORM)-w64-mingw32-ranlib -STRIP=$(TARGET_PLATFORM)-w64-mingw32-strip - -USE_UPNP:=0 -USE_WALLET:=1 - -INCLUDEPATHS= \ - -I"$(CURDIR)" \ - -I"$(CURDIR)"/obj \ - -I"$(DEPSDIR)/boost_1_55_0" \ - -I"$(DEPSDIR)/db-6.0.20/build_unix" \ - -I"$(DEPSDIR)/openssl-1.0.1f/include" \ - -I"$(DEPSDIR)" - -LIBPATHS= \ - -L"$(DEPSDIR)/boost_1_55_0/stage/lib" \ - -L"$(DEPSDIR)/db-6.0.20/build_unix" \ - -L"$(DEPSDIR)/openssl-1.0.1f" - -LIBS= \ - -l boost_system-mt \ - -l boost_filesystem-mt \ - -l boost_program_options-mt \ - -l boost_thread_win32-mt \ - -l boost_chrono-mt \ - -l db_cxx \ - -l ssl \ - -l crypto \ - -l z - -DEFS=-D_MT -DWIN32 -D_WINDOWS -DBOOST_THREAD_USE_LIB -DBOOST_SPIRIT_THREADSAFE -DEBUGFLAGS=-g -CFLAGS=-O2 -msse2 -w -Wall -Wextra -Wno-ignored-qualifiers -Wformat -Wformat-security -Wno-unused-parameter $(DEBUGFLAGS) $(DEFS) $(INCLUDEPATHS) -LDFLAGS=-Wl,--dynamicbase -Wl,--nxcompat -static-libgcc -static-libstdc++ - -ifndef USE_UPNP - override USE_UPNP = - -endif -ifneq (${USE_UPNP}, -) - LIBPATHS += -L"$(DEPSDIR)/miniupnpc" - LIBS += -l miniupnpc -l iphlpapi - DEFS += -DSTATICLIB -DUSE_UPNP=$(USE_UPNP) -endif - -LIBS += -l mingwthrd -l kernel32 -l user32 -l gdi32 -l comdlg32 -l winspool -l winmm -l DigitalNote32 -l comctl32 -l ole32 -l oleaut32 -l uuid -l rpcrt4 -l advapi32 -l ws2_32 -l mswsock -l shlwapi - -# TODO: make the mingw builds smarter about dependencies, like the linux/osx builds are -HEADERS = $(wildcard *.h) - -OBJS= \ - obj/alert.o \ - obj/blocksizecalculator.o \ - obj/blockparams.o \ - obj/chainparams.o \ - obj/allocators.o \ - obj/version.o \ - obj/velocity.o \ - obj/support/cleanse.o \ - obj/checkpoints.o \ - obj/netbase.o \ - obj/addrman.o \ - obj/base58.o \ - obj/crypter.o \ - obj/key.o \ - obj/pubkey.o \ - obj/ecwrapper.o \ - obj/init.o \ - obj/bitcoind.o \ - obj/keystore.o \ - obj/chain.o \ - obj/main.o \ - obj/net.o \ - obj/protocol.o \ - obj/rpcclient.o \ - obj/rpcprotocol.o \ - obj/rpcserver.o \ - obj/rpcvelocity.o \ - obj/rpcmisc.o \ - obj/rpcnet.o \ - obj/rpcblockchain.o \ - obj/rpcrawtransaction.o \ - obj/script.o \ - obj/scrypt.o \ - obj/sync.o \ - obj/txmempool.o \ - obj/util.o \ - obj/hash.o \ - obj/noui.o \ - obj/kernel.o \ - obj/pbkdf2.o \ - obj/stealth.o \ - obj/activemasternode.o \ - obj/mnengine.o \ - obj/instantx.o \ - obj/smessage.o \ - obj/rpcsmessage.o \ - obj/webwalletconnector.o \ - obj/masternodeconfig.o \ - obj/masternodeman.o \ - obj/masternode.o \ - obj/masternode-payments.o \ - obj/rpcmnengine.o \ - obj/spork.o \ - obj/crypto/common/hmac_sha256.o \ - obj/crypto/common/hmac_sha512.o \ - obj/crypto/common/ripemd160.o \ - obj/crypto/common/sha1.o \ - obj/crypto/common/sha256.o \ - obj/crypto/common/sha512.o \ - obj/crypto/common/aes_helper.o \ - obj/crypto/common/bmw.o \ - obj/crypto/common/echo.o - -ifeq (${USE_WALLET}, 1) - DEFS += -DENABLE_WALLET - OBJS += \ - obj/db.o \ - obj/miner.o \ - obj/rpcdump.o \ - obj/rpcmining.o \ - obj/rpcwallet.o \ - obj/wallet.o \ - obj/walletdb.o -endif - -all: DigitalNoted.exe - -LIBS += $(CURDIR)/leveldb/libleveldb.a $(CURDIR)/leveldb/libmemenv.a -DEFS += -I"$(CURDIR)/leveldb/include" -DEFS += -I"$(CURDIR)/leveldb/helpers" -OBJS += obj/txdb-leveldb.o -leveldb/libleveldb.a: - @echo "Building LevelDB ..." && cd leveldb && CC=$(CC) CXX=$(CXX) TARGET_OS=OS_WINDOWS_CROSSCOMPILE CXXFLAGS="-I$(INCLUDEPATHS)" LDFLAGS="-L$(LIBPATHS)" $(MAKE) libleveldb.a libmemenv.a && $(RANLIB) libleveldb.a && $(RANLIB) libmemenv.a && cd .. -obj/txdb-leveldb.o: leveldb/libleveldb.a - -obj/build.h: FORCE - /bin/sh ../share/genbuild.sh obj/build.h -version.cpp: obj/build.h -DEFS += -DHAVE_BUILD_INFO - -obj/%.o: %.cpp $(HEADERS) - $(CXX) -c $(CFLAGS) -o $@ $< - -DigitalNoted.exe: $(OBJS:obj/%=obj/%) - $(CXX) $(CFLAGS) $(LDFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS) -lshlwapi - $(STRIP) DigitalNoted.exe - -clean: - -rm -f obj/*.o - -rm -f DigitalNoted.exe - -rm -f obj/build.h - cd leveldb && TARGET_OS=OS_WINDOWS_CROSSCOMPILE $(MAKE) clean && cd .. - -FORCE: diff --git a/src/makefile.mingw b/src/makefile.mingw deleted file mode 100644 index f6cd896d..00000000 --- a/src/makefile.mingw +++ /dev/null @@ -1,165 +0,0 @@ -# Copyright (c) 2009-2010 Satoshi Nakamoto -# Distributed under the MIT/X11 software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -USE_UPNP:=0 -USE_WALLET:=1 -USE_IPV6:=1 - -BOOST_SUFFIX?=-mgw49-mt-s-1_57 - -INCLUDEPATHS= \ - -I"$(CURDIR)" \ - -I"c:/dev/coindeps32/boost_1_57_0/include" \ - -I"c:/dev/coindeps32/bdb-4.8/include" \ - -I"c:/dev/coindeps32/openssl-1.0.1p/include" \ - -I"c:/dev/coindeps32/Secp256k1/include" \ - -I"c:/dev/coindeps32/miniupnpc-1.9" - -LIBPATHS= \ - -L"$(CURDIR)/leveldb" \ - -L"c:/dev/coindeps32/boost_1_57_0/lib" \ - -L"c:/dev/coindeps32/bdb-4.8/lib" \ - -L"c:/dev/coindeps32/openssl-1.0.1p/lib" \ - -L"c:/dev/coindeps32/Secp256k1/lib" \ - -L"c:/dev/coindeps32/miniupnpc-1.9" - -LIBS= \ - -l leveldb \ - -l memenv \ - -l boost_system$(BOOST_SUFFIX) \ - -l boost_filesystem$(BOOST_SUFFIX) \ - -l boost_program_options$(BOOST_SUFFIX) \ - -l boost_thread$(BOOST_SUFFIX) \ - -l boost_chrono$(BOOST_SUFFIX) \ - -l db_cxx \ - -l ssl \ - -l secp256k1 \ - -l crypto - -DEFS=-DWIN32 -D_WINDOWS -DBOOST_THREAD_USE_LIB -DBOOST_SPIRIT_THREADSAFE -DEBUGFLAGS=-g -CFLAGS=-mthreads -O2 -w -Wall -Wextra -Wno-ignored-qualifiers -Wformat -Wformat-security -Wno-unused-parameter -fpermissive $(DEBUGFLAGS) $(DEFS) $(INCLUDEPATHS) -LDFLAGS=-Wl,--dynamicbase -Wl,--nxcompat -Wl,--large-address-aware -static - -TESTDEFS = -DTEST_DATA_DIR=$(abspath test/data) - -ifndef USE_UPNP - override USE_UPNP = - -endif -ifneq (${USE_UPNP}, -) - LIBS += -l miniupnpc -l iphlpapi - DEFS += -DMINIUPNP_STATICLIB -DUSE_UPNP=$(USE_UPNP) -endif - -ifneq (${USE_IPV6}, -) - DEFS += -DUSE_IPV6=$(USE_IPV6) -endif - -LIBS += -l mingwthrd -l kernel32 -l user32 -l gdi32 -l comdlg32 -l winspool -l winmm -l shell32 -l comctl32 -l ole32 -l oleaut32 -l uuid -l rpcrt4 -l advapi32 -l ws2_32 -l mswsock -l shlwapi - -# TODO: make the mingw builds smarter about dependencies, like the linux/osx builds are -HEADERS = $(wildcard *.h) - -OBJS= \ - obj/alert.o \ - obj/blocksizecalculator.o \ - obj/blockparams.o \ - obj/chainparams.o \ - obj/allocators.o \ - obj/version.o \ - obj/velocity.o \ - obj/support/cleanse.o \ - obj/checkpoints.o \ - obj/netbase.o \ - obj/addrman.o \ - obj/base58.o \ - obj/crypter.o \ - obj/key.o \ - obj/pubkey.o \ - obj/ecwrapper.o \ - obj/init.o \ - obj/bitcoind.o \ - obj/keystore.o \ - obj/chain.o \ - obj/main.o \ - obj/net.o \ - obj/protocol.o \ - obj/rpcclient.o \ - obj/rpcprotocol.o \ - obj/rpcserver.o \ - obj/rpcvelocity.o \ - obj/rpcmisc.o \ - obj/rpcnet.o \ - obj/rpcblockchain.o \ - obj/rpcrawtransaction.o \ - obj/script.o \ - obj/scrypt.o \ - obj/sync.o \ - obj/txmempool.o \ - obj/util.o \ - obj/hash.o \ - obj/noui.o \ - obj/kernel.o \ - obj/pbkdf2.o \ - obj/stealth.o \ - obj/activemasternode.o \ - obj/mnengine.o \ - obj/instantx.o \ - obj/smessage.o \ - obj/rpcsmessage.o \ - obj/webwalletconnector.o \ - obj/masternodeconfig.o \ - obj/masternodeman.o \ - obj/masternode.o \ - obj/masternode-payments.o \ - obj/rpcmnengine.o \ - obj/spork.o \ - obj/crypto/common/hmac_sha256.o \ - obj/crypto/common/hmac_sha512.o \ - obj/crypto/common/ripemd160.o \ - obj/crypto/common/sha1.o \ - obj/crypto/common/sha256.o \ - obj/crypto/common/sha512.o \ - obj/crypto/common/aes_helper.o \ - obj/crypto/common/bmw.o \ - obj/crypto/common/echo.o - -ifeq (${USE_WALLET}, 1) - DEFS += -DENABLE_WALLET - OBJS += \ - obj/db.o \ - obj/miner.o \ - obj/rpcdump.o \ - obj/rpcmining.o \ - obj/rpcwallet.o \ - obj/wallet.o \ - obj/walletdb.o -endif - -all: DigitalNoted.exe - -LIBS += $(CURDIR)/leveldb/libleveldb.a $(CURDIR)/leveldb/libmemenv.a -DEFS += $(addprefix -I,$(CURDIR)/leveldb/include) -DEFS += $(addprefix -I,$(CURDIR)/leveldb/helpers) -OBJS += obj/txdb-leveldb.o -leveldb/libleveldb.a: - @echo "Building LevelDB ..."; cd leveldb; chmod 755 *;make libleveldb.a libmemenv.a; cd ..; -obj/txdb-leveldb.o: leveldb/libleveldb.a - -obj/%.o: %.cpp $(HEADERS) - g++ -c $(CFLAGS) -o $@ $< - -obj/%.o: %.c $(HEADERS) - $(CXX) -c $(CFLAGS) -fpermissive -o $@ $< - -DigitalNoted.exe: $(OBJS:obj/%=obj/%) - g++ $(CFLAGS) $(LDFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS) - -clean: - -rm -f obj/*.o - -rm -f DigitalNoted.exe - -rm -f obj/build.h - cd leveldb && TARGET_OS=NATIVE_WINDOWS $(MAKE) clean && cd .. - -FORCE: diff --git a/src/makefile.osx b/src/makefile.osx deleted file mode 100644 index fab15319..00000000 --- a/src/makefile.osx +++ /dev/null @@ -1,213 +0,0 @@ -# -*- mode: Makefile; -*- -# Copyright (c) 2011 Bitcoin Developers -# Distributed under the MIT/X11 software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -# Mac OS X makefile for DigitalNote -# Originally by Laszlo Hanyecz (solar@heliacal.net) - -CXX=clang++ -std=c++11 -C=clang -DEPSDIR=/usr/local - -INCLUDEPATHS= \ - -I"$(CURDIR)" \ - -I"$(CURDIR)"/obj \ - -I"$(DEPSDIR)/include" \ - -I"$(DEPSDIR)/Cellar/boost/1.73.0/include" \ - -I"$(DEPSDIR)/Cellar/berkeley-db@6.2.32/include" \ - -I"$(DEPSDIR)/Cellar/openssl@1.1/1.1.1g/lib" - -LIBPATHS= \ - -L"$(DEPSDIR)/lib" \ - -L"$(DEPSDIR)/Cellar/boost/1.73.0/lib" \ - -L"$(DEPSDIR)/Cellar/berkeley-db@6.2.32/lib" \ - -L"$(DEPSDIR)/Cellar/openssl@1.1/1.1.1g/lib" - -USE_UPNP:=1 -USE_WALLET:=1 -USE_IPV6:=1 - -LIBS= -dead_strip - -ifdef STATIC -# Build STATIC if you are redistributing the DigitalNoted binary -LIBS += \ - $(DEPSDIR)/Cellar/berkeley-db@6.2.32/lib/libdb_cxx-6.2.a \ - $(DEPSDIR)/lib/libboost_system.a \ - $(DEPSDIR)/lib/libboost_filesystem.a \ - $(DEPSDIR)/lib/libboost_program_options.a \ - $(DEPSDIR)/lib/libboost_thread-mt.a \ - $(DEPSDIR)/lib/libssl.a \ - $(DEPSDIR)/lib/libcrypto.a \ - -lz -else -LIBS += \ - -l db_cxx-6.2 \ - -l boost_system \ - -l boost_filesystem \ - -l boost_program_options \ - -l boost_thread-mt \ - -l boost_chrono-mt \ - -l ssl \ - -l crypto \ - -lgmp \ - -l z -endif - -DEFS=-DMAC_OSX -DMSG_NOSIGNAL=0 -DBOOST_SPIRIT_THREADSAFE - -ifdef RELEASE -# Compile for maximum compatibility and smallest size. -# This requires that dependencies are compiled -# the same way. -CFLAGS = -mmacosx-version-min=10.8 -arch x86_64 -O3 -else -DEBUGFLAGS = -g -endif - -# ppc doesn't work because we don't support big-endian -CFLAGS += -Wall -Wextra -Wformat -Wno-ignored-qualifiers -Wformat-security -Wno-unused-parameter -Wunused-function -Wunused-variable -fpermissive -Wconversion-null -Wno-deprecated-declarations\ - $(DEBUGFLAGS) $(DEFS) $(INCLUDEPATHS) - -OBJS= \ - obj/alert.o \ - obj/blocksizecalculator.o \ - obj/blockparams.o \ - obj/chainparams.o \ - obj/allocators.o \ - obj/version.o \ - obj/velocity.o \ - obj/support/cleanse.o \ - obj/checkpoints.o \ - obj/netbase.o \ - obj/addrman.o \ - obj/base58.o \ - obj/crypter.o \ - obj/key.o \ - obj/pubkey.o \ - obj/ecwrapper.o \ - obj/init.o \ - obj/bitcoind.o \ - obj/keystore.o \ - obj/chain.o \ - obj/main.o \ - obj/net.o \ - obj/protocol.o \ - obj/rpcclient.o \ - obj/rpcprotocol.o \ - obj/rpcserver.o \ - obj/rpcvelocity.o \ - obj/rpcmisc.o \ - obj/rpcnet.o \ - obj/rpcblockchain.o \ - obj/rpcrawtransaction.o \ - obj/script.o \ - obj/scrypt.o \ - obj/sync.o \ - obj/txmempool.o \ - obj/util.o \ - obj/hash.o \ - obj/noui.o \ - obj/kernel.o \ - obj/pbkdf2.o \ - obj/stealth.o \ - obj/activemasternode.o \ - obj/mnengine.o \ - obj/instantx.o \ - obj/smessage.o \ - obj/rpcsmessage.o \ - obj/webwalletconnector.o \ - obj/masternodeconfig.o \ - obj/masternodeman.o \ - obj/masternode.o \ - obj/masternode-payments.o \ - obj/rpcmnengine.o \ - obj/spork.o \ - obj/crypto/common/hmac_sha256.o \ - obj/crypto/common/hmac_sha512.o \ - obj/crypto/common/ripemd160.o \ - obj/crypto/common/sha1.o \ - obj/crypto/common/sha256.o \ - obj/crypto/common/sha512.o \ - obj/crypto/common/aes_helper.o \ - obj/crypto/common/bmw.o \ - obj/crypto/common/echo.o - -ifeq (${USE_WALLET}, 1) - DEFS += -DENABLE_WALLET - OBJS += \ - obj/db.o \ - obj/miner.o \ - obj/rpcdump.o \ - obj/rpcmining.o \ - obj/rpcwallet.o \ - obj/wallet.o \ - obj/walletdb.o -endif - -ifndef USE_UPNP - override USE_UPNP = - -endif -ifneq (${USE_UPNP}, -) - DEFS += -DUSE_UPNP=$(USE_UPNP) -ifdef STATIC - LIBS += $(DEPSDIR)/lib/libminiupnpc.a -else - LIBS += -lminiupnpc -endif -endif - -ifneq (${USE_IPV6}, -) - DEFS += -DUSE_IPV6=$(USE_IPV6) -endif - -all: DigitalNoted - -# build secp256k1 -DEFS += $(addprefix -I,$(CURDIR)/secp256k1/include) -secp256k1/src/libsecp256k1_la-secp256k1.o: - @echo "Building Secp256k1 ..."; cd secp256k1; chmod 755 *; ./autogen.sh; ./configure --enable-module-recovery; make; cd ..; -DigitalNoted: secp256k1/src/libsecp256k1_la-secp256k1.o - -# build leveldb -LIBS += $(CURDIR)/leveldb/libleveldb.a $(CURDIR)/leveldb/libmemenv.a -DEFS += $(addprefix -I,$(CURDIR)/leveldb/include) -DEFS += $(addprefix -I,$(CURDIR)/leveldb/helpers) -OBJS += obj/txdb-leveldb.o -leveldb/libleveldb.a: - @echo "Building LevelDB ..."; cd leveldb; chmod 755 *; make libleveldb.a libmemenv.a; cd .. -obj/txdb-leveldb.o: leveldb/libleveldb.a - -# auto-generated dependencies: --include obj/*.P - -obj/build.h: FORCE - /bin/sh ../share/genbuild.sh obj/build.h -version.cpp: obj/build.h -DEFS += -DHAVE_BUILD_INFO - -obj/%.o: %.cpp - $(CXX) -c $(CFLAGS) -MMD -MF $(@:%.o=%.d) -o $@ $< - @cp $(@:%.o=%.d) $(@:%.o=%.P); \ - sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ - -e '/^$$/ d' -e 's/$$/ :/' < $(@:%.o=%.d) >> $(@:%.o=%.P); \ - rm -f $(@:%.o=%.d) - -obj/%.o: %.c - $(C) -c $(CFLAGS) -fpermissive -MMD -MF $(@:%.o=%.d) -o $@ $< - @cp $(@:%.o=%.d) $(@:%.o=%.P); \ - sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ - -e '/^$$/ d' -e 's/$$/ :/' < $(@:%.o=%.d) >> $(@:%.o=%.P); \ - rm -f $(@:%.o=%.d) - -DigitalNoted: $(OBJS:obj/%=obj/%) - $(CXX) $(CFLAGS) -o $@ $(LIBPATHS) $^ $(LIBS) - -clean: - -rm -f DigitalNoted - -rm -f obj/*.o - -rm -f obj/*.P - -rm -f obj/build.h - -FORCE: diff --git a/src/makefile.unix b/src/makefile.unix deleted file mode 100644 index 3acc02ac..00000000 --- a/src/makefile.unix +++ /dev/null @@ -1,235 +0,0 @@ -# Copyright (c) 2009-2010 Satoshi Nakamoto -# Distributed under the MIT/X11 software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -USE_UPNP:=0 -USE_WALLET:=1 -USE_IPV6:=1 - -LINK:=$(CXX) -ARCH:=$(system lscpu | head -n 1 | awk '{print $2}') - -DEFS=-DBOOST_SPIRIT_THREADSAFE -DEFS += $(addprefix -I,$(CURDIR) $(CURDIR)/obj $(BOOST_INCLUDE_PATH) $(BDB_INCLUDE_PATH) $(OPENSSL_INCLUDE_PATH)) -LIBS = $(addprefix -L,$(BOOST_LIB_PATH) $(BDB_LIB_PATH) $(OPENSSL_LIB_PATH)) - -LMODE = dynamic -LMODE2 = dynamic -ifdef STATIC - LMODE = static - ifeq (${STATIC}, all) - LMODE2 = static - endif -endif - -LIBS += \ - -Wl,-B$(LMODE) - -# for boost 1.37, add -mt to the boost libraries -LIBS += \ - -Wl,-B$(LMODE) \ - -l boost_system$(BOOST_LIB_SUFFIX) \ - -l boost_filesystem$(BOOST_LIB_SUFFIX) \ - -l boost_program_options$(BOOST_LIB_SUFFIX) \ - -l boost_thread$(BOOST_LIB_SUFFIX) \ - -l boost_chrono$(BOOST_LIB_SUFFIX) \ - -l db_cxx$(BDB_LIB_SUFFIX) \ - -l ssl \ - -l gmp \ - -l crypto - -ifndef USE_UPNP - override USE_UPNP = - -endif -ifneq (${USE_UPNP}, -) - LIBS += -l miniupnpc - DEFS += -DUSE_UPNP=$(USE_UPNP) -endif - -ifneq (${USE_IPV6}, -) - DEFS += -DUSE_IPV6=$(USE_IPV6) -endif - -LIBS+= \ - -Wl,-B$(LMODE2) \ - -l z \ - -l dl \ - -l pthread - - -# Hardening -# Make some classes of vulnerabilities unexploitable in case one is discovered. -# - # This is a workaround for Ubuntu bug #691722, the default -fstack-protector causes - # -fstack-protector-all to be ignored unless -fno-stack-protector is used first. - # see: https://bugs.launchpad.net/ubuntu/+source/gcc-4.5/+bug/691722 - HARDENING=-fno-stack-protector - - # Stack Canaries - # Put numbers at the beginning of each stack frame and check that they are the same. - # If a stack buffer if overflowed, it writes over the canary number and then on return - # when that number is checked, it won't be the same and the program will exit with - # a "Stack smashing detected" error instead of being exploited. - HARDENING+=-fstack-protector-all -Wstack-protector - - # Make some important things such as the global offset table read only as soon as - # the dynamic linker is finished building it. This will prevent overwriting of addresses - # which would later be jumped to. - LDHARDENING+=-Wl,-z,relro -Wl,-z,now - - # Build position independent code to take advantage of Address Space Layout Randomization - # offered by some kernels. - # see doc/build-unix.txt for more information. - ifdef PIE - HARDENING+=-fPIE - LDHARDENING+=-pie - endif - - # -D_FORTIFY_SOURCE=2 does some checking for potentially exploitable code patterns in - # the source such overflowing a statically defined buffer. - HARDENING+=-D_FORTIFY_SOURCE=2 -# - - -DEBUGFLAGS=-g - - -ifeq (${ARCH}, i686) - EXT_OPTIONS=-msse2 -endif - - -# CXXFLAGS can be specified on the make command line, so we use xCXXFLAGS that only -# adds some defaults in front. Unfortunately, CXXFLAGS=... $(CXXFLAGS) does not work. -xCXXFLAGS=-O2 $(EXT_OPTIONS) -pthread -Wall -Wextra -Wno-ignored-qualifiers -Wformat -Wformat-security -Wno-unused-parameter -Wunused-function -Wunused-variable -fpermissive -Wconversion-null\ - $(DEBUGFLAGS) $(DEFS) $(HARDENING) $(CXXFLAGS) - -# LDFLAGS can be specified on the make command line, so we use xLDFLAGS that only -# adds some defaults in front. Unfortunately, LDFLAGS=... $(LDFLAGS) does not work. -xLDFLAGS=$(LDHARDENING) $(LDFLAGS) - -OBJS= \ - obj/alert.o \ - obj/blocksizecalculator.o \ - obj/blockparams.o \ - obj/chainparams.o \ - obj/allocators.o \ - obj/version.o \ - obj/velocity.o \ - obj/support/cleanse.o \ - obj/checkpoints.o \ - obj/netbase.o \ - obj/addrman.o \ - obj/base58.o \ - obj/crypter.o \ - obj/key.o \ - obj/pubkey.o \ - obj/ecwrapper.o \ - obj/init.o \ - obj/bitcoind.o \ - obj/keystore.o \ - obj/chain.o \ - obj/main.o \ - obj/net.o \ - obj/protocol.o \ - obj/rpcclient.o \ - obj/rpcprotocol.o \ - obj/rpcserver.o \ - obj/rpcvelocity.o \ - obj/rpcmisc.o \ - obj/rpcnet.o \ - obj/rpcblockchain.o \ - obj/rpcrawtransaction.o \ - obj/script.o \ - obj/scrypt.o \ - obj/sync.o \ - obj/txmempool.o \ - obj/util.o \ - obj/hash.o \ - obj/noui.o \ - obj/kernel.o \ - obj/pbkdf2.o \ - obj/stealth.o \ - obj/activemasternode.o \ - obj/mnengine.o \ - obj/instantx.o \ - obj/smessage.o \ - obj/rpcsmessage.o \ - obj/webwalletconnector.o \ - obj/masternodeconfig.o \ - obj/masternodeman.o \ - obj/masternode.o \ - obj/masternode-payments.o \ - obj/rpcmnengine.o \ - obj/spork.o \ - obj/crypto/common/hmac_sha256.o \ - obj/crypto/common/hmac_sha512.o \ - obj/crypto/common/ripemd160.o \ - obj/crypto/common/sha1.o \ - obj/crypto/common/sha256.o \ - obj/crypto/common/sha512.o \ - obj/crypto/common/aes_helper.o \ - obj/crypto/common/bmw.o \ - obj/crypto/common/echo.o - -ifeq (${USE_WALLET}, 1) - DEFS += -DENABLE_WALLET - OBJS += \ - obj/db.o \ - obj/miner.o \ - obj/rpcdump.o \ - obj/rpcmining.o \ - obj/rpcwallet.o \ - obj/wallet.o \ - obj/walletdb.o -endif - -all: DigitalNoted - -# build secp256k1 -DEFS += $(addprefix -I,$(CURDIR)/secp256k1/include) -secp256k1/src/libsecp256k1_la-secp256k1.o: - @echo "Building Secp256k1 ..."; cd secp256k1; chmod 755 *; ./autogen.sh; ./configure --enable-module-recovery; make; cd ..; -DigitalNoted: secp256k1/src/libsecp256k1_la-secp256k1.o - -# build leveldb -LIBS += $(CURDIR)/leveldb/libleveldb.a $(CURDIR)/leveldb/libmemenv.a -DEFS += $(addprefix -I,$(CURDIR)/leveldb/include) -DEFS += $(addprefix -I,$(CURDIR)/leveldb/helpers) -OBJS += obj/txdb-leveldb.o -leveldb/libleveldb.a: - @echo "Building LevelDB ..."; cd leveldb; chmod 755 *;make libleveldb.a libmemenv.a; cd ..; -obj/txdb-leveldb.o: leveldb/libleveldb.a - -# auto-generated dependencies: --include obj/*.P - -obj/build.h: FORCE - /bin/sh ../share/genbuild.sh obj/build.h -version.cpp: obj/build.h -DEFS += -DHAVE_BUILD_INFO - -obj/%.o: %.cpp - $(CXX) -c $(xCXXFLAGS) -MMD -MF $(@:%.o=%.d) -o $@ $< - @cp $(@:%.o=%.d) $(@:%.o=%.P); \ - sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ - -e '/^$$/ d' -e 's/$$/ :/' < $(@:%.o=%.d) >> $(@:%.o=%.P); \ - rm -f $(@:%.o=%.d) - -obj/%.o: %.c - $(CXX) -c $(xCXXFLAGS) -fpermissive -MMD -MF $(@:%.o=%.d) -o $@ $< - @cp $(@:%.o=%.d) $(@:%.o=%.P); \ - sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ - -e '/^$$/ d' -e 's/$$/ :/' < $(@:%.o=%.d) >> $(@:%.o=%.P); \ - rm -f $(@:%.o=%.d) - -DigitalNoted: $(OBJS:obj/%=obj/%) - $(LINK) $(xCXXFLAGS) -o $@ $^ $(xLDFLAGS) $(LIBS) - -clean: - -rm -f DigitalNoted - -rm -f obj/*.o - -rm -f obj/*.P - -rm -f obj/build.h - -FORCE: diff --git a/src/qt/addressbookpage.cpp b/src/qt/addressbookpage.cpp index b7346106..4891b1fe 100644 --- a/src/qt/addressbookpage.cpp +++ b/src/qt/addressbookpage.cpp @@ -1,3 +1,7 @@ +#if defined(HAVE_CONFIG_H) +#include "bitcoin-config.h" +#endif + #include "addressbookpage.h" #include "ui_addressbookpage.h" diff --git a/src/qt/notificator.h b/src/qt/notificator.h index aafec325..aee096e9 100644 --- a/src/qt/notificator.h +++ b/src/qt/notificator.h @@ -1,6 +1,10 @@ #ifndef NOTIFICATOR_H #define NOTIFICATOR_H +#if defined(HAVE_CONFIG_H) +#include "bitcoin-config.h" +#endif + #include #include diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp index 433d3e8e..43bfc435 100644 --- a/src/qt/optionsdialog.cpp +++ b/src/qt/optionsdialog.cpp @@ -1,3 +1,7 @@ +#if defined(HAVE_CONFIG_H) +#include "bitcoin-config.h" +#endif + #include "optionsdialog.h" #include "ui_optionsdialog.h" @@ -189,7 +193,7 @@ void OptionsDialog::updateDisplayUnit() bool OptionsDialog::eventFilter(QObject *object, QEvent *event) { if(event->type() == QEvent::FocusOut) - { + { return QDialog::eventFilter(object, event); } } diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp index f8ad0d1e..25e62a94 100644 --- a/src/qt/optionsmodel.cpp +++ b/src/qt/optionsmodel.cpp @@ -1,6 +1,10 @@ // Copyright (c) 2011-2014 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#if defined(HAVE_CONFIG_H) +#include "bitcoin-config.h" +#endif + #include "optionsmodel.h" #include "bitcoinunits.h" @@ -55,9 +59,9 @@ void OptionsModel::Init() if (!settings.contains("nDisplayUnit")) settings.setValue("nDisplayUnit", DigitalNoteUnits::XDN); nDisplayUnit = settings.value("nDisplayUnit").toInt(); - + fUseDarkTheme = settings.value("fUseDarkTheme", false).toBool(); - + if (!settings.contains("fCoinControlFeatures")) settings.setValue("fCoinControlFeatures", false); fCoinControlFeatures = settings.value("fCoinControlFeatures", false).toBool(); @@ -165,7 +169,7 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const settings.setValue("nTransactionFee", (qint64)nTransactionFee); // Todo: Consider to revert back to use just nTransactionFee here, if we don't want // -paytxfee to update our QSettings! - return settings.value("nTransactionFee"); + return settings.value("nTransactionFee"); case ReserveBalance: return QVariant((qint64) nReserveBalance); #endif diff --git a/src/qt/res/bitcoin-qt.rc b/src/qt/res/bitcoin-qt-res.rc similarity index 100% rename from src/qt/res/bitcoin-qt.rc rename to src/qt/res/bitcoin-qt-res.rc diff --git a/src/qt/test/MakeFile.am b/src/qt/test/MakeFile.am new file mode 100644 index 00000000..315ad818 --- /dev/null +++ b/src/qt/test/MakeFile.am @@ -0,0 +1,25 @@ +include $(top_srcdir)/src/Makefile.include + +AM_CPPFLAGS = $(INCLUDES) -I$(top_builddir)/src/obj \ + -I$(top_srcdir)/src/leveldb/include -I$(top_srcdir)/src \ + -I$(top_srcdir)/src/leveldb/helpers -I$(top_srcdir)/src/qt \ + -I$(top_builddir)/src/qt $(BOOST_INCLUDES) $(PROTOBUF_CFLAGS) \ + $(QR_CFLAGS) +AM_LDFLAGS = $(PTHREAD_CFLAGS) +bin_PROGRAMS = test_bitcoin-qt +TESTS = test_bitcoin-qt + +TEST_QT_MOC_CPP = moc_uritests.cpp moc_paymentservertests.cpp + +TEST_QT_H = uritests.h paymentservertests.h paymentrequestdata.h + +BUILT_SOURCES = $(TEST_QT_MOC_CPP) + +test_bitcoin_qt_CPPFLAGS = $(AM_CPPFLAGS) $(QT_INCLUDES) $(QT_TEST_INCLUDES) +test_bitcoin_qt_SOURCES = test_main.cpp uritests.cpp paymentservertests.cpp $(TEST_QT_H) +nodist_test_bitcoin_qt_SOURCES = $(TEST_QT_MOC_CPP) +test_bitcoin_qt_LDADD = $(LIBBITCOINQT) $(LIBBITCOIN) $(LIBLEVELDB) \ + $(LIBMEMENV) $(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QT_TEST_LIBS) \ + $(QR_LIBS) $(PROTOBUF_LIBS) + +CLEANFILES = $(BUILT_SOURCES) *.gcda *.gcno \ No newline at end of file diff --git a/src/qt/test/paymentservertests.cpp b/src/qt/test/paymentservertests.cpp new file mode 100644 index 00000000..0993e77c --- /dev/null +++ b/src/qt/test/paymentservertests.cpp @@ -0,0 +1,111 @@ +#include +#include +#include +#include +#include + +#include +#include + +#include "optionsmodel.h" +#include "paymentservertests.h" +#include "paymentrequestdata.h" +#include "util.h" + + + +X509 *parse_b64der_cert(const char* cert_data) +{ + std::vector data = DecodeBase64(cert_data); + assert(data.size() > 0); + const unsigned char* dptr = &data[0]; + X509 *cert = d2i_X509(NULL, &dptr, data.size()); + assert(cert); + return cert; +} + + +// +// Test payment request handling +// + +static SendCoinsRecipient handleRequest(PaymentServer* server, std::vector& data) +{ + RecipientCatcher sigCatcher; + QObject::connect(server, SIGNAL(receivedPaymentRequest(SendCoinsRecipient)), + &sigCatcher, SLOT(getRecipient(SendCoinsRecipient))); + + // Write data to a temp file: + QTemporaryFile f; + f.open(); + f.write((const char*)&data[0], data.size()); + f.close(); + + // Create a FileOpenEvent and send it directly to the server's event filter: + QFileOpenEvent event(f.fileName()); + server->eventFilter(NULL, &event); + + QObject::disconnect(server, SIGNAL(receivedPaymentRequest(SendCoinsRecipient)), + &sigCatcher, SLOT(getRecipient(SendCoinsRecipient))); + + // Return results from sigCatcher + return sigCatcher.recipient; +} + +void PaymentServerTests::paymentServerTests() +{ + OptionsModel optionsModel; + PaymentServer* server = new PaymentServer(NULL, false); + X509_STORE* caStore = X509_STORE_new(); + X509_STORE_add_cert(caStore, parse_b64der_cert(caCert_BASE64)); + PaymentServer::LoadRootCAs(caStore); + server->setOptionsModel(&optionsModel); + server->initNetManager(); + server->uiReady(); + + // Now feed PaymentRequests to server, and observe signals it produces: + std::vector data = DecodeBase64(paymentrequest1_BASE64); + SendCoinsRecipient r = handleRequest(server, data); + QString merchant; + r.paymentRequest.getMerchant(caStore, merchant); + QCOMPARE(merchant, QString("testmerchant.org")); + + // Version of the above, with an expired certificate: + data = DecodeBase64(paymentrequest2_BASE64); + r = handleRequest(server, data); + r.paymentRequest.getMerchant(caStore, merchant); + QCOMPARE(merchant, QString("")); + + // Long certificate chain: + data = DecodeBase64(paymentrequest3_BASE64); + r = handleRequest(server, data); + r.paymentRequest.getMerchant(caStore, merchant); + QCOMPARE(merchant, QString("testmerchant8.org")); + + // Long certificate chain, with an expired certificate in the middle: + data = DecodeBase64(paymentrequest4_BASE64); + r = handleRequest(server, data); + r.paymentRequest.getMerchant(caStore, merchant); + QCOMPARE(merchant, QString("")); + + // Validly signed, but by a CA not in our root CA list: + data = DecodeBase64(paymentrequest5_BASE64); + r = handleRequest(server, data); + r.paymentRequest.getMerchant(caStore, merchant); + QCOMPARE(merchant, QString("")); + + // Try again with no root CA's, verifiedMerchant should be empty: + caStore = X509_STORE_new(); + PaymentServer::LoadRootCAs(caStore); + data = DecodeBase64(paymentrequest1_BASE64); + r = handleRequest(server, data); + r.paymentRequest.getMerchant(caStore, merchant); + QCOMPARE(merchant, QString("")); + + delete server; +} + +void RecipientCatcher::getRecipient(SendCoinsRecipient r) +{ + recipient = r; +} \ No newline at end of file diff --git a/src/test/MakeFile.am b/src/test/MakeFile.am new file mode 100644 index 00000000..ef6296d0 --- /dev/null +++ b/src/test/MakeFile.am @@ -0,0 +1,38 @@ +include $(top_srcdir)/src/Makefile.include + +AM_CPPFLAGS = $(INCLUDES) -I$(top_builddir)/src/obj \ + -I$(top_srcdir)/src/leveldb/include -I$(top_srcdir)/src/leveldb/helpers \ + -I$(top_srcdir)/src $(BOOST_INCLUDES) + +AM_LDFLAGS = $(PTHREAD_CFLAGS) + +bin_PROGRAMS = test_bitcoin + +TESTS = test_bitcoin + +TEST_DATA_DIR=$(top_srcdir)/src/test/data + +TEST_DATA_FILES= $(TEST_DATA_DIR)/script_valid.json \ + $(TEST_DATA_DIR)/base58_keys_valid.json $(TEST_DATA_DIR)/sig_canonical.json \ + $(TEST_DATA_DIR)/sig_noncanonical.json \ + $(TEST_DATA_DIR)/base58_encode_decode.json $(TEST_DATA_DIR)/alertTests \ + $(TEST_DATA_DIR)/base58_keys_invalid.json \ + $(TEST_DATA_DIR)/script_invalid.json $(TEST_DATA_DIR)/tx_invalid.json \ + $(TEST_DATA_DIR)/tx_valid.json + +# test_bitcoin binary # +test_bitcoin_CPPFLAGS = $(AM_CPPFLAGS) $(TESTDEFS) \ + -DTEST_DATA_DIR=$(TEST_DATA_DIR) +test_bitcoin_LDADD = $(LIBBITCOIN) $(LIBLEVELDB) $(LIBMEMENV) \ + $(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) +test_bitcoin_SOURCES = accounting_tests.cpp alert_tests.cpp \ + allocator_tests.cpp base32_tests.cpp base58_tests.cpp base64_tests.cpp \ + bignum_tests.cpp bloom_tests.cpp canonical_tests.cpp checkblock_tests.cpp \ + Checkpoints_tests.cpp compress_tests.cpp DoS_tests.cpp getarg_tests.cpp \ + key_tests.cpp miner_tests.cpp mruset_tests.cpp multisig_tests.cpp \ + netbase_tests.cpp pmt_tests.cpp rpc_tests.cpp script_P2SH_tests.cpp \ + script_tests.cpp serialize_tests.cpp sigopcount_tests.cpp test_bitcoin.cpp \ + transaction_tests.cpp uint160_tests.cpp uint256_tests.cpp util_tests.cpp \ + wallet_tests.cpp $(TEST_DATA_FILES) + +CLEANFILES = *.gcda *.gcno \ No newline at end of file diff --git a/src/util.h b/src/util.h index 6bcd34b0..57cf2d7e 100644 --- a/src/util.h +++ b/src/util.h @@ -111,10 +111,13 @@ T* alignup(T* p) inline void MilliSleep(int64_t n) { -#if BOOST_VERSION >= 105000 +#if defined(HAVE_WORKING_BOOST_SLEEP_FOR) boost::this_thread::sleep_for(boost::chrono::milliseconds(n)); -#else +#elif defined(HAVE_WORKING_BOOST_SLEEP) boost::this_thread::sleep(boost::posix_time::milliseconds(n)); +#else + //should never get here +#error missing boost sleep implementation #endif } @@ -290,7 +293,7 @@ long hex2long(const char *hexString); bool ParseInt32(const std::string& str, int32_t *out); -/** +/** * Format a paragraph of text to a fixed width, adding spaces for * indentation to any added line. */ From de8e5eba87d549bd09860dde877c3b8b99274f11 Mon Sep 17 00:00:00 2001 From: 2a5A1Ghu1 <13294167+2a5A1Ghu1@users.noreply.github.com> Date: Sat, 7 Nov 2020 23:17:31 -0800 Subject: [PATCH 02/35] Fix Recursive Push Issue --- autogen.sh | 8 +------- configure.ac | 2 +- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/autogen.sh b/autogen.sh index 27417daf..6aeeddf1 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,8 +1,4 @@ #!/bin/sh -# Copyright (c) 2013-2016 The Bitcoin Core developers -# Distributed under the MIT software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - set -e srcdir="$(dirname $0)" cd "$srcdir" @@ -10,6 +6,4 @@ if [ -z ${LIBTOOLIZE} ] && GLIBTOOLIZE="`which glibtoolize 2>/dev/null`"; then LIBTOOLIZE="${GLIBTOOLIZE}" export LIBTOOLIZE fi -which autoreconf >/dev/null || \ - (echo "configuration failed, please install autoconf first" && exit 1) -autoreconf --install --force --warnings=all +autoreconf --install --force --warnings=all \ No newline at end of file diff --git a/configure.ac b/configure.ac index c6b63314..0a0ca5bc 100644 --- a/configure.ac +++ b/configure.ac @@ -710,4 +710,4 @@ AC_SUBST(BUILD_TEST_QT) AC_CONFIG_FILES([Makefile src/Makefile src/test/Makefile src/qt/Makefile src/qt/test/Makefile share/setup.nsi share/qt/Info.plist]) AC_CONFIG_FILES([qa/pull-tester/run-bitcoind-for-test.sh],[chmod +x qa/pull-tester/run-bitcoind-for-test.sh]) AC_CONFIG_FILES([qa/pull-tester/build-tests.sh],[chmod +x qa/pull-tester/build-tests.sh]) -AC_OUTPUT \ No newline at end of file +AC_OUTPUT From e1d0fdd55f399edd88fcefda82be409848ba9bbb Mon Sep 17 00:00:00 2001 From: 2a5A1Ghu1 <13294167+2a5A1Ghu1@users.noreply.github.com> Date: Sat, 7 Nov 2020 23:22:08 -0800 Subject: [PATCH 03/35] Update configure.ac --- configure.ac | 35 +++++++++++++---------------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/configure.ac b/configure.ac index 0a0ca5bc..3d357410 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N) -AC_PREREQ([2.60]) +AC_PREREQ([2.69]) define(_CLIENT_VERSION_MAJOR, 0) define(_CLIENT_VERSION_MINOR, 8) define(_CLIENT_VERSION_REVISION, 99) @@ -327,11 +327,8 @@ AC_CHECK_HEADERS([stdio.h stdlib.h unistd.h strings.h sys/types.h sys/stat.h]) dnl Check for MSG_NOSIGNAL AC_MSG_CHECKING(for MSG_NOSIGNAL) -AC_TRY_COMPILE([#include ], - [ int f = MSG_NOSIGNAL; ], - [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_MSG_NOSIGNAL, 1,[Define this symbol if you have MSG_NOSIGNAL]) ], - [ AC_MSG_RESULT(no)] -) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ int f = MSG_NOSIGNAL; ]])],[ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_MSG_NOSIGNAL, 1,[Define this symbol if you have MSG_NOSIGNAL]) ],[ AC_MSG_RESULT(no) +]) dnl Check for libdb_cxx AC_CHECK_HEADER([db_cxx.h],,AC_MSG_ERROR(libdb_cxx headers missing)) @@ -366,38 +363,34 @@ dnl If sleep_for is used, boost_chrono becomes a requirement. if test x$ax_cv_boost_chrono = xyes; then TEMP_LIBS="$LIBS" LIBS="$LIBS $BOOST_LIBS $BOOST_CHRONO_LIB" -AC_TRY_LINK([ +AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include #include - ],[ + ]], [[ #if BOOST_VERSION >= 105000 && (!defined(BOOST_HAS_NANOSLEEP) || BOOST_VERSION >= 105200) boost::this_thread::sleep_for(boost::chrono::milliseconds(0)); #else choke me #endif - ], - [boost_sleep=yes; BOOST_LIBS="$BOOST_LIBS $BOOST_CHRONO_LIB"; - AC_DEFINE(HAVE_WORKING_BOOST_SLEEP_FOR, 1, [Define this symbol if boost sleep_for works])], - [boost_sleep=no]) + ]])],[boost_sleep=yes; BOOST_LIBS="$BOOST_LIBS $BOOST_CHRONO_LIB"; + AC_DEFINE(HAVE_WORKING_BOOST_SLEEP_FOR, 1, [Define this symbol if boost sleep_for works])],[boost_sleep=no]) LIBS="$TEMP_LIBS" fi if test x$boost_sleep != xyes; then TEMP_LIBS="$LIBS" LIBS="$LIBS $BOOST_LIBS" -AC_TRY_LINK([ +AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include #include #include - ],[ + ]], [[ #if BOOST_VERSION <= 105600 boost::this_thread::sleep(boost::posix_time::milliseconds(0)); #else choke me #endif - ], - [boost_sleep=yes; AC_DEFINE(HAVE_WORKING_BOOST_SLEEP, 1, [Define this symbol if boost sleep works])], - [boost_sleep=no]) + ]])],[boost_sleep=yes; AC_DEFINE(HAVE_WORKING_BOOST_SLEEP, 1, [Define this symbol if boost sleep works])],[boost_sleep=no]) LIBS="$TEMP_LIBS" fi @@ -513,7 +506,7 @@ fi if test x$use_ipv6 = xyes; then dnl Check for ipv6 build requirements AC_MSG_CHECKING(for IPV6 build support) - AC_TRY_LINK([ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #if defined(_WINDOWS) #include #else @@ -521,14 +514,12 @@ if test x$use_ipv6 = xyes; then #include #include #endif - ],[ + ]], [[ #if !defined(_WINDOWS) struct in6_addr ipv6Addr; struct sockaddr_in6 addr; #endif - int temp = socket(AF_INET6, SOCK_STREAM, 0);], - [AC_MSG_RESULT(yes); have_ipv6=yes; AC_DEFINE(HAVE_IPV6, 1, [Define this symbol if you have ipv6 build support])], - [AC_MSG_RESULT(no)]; have_ipv6=no) + int temp = socket(AF_INET6, SOCK_STREAM, 0);]])],[AC_MSG_RESULT(yes); have_ipv6=yes; AC_DEFINE(HAVE_IPV6, 1, [Define this symbol if you have ipv6 build support])],[AC_MSG_RESULT(no); have_ipv6=no]) fi AC_LANG_POP From 9dbec8fc62594ca57730b80d90da678ec42e4e78 Mon Sep 17 00:00:00 2001 From: 2a5A1Ghu1 <13294167+2a5A1Ghu1@users.noreply.github.com> Date: Sun, 8 Nov 2020 05:01:09 -0800 Subject: [PATCH 04/35] [BUILD] More Upstream Autotools This commit is a current state commit based off of dash's and bitcoin's autotools implementation pre c++11. --- .gitignore | 3 + Makefile.am | 39 +- autogen.sh | 5 +- configure.ac | 534 +- contrib/debian/control | 58 + contrib/gitian-descriptors/boost-win.yml | 74 + contrib/gitian-descriptors/boost-win32.yml | 32 - contrib/gitian-descriptors/deps-win.yml | 176 +- contrib/gitian-descriptors/deps-win32.yml | 81 - contrib/gitian-descriptors/gitian-win.yml | 102 +- contrib/gitian-descriptors/gitian-win32.yml | 56 - contrib/gitian-descriptors/protobuf-win.yml | 55 + contrib/gitian-descriptors/protobuf-win32.yml | 38 - contrib/gitian-descriptors/qt-win.yml | 68 +- contrib/gitian-descriptors/qt-win32.yml | 57 - contrib/verifysfbinaries/verify.sh | 119 + doc/README_windows.txt | 18 + doc/release-process.md | 190 + doc/release-process.txt | 142 - libtool | 11805 ++++++++++++++++ qa/pull-tester/build-tests.sh.in | 73 +- share/setup.nsi.in | 41 +- src/MakeFile.am | 280 +- src/MakeFile.include | 108 +- src/Makefile.qt.include | 387 + src/Makefile.qttest.include | 52 + src/Makefile.test.include | 87 + .../.deps/libbitcoin_common_a-glibc_compat.Po | 1 + .../.deps/libbitcoin_common_a-glibc_sanity.Po | 1 + .../libbitcoin_common_a-glibcxx_compat.Po | 1 + .../libbitcoin_common_a-glibcxx_sanity.Po | 1 + src/config/bitcoin-config.h | 314 + src/config/bitcoin-config.h.in | 313 + src/config/stamp-h1 | 1 + .../.deps/libbitcoin_common_a-ripemd160.Po | 1 + src/crypto/.deps/libbitcoin_common_a-sha1.Po | 1 + src/crypto/.deps/libbitcoin_common_a-sha2.Po | 1 + src/crypto/common/common.h | 3 + src/m4/bitcoin_find_bdb48.m4 | 4 +- src/m4/bitcoin_qt.m4 | 53 +- src/m4/bitcoin_subdir_to_include.m4 | 8 +- src/m4/libtool.m4 | 8364 +++++++++++ src/m4/ltoptions.m4 | 437 + src/m4/ltsugar.m4 | 124 + src/m4/ltversion.m4 | 23 + src/m4/lt~obsolete.m4 | 99 + src/makefile.bsd | 206 - src/net.h | 10 +- src/netbase.cpp | 58 + src/qt/MakeFile.am | 267 + src/qt/bitcoin.cpp | 2 + src/qt/test/MakeFile.am | 15 +- src/test/MakeFile.am | 48 +- src/test/alert_tests.cpp | 175 + src/test/base58_tests.cpp | 38 +- src/test/canonical_tests.cpp | 89 + src/test/script_tests.cpp | 434 + src/test/transaction_tests.cpp | 278 + 58 files changed, 24696 insertions(+), 1354 deletions(-) create mode 100644 contrib/debian/control create mode 100644 contrib/gitian-descriptors/boost-win.yml delete mode 100644 contrib/gitian-descriptors/boost-win32.yml delete mode 100644 contrib/gitian-descriptors/deps-win32.yml delete mode 100644 contrib/gitian-descriptors/gitian-win32.yml create mode 100644 contrib/gitian-descriptors/protobuf-win.yml delete mode 100644 contrib/gitian-descriptors/protobuf-win32.yml delete mode 100644 contrib/gitian-descriptors/qt-win32.yml create mode 100644 contrib/verifysfbinaries/verify.sh create mode 100644 doc/README_windows.txt create mode 100644 doc/release-process.md delete mode 100644 doc/release-process.txt create mode 100755 libtool create mode 100644 src/Makefile.qt.include create mode 100644 src/Makefile.qttest.include create mode 100644 src/Makefile.test.include create mode 100644 src/compat/.deps/libbitcoin_common_a-glibc_compat.Po create mode 100644 src/compat/.deps/libbitcoin_common_a-glibc_sanity.Po create mode 100644 src/compat/.deps/libbitcoin_common_a-glibcxx_compat.Po create mode 100644 src/compat/.deps/libbitcoin_common_a-glibcxx_sanity.Po create mode 100644 src/config/bitcoin-config.h create mode 100644 src/config/bitcoin-config.h.in create mode 100644 src/config/stamp-h1 create mode 100644 src/crypto/.deps/libbitcoin_common_a-ripemd160.Po create mode 100644 src/crypto/.deps/libbitcoin_common_a-sha1.Po create mode 100644 src/crypto/.deps/libbitcoin_common_a-sha2.Po create mode 100644 src/m4/libtool.m4 create mode 100644 src/m4/ltoptions.m4 create mode 100644 src/m4/ltsugar.m4 create mode 100644 src/m4/ltversion.m4 create mode 100644 src/m4/lt~obsolete.m4 delete mode 100644 src/makefile.bsd create mode 100644 src/qt/MakeFile.am create mode 100644 src/test/alert_tests.cpp create mode 100644 src/test/canonical_tests.cpp create mode 100644 src/test/script_tests.cpp create mode 100644 src/test/transaction_tests.cpp diff --git a/.gitignore b/.gitignore index 291b20f8..ba57c4b0 100644 --- a/.gitignore +++ b/.gitignore @@ -57,6 +57,9 @@ src/qt/res/.dirstamp *.trs *.dmg +*.json.h +*.raw.h + # Compilation and Qt preprocessor part *.qm Makefile diff --git a/Makefile.am b/Makefile.am index edb4168e..220911ad 100644 --- a/Makefile.am +++ b/Makefile.am @@ -6,7 +6,7 @@ GZIP_ENV="-9n" BITCOIND_BIN=$(top_builddir)/src/bitcoind$(EXEEXT) BITCOIN_QT_BIN=$(top_builddir)/src/qt/bitcoin-qt$(EXEEXT) -BITCOIN_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win32-setup$(EXEEXT) +BITCOIN_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win$(WINDOWS_BITS)-setup$(EXEEXT) OSX_APP=Bitcoin-Qt.app OSX_DMG=Bitcoin-Qt.dmg @@ -14,6 +14,9 @@ OSX_DEPLOY_SCRIPT=$(top_srcdir)/contrib/macdeploy/macdeployqtplus OSX_FANCY_PLIST=$(top_srcdir)/contrib/macdeploy/fancy.plist OSX_INSTALLER_ICONS=$(top_srcdir)/src/qt/res/icons/bitcoin.icns OSX_PLIST=$(top_srcdir)/share/qt/Info.plist #not installed +OSX_QT_TRANSLATIONS = da,de,es,hu,ru,uk,zh_CN,zh_TW + +DIST_DOCS = $(wildcard doc/*.md) WINDOWS_PACKAGING = $(top_srcdir)/share/pixmaps/bitcoin.ico \ $(top_srcdir)/share/pixmaps/nsis-header.bmp \ @@ -21,7 +24,8 @@ WINDOWS_PACKAGING = $(top_srcdir)/share/pixmaps/bitcoin.ico \ $(top_srcdir)/doc/README_windows.txt OSX_PACKAGING = $(OSX_DEPLOY_SCRIPT) $(OSX_FANCY_PLIST) $(OSX_INSTALLER_ICONS) \ - $(top_srcdir)/contrib/macdeploy/background.png + $(top_srcdir)/contrib/macdeploy/background.png \ + $(top_srcdir)/contrib/macdeploy/DS_Store COVERAGE_INFO = baseline_filtered_combined.info baseline.info block_test.info \ leveldb_baseline.info test_bitcoin_filtered.info total_coverage.info \ @@ -40,20 +44,16 @@ distcheck-hook: distcleancheck: @: -$(BITCOIN_WIN_INSTALLER): $(BITCOIND_BIN) $(BITCOIN_QT_BIN) - $(MAKE) distdir +$(BITCOIN_WIN_INSTALLER): $(BITCOIND_BIN) $(BITCOIN_QT_BIN) $(BITCOIN_CLI_BIN) $(MKDIR_P) $(top_builddir)/release - $(INSTALL_STRIP_PROGRAM) $(top_builddir)/src/bitcoind$(EXEEXT) $(top_builddir)/release - $(INSTALL_STRIP_PROGRAM) $(top_builddir)/src/qt/bitcoin-qt$(EXEEXT) $(top_builddir)/release + $(INSTALL_STRIP_PROGRAM) $(BITCOIND_BIN) $(top_builddir)/release + $(INSTALL_STRIP_PROGRAM) $(BITCOIN_QT_BIN) $(top_builddir)/release + $(INSTALL_STRIP_PROGRAM) $(BITCOIN_CLI_BIN) $(top_builddir)/release @test -f $(MAKENSIS) && $(MAKENSIS) $(top_builddir)/share/setup.nsi || \ echo error: could not build $@ -$(BITCOIND_BIN): - make -C $(top_srcdir)/src bitcoind$(EXEEXT) - -$(BITCOIN_QT_BIN): - make -C $(top_srcdir)/src/qt bitcoin-qt$(EXEEXT) - +$(BITCOIND_BIN) $(BITCOIN_QT_BIN) $(BITCOIN_CLI_BIN): + make -C $(dir $@) $(notdir $@) $(OSX_APP)/Contents/PkgInfo: $(MKDIR_P) $(@D) @@ -79,10 +79,19 @@ OSX_APP_BUILT=$(OSX_APP)/Contents/PkgInfo $(OSX_APP)/Contents/Resources/empty.lp $(OSX_APP)/Contents/Resources/bitcoin.icns $(OSX_APP)/Contents/Info.plist \ $(OSX_APP)/Contents/MacOS/Bitcoin-Qt +if BUILD_DARWIN $(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING) - $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -add-qt-tr da,de,es,hu,ru,uk,zh_CN,zh_TW -dmg -fancy $(OSX_FANCY_PLIST) -verbose 2 - rm -rf $(OSX_APP) + $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -add-qt-tr $(OSX_QT_TRANSLATIONS) -dmg -fancy $(OSX_FANCY_PLIST) -verbose 2 +else +$(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING) + INSTALLNAMETOOL=$(INSTALLNAMETOOL) OTOOL=$(OTOOL) STRIP=$(STRIP) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -add-qt-tr $(OSX_QT_TRANSLATIONS) -verbose 2 + $(MKDIR_P) dist/.background + $(INSTALL) contrib/macdeploy/background.png dist/.background + $(INSTALL) contrib/macdeploy/DS_Store dist/.DS_Store + cd dist; $(LN_S) /Applications Applications + $(GENISOIMAGE) -no-cache-inodes -l -probe -V "Bitcoin-Qt" -no-pad -r -apple -o $@ dist +endif if TARGET_DARWIN deploy: $(OSX_DMG) @@ -149,7 +158,7 @@ check-local: @qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -Xmx2G -jar $(JAVA_COMPARISON_TOOL) 1 18444 endif -EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/pull-tester.sh $(WINDOWS_PACKAGING) $(OSX_PACKAGING) +EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/pull-tester.sh $(DIST_DOCS) $(WINDOWS_PACKAGING) $(OSX_PACKAGING) CLEANFILES = $(OSX_DMG) $(BITCOIN_WIN_INSTALLER) diff --git a/autogen.sh b/autogen.sh index 6aeeddf1..a32bc03d 100755 --- a/autogen.sh +++ b/autogen.sh @@ -3,7 +3,6 @@ set -e srcdir="$(dirname $0)" cd "$srcdir" if [ -z ${LIBTOOLIZE} ] && GLIBTOOLIZE="`which glibtoolize 2>/dev/null`"; then - LIBTOOLIZE="${GLIBTOOLIZE}" - export LIBTOOLIZE + export LIBTOOLIZE="${GLIBTOOLIZE}" fi -autoreconf --install --force --warnings=all \ No newline at end of file +autoreconf --install --force \ No newline at end of file diff --git a/configure.ac b/configure.ac index 3d357410..d65ad905 100644 --- a/configure.ac +++ b/configure.ac @@ -1,14 +1,15 @@ dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N) AC_PREREQ([2.69]) -define(_CLIENT_VERSION_MAJOR, 0) -define(_CLIENT_VERSION_MINOR, 8) -define(_CLIENT_VERSION_REVISION, 99) -define(_CLIENT_VERSION_BUILD, 0) -define(_CLIENT_VERSION_IS_RELEASE, false) -define(_COPYRIGHT_YEAR, 2013) -AC_INIT([Bitcoin],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[info@bitcoin.org],[bitcoin]) +define(_CLIENT_VERSION_MAJOR, 1) +define(_CLIENT_VERSION_MINOR, 0) +define(_CLIENT_VERSION_REVISION, 3) +define(_CLIENT_VERSION_BUILD, 4) +define(_CLIENT_VERSION_IS_RELEASE, true) +define(_COPYRIGHT_YEAR, 2014) +AC_INIT([Bitcoin Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[info@bitcoin.org],[bitcoin]) AC_CONFIG_AUX_DIR([src/build-aux]) AC_CONFIG_MACRO_DIR([src/m4]) +LT_INIT([disable-shared]) AC_CANONICAL_HOST AH_TOP([#ifndef BITCOIN_CONFIG_H]) AH_TOP([#define BITCOIN_CONFIG_H]) @@ -21,13 +22,15 @@ AH_BOTTOM([#endif //BITCOIN_CONFIG_H]) # probably be removed when building on <= 10.6 is no longer supported. m4_include([pkg.m4]) -dnl reset CXXFLAGS if empty (autoconf adds its own defaults otherwise) -: ${CFLAGS=""} -: ${CXXFLAGS=""} - dnl faketime breaks configure and is only needed for make. Disable it here. unset FAKETIME +if test "x${CXXFLAGS+set}" = "xset"; then + CXXFLAGS_overridden=yes +else + CXXFLAGS_overridden=no +fi + dnl ============================================================== dnl Setup for automake dnl ============================================================== @@ -41,6 +44,13 @@ AM_MAINTAINER_MODE([enable]) dnl make the compilation flags quiet unless V=1 is used m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) +# Enable wallet +AC_ARG_ENABLE([wallet], + [AS_HELP_STRING([--enable-wallet], + [enable wallet (default is yes)])], + [enable_wallet=$enableval], + [enable_wallet=yes]) + AC_ARG_WITH([miniupnpc], [AS_HELP_STRING([--with-miniupnpc], [enable UPNP (default is yes if libminiupnpc is found)])], @@ -53,49 +63,27 @@ AC_ARG_ENABLE([upnp-default], [use_upnp_default=$enableval], [use_upnp_default=no]) -dnl enable ipv6 support -AC_ARG_ENABLE([ipv6], - [AS_HELP_STRING([--enable-ipv6], - [enable ipv6 (default is yes)])], - [use_ipv6=$enableval], - [use_ipv6=yes]) - -dnl enable qt support -AC_ARG_WITH([qt], - [AS_HELP_STRING([--with-qt], - [enable qt (default is yes)])], - [use_qt=$withval], - [use_qt=yes]) - -dnl compile with full warnings and debugging symbols -AC_ARG_ENABLE(debug, - AS_HELP_STRING([--enable-debug],[compile with debug symbols (default is yes)]), - [use_debug=$enableval], - [use_debug=yes]) - AC_MSG_CHECKING([if compiling with debugging symbols]) - AC_ARG_ENABLE(tests, AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]), [use_tests=$enableval], [use_tests=yes]) AC_ARG_WITH([comparison-tool], - AS_HELP_STRING([with-comparison-tool],[path to java comparison tool (requires --enable-tests)]), + AS_HELP_STRING([--with-comparison-tool],[path to java comparison tool (requires --enable-tests)]), [use_comparison_tool=$withval], [use_comparison_tool=no]) +AC_ARG_ENABLE([comparison-tool-reorg-tests], + AS_HELP_STRING([--enable-comparison-tool-reorg-tests],[enable expensive reorg tests in the comparison tool (default no)]), + [use_comparison_tool_reorg_tests=$enableval], + [use_comparison_tool_reorg_tests=no]) + AC_ARG_WITH([qrencode], [AS_HELP_STRING([--with-qrencode], [enable QR code support (default is yes if qt is enabled and libqrencode is found)])], [use_qr=$withval], [use_qr=auto]) -AC_ARG_WITH([qtdbus], - [AS_HELP_STRING([--with-qtdbus], - [enable DBus support (default is yes if qt is enabled and QtDBus is found)])], - [use_dbus=$withval], - [use_dbus=auto]) - AC_ARG_ENABLE([hardening], [AS_HELP_STRING([--enable-hardening], [attempt to harden the resulting executables (default is yes)])], @@ -114,49 +102,68 @@ AC_ARG_ENABLE([lcov], [use_lcov=yes], [use_lcov=no]) -AC_ARG_WITH([qt-incdir],[AS_HELP_STRING([--with-qt-incdir=INC_DIR],[specify qt include path (overridden by pkgconfig)])], [qt_include_path=$withval], []) -AC_ARG_WITH([qt-libdir],[AS_HELP_STRING([--with-qt-libdir=LIB_DIR],[specify qt lib path (overridden by pkgconfig)])], [qt_lib_path=$withval], []) -AC_ARG_WITH([qt-bindir],[AS_HELP_STRING([--with-qt-bindir=BIN_DIR],[specify qt bin path])], [qt_bin_path=$withval], []) -AC_ARG_WITH([qt-plugindir],[AS_HELP_STRING([--with-qt-plugindir=PLUGIN_DIR],[specify qt plugin path (overridden by pkgconfig)])], [qt_plugin_path=$withval], []) +AC_ARG_ENABLE([glibc-back-compat], + [AS_HELP_STRING([--enable-glibc-back-compat], + [enable backwards compatibility with glibc and libstdc++])], + [use_glibc_compat=$enableval], + [use_glibc_compat=no]) + AC_ARG_WITH([protoc-bindir],[AS_HELP_STRING([--with-protoc-bindir=BIN_DIR],[specify protoc bin path])], [protoc_bin_path=$withval], []) AC_CONFIG_SRCDIR([src]) -AC_CONFIG_HEADERS([src/bitcoin-config.h]) +AC_CONFIG_HEADERS([src/config/bitcoin-config.h]) dnl Checks for programs. AC_PROG_CXX AC_PROG_CC AC_PROG_CPP +AC_PROG_CXXCPP AC_PROG_INSTALL AC_PROG_OBJC +AC_PROG_LN_S m4_ifdef([AC_PROG_OBJCXX],[AC_PROG_OBJCXX]) AC_PROG_MKDIR_P AC_PROG_SED AC_PATH_TOOL(AR, ar) AC_PATH_TOOL(RANLIB, ranlib) -AC_PATH_TOOL(WINDRES, windres) AC_PATH_TOOL(STRIP, strip) AC_PATH_TOOL(GCOV, gcov) AC_PATH_PROG(LCOV, lcov) AC_PATH_PROG(JAVA, java) AC_PATH_PROG(GENHTML, genhtml) AC_PATH_PROG([GIT], [git]) -AC_PATH_PROGS([MOC], [moc moc-qt4],, $qt_bin_path:$PATH) -AC_PATH_PROGS([UIC], [uic uic-qt4],, $qt_bin_path:$PATH) -AC_PATH_PROG([RCC], [rcc],, $qt_bin_path:$PATH) -AC_PATH_PROG([LRELEASE], [lrelease],, $qt_bin_path:$PATH) -AC_PATH_PROG([PROTOC], [protoc],, $protoc_bin_path:$PATH) AC_PATH_PROG(CCACHE,ccache) +AC_PATH_PROG(XGETTEXT,xgettext) +AC_PATH_PROG(HEXDUMP,hexdump) PKG_PROG_PKG_CONFIG +# Enable debug +AC_ARG_ENABLE([debug], + [AS_HELP_STRING([--enable-debug], + [use debug compiler flags and macros (default is no)])], + [enable_debug=$enableval], + [enable_debug=no]) + +if test "x$enable_debug" = xyes; then + if test "x$GCC" = xyes; then + CFLAGS="-g3 -O0 -DDEBUG" + fi + + if test "x$GXX" = xyes; then + CXXFLAGS="-g3 -O0 -DDEBUG" + fi +fi + + ## TODO: Remove these hard-coded paths and flags. They are here for the sake of ## compatibility with the legacy buildsystem. ## CXXFLAGS="$CXXFLAGS -Wall -Wextra -Wformat -Wformat-security -Wno-unused-parameter" -CPPFLAGS="$CPPFLAGS -DBOOST_SPIRIT_THREADSAFE -DHAVE_BUILD_INFO" -DEBUG_CXXFLAGS="-g -ggdb" -RELEASE_CXXFLAGS="-O2" +if test "x$CXXFLAGS_overridden" = "xno"; then + CXXFLAGS="$CXXFLAGS -Wall -Wextra -Wformat -Wformat-security -Wno-unused-parameter" +fi +CPPFLAGS="$CPPFLAGS -DBOOST_SPIRIT_THREADSAFE -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS" AC_LANG_PUSH([C++]) @@ -164,7 +171,7 @@ use_pkgconfig=yes case $host in *mingw*) - #pkgconfig does more harm than good with mingw + #pkgconfig does more harm than good with MinGW use_pkgconfig=no TARGET_OS=windows @@ -186,47 +193,81 @@ case $host in AC_CHECK_LIB([mswsock], [main],, AC_MSG_ERROR(lib missing)) AC_CHECK_LIB([shlwapi], [main],, AC_MSG_ERROR(lib missing)) AC_CHECK_LIB([iphlpapi], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([crypt32], [main],, AC_MSG_ERROR(lib missing)) + + AX_CHECK_LINK_FLAG([[-static]],[LDFLAGS="$LDFLAGS -static"]) + AX_CHECK_LINK_FLAG([[-static-libgcc]],[LDFLAGS="$LDFLAGS -static-libgcc"]) + AX_CHECK_LINK_FLAG([[-static-libstdc++]],[LDFLAGS="$LDFLAGS -static-libstdc++"]) AC_PATH_PROG([MAKENSIS], [makensis], none) if test x$MAKENSIS = xnone; then AC_MSG_WARN("makensis not found. Cannot create installer.") fi + AC_PATH_TOOL(WINDRES, windres, none) + if test x$WINDRES = xnone; then + AC_MSG_ERROR("windres not found") + fi + CPPFLAGS="$CPPFLAGS -D_MT -DWIN32 -D_WINDOWS -DBOOST_THREAD_USE_LIB" LEVELDB_TARGET_FLAGS="TARGET_OS=OS_WINDOWS_CROSSCOMPILE" - CXXFLAGS="$CXXFLAGS -w" + if test "x$CXXFLAGS_overridden" = "xno"; then + CXXFLAGS="$CXXFLAGS -w" + fi + case $host in + i?86-*) WINDOWS_BITS=32 ;; + x86_64-*) WINDOWS_BITS=64 ;; + *) AC_MSG_ERROR("Could not determine win32/win64 for installer") ;; + esac + AC_SUBST(WINDOWS_BITS) ;; *darwin*) TARGET_OS=darwin LEVELDB_TARGET_FLAGS="TARGET_OS=Darwin" if test x$cross_compiling != xyes; then + BUILD_OS=darwin AC_CHECK_PROG([PORT],port, port) if test x$PORT = xport; then dnl add default macports paths - CPPFLAGS="$CPPFLAGS -I/opt/local/include -I/opt/local/include/db48" + CPPFLAGS="$CPPFLAGS -isystem /opt/local/include -I/opt/local/include/db48" LIBS="$LIBS -L/opt/local/lib -L/opt/local/lib/db48" fi AC_CHECK_PROG([BREW],brew, brew) if test x$BREW = xbrew; then - dnl add default homebrew paths - openssl_prefix=`$BREW --prefix openssl` - bdb_prefix=`$BREW --prefix berkeley-db4` - export PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH" - CPPFLAGS="$CPPFLAGS -I$bdb_prefix/include" - LIBS="$LIBS -L/$bdb_prefix/lib" + dnl These Homebrew packages may be bottled, meaning that they won't be found + dnl in expected paths because they may conflict with system files. Ask + dnl Homebrew where each one is located, then adjust paths accordingly. + dnl It's safe to add these paths even if the functionality is disabled by + dnl the user (--without-wallet or --without-gui for example). + + openssl_prefix=`$BREW --prefix openssl 2>/dev/null` + bdb_prefix=`$BREW --prefix berkeley-db4 2>/dev/null` + qt5_prefix=`$BREW --prefix qt5 2>/dev/null` + if test x$openssl_prefix != x; then + export PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH" + fi + if test x$bdb_prefix != x; then + CPPFLAGS="$CPPFLAGS -I$bdb_prefix/include" + LIBS="$LIBS -L$bdb_prefix/lib" + fi + if test x$qt5_prefix != x; then + export PKG_CONFIG_PATH="$qt5_prefix/lib/pkgconfig:$PKG_CONFIG_PATH" + fi fi + else + case $build_os in + *darwin*) + BUILD_OS=darwin + ;; + *) + AC_PATH_TOOL([INSTALLNAMETOOL], [install_name_tool], install_name_tool) + AC_PATH_TOOL([OTOOL], [otool], otool) + AC_PATH_PROGS([GENISOIMAGE], [genisoimage mkisofs],genisoimage) + ;; + esac fi - if test x$use_qt = xyes; then - MOC_DEFS="-DQ_OS_MAC" - base_frameworks="-framework Foundation -framework ApplicationServices -framework AppKit" - AX_CHECK_LINK_FLAG([[$base_frameworks]],[LIBS="$LIBS $base_frameworks"],[AC_MSG_ERROR(could not find base frameworks)]) - fi - - AX_CHECK_COMPILE_FLAG([-mmacosx-version-min=10.5],[RELEASE_CXXFLAGS="$RELEASE_CXXFLAGS -mmacosx-version-min=10.5"]) - AX_CHECK_COMPILE_FLAG([-arch i386],[RELEASE_CXXFLAGS="$RELEASE_CXXFLAGS -arch i386"]) - RELEASE_CXXFLAGS="$RELEASE_CXXFLAGS -O3" CPPFLAGS="$CPPFLAGS -DMAC_OSX" TESTDEFS="-DBOOST_TEST_DYN_LINK" ;; @@ -235,16 +276,19 @@ case $host in ;; esac -if test x$use_debug == xyes; then - CXXFLAGS="$DEBUG_CXXFLAGS $CXXFLAGS" -else - CXXFLAGS="$RELEASE_CXXFLAGS $CXXFLAGS" -fi - if test x$use_comparison_tool != xno; then AC_SUBST(JAVA_COMPARISON_TOOL, $use_comparison_tool) fi +if test x$use_comparison_tool_reorg_tests != xno; then + if test x$use_comparison_tool == x; then + AC_MSG_ERROR("comparison tool reorg tests but comparison tool was not specified") + fi + AC_SUBST(COMPARISON_TOOL_REORG_TESTS, 1) +else + AC_SUBST(COMPARISON_TOOL_REORG_TESTS, 0) +fi + if test x$use_lcov == xyes; then if test x$LCOV == x; then AC_MSG_ERROR("lcov testing requested but lcov not found") @@ -277,6 +321,8 @@ INCLUDES="$INCLUDES $PTHREAD_CFLAGS" # they also need to be passed down to any subprojects. Pull the results out of # the cache and add them to CPPFLAGS. AC_SYS_LARGEFILE +# detect POSIX or GNU variant of strerror_r +AC_FUNC_STRERROR_R if test x$ac_cv_sys_file_offset_bits != x && test x$ac_cv_sys_file_offset_bits != xno && @@ -292,23 +338,37 @@ fi AX_CHECK_LINK_FLAG([[-Wl,--large-address-aware]], [LDFLAGS="$LDFLAGS -Wl,--large-address-aware"]) +if test x$use_glibc_compat != xno; then + + #__fdelt_chk's params and return type have changed from long unsigned int to long int. + # See which one is present here. + AC_MSG_CHECKING(__fdelt_chk type) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#define __USE_FORTIFY_LEVEL 2 + #include + extern "C" long unsigned int __fdelt_warn(long unsigned int);]], [[]])],[ fdelt_type="long unsigned int"],[ fdelt_type="long int"]) + AC_MSG_RESULT($fdelt_type) + AC_DEFINE_UNQUOTED(FDELT_TYPE, $fdelt_type,[parameter and return value type for __fdelt_chk]) + +fi + if test x$use_hardening != xno; then - AX_CHECK_COMPILE_FLAG([-Wstack-protector],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wstack-protector"]) - AX_CHECK_COMPILE_FLAG([-fPIE],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fPIE"]) + AX_CHECK_COMPILE_FLAG([-fstack-protector-all],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fstack-protector-all"]) - AX_CHECK_PREPROC_FLAG([-D_FORTIFY_SOURCE=2],[HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -D_FORTIFY_SOURCE=2"]) + AX_CHECK_PREPROC_FLAG([-D_FORTIFY_SOURCE=2],[ + AX_CHECK_PREPROC_FLAG([-U_FORTIFY_SOURCE],[ + HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -U_FORTIFY_SOURCE" + ]) + HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -D_FORTIFY_SOURCE=2" + ]) AX_CHECK_LINK_FLAG([[-Wl,--dynamicbase]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--dynamicbase"]) AX_CHECK_LINK_FLAG([[-Wl,--nxcompat]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--nxcompat"]) - AX_CHECK_LINK_FLAG([[-Wl,-z,relro]], [LDFLAGS="-Wl,-z,relro"]) - AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [LDFLAGS="-Wl,-z,now"]) + AX_CHECK_LINK_FLAG([[-Wl,-z,relro]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,relro"]) + AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,now"]) if test x$TARGET_OS != xwindows; then - # -fstack-protector-all can produce broken binaries with mingw - AX_CHECK_COMPILE_FLAG([-fno-stack-protector],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fno-stack-protector"]) - AX_CHECK_COMPILE_FLAG([-fstack-protector-all],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fstack-protector-all"]) - - # -pie will link successfully with mingw, but it's unsupported and leads to undeterministic binaries + # All windows code is PIC, forcing it on just adds useless compile warnings + AX_CHECK_COMPILE_FLAG([-fPIE],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fPIE"]) AX_CHECK_LINK_FLAG([[-pie]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -pie"]) fi @@ -323,20 +383,40 @@ if test x$TARGET_OS = xdarwin; then AX_CHECK_LINK_FLAG([[-Wl,-dead_strip]], [LDFLAGS="$LDFLAGS -Wl,-dead_strip"]) fi -AC_CHECK_HEADERS([stdio.h stdlib.h unistd.h strings.h sys/types.h sys/stat.h]) +AC_CHECK_HEADERS([endian.h stdio.h stdlib.h unistd.h strings.h sys/types.h sys/stat.h sys/select.h]) +AC_SEARCH_LIBS([getaddrinfo_a], [anl], [AC_DEFINE(HAVE_GETADDRINFO_A, 1, [Define this symbol if you have getaddrinfo_a])]) +AC_SEARCH_LIBS([inet_pton], [nsl resolv], [AC_DEFINE(HAVE_INET_PTON, 1, [Define this symbol if you have inet_pton])]) + +AC_CHECK_DECLS([le32toh, le64toh, htole32, htole64, be32toh, be64toh, htobe32, htobe64],,, + [#if HAVE_ENDIAN_H + #include + #endif]) dnl Check for MSG_NOSIGNAL AC_MSG_CHECKING(for MSG_NOSIGNAL) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ int f = MSG_NOSIGNAL; ]])],[ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_MSG_NOSIGNAL, 1,[Define this symbol if you have MSG_NOSIGNAL]) ],[ AC_MSG_RESULT(no) ]) -dnl Check for libdb_cxx -AC_CHECK_HEADER([db_cxx.h],,AC_MSG_ERROR(libdb_cxx headers missing)) -AC_CHECK_LIB([db_cxx], [main],, AC_MSG_ERROR(libdb_cxx missing)) +LEVELDB_CPPFLAGS= +LIBLEVELDB= +LIBMEMENV= +AM_CONDITIONAL([EMBEDDED_LEVELDB],[true]) +AC_SUBST(LEVELDB_CPPFLAGS) +AC_SUBST(LIBLEVELDB) +AC_SUBST(LIBMEMENV) + +if test x$enable_wallet != xno; then + dnl Check for libdb_cxx only if wallet enabled + BITCOIN_FIND_BDB48 +fi dnl Check for libminiupnpc (optional) if test x$use_upnp != xno; then - AC_CHECK_LIB([miniupnpc], [main],, [have_miniupnpc=no]) + AC_CHECK_HEADERS( + [miniupnpc/miniwget.h miniupnpc/miniupnpc.h miniupnpc/upnpcommands.h miniupnpc/upnperrors.h], + [AC_CHECK_LIB([miniupnpc], [main],, [have_miniupnpc=no])], + [have_miniupnpc=no] + ) fi dnl Check for boost libs @@ -348,7 +428,30 @@ AX_BOOST_THREAD AX_BOOST_CHRONO if test x$use_tests = xyes; then + + if test x$HEXDUMP = x; then + AC_MSG_ERROR(hexdump is required for tests) + fi + + AX_BOOST_UNIT_TEST_FRAMEWORK + + dnl Determine if -DBOOST_TEST_DYN_LINK is needed + AC_MSG_CHECKING([for dynamic linked boost test]) + TEMP_LIBS="$LIBS" + LIBS="$LIBS $BOOST_UNIT_TEST_FRAMEWORK_LIB" + TEMP_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" + AC_LINK_IFELSE([AC_LANG_SOURCE([ + #define BOOST_TEST_DYN_LINK + #define BOOST_TEST_MAIN + #include + ])], + [AC_MSG_RESULT(yes)] + [TESTDEFS="$TESTDEFS -DBOOST_TEST_DYN_LINK"], + [AC_MSG_RESULT(no)]) + LIBS="$TEMP_LIBS" + CPPFLAGS="$TEMP_CPPFLAGS" fi BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRAM_OPTIONS_LIB $BOOST_THREAD_LIB" @@ -361,8 +464,13 @@ dnl after 1.56. dnl If neither is available, abort. dnl If sleep_for is used, boost_chrono becomes a requirement. if test x$ax_cv_boost_chrono = xyes; then +dnl Allow passing extra needed dependency libraries for boost-chrono from static gitian build +BOOST_CHRONO_LIB="$BOOST_CHRONO_LIB $BOOST_CHRONO_EXTRALIBS" + TEMP_LIBS="$LIBS" LIBS="$LIBS $BOOST_LIBS $BOOST_CHRONO_LIB" +TEMP_CPPFLAGS="$CPPFLAGS" +CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include #include @@ -375,11 +483,13 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([[ ]])],[boost_sleep=yes; BOOST_LIBS="$BOOST_LIBS $BOOST_CHRONO_LIB"; AC_DEFINE(HAVE_WORKING_BOOST_SLEEP_FOR, 1, [Define this symbol if boost sleep_for works])],[boost_sleep=no]) LIBS="$TEMP_LIBS" +CPPFLAGS="$TEMP_CPPFLAGS" fi if test x$boost_sleep != xyes; then TEMP_LIBS="$LIBS" -LIBS="$LIBS $BOOST_LIBS" +TEMP_CPPFLAGS="$CPPFLAGS" +CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include #include @@ -392,16 +502,31 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #endif ]])],[boost_sleep=yes; AC_DEFINE(HAVE_WORKING_BOOST_SLEEP, 1, [Define this symbol if boost sleep works])],[boost_sleep=no]) LIBS="$TEMP_LIBS" +CPPFLAGS="$TEMP_CPPFLAGS" fi if test x$boost_sleep != xyes; then - AC_MSG_ERROR(No working boost sleep implementation found) + AC_MSG_ERROR(No working boost sleep implementation found. If on ubuntu 13.10 with libboost1.54-all-dev remove libboost.1.54-all-dev and use libboost1.53-all-dev) fi +AC_ARG_WITH([cli], + [AS_HELP_STRING([--with-cli], + [with CLI (default is yes)])], + [build_bitcoin_cli=$withval], + [build_bitcoin_cli=yes]) + +AC_ARG_WITH([daemon], + [AS_HELP_STRING([--with-daemon], + [with daemon (default is yes)])], + [build_bitcoind=$withval], + [build_bitcoind=yes]) + +BITCOIN_QT_INIT + if test x$use_pkgconfig = xyes; then if test x$PKG_CONFIG == x; then - AC_MSG_ERROR(pkg-config not found.)] + AC_MSG_ERROR(pkg-config not found.) fi : #NOP @@ -410,18 +535,9 @@ if test x$use_pkgconfig = xyes; then [ PKG_CHECK_MODULES([SSL], [libssl], [INCLUDES="$INCLUDES $SSL_CFLAGS"; LIBS="$LIBS $SSL_LIBS"], [AC_MSG_ERROR(openssl not found.)]) PKG_CHECK_MODULES([CRYPTO], [libcrypto], [INCLUDES="$INCLUDES $CRYPTO_CFLAGS"; LIBS="$LIBS $CRYPTO_LIBS"], [AC_MSG_ERROR(libcrypto not found.)]) - if test x$use_qt = xyes; then - PKG_CHECK_MODULES([QT], [QtCore QtGui QtNetwork], [QT_INCLUDES="$QT_CFLAGS"; have_qt=yes], [have_qt=no]) - if test x$use_tests = xyes; then - PKG_CHECK_MODULES([QT_TEST], [QtTest], [QT_TEST_INCLUDES="$QT_TEST_CFLAGS"; have_qt_test=yes], [have_qt_test=no]) - fi - if test x$use_dbus != xno; then - PKG_CHECK_MODULES([QT_DBUS], [QtDBus], [QT_DBUS_INCLUDES="$QT_DBUS_CFLAGS"; have_qt_dbus=yes], [have_qt_dbus=no]) - fi - if test x$use_qr != xno; then - PKG_CHECK_MODULES([QR], [libqrencode], [have_qrencode=yes], [have_qrencode=no]) - fi - PKG_CHECK_MODULES([PROTOBUF], [protobuf], [have_protobuf=yes], [AC_MSG_ERROR(libprotobuf not found.)]) + BITCOIN_QT_CHECK([PKG_CHECK_MODULES([PROTOBUF], [protobuf], [have_protobuf=yes], [BITCOIN_QT_FAIL(libprotobuf not found)])]) + if test x$use_qr != xno; then + BITCOIN_QT_CHECK([PKG_CHECK_MODULES([QR], [libqrencode], [have_qrencode=yes], [have_qrencode=no])]) fi ] ) @@ -432,95 +548,26 @@ else AC_CHECK_HEADER([openssl/ssl.h],, AC_MSG_ERROR(libssl headers missing),) AC_CHECK_LIB([ssl], [main],, AC_MSG_ERROR(libssl missing)) - if test x$use_qt = xyes; then - TEMP_LIBS="$LIBS" - LIBS= - if test x$qt_lib_path != x; then - QT_LIBS="$QT_LIBS -L$qt_lib_path" - LIBS="$QT_LIBS" - fi - if test x$qt_plugin_path != x; then - QT_LIBS="$QT_LIBS -L$qt_plugin_path/codecs" - LIBS="$QT_LIBS" - fi + BITCOIN_QT_CHECK(AC_CHECK_LIB([protobuf] ,[main],,BITCOIN_QT_FAIL(libprotobuf not found))) + if test x$use_qr != xno; then + BITCOIN_QT_CHECK([AC_CHECK_LIB([qrencode], [main],, [have_qrencode=no])]) + BITCOIN_QT_CHECK([AC_CHECK_HEADER([qrencode.h],, have_qrencode=no)]) + fi +fi - if test x$TARGET_OS == xwindows; then - AC_CHECK_LIB([imm32], [main],, AC_MSG_ERROR(libimm32 not found. Install it or use --without-qt.)) - fi +BITCOIN_QT_PATH_PROGS([PROTOC], [protoc],$protoc_bin_path) - #TODO: These are only needed when they're linked directly to parent libs. It really has nothing to do with windows. - #Instead, check for missing functions in parent libs and assume static if they're absent. - if test x$TARGET_OS == xwindows; then - AC_CHECK_LIB([qcncodecs], [main],, AC_MSG_ERROR(libqcncodecs not found. Install it or use --without-qt.)) - AC_CHECK_LIB([qjpcodecs], [main],, AC_MSG_ERROR(libqjpcodecs not found. Install it or use --without-qt.)) - AC_CHECK_LIB([qkrcodecs], [main],, AC_MSG_ERROR(libqkrcodecs not found. Install it or use --without-qt.)) - AC_CHECK_LIB([qtwcodecs], [main],, AC_MSG_ERROR(libqtwcodecs not found. Install it or use --without-qt.)) - fi +AC_MSG_CHECKING([if bitcoind should be enabled]) +AM_CONDITIONAL([BUILD_BITCOIND], [test x$build_bitcoind = xyes]) +AC_MSG_RESULT($build_bitcoind) - AC_CHECK_LIB([QtCore], [main],, AC_MSG_ERROR(libQtCore not found. Install it or use --without-qt.)) - AC_CHECK_LIB([QtGui], [main],, AC_MSG_ERROR(libQtGui not found. Install it or use --without-qt.)) - AC_CHECK_LIB([QtNetwork], [main],, AC_MSG_ERROR(libQtNetwork not found. Install it or use --without-qt.)) - AC_CHECK_LIB([protobuf], [main],, AC_MSG_ERROR(libprotobuf not found. Install it or use --without-qt.)) - QT_LIBS="$LIBS" - LIBS="$TEMP_LIBS" - - TEMP_CPPFLAGS="$CPPFLAGS" - if test x$qt_include_path != x; then - QT_INCLUDES="-I$qt_include_path -I$qt_include_path/QtCore -I$qt_include_path/QtGui -I$qt_include_path/QtNetwork -I$qt_include_path/QtTest -I$qt_include_path/QtDBus" - CPPFLAGS="$CPPFLAGS $QT_INCLUDES" - fi - AC_CHECK_HEADER([QtPlugin],, AC_MSG_ERROR(QtCore headers missing. Install them or use --without-qt.),) - AC_CHECK_HEADER([QApplication],, AC_MSG_ERROR(QtGUI headers missing. Install them or use --without-qt.),) - AC_CHECK_HEADER([QLocalSocket],, AC_MSG_ERROR(QtNetwork headers missing. Install them or use --without-qt.),) - - if test x$use_tests = xyes; then - TEMP_LIBS="$LIBS" - LIBS= - if test x$qt_lib_path != x; then - LIBS="-L$qt_lib_path" - fi - AC_CHECK_LIB([QtTest], [main],, have_qt_test=no) - AC_CHECK_HEADER([QTest],, have_qt_test=no) - QT_TEST_LIBS="$LIBS" - LIBS="$TEMP_LIBS" - fi - if test x$use_dbus != xno; then - TEMP_LIBS="$LIBS" - LIBS= - if test x$qt_lib_path != x; then - LIBS="-L$qt_lib_path" - fi - AC_CHECK_LIB([QtDBus], [main],, have_qt_dbus=no) - AC_CHECK_HEADER([QtDBus],, have_qt_dbus=no) - QT_DBUS_LIBS="$LIBS" - LIBS="$TEMP_LIBS" - fi - CPPFLAGS="$TEMP_CPPFLAGS" - if test x$use_qr != xno; then - AC_CHECK_LIB([qrencode], [main],, [have_qrencode=no]) - AC_CHECK_HEADER([qrencode.h],, have_qrencode=no) - fi - fi -fi +AC_MSG_CHECKING([if bitcoin-cli should be enabled]) +AM_CONDITIONAL([BUILD_BITCOIN_CLI], [test x$build_bitcoin_cli = xyes]) +AC_MSG_RESULT($build_bitcoin_cli) + +dnl sets $bitcoin_enable_qt, $bitcoin_enable_qt_test, $bitcoin_enable_qt_dbus +BITCOIN_QT_CONFIGURE([$use_pkgconfig], [qt4]) -if test x$use_ipv6 = xyes; then - dnl Check for ipv6 build requirements - AC_MSG_CHECKING(for IPV6 build support) - AC_LINK_IFELSE([AC_LANG_PROGRAM([[ - #if defined(_WINDOWS) - #include - #else - #include - #include - #include - #endif - ]], [[ - #if !defined(_WINDOWS) - struct in6_addr ipv6Addr; - struct sockaddr_in6 addr; - #endif - int temp = socket(AF_INET6, SOCK_STREAM, 0);]])],[AC_MSG_RESULT(yes); have_ipv6=yes; AC_DEFINE(HAVE_IPV6, 1, [Define this symbol if you have ipv6 build support])],[AC_MSG_RESULT(no); have_ipv6=no]) -fi AC_LANG_POP if test "x$use_ccache" != "xno"; then @@ -540,20 +587,14 @@ if test "x$use_ccache" != "xno"; then AC_MSG_RESULT($use_ccache) fi -dnl enable ipv6 support -AC_MSG_CHECKING([if ipv6 should be enabled]) -if test x$have_ipv6 = xno; then - if test x$use_ipv6 = xyes; then - AC_MSG_ERROR("ipv6 requested but cannot be built. use --disable-ipv6") - fi - AC_MSG_RESULT(no) +dnl enable wallet +AC_MSG_CHECKING([if wallet should be enabled]) +if test x$enable_wallet != xno; then + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED([ENABLE_WALLET],[1],[Define to 1 to enable wallet functions]) + else - if test x$use_ipv6 = xyes; then - AC_MSG_RESULT(yes) - AC_DEFINE([USE_IPV6],[1],[Define if ipv6 support should be compiled in]) - else - AC_MSG_RESULT(no) - fi + AC_MSG_RESULT(no) fi dnl enable upnp support @@ -583,57 +624,15 @@ else fi fi -dnl enable qt support -AC_MSG_CHECKING([if qt should be enabled]) -if test x$use_qt = xyes; then - if test x$have_qt = xno; then - AC_MSG_ERROR("qt support requested but qt could not be located. use --without-qt") - fi - if test x$MOC = x; then - AC_MSG_ERROR("qt support requested but moc was not found. use --without-qt") - fi - if test x$PROTOC = x; then - AC_MSG_ERROR("qt support requested but protoc was not found. use --without-qt") - fi - if test x$UIC = x; then - AC_MSG_ERROR("qt support requested but uic was not found. use --without-qt") - fi - if test x$RCC = x; then - AC_MSG_ERROR("qt support requested but rcc was not found. use --without-qt") - fi - if test x$LRELEASE = x; then - AC_MSG_ERROR("qt support requested but lrelease was not found. use --without-qt") - fi - if test x$use_tests = xyes; then - if test x$have_qt_test = xno; then - AC_MSG_ERROR("libQtTest not found. Use --disable-tests or --without-qt.") - fi - fi - if test x$have_qt_dbus = xno; then - use_dbus=no - if test x$use_dbus = xyes; then - AC_MSG_ERROR("libQtDBus not found. Use --without-qtdbus.") - fi - fi - BUILD_QT=qt -else - use_qt=no -fi - -AC_MSG_RESULT($use_qt) - dnl these are only used when qt is enabled -if test x$use_qt = xyes; then - +if test x$bitcoin_enable_qt != xno; then + BUILD_QT=qt dnl enable dbus support AC_MSG_CHECKING([if dbus should be enabled]) - if test x$use_dbus != xno; then - use_dbus=yes + if test x$bitcoin_enable_qt_dbus != xno; then AC_DEFINE([USE_DBUS],[1],[Define if dbus support should be compiled in]) - else - use_dbus=no fi - AC_MSG_RESULT($use_dbus) + AC_MSG_RESULT($bitcoin_enable_qt_dbus) dnl enable qr support AC_MSG_CHECKING([if qr should be enabled]) @@ -652,8 +651,18 @@ if test x$use_qt = xyes; then fi fi + if test x$XGETTEXT == x; then + AC_MSG_WARN("xgettext is required to update qt translations") + fi + if test x$use_tests = xyes; then BUILD_TEST_QT="test" + if test x$bitcoin_enable_qt_test != xyes; then + AC_MSG_ERROR("Qt Test lib not found. Use --disable-tests or --without-gui.") + fi + fi + if test x$enable_wallet == xno; then + AC_MSG_ERROR([Cannot currently build Qt GUI with wallet disabled. Use --without-qt.]) fi fi @@ -661,11 +670,22 @@ if test x$use_tests = xyes; then BUILD_TEST="test" fi +if test "x$use_tests$build_bitcoind$use_qt" = "xnonono"; then + AC_MSG_ERROR([No targets! Please specify at least one of: --enable-cli --enable-daemon --enable-gui or --enable-tests]) +fi + AM_CONDITIONAL([TARGET_DARWIN], [test x$TARGET_OS = xdarwin]) +AM_CONDITIONAL([BUILD_DARWIN], [test x$BUILD_OS = xdarwin]) AM_CONDITIONAL([TARGET_WINDOWS], [test x$TARGET_OS = xwindows]) +AM_CONDITIONAL([ENABLE_WALLET],[test x$enable_wallet == xyes]) +AM_CONDITIONAL([ENABLE_TESTS],[test x$use_tests == 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([USE_QRCODE], [test x$use_qr = 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_REORG_TESTS],[test x$use_comparison_tool_reorg_test != xno]) +AM_CONDITIONAL([GLIBC_BACK_COMPAT],[test x$use_glibc_compat = xyes]) AC_DEFINE(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR, [Major version]) AC_DEFINE(CLIENT_VERSION_MINOR, _CLIENT_VERSION_MINOR, [Minor version]) @@ -683,22 +703,14 @@ AC_SUBST(COPYRIGHT_YEAR, _COPYRIGHT_YEAR) AC_SUBST(USE_UPNP) AC_SUBST(USE_QRCODE) -AC_SUBST(USE_IPV6) AC_SUBST(INCLUDES) AC_SUBST(BOOST_LIBS) -AC_SUBST(MOC_DEFS) -AC_SUBST(QT_INCLUDES) -AC_SUBST(QT_TEST_LIBS) -AC_SUBST(QT_LIBS) -AC_SUBST(QT_DBUS_LIBS) -AC_SUBST(QT_DBUS_INCLUDES) -AC_SUBST(QT_TEST_INCLUDES) AC_SUBST(TESTDEFS) AC_SUBST(LEVELDB_TARGET_FLAGS) -AC_SUBST(BUILD_QT) AC_SUBST(BUILD_TEST) +AC_SUBST(BUILD_QT) AC_SUBST(BUILD_TEST_QT) -AC_CONFIG_FILES([Makefile src/Makefile src/test/Makefile src/qt/Makefile src/qt/test/Makefile share/setup.nsi share/qt/Info.plist]) +AC_CONFIG_FILES([Makefile src/Makefile share/setup.nsi share/qt/Info.plist]) AC_CONFIG_FILES([qa/pull-tester/run-bitcoind-for-test.sh],[chmod +x qa/pull-tester/run-bitcoind-for-test.sh]) AC_CONFIG_FILES([qa/pull-tester/build-tests.sh],[chmod +x qa/pull-tester/build-tests.sh]) AC_OUTPUT diff --git a/contrib/debian/control b/contrib/debian/control new file mode 100644 index 00000000..a04e88d4 --- /dev/null +++ b/contrib/debian/control @@ -0,0 +1,58 @@ +Source: bitcoin +Section: utils +Priority: optional +Maintainer: Jonas Smedegaard +Uploaders: Micah Anderson +Build-Depends: debhelper, + devscripts, + automake, + libtool, + bash-completion, + libboost-system-dev (>> 1.35) | libboost-system1.35-dev, + libdb4.8++-dev, + libssl-dev, + pkg-config, + libminiupnpc8-dev, + libboost-filesystem-dev (>> 1.35) | libboost-filesystem1.35-dev, + libboost-program-options-dev (>> 1.35) | libboost-program-options1.35-dev, + libboost-thread-dev (>> 1.35) | libboost-thread1.35-dev, + libboost-test-dev (>> 1.35) | libboost-test1.35-dev, + qt4-qmake, + libqt4-dev, + libqrencode-dev, + libprotobuf-dev, protobuf-compiler +Standards-Version: 3.9.2 +Homepage: http://www.bitcoin.org/ +Vcs-Git: git://github.com/bitcoin/bitcoin.git +Vcs-Browser: http://github.com/bitcoin/bitcoin + +Package: bitcoind +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: peer-to-peer network based digital currency - daemon + Bitcoin is a free open source peer-to-peer electronic cash system that + is completely decentralized, without the need for a central server or + trusted parties. Users hold the crypto keys to their own money and + transact directly with each other, with the help of a P2P network to + check for double-spending. + . + Full transaction history is stored locally at each client. This + requires 20+ GB of space, slowly growing. + . + This package provides bitcoind, a combined daemon and CLI tool to + interact with the daemon. + +Package: bitcoin-qt +Architecture: any +Depends: ${shlibs:Depends}, ${misc:Depends} +Description: peer-to-peer network based digital currency - Qt GUI + Bitcoin is a free open source peer-to-peer electronic cash system that + is completely decentralized, without the need for a central server or + trusted parties. Users hold the crypto keys to their own money and + transact directly with each other, with the help of a P2P network to + check for double-spending. + . + 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. diff --git a/contrib/gitian-descriptors/boost-win.yml b/contrib/gitian-descriptors/boost-win.yml new file mode 100644 index 00000000..35bd3426 --- /dev/null +++ b/contrib/gitian-descriptors/boost-win.yml @@ -0,0 +1,74 @@ +--- +name: "boost" +suites: +- "precise" +architectures: +- "amd64" +packages: +- "mingw-w64" +- "g++-mingw-w64" +- "faketime" +- "zip" +reference_datetime: "2011-01-30 00:00:00" +remotes: [] +files: +- "boost_1_55_0.tar.bz2" +- "boost-mingw-gas-cross-compile-2013-03-03.patch" +script: | + # Defines + export TZ=UTC + INDIR=$HOME/build + # Input Integrity Check + echo "fff00023dd79486d444c8e29922f4072e1d451fc5a4d2b6075852ead7f2b7b52 boost_1_55_0.tar.bz2" | shasum -c + echo "d2b7f6a1d7051faef3c9cf41a92fa3671d905ef1e1da920d07651a43299f6268 boost-mingw-gas-cross-compile-2013-03-03.patch" | shasum -c + for BITS in 32 64; do # for architectures + # + INSTALLPREFIX=$HOME/staging${BITS} + BUILDDIR=$HOME/build${BITS} + if [ "$BITS" == "32" ]; then + HOST=i686-w64-mingw32 + else + HOST=x86_64-w64-mingw32 + fi + # + mkdir -p $INSTALLPREFIX $BUILDDIR + cd $BUILDDIR + # + tar xjf $INDIR/boost_1_55_0.tar.bz2 + cd boost_1_55_0 + GCCVERSION=$($HOST-g++ -E -dM $(mktemp --suffix=.h) | grep __VERSION__ | cut -d ' ' -f 3 | cut -d '"' -f 2) + echo "using gcc : $GCCVERSION : $HOST-g++ + : + $HOST-windres + $HOST-ar + -frandom-seed=boost1 + $HOST-ranlib + ;" > user-config.jam + ./bootstrap.sh --without-icu + # Workaround: Upstream boost dev refuses to include patch that would allow Free Software cross-compile toolchain to work + # This patch was authored by the Fedora package developer and ships in Fedora's mingw32-boost. + # Please obtain the exact patch that matches the above sha256sum from one of the following mirrors. + # + # Read History: https://svn.boost.org/trac/boost/ticket/7262 + # History Mirror: http://rose.makesad.us/~paulproteus/mirrors/7262%20Boost.Context%20fails%20to%20build%20using%20MinGW.html + # + # Patch: https://svn.boost.org/trac/boost/raw-attachment/ticket/7262/boost-mingw.patch + # Patch Mirror: http://wtogami.fedorapeople.org/boost-mingw-gas-cross-compile-2013-03-03.patch + # Patch Mirror: http://mindstalk.net/host/boost-mingw-gas-cross-compile-2013-03-03.patch + # Patch Mirror: http://rose.makesad.us/~paulproteus/mirrors/boost-mingw-gas-cross-compile-2013-03-03.patch + patch -p0 < $INDIR/boost-mingw-gas-cross-compile-2013-03-03.patch + # Bug Workaround: boost-1.54.0 broke the ability to disable zlib, still broken in 1.55 + # https://svn.boost.org/trac/boost/ticket/9156 + sed -i 's^\[ ac.check-library /zlib//zlib : /zlib//zlib^^' libs/iostreams/build/Jamfile.v2 + sed -i 's^zlib.cpp gzip.cpp \]^^' libs/iostreams/build/Jamfile.v2 + # http://statmt.org/~s0565741/software/boost_1_52_0/libs/context/doc/html/context/requirements.html + # "For cross-compiling the lib you must specify certain additional properties at bjam command line: target-os, abi, binary-format, architecture and address-model." + ./bjam toolset=gcc binary-format=pe target-os=windows threadapi=win32 address-model=$BITS threading=multi variant=release link=static runtime-link=static --user-config=user-config.jam --without-mpi --without-python -sNO_BZIP2=1 -sNO_ZLIB=1 --layout=tagged --build-type=complete --prefix="$INSTALLPREFIX" $MAKEOPTS install + # + cd "$INSTALLPREFIX" + export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 + export FAKETIME=$REFERENCE_DATETIME + zip -r $OUTDIR/boost-win$BITS-1.55.0-gitian-r6.zip * + unset LD_PRELOAD + unset FAKETIME + done # for BITS in diff --git a/contrib/gitian-descriptors/boost-win32.yml b/contrib/gitian-descriptors/boost-win32.yml deleted file mode 100644 index f5be8e1d..00000000 --- a/contrib/gitian-descriptors/boost-win32.yml +++ /dev/null @@ -1,32 +0,0 @@ ---- -name: "boost" -suites: -- "lucid" -architectures: -- "i386" -packages: -- "mingw32" -- "faketime" -- "zip" -reference_datetime: "2011-01-30 00:00:00" -remotes: [] -files: -- "boost_1_59_0.tar.bz2" -script: | - INSTALLPREFIX="$OUTDIR/staging/boost" - mkdir -p "$INSTALLPREFIX" - tar xjf boost_1_59_0.tar.bz2 - cd boost_1_50_0 - echo "using gcc : 4.4 : i586-mingw32msvc-g++ - : - i586-mingw32msvc-windres - i586-mingw32msvc-ar - -frandom-seed=boost1 - ;" > user-config.jam - ./bootstrap.sh --without-icu - ./bjam toolset=gcc target-os=windows threadapi=win32 threading=multi variant=release link=static --user-config=user-config.jam --without-mpi --without-python -sNO_BZIP2=1 -sNO_ZLIB=1 --layout=tagged --build-type=complete --prefix="$INSTALLPREFIX" $MAKEOPTS install - cd "$INSTALLPREFIX" - export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 - export FAKETIME=$REFERENCE_DATETIME - zip -r boost-win32-1.59.0-gitian3.zip * - cp boost-win32-1.59.0-gitian3.zip $OUTDIR \ No newline at end of file diff --git a/contrib/gitian-descriptors/deps-win.yml b/contrib/gitian-descriptors/deps-win.yml index 0dbf5f78..63810233 100644 --- a/contrib/gitian-descriptors/deps-win.yml +++ b/contrib/gitian-descriptors/deps-win.yml @@ -1,52 +1,38 @@ --- -name: "DigitalNote-deps" +name: "bitcoin-deps" suites: -- "trusty" +- "precise" architectures: - "amd64" -packages: +packages: - "mingw-w64" - "g++-mingw-w64" - "git-core" - "zip" -- "unzip" - "faketime" - "psmisc" -- "libtool" -- "automake" -- "autoconf" -reference_datetime: "2013-06-01 00:00:00" +reference_datetime: "2011-01-30 00:00:00" remotes: [] files: -- "openssl-1.0.2d.tar.gz" -- "miniupnpc-1.9.20151008.tar.gz" -- "db-6.1.26.NC.tar.gz" +- "openssl-1.0.1e.tar.gz" +- "db-4.8.30.NC.tar.gz" +- "miniupnpc-1.8.tar.gz" - "zlib-1.2.8.tar.gz" -- "libpng-1.6.18.tar.xz" -- "boost_1_59_0.tar.bz2" -- "secp256k1-master.zip" -- "qrencode-3.4.4.tar.gz" -- "icu4c-55_1-src.tgz" -- "boost-mingw.patch" -#- "qt-everywhere-opensource-src-5.5.0.tar.xz" -script: | +- "libpng-1.6.8.tar.gz" +- "qrencode-3.4.3.tar.bz2" script: | # - export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1 + export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 export FAKETIME=$REFERENCE_DATETIME export TZ=UTC INDIR=$HOME/build - TEMPDIR=$HOME/tmp # Input Integrity Check - echo "3da5b3c572741fe2237bee1c3d36b11beef61172ac847132b045548b98d4df29 secp256k1-master.zip" | sha256sum -c - echo "e444ac3b587ce82709c4d0cfca1fe71f44f9fc433e9f946b12b9e1bfe667a633 miniupnpc-1.9.20151008.tar.gz" | sha256sum -c - echo "060105bda482fdfb109b88c05b69624e9d467d59fa30fd9a97225efcc38d1561 db-6.1.26.NC.tar.gz" | sha256sum -c - echo "36658cb768a54c1d4dec43c3116c27ed893e88b02ecfcb44f2166f9c0b7f2a0d zlib-1.2.8.tar.gz" | sha256sum -c - echo "2e10c13b7949883ac961db6177c516d778184432d440317e9f0391305c360963 libpng-1.6.18.tar.xz" | sha256sum -c - echo "727a932322d94287b62abb1bd2d41723eec4356a7728909e38adb65ca25241ca boost_1_59_0.tar.bz2" | sha256sum -c - echo "671c36487785628a703374c652ad2cebea45fa920ae5681515df25d9f2c9a8c8 openssl-1.0.2d.tar.gz" | sha256sum -c - echo "e794e26a96019013c0e3665cb06b18992668f352c5553d0a553f5d144f7f2a72 qrencode-3.4.4.tar.gz" | sha256sum -c - # + echo "f74f15e8c8ff11aa3d5bb5f276d202ec18d7246e95f961db76054199c69c1ae3 openssl-1.0.1e.tar.gz" | sha256sum -c + echo "12edc0df75bf9abd7f82f821795bcee50f42cb2e5f76a6a281b85732798364ef db-4.8.30.NC.tar.gz" | sha256sum -c + echo "bc5f73c7b0056252c1888a80e6075787a1e1e9112b808f863a245483ff79859c miniupnpc-1.8.tar.gz" | sha256sum -c + echo "36658cb768a54c1d4dec43c3116c27ed893e88b02ecfcb44f2166f9c0b7f2a0d zlib-1.2.8.tar.gz" | sha256sum -c + echo "32c7acf1608b9c8b71b743b9780adb7a7b347563dbfb4a5263761056da44cc96 libpng-1.6.8.tar.gz" | sha256sum -c + echo "dfd71487513c871bad485806bfd1fdb304dedc84d2b01a8fb8e0940b50597a98 qrencode-3.4.3.tar.bz2" | sha256sum -c for BITS in 32 64; do # for architectures # INSTALLPREFIX=$HOME/staging${BITS} @@ -57,51 +43,46 @@ script: | HOST=x86_64-w64-mingw32 fi # - mkdir -p $BUILDDIR $INSTALLPREFIX/lib + mkdir -p $INSTALLPREFIX $BUILDDIR cd $BUILDDIR # - tar xzf $INDIR/openssl-1.0.2d.tar.gz - cd openssl-1.0.2d + tar xzf $INDIR/openssl-1.0.1e.tar.gz + cd openssl-1.0.1e if [ "$BITS" == "32" ]; then OPENSSL_TGT=mingw else OPENSSL_TGT=mingw64 fi - ./Configure --cross-compile-prefix=$HOST- ${OPENSSL_TGT} --prefix=$INSTALLPREFIX - make install - #make install_sw + ./Configure --cross-compile-prefix=$HOST- ${OPENSSL_TGT} no-shared no-dso --openssldir=$INSTALLPREFIX + make + make install_sw cd .. # - tar xzf $INDIR/db-6.1.26.NC.tar.gz - cd db-6.1.26.NC/build_unix - ../dist/configure --prefix=$INSTALLPREFIX --enable-mingw --enable-cxx --host=$HOST -disable-shared --disable-replication - # Workaround to prevent re-configuring by make; make all files have a date in the past - sed -i 's/WinIoCtl.h/winioctl.h/' ../src/dbinc/win_db.h - find . -print0 | xargs -r0 touch -t 200001010000 - make $MAKEOPTS #library_build + tar xzf $INDIR/db-4.8.30.NC.tar.gz + cd db-4.8.30.NC/build_unix + ../dist/configure --prefix=$INSTALLPREFIX --enable-mingw --enable-cxx --host=$HOST --disable-shared + make $MAKEOPTS library_build make install_lib install_include cd ../.. # - tar xzf $INDIR/miniupnpc-1.9.20151008.tar.gz - cd miniupnpc-1.9.20151008 + tar xzf $INDIR/miniupnpc-1.8.tar.gz + cd miniupnpc-1.8 echo " - --- miniupnpc-1.9/Makefile.mingw.orig 2013-09-29 18:52:51.014087958 -1000 - +++ miniupnpc-1.9/Makefile.mingw 2013-09-29 19:09:29.663318691 -1000 + --- miniupnpc-1.8/Makefile.mingw.orig 2013-09-29 18:52:51.014087958 -1000 + +++ miniupnpc-1.8/Makefile.mingw 2013-09-29 19:09:29.663318691 -1000 @@ -67,8 +67,8 @@ - + wingenminiupnpcstrings.o: wingenminiupnpcstrings.c - + -miniupnpcstrings.h: miniupnpcstrings.h.in wingenminiupnpcstrings - wingenminiupnpcstrings \$< \$@ - +miniupnpcstrings.h: miniupnpcstrings.h.in + +miniupnpcstrings.h: miniupnpcstrings.h.in + sed -e 's|OS/version|MSWindows/5.1.2600|' -e 's|MINIUPNPC_VERSION_STRING \"version\"|MINIUPNPC_VERSION_STRING \"VERSIONHERE\"|' \$< > \$@ - + minixml.o: minixml.c minixml.h miniupnpcstrings.h - + " | sed "s/VERSIONHERE/$(cat VERSION)/" | patch -p1 mkdir -p dll - # Workaround to prevent re-configuring by make; make all files have a date in the past - find . -print0 | xargs -r0 touch -t 200001010000 make -f Makefile.mingw CC=$HOST-gcc AR=$HOST-ar libminiupnpc.a install -d $INSTALLPREFIX/include/miniupnpc install *.h $INSTALLPREFIX/include/miniupnpc @@ -115,94 +96,21 @@ script: | make install cd .. # - tar xf $INDIR/libpng-1.6.18.tar.xz - cd libpng-1.6.18 + tar xzf $INDIR/libpng-1.6.8.tar.gz + cd libpng-1.6.8 OPT="-O2" CPPFLAGS="${OPT} -I$INSTALLPREFIX/include" CFLAGS="${OPT} -I$INSTALLPREFIX/include" LDFLAGS="${OPT} -L$INSTALLPREFIX/lib" ./configure --disable-shared --prefix=$INSTALLPREFIX --host=$HOST make $MAKEOPTS make install cd .. # - tar xfz $INDIR/qrencode-3.4.4.tar.gz - cd qrencode-3.4.4 - CPPFLAGS="${OPT} -I$INSTALLPREFIX/include" CFLAGS="${OPT} -I$INSTALLPREFIX/include" LDFLAGS="${OPT} -L$INSTALLPREFIX/lib" ./configure --enable-static --disable-shared --without-tools --prefix=$INSTALLPREFIX --host=$HOST - make $MAKEOPTS - make install - cd .. - # - mkdir -p icuCross - cd icuCross - tar xzf $INDIR/icu4c-55_1-src.tgz - cd icu/source - mkdir -p $TEMPDIR/icu - ./runConfigureICU MinGW --prefix=$TEMPDIR/icu --enable-static --disable-shared - make - make install - cd ../../.. - #rm -rf icu - tar xzf $INDIR/icu4c-55_1-src.tgz - cd icu/source - ./runConfigureICU MinGW --host=$HOST --with-cross-build=$BUILDDIR/icuCross/icu/source --prefix=$INSTALLPREFIX --enable-static --disable-shared + tar xjf $INDIR/qrencode-3.4.3.tar.bz2 + cd qrencode-3.4.3 + png_CFLAGS="-I$INSTALLPREFIX/include" png_LIBS="-L$INSTALLPREFIX/lib -lpng" ./configure --prefix=$INSTALLPREFIX --host=$HOST make make install - cd ../.. - # - tar --warning=no-timestamp -xjf $INDIR/boost_1_59_0.tar.bz2 - cd boost_1_59_0 - GCCVERSION=$($HOST-g++ -E -dM $(mktemp --suffix=.h) | grep __VERSION__ | cut -d ' ' -f 3 | cut -d '"' -f 2) - echo "using gcc : $GCCVERSION : $HOST-g++ - : - $HOST-windres - $HOST-ar - -frandom-seed=boost1 - $HOST-ranlib - ;" > user-config.jam - ./bootstrap.sh --without-icu - # Workaround: Upstream boost dev refuses to include patch that would allow Free Software cross-compile toolchain to work - # This patch was authored by the Fedora package developer and ships in Fedora's mingw32-boost. - # Please obtain the exact patch that matches the above sha256sum from one of the following mirrors. - # - # Read History: https://svn.boost.org/trac/boost/ticket/7262 - # History Mirror: http://rose.makesad.us/~paulproteus/mirrors/7262%20Boost.Context%20fails%20to%20build%20using%20MinGW.html - # - # Patch: https://svn.boost.org/trac/boost/raw-attachment/ticket/7262/boost-mingw.patch - # Patch Mirror: http://wtogami.fedorapeople.org/boost-mingw-gas-cross-compile-2013-03-03.patch - # Patch Mirror: http://mindstalk.net/host/boost-mingw-gas-cross-compile-2013-03-03.patch - # Patch Mirror: http://rose.makesad.us/~paulproteus/mirrors/boost-mingw-gas-cross-compile-2013-03-03.patch - #patch -p0 < $INDIR/boost-mingw.patch - # Bug Workaround: boost-1.54.0 broke the ability to disable zlib, still broken in 1.55 - # https://svn.boost.org/trac/boost/ticket/9156 - sed -i 's^\[ ac.check-library /zlib//zlib : /zlib//zlib^^' libs/iostreams/build/Jamfile.v2 - sed -i 's^zlib.cpp gzip.cpp \]^^' libs/iostreams/build/Jamfile.v2 - # http://statmt.org/~s0565741/software/boost_1_52_0/libs/context/doc/html/context/requirements.html - # Workaround: Upstream boost dev refuses to include patch that would allow Free Software cross-compile toolchain to work - # This patch was authored by the Fedora package developer and ships in Fedora's mingw32-boost. - # Please obtain the exact patch that matches the above sha256sum from one of the following mirrors. - # - # Read History: https://svn.boost.org/trac/boost/ticket/7262 - # History Mirror: http://rose.makesad.us/~paulproteus/mirrors/7262%20Boost.Context%20fails%20to%20build%20using%20MinGW.html - # - # Patch: https://svn.boost.org/trac/boost/raw-attachment/ticket/7262/boost-mingw.patch - # Patch Mirror: http://wtogami.fedorapeople.org/boost-mingw-gas-cross-compile-2013-03-03.patch - # Patch Mirror: http://mindstalk.net/host/boost-mingw-gas-cross-compile-2013-03-03.patch - # Patch Mirror: http://rose.makesad.us/~paulproteus/mirrors/boost-mingw-gas-cross-compile-2013-03-03.patch - patch -p0 < $INDIR/boost-mingw.patch - # "For cross-compiling the lib you must specify certain additional properties at bjam command line: target-os, abi, binary-format, architecture and address-model." - ./bjam toolset=gcc binary-format=pe target-os=windows threadapi=win32 address-model=$BITS threading=multi variant=release link=static runtime-link=static --user-config=user-config.jam --without-mpi --without-python -sNO_BZIP2=1 -sNO_ZLIB=1 --layout=tagged --build-type=complete --prefix="$INSTALLPREFIX" $MAKEOPTS install cd .. # - unzip -o $INDIR/secp256k1-master.zip - cd secp256k1-master - unset FAKETIME # unset fake time during configure, as it does some clock sanity tests - ./autogen.sh - #LDFLAGS="-no-undefined" - ./configure --prefix=$INSTALLPREFIX --host=$HOST - # Workaround to prevent re-configuring by make; make all files have a date in the past - find . -print0 | xargs -r0 touch -t 200001010000 - export FAKETIME=$REFERENCE_DATETIME - make install - # cd $INSTALLPREFIX - find -print0 | xargs -r0 touch # fix up timestamps before packaging - find include lib | sort | zip -X@ $OUTDIR/DigitalNote-deps-win$BITS-gitian.zip - done # for BITS in + zip -r $OUTDIR/bitcoin-deps-win$BITS-gitian-r10.zip include lib + done # for BITS in \ No newline at end of file diff --git a/contrib/gitian-descriptors/deps-win32.yml b/contrib/gitian-descriptors/deps-win32.yml deleted file mode 100644 index d7936c30..00000000 --- a/contrib/gitian-descriptors/deps-win32.yml +++ /dev/null @@ -1,81 +0,0 @@ ---- -name: "bitcoin-deps" -suites: -- "lucid" -architectures: -- "i386" -packages: -- "mingw32" -- "git-core" -- "zip" -- "faketime" -- "wine" -- "psmisc" -reference_datetime: "2011-01-30 00:00:00" -remotes: [] -files: -- "openssl-1.0.1c.tar.gz" -- "db-4.8.30.NC.tar.gz" -- "miniupnpc-1.6.tar.gz" -- "zlib-1.2.6.tar.gz" -- "libpng-1.5.9.tar.gz" -- "qrencode-3.2.0.tar.bz2" -script: | - # - export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 - export FAKETIME=$REFERENCE_DATETIME - export TZ=UTC - export INSTALLPREFIX=$OUTDIR/staging/deps - export HOST=i586-mingw32msvc - # - mkdir -p $INSTALLPREFIX - tar xzf openssl-1.0.1c.tar.gz - cd openssl-1.0.1c - ./Configure --cross-compile-prefix=$HOST- mingw --openssldir=$INSTALLPREFIX - make - make install_sw - cd .. - # - tar xzf db-4.8.30.NC.tar.gz - cd db-4.8.30.NC/build_unix - ../dist/configure --prefix=$INSTALLPREFIX --enable-mingw --enable-cxx --host=$HOST - make $MAKEOPTS library_build - make install_lib install_include - cd ../.. - # - tar xzf miniupnpc-1.6.tar.gz - cd miniupnpc-1.6 - sed 's/dllwrap -k --driver-name gcc/$(DLLWRAP) -k --driver-name $(CC)/' -i Makefile.mingw - sed 's|wingenminiupnpcstrings $< $@|./wingenminiupnpcstrings $< $@|' -i Makefile.mingw - mkdir -p dll - make -f Makefile.mingw DLLWRAP=$HOST-dllwrap CC=$HOST-gcc AR=$HOST-ar libminiupnpc.a - install -d $INSTALLPREFIX/include/miniupnpc - install *.h $INSTALLPREFIX/include/miniupnpc - install libminiupnpc.a $INSTALLPREFIX/lib - cd .. - # - tar xzf zlib-1.2.6.tar.gz - cd zlib-1.2.6 - CROSS_PREFIX=$HOST- ./configure --prefix=$INSTALLPREFIX --static - make - make install - cd .. - # - tar xzf libpng-1.5.9.tar.gz - cd libpng-1.5.9 - CFLAGS="-I$INSTALLPREFIX/include" LDFLAGS="-L$INSTALLPREFIX/lib" ./configure --disable-shared --prefix=$INSTALLPREFIX --host=$HOST - make $MAKEOPTS - make install - cd .. - # - tar xjf qrencode-3.2.0.tar.bz2 - cd qrencode-3.2.0 - png_CFLAGS="-I$INSTALLPREFIX/include" png_LIBS="-L$INSTALLPREFIX/lib -lpng" ./configure --prefix=$INSTALLPREFIX --host=i586-mingw32msvc - make - make install - cd .. - # - cd $INSTALLPREFIX - zip -r $OUTDIR/bitcoin-deps-0.0.6.zip include lib - # Kill wine processes as gitian won't figure out we are done otherwise - killall wineserver services.exe explorer.exe winedevice.exe \ No newline at end of file diff --git a/contrib/gitian-descriptors/gitian-win.yml b/contrib/gitian-descriptors/gitian-win.yml index 8b66e590..3fb3bced 100644 --- a/contrib/gitian-descriptors/gitian-win.yml +++ b/contrib/gitian-descriptors/gitian-win.yml @@ -1,7 +1,7 @@ --- -name: "DigitalNote" +name: "bitcoin" suites: -- "trusty" +- "precise" architectures: - "amd64" packages: @@ -9,7 +9,6 @@ packages: - "g++-mingw-w64" - "git-core" - "unzip" -- "zip" - "nsis" - "faketime" - "autoconf2.13" @@ -17,87 +16,68 @@ packages: - "automake" - "pkg-config" - "bsdmainutils" + reference_datetime: "2013-06-01 00:00:00" remotes: -- "url": "https://github.com/rynomster/DigitalNote.git" - "dir": "DigitalNote" +- "url": "https://github.com/bitcoin/bitcoin.git" + "dir": "bitcoin" files: -- "qt-win32-5.5.0-gitian.zip" -- "qt-win64-5.5.0-gitian.zip" -- "DigitalNote-deps-win32-gitian.zip" -- "DigitalNote-deps-win64-gitian.zip" +- "qt-win32-5.2.0-gitian-r1.zip" +- "qt-win64-5.2.0-gitian-r1.zip" +- "boost-win32-1.55.0-gitian-r6.zip" +- "boost-win64-1.55.0-gitian-r6.zip" +- "bitcoin-deps-win32-gitian-r10.zip" +- "bitcoin-deps-win64-gitian-r10.zip" +- "protobuf-win32-2.5.0-gitian-r4.zip" +- "protobuf-win64-2.5.0-gitian-r4.zip" script: | # Defines - export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1 - export FAKETIME=$REFERENCE_DATETIME export TZ=UTC INDIR=$HOME/build OPTFLAGS='-O2' - TEMPDIR="$HOME/tempdir" - echo "2d4fafbd04d5e233416c83c618dda2f111891f995eba585cc0a2ea637d0b3be2 qt-win32-5.5.0-gitian.zip" | sha256sum -c - echo "130685a66c344e53b131aa7cfac77f7796c6e113563bfd37eeb3cfd7c7fb4f08 qt-win64-5.5.0-gitian.zip" | sha256sum -c - echo "1cf99b3e264725580fd0f22ef36afbf96d3da0d5f659057e7100089b96a18ece DigitalNote-deps-win32-gitian.zip" | sha256sum -c - echo "76e769fc3147dc819c4495839b7a5270fd058658bf1ef1adba22394b4f465ccb DigitalNote-deps-win64-gitian.zip" | sha256sum -c NEEDDIST=1 - # Qt: workaround for determinism in resource ordering - # Qt5's rcc uses a QHash to store the files for the resource. - # A security fix in QHash makes the ordering of keys to be different on every run - # (https://qt.gitorious.org/qt/qtbase/commit/c01eaa438200edc9a3bbcd8ae1e8ded058bea268). - # This is good in general but qrc shouldn't be doing a traversal over a randomized container. - # The thorough solution would be to use QMap instead of QHash, but this requires patching Qt. - # For now luckily there is a test mode that forces a fixed seed. - export QT_RCC_TEST=1 for BITS in 32 64; do # for architectures # STAGING=$HOME/staging${BITS} BUILDDIR=$HOME/build${BITS} BINDIR=$OUTDIR/$BITS - DEPSDIR=$HOME/deps${BITS} if [ "$BITS" == "32" ]; then HOST=i686-w64-mingw32 - DISTNAME=i686-win else HOST=x86_64-w64-mingw32 - DISTNAME=x86_64-win fi - export PATH=$STAGING/host/bin:$PATH - rm -rf $DEPSDIR - rm -rf $BUILDDIR - rm -rf $STAGING - mkdir -p $STAGING $BUILDDIR $BINDIR $DEPSDIR + mkdir -p $STAGING $BUILDDIR $BINDIR # cd $STAGING - unzip -o $INDIR/qt-win${BITS}-5.5.0-gitian.zip - cd $DEPSDIR - unzip -o $INDIR/DigitalNote-deps-win${BITS}-gitian.zip - # + unzip $INDIR/qt-win${BITS}-5.2.0-gitian-r1.zip + unzip $INDIR/boost-win${BITS}-1.55.0-gitian-r6.zip + unzip $INDIR/bitcoin-deps-win${BITS}-gitian-r10.zip + unzip $INDIR/protobuf-win${BITS}-2.5.0-gitian-r4.zip + if [ "$NEEDDIST" == "1" ]; then + # Make source code archive which is architecture independent so it only needs to be done once + cd $HOME/build/ + cd bitcoin + export PATH=$STAGING/host/bin:$PATH + export TAR_OPTIONS=--mtime=`echo $REFERENCE_DATETIME | awk '{ print $1 }'` + ./autogen.sh + ./configure --bindir=$OUTDIR --prefix=$STAGING --host=$HOST --with-qt-plugindir=$STAGING/plugins --with-qt-incdir=$STAGING/include --with-qt-bindir=$STAGING/host/bin --with-boost=$STAGING --disable-maintainer-mode --with-protoc-bindir=$STAGING/host/bin --disable-dependency-tracking CPPFLAGS="-I$STAGING/include ${OPTFLAGS}" LDFLAGS="-L$STAGING/lib ${OPTFLAGS}" CXXFLAGS="-frandom-seed=bitcoin ${OPTFLAGS}" + make dist + mkdir -p $OUTDIR/src + cp -f bitcoin-*.tar.* $OUTDIR/src + NEEDDIST=0 + fi + # Build platform-dependent executables from source archive cd $BUILDDIR - cp -r ../build/DigitalNote . - cd DigitalNote - mkdir -p $OUTDIR/src - git archive HEAD | tar -x -C $OUTDIR/src - cp $OUTDIR/src/doc/README_windows.txt $OUTDIR/readme.txt - cp $OUTDIR/src/COPYING $OUTDIR/COPYING.txt - # - cd src - make -f makefile.linux-mingw HOST="$HOST" DEPSDIR="$DEPSDIR" CURDIR="$BUILDDIR/DigitalNote/src" STATIC=1 $MAKEOPTS USE_UPNP=1 BOOST_LIB_SUFFIX="-mt-s" USE_WALLET=1 DEBUGFLAGS= - cp DigitalNoted.exe $BINDIR/ - cd .. - # - #$DEPSDIR/qt/host/bin/qmake -spec unsupported/win32-g++-cross MINIUPNPC_LIB_PATH=$HOME/build/miniupnpc MINIUPNPC_INCLUDE_PATH=$HOME/build/ BDB_LIB_PATH=$HOME/build/db-4.8.30.NC/build_unix BDB_INCLUDE_PATH=$HOME/build/db-4.8.30.NC/build_unix BOOST_LIB_PATH=$HOME/build/lib BOOST_INCLUDE_PATH=$HOME/build/include BOOST_LIB_SUFFIX=-mt-s BOOST_THREAD_LIB_SUFFIX=_win32-mt-s OPENSSL_LIB_PATH=$HOME/build/openssl-1.0.1h OPENSSL_INCLUDE_PATH=$HOME/build/openssl-1.0.1h/include INCLUDEPATH=$HOME/build DEFINES=BOOST_THREAD_USE_LIB BITCOIN_NEED_QT_PLUGINS=1 QMAKE_LRELEASE=lrelease QMAKE_CXXFLAGS=-frandom-seed=bitcoin USE_BUILD_INFO=1 - $STAGING/host/bin/qmake -xplatform win32-g++ RELEASE=1 QMAKE_LRELEASE="$STAGING/host/bin/lrelease" MINIUPNPC_LIB_PATH="$DEPSDIR/lib" MINIUPNPC_INCLUDE_PATH="$DEPSDIR/include" BDB_LIB_PATH="$DEPSDIR/lib" BDB_INCLUDE_PATH="$DEPSDIR/include" BOOST_LIB_PATH="$DEPSDIR/lib" BOOST_INCLUDE_PATH="$DEPSDIR/include" BOOST_LIB_SUFFIX="-mt-s" BOOST_THREAD_LIB_SUFFIX="_win32-mt-s" OPENSSL_LIB_PATH="$DEPSDIR/lib" OPENSSL_INCLUDE_PATH="$DEPSDIR/include" INCLUDEPATH="$DEPSDIR/include" DEFINES="BOOST_THREAD_USE_LIB BITCOIN_NEED_QT_PLUGINS=1 USE_BUILD_INFO=1 USE_NATIVE_I2P=1 USE_QRENCODE=1" QMAKE_CXXFLAGS=-frandom-seed=DigitalNote + mkdir -p distsrc + cd distsrc + tar --strip-components=1 -xf $HOME/build/bitcoin/bitcoin-*.tar.* + ./configure --bindir=$BINDIR --prefix=$STAGING --host=$HOST --with-qt-plugindir=$STAGING/plugins --with-qt-incdir=$STAGING/include --with-qt-bindir=$STAGING/host/bin --with-boost=$STAGING --disable-maintainer-mode --with-protoc-bindir=$STAGING/host/bin --disable-dependency-tracking CPPFLAGS="-I$STAGING/include ${OPTFLAGS}" LDFLAGS="-L$STAGING/lib ${OPTFLAGS}" CXXFLAGS="-frandom-seed=bitcoin ${OPTFLAGS}" + export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 + export FAKETIME=$REFERENCE_DATETIME make $MAKEOPTS - cp release/DigitalNote.exe $BINDIR/ - # + make deploy + make install-strip + cp -f bitcoin-*setup*.exe $BINDIR/ unset LD_PRELOAD unset FAKETIME done # for BITS in - # - # sort distribution tar file and normalize user/group/mtime information for deterministic output - mkdir -p $OUTDIR/src - rm -rf $TEMPDIR - mkdir -p $TEMPDIR - cd $TEMPDIR - cd $BINDIR - #tar -xvf $HOME/build/DigitalNote/$DISTNAME | sort | tar --no-recursion -cT /dev/stdin --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 --mtime="$REFERENCE_DATETIME" | gzip -n > $OUTDIR/src/$DISTNAME - find | sort | zip -X@ $OUTDIR/DigitalNote_$DISTNAME.zip diff --git a/contrib/gitian-descriptors/gitian-win32.yml b/contrib/gitian-descriptors/gitian-win32.yml deleted file mode 100644 index 7eb8d153..00000000 --- a/contrib/gitian-descriptors/gitian-win32.yml +++ /dev/null @@ -1,56 +0,0 @@ ---- -name: "bitcoin" -suites: -- "lucid" -architectures: -- "i386" -packages: -- "mingw32" -- "git-core" -- "unzip" -- "nsis" -- "faketime" -- "autoconf2.13" -- "libtool" -- "automake" -- "pkg-config" - -reference_datetime: "2013-06-01 00:00:00" -remotes: -- "url": "https://github.com/bitcoin/bitcoin.git" - "dir": "bitcoin" -files: -- "qt-win32-4.8.3-gitian-r3.zip" -- "boost-win32-1.50.0-gitian3.zip" -- "bitcoin-deps-0.0.6.zip" -- "protobuf-win32-2.5.0-gitian-r2.zip" -script: | - # - STAGING=$HOME/staging - mkdir -p $STAGING - cd $STAGING - unzip ../build/qt-win32-4.8.3-gitian-r3.zip - unzip ../build/boost-win32-1.50.0-gitian3.zip - unzip ../build/bitcoin-deps-0.0.6.zip - unzip ../build/protobuf-win32-2.5.0-gitian-r2.zip - cd $HOME/build/ - # - cd bitcoin - export PATH=$STAGING/host/bin:$PATH - export TAR_OPTIONS=--mtime=`echo $REFERENCE_DATETIME | awk '{ print $1 }'` - ./autogen.sh - ./configure --disable-debug --bindir=$OUTDIR --prefix=$STAGING --host=i586-mingw32msvc --with-qt-plugindir=$STAGING/plugins --with-qt-incdir=$STAGING/include --with-qt-bindir=$STAGING/host/bin --with-boost=$STAGING --disable-maintainer-mode --with-protoc-bindir=$STAGING/host/bin --disable-dependency-tracking CPPFLAGS="-I$STAGING/include" LDFLAGS="-L$STAGING/lib" CXXFLAGS="-frandom-seed=bitcoin" - make dist - mkdir -p distsrc - cd distsrc - tar --strip-components=1 -xf ../bitcoin-*.tar.* - ./configure --disable-debug --bindir=$OUTDIR --prefix=$STAGING --host=i586-mingw32msvc --with-qt-plugindir=$STAGING/plugins --with-qt-incdir=$STAGING/include --with-qt-bindir=$STAGING/host/bin --with-boost=$STAGING --disable-maintainer-mode --with-protoc-bindir=$STAGING/host/bin --disable-dependency-tracking CPPFLAGS="-I$STAGING/include" LDFLAGS="-L$STAGING/lib" CXXFLAGS="-frandom-seed=bitcoin" - export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 - export FAKETIME=$REFERENCE_DATETIME - export TZ=UTC - make $MAKEOPTS - make deploy - make install-strip - cp -f bitcoin-*setup*.exe $OUTDIR/ - mkdir -p $OUTDIR/src - cp -f ../bitcoin-*.tar.* $OUTDIR/src \ No newline at end of file diff --git a/contrib/gitian-descriptors/protobuf-win.yml b/contrib/gitian-descriptors/protobuf-win.yml new file mode 100644 index 00000000..5875890c --- /dev/null +++ b/contrib/gitian-descriptors/protobuf-win.yml @@ -0,0 +1,55 @@ +--- +name: "protobuf-win32" +suites: +- "precise" +architectures: +- "amd64" +packages: +- "mingw-w64" +- "g++-mingw-w64" +- "zip" +- "faketime" +reference_datetime: "2013-04-15 00:00:00" +remotes: [] +files: +- "protobuf-2.5.0.tar.bz2" +script: | + # + export TZ=UTC + INDIR=$HOME/build + OPTFLAGS="-O2" + # Integrity Check + echo "13bfc5ae543cf3aa180ac2485c0bc89495e3ae711fc6fab4f8ffe90dfb4bb677 protobuf-2.5.0.tar.bz2" | sha256sum -c + for BITS in 32 64; do # for architectures + # + INSTALLPREFIX=$HOME/staging${BITS} + BUILDDIR=$HOME/build${BITS} + if [ "$BITS" == "32" ]; then + HOST=i686-w64-mingw32 + else + HOST=x86_64-w64-mingw32 + fi + # + mkdir -p $INSTALLPREFIX $BUILDDIR + cd $BUILDDIR + # + tar xjf $INDIR/protobuf-2.5.0.tar.bz2 + cd protobuf-2.5.0 + # First: build a native (linux) protoc + ./configure --enable-shared=no --disable-dependency-tracking + make + mkdir -p $INSTALLPREFIX/host/bin + cp src/protoc $INSTALLPREFIX/host/bin + # Now recompile with the mingw cross-compiler: + make distclean + ./configure --prefix=$INSTALLPREFIX --enable-shared=no --disable-dependency-tracking --with-protoc=$INSTALLPREFIX/host/bin/protoc --host=$HOST CXXFLAGS="-frandom-seed=11 ${OPTFLAGS}" + make + make install + # + cd $INSTALLPREFIX + export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 + export FAKETIME=$REFERENCE_DATETIME + zip -r $OUTDIR/protobuf-win$BITS-2.5.0-gitian-r4.zip include lib host + unset LD_PRELOAD + unset FAKETIME + done # for BITS in \ No newline at end of file diff --git a/contrib/gitian-descriptors/protobuf-win32.yml b/contrib/gitian-descriptors/protobuf-win32.yml deleted file mode 100644 index d347ebe8..00000000 --- a/contrib/gitian-descriptors/protobuf-win32.yml +++ /dev/null @@ -1,38 +0,0 @@ ---- -name: "protobuf-win32" -suites: -- "lucid" -architectures: -- "i386" -packages: -- "mingw32" -- "zip" -- "faketime" -reference_datetime: "2013-04-15 00:00:00" -remotes: [] -files: -- "protobuf-2.5.0.tar.bz2" -script: | - # - export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 - export FAKETIME=$REFERENCE_DATETIME - export TZ=UTC - export INSTALLPREFIX=$OUTDIR/staging/deps - export HOST=i586-mingw32msvc - # - # - mkdir -p $INSTALLPREFIX - tar xjf protobuf-2.5.0.tar.bz2 - cd protobuf-2.5.0 - # First: build a native (linux) protoc - ./configure --enable-shared=no --disable-dependency-tracking - make - mkdir -p $INSTALLPREFIX/host/bin - cp src/protoc $INSTALLPREFIX/host/bin - # Now recompile with the mingw cross-compiler: - make distclean - ./configure --prefix=$INSTALLPREFIX --enable-shared=no --disable-dependency-tracking --with-protoc=$INSTALLPREFIX/host/bin/protoc --host=$HOST CXXFLAGS=-frandom-seed=11 - make - make install - cd $INSTALLPREFIX - zip -r $OUTDIR/protobuf-win32-2.5.0-gitian-r2.zip include lib host \ No newline at end of file diff --git a/contrib/gitian-descriptors/qt-win.yml b/contrib/gitian-descriptors/qt-win.yml index 63b0e973..9b26ec4c 100644 --- a/contrib/gitian-descriptors/qt-win.yml +++ b/contrib/gitian-descriptors/qt-win.yml @@ -1,39 +1,28 @@ --- name: "qt" suites: -- "trusty" +- "precise" architectures: - "amd64" -packages: +packages: - "mingw-w64" - "g++-mingw-w64" - "zip" - "unzip" - "faketime" - "libz-dev" -reference_datetime: "2013-06-01 00:00:00" +reference_datetime: "2011-01-30 00:00:00" remotes: [] files: -- "qt-everywhere-opensource-src-5.5.0.tar.xz" -- "DigitalNote-deps-win32-gitian.zip" -- "DigitalNote-deps-win64-gitian.zip" +- "qt-everywhere-opensource-src-5.2.0.tar.gz" +- "bitcoin-deps-win32-gitian-r10.zip" +- "bitcoin-deps-win64-gitian-r10.zip" script: | # Defines export TZ=UTC INDIR=$HOME/build - TEMPDIR=$HOME/tmp - # Qt: workaround for determinism in resource ordering - # Qt5's rcc uses a QHash to store the files for the resource. - # A security fix in QHash makes the ordering of keys to be different on every run - # (https://qt.gitorious.org/qt/qtbase/commit/c01eaa438200edc9a3bbcd8ae1e8ded058bea268). - # This is good in general but qrc shouldn't be doing a traversal over a randomized container. - # The thorough solution would be to use QMap instead of QHash, but this requires patching Qt. - # For now luckily there is a test mode that forces a fixed seed. - export QT_RCC_TEST=1 # Integrity Check - echo "c603942b866f8a8ffff441c0d3e8c69d29a45e0bd3e48d386e7dc27d03237178 DigitalNote-deps-win32-gitian.zip" | sha256sum -c - echo "1cb5e1b498e86917db690bc07ee73c9d6ffc23cf3509607d4f79aba53e87ecff DigitalNote-deps-win64-gitian.zip" | sha256sum -c - echo "7ea2a16ecb8088e67db86b0835b887d5316121aeef9565d5d19be3d539a2c2af qt-everywhere-opensource-src-5.5.0.tar.xz" | sha256sum -c + echo "395ec72277c5786c65b8163ef5817fd03d0a1f524a6d47f53624baf8056f1081 qt-everywhere-opensource-src-5.2.0.tar.gz" | sha256sum -c for BITS in 32 64; do # for architectures # INSTALLPREFIX=$HOME/staging${BITS} @@ -47,47 +36,40 @@ script: | # mkdir -p $INSTALLPREFIX $INSTALLPREFIX/host/bin $DEPSDIR $BUILDDIR # - # Need mingw-compiled openssl from DigitalNote-deps: + # Need mingw-compiled openssl from bitcoin-deps: cd $DEPSDIR - unzip -o $INDIR/DigitalNote-deps-win${BITS}-gitian.zip + unzip $INDIR/bitcoin-deps-win${BITS}-gitian-r10.zip # cd $BUILDDIR # - tar xf $INDIR/qt-everywhere-opensource-src-5.5.0.tar.xz - cd qt-everywhere-opensource-src-5.5.0 + tar xzf $INDIR/qt-everywhere-opensource-src-5.2.0.tar.gz + cd qt-everywhere-opensource-src-5.2.0 SPECNAME="win32-g++" SPECFILE="qtbase/mkspecs/${SPECNAME}/qmake.conf" - sed 's/qt_instdate=`date +%Y-%m-%d`/qt_instdate=2013-06-01/' -i qtbase/configure + sed 's/$TODAY/2011-01-30/' -i configure sed --posix "s|QMAKE_CFLAGS = -pipe -fno-keep-inline-dllexport|QMAKE_CFLAGS\t\t= -pipe -fno-keep-inline-dllexport -isystem /usr/$HOST/include/ -frandom-seed=qtbuild -I$DEPSDIR/include|" -i ${SPECFILE} sed --posix "s|QMAKE_LFLAGS =|QMAKE_LFLAGS\t\t= -L$DEPSDIR/lib|" -i ${SPECFILE} - # Before we tried to pass arguments to ar (static linking) in using QMAKE_LIB, however - # qt removes the arguments for ar and provides a script which makes it impossible to pass the determinism flag - - # so rather than try to replace ar, post-process all libraries and plugins at the end. - # + # ar adds timestamps to every object file included in the static library + # providing -D as ar argument is supposed to solve it, but doesn't work as qmake strips off the arguments and adds -M to pass a script... + # which somehow cannot be combined with other flags. + # use faketime only for ar, as it confuses make/qmake into hanging sometimes + sed --posix "s|QMAKE_LIB = \\\$\\\${CROSS_COMPILE}ar -ru|QMAKE_LIB\t\t= $HOME/ar -Dr|" -i ${SPECFILE} + echo '#!/bin/bash' > $HOME/ar + echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> $HOME/ar + echo "$HOST-ar \"\$@\"" >> $HOME/ar + chmod +x $HOME/ar # Don't load faketime while compiling Qt, qmake will get stuck in nearly infinite loops #export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 - #export FAKETIME=$REFERENCE_DATETIME + export FAKETIME=$REFERENCE_DATETIME # # Compile static libraries, and use statically linked openssl (-openssl-linked): - OPENSSL_LIBS="-L$DEPSDIR/lib -lssl -lcrypto -lgdi32" ./configure -prefix $INSTALLPREFIX -bindir $INSTALLPREFIX/host/bin -confirm-license -release -opensource -static -xplatform $SPECNAME -device-option CROSS_COMPILE="$HOST-" -no-audio-backend -no-sql-sqlite -no-sql-odbc -no-nis -no-cups -no-iconv -no-dbus -no-gif -no-opengl -no-compile-examples -no-feature-style-windowsce -no-feature-style-windowsmobile -no-qml-debug -openssl-linked -skip qtsvg -skip qtwebkit -skip qtwebkit-examples -skip qtserialport -skip qtdeclarative -skip qtmultimedia -skip qtimageformats -skip qtlocation -skip qtsensors -skip qtquick1 -skip qtquickcontrols -skip qtactiveqt -skip qtconnectivity -skip qtwinextras -skip qtxmlpatterns -skip qtscript -skip qtdoc -skip qtwebchannel -system-libpng -system-zlib + OPENSSL_LIBS="-L$DEPSDIR/lib -lssl -lcrypto -lgdi32" ./configure -prefix $INSTALLPREFIX -bindir $INSTALLPREFIX/host/bin -confirm-license -release -opensource -static -xplatform $SPECNAME -device-option CROSS_COMPILE="$HOST-" -no-audio-backend -no-javascript-jit -no-sql-sqlite -no-sql-odbc -no-nis -no-cups -no-iconv -no-dbus -no-gif -no-opengl -no-compile-examples -no-feature-style-windowsce -no-feature-style-windowsmobile -no-qml-debug -openssl-linked -skip qtsvg -skip qtwebkit -skip qtwebkit-examples -skip qtserialport -skip qtdeclarative -skip qtmultimedia -skip qtimageformats -skip qtlocation -skip qtsensors -skip qtquick1 -skip qtquickcontrols -skip qtactiveqt -skip qtconnectivity -skip qtwinextras -skip qtxmlpatterns -skip qtscript -skip qtdoc -system-libpng -system-zlib make $MAKEOPTS install - # post-process all generated libraries and plugins to be deterministic - # extract them to a temporary directory then re-build them deterministically - for LIB in $(find $INSTALLPREFIX -name *.a); do - rm -rf $TEMPDIR && mkdir $TEMPDIR && cd $TEMPDIR - $HOST-ar xv $LIB | cut -b5- > /tmp/list.txt - rm $LIB - $HOST-ar crsD $LIB $(cat /tmp/list.txt) - done # cd $INSTALLPREFIX - # Remove unused non-deterministic stuff - rm host/bin/qtpaths.exe lib/libQt5Bootstrap.a lib/libQt5Bootstrap.la # as zip stores file timestamps, use faketime to intercept stat calls to set dates for all files to reference date - export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1 - export FAKETIME=$REFERENCE_DATETIME - find -print0 | xargs -r0 touch # fix up timestamps before packaging - find | sort | zip -X@ $OUTDIR/qt-win${BITS}-5.5.0-gitian.zip + export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 + zip -r $OUTDIR/qt-win${BITS}-5.2.0-gitian-r1.zip * unset LD_PRELOAD unset FAKETIME done # for BITS in diff --git a/contrib/gitian-descriptors/qt-win32.yml b/contrib/gitian-descriptors/qt-win32.yml deleted file mode 100644 index e4976438..00000000 --- a/contrib/gitian-descriptors/qt-win32.yml +++ /dev/null @@ -1,57 +0,0 @@ ---- -name: "qt" -suites: -- "lucid" -architectures: -- "i386" -packages: -- "mingw32" -- "zip" -- "faketime" -- "unzip" -reference_datetime: "2011-01-30 00:00:00" -remotes: [] -files: -- "qt-everywhere-opensource-src-4.8.3.tar.gz" -- "bitcoin-deps-0.0.6.zip" -script: | - INSTDIR="$HOME/qt/" - mkdir $INSTDIR - mkdir -p $INSTDIR/host/bin - # - # Need mingw-compiled openssl from bitcoin-deps: - unzip bitcoin-deps-0.0.6.zip - DEPSDIR=`pwd` - # - tar xzf qt-everywhere-opensource-src-4.8.3.tar.gz - cd qt-everywhere-opensource-src-4.8.3 - sed 's/$TODAY/2011-01-30/' -i configure - sed 's/i686-pc-mingw32-/i586-mingw32msvc-/' -i mkspecs/unsupported/win32-g++-cross/qmake.conf - sed --posix 's|QMAKE_CFLAGS\t\t= -pipe|QMAKE_CFLAGS\t\t= -pipe -isystem /usr/i586-mingw32msvc/include/ -frandom-seed=qtbuild|' -i mkspecs/unsupported/win32-g++-cross/qmake.conf - sed 's/QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions -mthreads/QMAKE_CXXFLAGS_EXCEPTIONS_ON = -fexceptions/' -i mkspecs/unsupported/win32-g++-cross/qmake.conf - sed 's/QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads/QMAKE_LFLAGS_EXCEPTIONS_ON = -lmingwthrd/' -i mkspecs/unsupported/win32-g++-cross/qmake.conf - sed --posix 's/QMAKE_MOC\t\t= i586-mingw32msvc-moc/QMAKE_MOC\t\t= moc/' -i mkspecs/unsupported/win32-g++-cross/qmake.conf - sed --posix 's/QMAKE_RCC\t\t= i586-mingw32msvc-rcc/QMAKE_RCC\t\t= rcc/' -i mkspecs/unsupported/win32-g++-cross/qmake.conf - sed --posix 's/QMAKE_UIC\t\t= i586-mingw32msvc-uic/QMAKE_UIC\t\t= uic/' -i mkspecs/unsupported/win32-g++-cross/qmake.conf - # ar adds timestamps to every object file included in the static library - # providing -D as ar argument is supposed to solve it, but doesn't work as qmake strips off the arguments and adds -M to pass a script... - # which somehow cannot be combined with other flags. - # use faketime only for ar, as it confuses make/qmake into hanging sometimes - sed --posix "s|QMAKE_LIB\t\t= i586-mingw32msvc-ar -ru|QMAKE_LIB\t\t= $HOME/ar -Dr|" -i mkspecs/unsupported/win32-g++-cross/qmake.conf - echo '#!/bin/bash' > $HOME/ar - echo 'export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1' >> $HOME/ar - echo 'i586-mingw32msvc-ar "$@"' >> $HOME/ar - chmod +x $HOME/ar - #export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 - export FAKETIME=$REFERENCE_DATETIME - export TZ=UTC - # Compile static libraries, and use statically linked openssl (-openssl-linked): - OPENSSL_LIBS="-L$DEPSDIR/lib -lssl -lcrypto -lgdi32" ./configure -prefix $INSTDIR -bindir $INSTDIR/host/bin -I $DEPSDIR/include -confirm-license -release -opensource -static -no-qt3support -xplatform unsupported/win32-g++-cross -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend -no-declarative -no-script -no-scripttools -no-javascript-jit -no-webkit -no-svg -no-xmlpatterns -no-sql-sqlite -no-nis -no-cups -no-iconv -no-dbus -no-gif -no-libtiff -no-opengl -nomake examples -nomake demos -nomake docs -no-feature-style-plastique -no-feature-style-cleanlooks -no-feature-style-motif -no-feature-style-cde -no-feature-style-windowsce -no-feature-style-windowsmobile -no-feature-style-s60 -openssl-linked - find . -name *.prl | xargs -l sed 's|/\.||' -i - find . -name *.prl | xargs -l sed 's|/$||' -i - make $MAKEOPTS install - cd $INSTDIR - find . -name *.prl | xargs -l sed 's|/$||' -i - # as zip stores file timestamps, use faketime to intercept stat calls to set dates for all files to reference date - export LD_PRELOAD=/usr/lib/faketime/libfaketime.so.1 - zip -r $OUTDIR/qt-win32-4.8.3-gitian-r3.zip * \ No newline at end of file diff --git a/contrib/verifysfbinaries/verify.sh b/contrib/verifysfbinaries/verify.sh new file mode 100644 index 00000000..6ab0a964 --- /dev/null +++ b/contrib/verifysfbinaries/verify.sh @@ -0,0 +1,119 @@ +#!/bin/bash + +### This script attempts to download the signature file SHA256SUMS.asc from SourceForge +### 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 + +function clean_up { + for file in $* + do + rm "$file" 2> /dev/null + done +} + +WORKINGDIR="/tmp/bitcoin" +TMPFILE="hashes.tmp" + +#this URL is used if a version number is not specified as an argument to the script +SIGNATUREFILE="http://downloads.sourceforge.net/project/bitcoin/Bitcoin/bitcoin-0.9.0rc1/SHA256SUMS.asc" + +SIGNATUREFILENAME="SHA256SUMS.asc" +RCSUBDIR="test/" +BASEDIR="http://downloads.sourceforge.net/project/bitcoin/Bitcoin/" +VERSIONPREFIX="bitcoin-" +RCVERSIONSTRING="rc" + +if [ ! -d "$WORKINGDIR" ]; then + mkdir "$WORKINGDIR" +fi + +cd "$WORKINGDIR" + +#test if a version number has been passed as an argument +if [ -n "$1" ]; then + #let's also check if the version number includes the prefix 'bitcoin-', + # and add this prefix if it doesn't + if [[ $1 == "$VERSIONPREFIX"* ]]; then + VERSION="$1" + else + VERSION="$VERSIONPREFIX$1" + fi + + #now let's see if the version string contains "rc", and strip it off if it does + # and simultaneously add RCSUBDIR to BASEDIR, where we will look for SIGNATUREFILENAME + if [[ $VERSION == *"$RCVERSIONSTRING"* ]]; then + BASEDIR="$BASEDIR${VERSION/%-$RCVERSIONSTRING*}/" + BASEDIR="$BASEDIR$RCSUBDIR" + else + BASEDIR="$BASEDIR$VERSION/" + fi + + SIGNATUREFILE="$BASEDIR$SIGNATUREFILENAME" +else + BASEDIR="${SIGNATUREFILE%/*}/" +fi + +#first we fetch the file containing the signature +WGETOUT=$(wget -N "$BASEDIR$SIGNATUREFILENAME" 2>&1) + +#and then see if wget completed successfully +if [ $? -ne 0 ]; then + echo "Error: couldn't fetch signature file. Have you specified the version number in the following format?" + echo "[bitcoin-]-[rc[0-9]] (example: bitcoin-0.7.1-rc1)" + echo "wget output:" + echo "$WGETOUT"|sed 's/^/\t/g' + exit 2 +fi + +#then we check it +GPGOUT=$(gpg --yes --decrypt --output "$TMPFILE" "$SIGNATUREFILENAME" 2>&1) + +#return value 0: good signature +#return value 1: bad signature +#return value 2: gpg error + +RET="$?" +if [ $RET -ne 0 ]; then + if [ $RET -eq 1 ]; then + #and notify the user if it's bad + echo "Bad signature." + elif [ $RET -eq 2 ]; then + #or if a gpg error has occurred + echo "gpg error. Do you have Gavin's code signing key installed?" + fi + + echo "gpg output:" + echo "$GPGOUT"|sed 's/^/\t/g' + clean_up $SIGNATUREFILENAME $TMPFILE + exit "$RET" +fi + +#here we extract the filenames from the signature file +FILES=$(awk '{print $2}' "$TMPFILE") + +#and download these one by one +for file in in $FILES +do + wget --quiet -N "$BASEDIR$file" +done + +#check hashes +DIFF=$(diff <(sha256sum $FILES) "$TMPFILE") + +if [ $? -eq 1 ]; then + echo "Hashes don't match." + echo "Offending files:" + echo "$DIFF"|grep "^<"|awk '{print "\t"$3}' + exit 1 +elif [ $? -gt 1 ]; then + echo "Error executing 'diff'" + exit 2 +fi + +#everything matches! clean up the mess +clean_up $FILES $SIGNATUREFILENAME $TMPFILE + +exit 0 \ No newline at end of file diff --git a/doc/README_windows.txt b/doc/README_windows.txt new file mode 100644 index 00000000..5ee3df5b --- /dev/null +++ b/doc/README_windows.txt @@ -0,0 +1,18 @@ +DigitalNote 0.4.4 BETA + +Copyright (c) 2013 NovaCoin Developers +Copyright (c) 2011-2012 PPCoin Developers +Distributed under the MIT/X11 software license, see the accompanying +file license.txt or http://www.opensource.org/licenses/mit-license.php. +This product includes software developed by the OpenSSL Project for use in +the OpenSSL Toolkit (http://www.openssl.org/). This product includes +cryptographic software written by Eric Young (eay@cryptsoft.com). + + +Intro +----- +DigitalNote is a free open source project derived from DigitalNote, with +the goal of providing a long-term energy-efficient scrypt-based crypto-currency. +Built on the foundation of DigitalNote, PPCoin and NovaCoin, innovations such as proof-of-stake +help further advance the field of crypto-currency. + diff --git a/doc/release-process.md b/doc/release-process.md new file mode 100644 index 00000000..03ba8de7 --- /dev/null +++ b/doc/release-process.md @@ -0,0 +1,190 @@ +Release Process +==================== + +* update translations (ping wumpus, Diapolo or tcatm on IRC) +* see https://github.com/bitcoin/bitcoin/blob/master/doc/translation_process.md#syncing-with-transifex + +* * * + +###update (commit) version in sources + + + bitcoin-qt.pro + contrib/verifysfbinaries/verify.sh + doc/README* + share/setup.nsi + src/clientversion.h (change CLIENT_VERSION_IS_RELEASE to true) + +###tag version in git + + git tag -s v(new version, e.g. 0.8.0) + +###write release notes. git shortlog helps a lot, for example: + + git shortlog --no-merges v(current version, e.g. 0.7.2)..v(new version, e.g. 0.8.0) + +* * * + +##perform gitian builds + + From a directory containing the bitcoin source, gitian-builder and gitian.sigs + + export SIGNER=(your gitian key, ie bluematt, sipa, etc) + export VERSION=(new version, e.g. 0.8.0) + pushd ./bitcoin + git checkout v${VERSION} + popd + pushd ./gitian-builder + + Fetch and build inputs: (first time, or when dependency versions change) + + mkdir -p inputs; cd inputs/ + wget 'http://miniupnp.free.fr/files/download.php?file=miniupnpc-1.8.tar.gz' -O miniupnpc-1.8.tar.gz + wget 'https://www.openssl.org/source/openssl-1.0.1e.tar.gz' + wget 'http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz' + wget 'http://zlib.net/zlib-1.2.8.tar.gz' + wget 'ftp://ftp.simplesystems.org/pub/png/src/libpng16/libpng-1.6.8.tar.gz' + wget 'https://fukuchi.org/works/qrencode/qrencode-3.4.3.tar.bz2' + wget 'https://downloads.sourceforge.net/project/boost/boost/1.55.0/boost_1_55_0.tar.bz2' + wget 'https://svn.boost.org/trac/boost/raw-attachment/ticket/7262/boost-mingw.patch' -O \ + boost-mingw-gas-cross-compile-2013-03-03.patch + wget 'https://download.qt-project.org/official_releases/qt/5.2/5.2.0/single/qt-everywhere-opensource-src-5.2.0.tar.gz' + wget 'https://protobuf.googlecode.com/files/protobuf-2.5.0.tar.bz2' + cd .. + ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/boost-linux.yml + mv build/out/boost-*.zip inputs/ + ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/deps-linux.yml + mv build/out/bitcoin-deps-*.zip inputs/ + ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/boost-win.yml + mv build/out/boost-*.zip inputs/ + ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/deps-win.yml + mv build/out/bitcoin-deps-*.zip inputs/ + ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/qt-win.yml + mv build/out/qt-*.zip inputs/ + ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/protobuf-win.yml + mv build/out/protobuf-*.zip inputs/ + + Build bitcoind and bitcoin-qt on Linux32, Linux64, and Win32: + + ./bin/gbuild --commit bitcoin=v${VERSION} ../bitcoin/contrib/gitian-descriptors/gitian-linux.yml + ./bin/gsign --signer $SIGNER --release ${VERSION} --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-linux.yml + pushd build/out + zip -r bitcoin-${VERSION}-linux-gitian.zip * + mv bitcoin-${VERSION}-linux-gitian.zip ../../../ + popd + ./bin/gbuild --commit bitcoin=v${VERSION} ../bitcoin/contrib/gitian-descriptors/gitian-win.yml + ./bin/gsign --signer $SIGNER --release ${VERSION}-win --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-win.yml + pushd build/out + zip -r bitcoin-${VERSION}-win-gitian.zip * + mv bitcoin-${VERSION}-win-gitian.zip ../../../ + popd + popd + + Build output expected: + + 1. linux 32-bit and 64-bit binaries + source (bitcoin-${VERSION}-linux-gitian.zip) + 2. windows 32-bit and 64-bit binaries + installer + source (bitcoin-${VERSION}-win-gitian.zip) + 3. Gitian signatures (in gitian.sigs/${VERSION}[-win]/(your gitian key)/ + +repackage gitian builds for release as stand-alone zip/tar/installer exe + +**Linux .tar.gz:** + + unzip bitcoin-${VERSION}-linux-gitian.zip -d bitcoin-${VERSION}-linux + tar czvf bitcoin-${VERSION}-linux.tar.gz bitcoin-${VERSION}-linux + rm -rf bitcoin-${VERSION}-linux + +**Windows .zip and setup.exe:** + + unzip bitcoin-${VERSION}-win-gitian.zip -d bitcoin-${VERSION}-win + mv bitcoin-${VERSION}-win/bitcoin-*-setup.exe . + zip -r bitcoin-${VERSION}-win.zip bitcoin-${VERSION}-win + rm -rf bitcoin-${VERSION}-win + +**Perform Mac build:** + + OSX binaries are created by Gavin Andresen on a 32-bit, OSX 10.6 machine. + + qmake RELEASE=1 USE_UPNP=1 USE_QRCODE=1 bitcoin-qt.pro + make + export QTDIR=/opt/local/share/qt4 # needed to find translations/qt_*.qm files + T=$(contrib/qt_translations.py $QTDIR/translations src/qt/locale) + python2.7 share/qt/clean_mac_info_plist.py + python2.7 contrib/macdeploy/macdeployqtplus Bitcoin-Qt.app -add-qt-tr $T -dmg -fancy contrib/macdeploy/fancy.plist + + Build output expected: Bitcoin-Qt.dmg + +###Next steps: + +* Code-sign Windows -setup.exe (in a Windows virtual machine) and + OSX Bitcoin-Qt.app (Note: only Gavin has the code-signing keys currently) + +* upload builds to SourceForge + +* create SHA256SUMS for builds, and PGP-sign it + +* update bitcoin.org version + make sure all OS download links go to the right versions + +* update download sizes on bitcoin.org/_templates/download.html + +* update forum version + +* update wiki download links + +* update wiki changelog: [https://en.bitcoin.it/wiki/Changelog](https://en.bitcoin.it/wiki/Changelog) + +Commit your signature to gitian.sigs: + + pushd gitian.sigs + git add ${VERSION}/${SIGNER} + git add ${VERSION}-win/${SIGNER} + git commit -a + git push # Assuming you can push to the gitian.sigs tree + popd + +------------------------------------------------------------------------- + +### After 3 or more people have gitian-built, repackage gitian-signed zips: + +From a directory containing bitcoin source, gitian.sigs and gitian zips + + export VERSION=(new version, e.g. 0.8.0) + mkdir bitcoin-${VERSION}-linux-gitian + pushd bitcoin-${VERSION}-linux-gitian + unzip ../bitcoin-${VERSION}-linux-gitian.zip + mkdir gitian + cp ../bitcoin/contrib/gitian-downloader/*.pgp ./gitian/ + for signer in $(ls ../gitian.sigs/${VERSION}/); do + cp ../gitian.sigs/${VERSION}/${signer}/bitcoin-build.assert ./gitian/${signer}-build.assert + cp ../gitian.sigs/${VERSION}/${signer}/bitcoin-build.assert.sig ./gitian/${signer}-build.assert.sig + done + zip -r bitcoin-${VERSION}-linux-gitian.zip * + cp bitcoin-${VERSION}-linux-gitian.zip ../ + popd + mkdir bitcoin-${VERSION}-win-gitian + pushd bitcoin-${VERSION}-win-gitian + unzip ../bitcoin-${VERSION}-win-gitian.zip + mkdir gitian + cp ../bitcoin/contrib/gitian-downloader/*.pgp ./gitian/ + for signer in $(ls ../gitian.sigs/${VERSION}-win/); do + cp ../gitian.sigs/${VERSION}-win/${signer}/bitcoin-build.assert ./gitian/${signer}-build.assert + cp ../gitian.sigs/${VERSION}-win/${signer}/bitcoin-build.assert.sig ./gitian/${signer}-build.assert.sig + done + zip -r bitcoin-${VERSION}-win-gitian.zip * + cp bitcoin-${VERSION}-win-gitian.zip ../ + popd + +- Upload gitian zips to SourceForge + +- Announce the release: + + - Add the release to bitcoin.org: https://github.com/bitcoin/bitcoin.org/tree/master/_releases + + - Release sticky on bitcointalk: https://bitcointalk.org/index.php?board=1.0 + + - Bitcoin-development mailing list + + - Optionally reddit /r/Bitcoin, ... + +- Celebrate diff --git a/doc/release-process.txt b/doc/release-process.txt deleted file mode 100644 index e161c7b5..00000000 --- a/doc/release-process.txt +++ /dev/null @@ -1,142 +0,0 @@ -* update translations (ping tcatm on IRC for now) - -* update (commit) version in sources - bitcoin-qt.pro - src/clientversion.h (change CLIENT_VERSION_IS_RELEASE to true) - share/setup.nsi - doc/README* - -* tag version in git - - git tag -a v0.5.1 - -* write release notes. git shortlog helps a lot: - - git shortlog --no-merges v0.5.0.. - -* perform gitian builds - - * From a directory containing the bitcoin source, gitian-builder and gitian.sigs - export SIGNER=(your gitian key, ie bluematt, sipa, etc) - export VERSION=0.5.1 - cd ./gitian-builder - - * Fetch and build inputs: - mkdir -p inputs; cd inputs/ - wget 'http://miniupnp.free.fr/files/download.php?file=miniupnpc-1.6.tar.gz' -O miniupnpc-1.6.tar.gz - wget 'http://www.openssl.org/source/openssl-1.0.1b.tar.gz' - wget 'http://download.oracle.com/berkeley-db/db-4.8.30.NC.tar.gz' - wget 'http://zlib.net/zlib-1.2.6.tar.gz' - wget 'ftp://ftp.simplesystems.org/pub/libpng/png/src/libpng-1.5.9.tar.gz' - wget 'http://fukuchi.org/works/qrencode/qrencode-3.2.0.tar.bz2' - wget 'http://downloads.sourceforge.net/project/boost/boost/1.47.0/boost_1_47_0.tar.bz2' - wget 'http://download.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.7.4.tar.gz' - cd .. - ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/boost-win32.yml - cp build/out/boost-win32-1.47.0-gitian.zip inputs/ - ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/qt-win32.yml - cp build/out/qt-win32-4.7.4-gitian.zip inputs/ - ./bin/gbuild ../bitcoin/contrib/gitian-descriptors/deps-win32.yml - cp build/out/bitcoin-deps-0.0.3.zip inputs/ - - * Build bitcoind and bitcoin-qt on Linux32, Linux64, and Win32: - ./bin/gbuild --commit bitcoin=v${VERSION} ../bitcoin/contrib/gitian-descriptors/gitian.yml - ./bin/gsign --signer $SIGNER --release ${VERSION} --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian.yml - pushd build/out - zip -r bitcoin-${VERSION}-linux-gitian.zip * - mv bitcoin-${VERSION}-linux-gitian.zip ../../ - popd - ./bin/gbuild --commit bitcoin=v${VERSION} ../bitcoin/contrib/gitian-descriptors/gitian-win32.yml - ./bin/gsign --signer $SIGNER --release ${VERSION}-win32 --destination ../gitian.sigs/ ../bitcoin/contrib/gitian-descriptors/gitian-win32.yml - pushd build/out - zip -r bitcoin-${VERSION}-win32-gitian.zip * - mv bitcoin-${VERSION}-win32-gitian.zip ../../ - popd - - Build output expected: - 1. linux 32-bit and 64-bit binaries + source (bitcoin-${VERSION}-linux-gitian.zip) - 2. windows 32-bit binary, installer + source (bitcoin-${VERSION}-win32-gitian.zip) - 3. Gitian signatures (in gitian.sigs/${VERSION}[-win32]/(your gitian key)/ - -* repackage gitian builds for release as stand-alone zip/tar/installer exe - - * Linux .tar.gz: - unzip bitcoin-${VERSION}-linux-gitian.zip -d bitcoin-${VERSION}-linux - tar czvf bitcoin-${VERSION}-linux.tar.gz bitcoin-${VERSION}-linux - rm -rf bitcoin-${VERSION}-linux - - * Windows .zip and setup.exe: - unzip bitcoin-${VERSION}-win32-gitian.zip -d bitcoin-${VERSION}-win32 - mv bitcoin-${VERSION}-win32/bitcoin-*-setup.exe . - zip -r bitcoin-${VERSION}-win32.zip bitcoin-${VERSION}-win32 - rm -rf bitcoin-${VERSION}-win32 - -* perform Mac build - See this blog post for how Gavin set up his build environment to build the OSX - release; note that a patched version of macdeployqt is not needed anymore, as - the required functionality and fixes are implemented directly in macdeployqtplus: - http://gavintech.blogspot.com/2011/11/deploying-bitcoin-qt-on-osx.html - Gavin also had trouble with the macports py27-appscript package; he - ended up installing a version that worked with: /usr/bin/easy_install-2.7 appscript - - qmake RELEASE=1 USE_UPNP=1 USE_QRCODE=1 bitcoin-qt.pro - make - export QTDIR=/opt/local/share/qt4 # needed to find translations/qt_*.qm files - T=$(contrib/qt_translations.py $QTDIR/translations src/qt/locale) - python2.7 contrib/macdeploy/macdeployqtplus DigitalNote-Qt.app -add-qt-tr $T -dmg -fancy contrib/macdeploy/fancy.plist - - Build output expected: - DigitalNote-Qt.dmg - -* upload builds to SourceForge - -* create SHA256SUMS for builds, and PGP-sign it - -* update bitcoin.org version - -* update forum version - -* update wiki download links - -* update wiki changelog: https://en.bitcoin.it/wiki/Changelog - -* Commit your signature to gitian.sigs: - pushd gitian.sigs - git add ${VERSION}/${SIGNER} - git add ${VERSION}-win32/${SIGNER} - git commit -a - git push # Assuming you can push to the gitian.sigs tree - popd - -------------------------------------------------------------------------- - -* After 3 or more people have gitian-built, repackage gitian-signed zips: - - * From a directory containing bitcoin source, gitian.sigs and gitian zips - export VERSION=0.5.1 - mkdir bitcoin-${VERSION}-linux-gitian - pushd bitcoin-${VERSION}-linux-gitian - unzip ../bitcoin-${VERSION}-linux-gitian.zip - mkdir gitian - cp ../bitcoin/contrib/gitian-downloader/*.pgp ./gitian/ - for signer in $(ls ../gitian.sigs/${VERSION}/); do - cp ../gitian.sigs/${VERSION}/${signer}/bitcoin-build.assert ./gitian/${signer}-build.assert - cp ../gitian.sigs/${VERSION}/${signer}/bitcoin-build.assert.sig ./gitian/${signer}-build.assert.sig - done - zip -r bitcoin-${VERSION}-linux-gitian.zip * - cp bitcoin-${VERSION}-linux-gitian.zip ../ - popd - mkdir bitcoin-${VERSION}-win32-gitian - pushd bitcoin-${VERSION}-win32-gitian - unzip ../bitcoin-${VERSION}-win32-gitian.zip - mkdir gitian - cp ../bitcoin/contrib/gitian-downloader/*.pgp ./gitian/ - for signer in $(ls ../gitian.sigs/${VERSION}-win32/); do - cp ../gitian.sigs/${VERSION}-win32/${signer}/bitcoin-build.assert ./gitian/${signer}-build.assert - cp ../gitian.sigs/${VERSION}-win32/${signer}/bitcoin-build.assert.sig ./gitian/${signer}-build.assert.sig - done - zip -r bitcoin-${VERSION}-win32-gitian.zip * - cp bitcoin-${VERSION}-win32-gitian.zip ../ - popd - - * Upload gitian zips to SourceForge diff --git a/libtool b/libtool new file mode 100755 index 00000000..729ff11a --- /dev/null +++ b/libtool @@ -0,0 +1,11805 @@ +#! /bin/sh +# Generated automatically by config.status (bitcoin) 1.0.3 +# Libtool was configured on host buddillalappy.local: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +# The names of the tagged configurations supported by this script. +available_tags='CXX ' + +# Configured defaults for sys_lib_dlsearch_path munging. +: ${LT_SYS_LIBRARY_PATH=""} + +# ### BEGIN LIBTOOL CONFIG + +# Which release of libtool.m4 was used? +macro_version=2.4.6 +macro_revision=2.4.6 + +# Whether or not to build shared libraries. +build_libtool_libs=no + +# Whether or not to build static libraries. +build_old_libs=yes + +# What type of objects to build. +pic_mode=default + +# Whether or not to optimize for fast installation. +fast_install=needless + +# Shared archive member basename,for filename based shared library versioning on AIX. +shared_archive_member_spec= + +# Shell to use when invoking shell scripts. +SHELL="/bin/sh" + +# An echo program that protects backslashes. +ECHO="printf %s\\n" + +# The PATH separator for the build system. +PATH_SEPARATOR=":" + +# The host system. +host_alias= +host=x86_64-apple-darwin19.6.0 +host_os=darwin19.6.0 + +# The build system. +build_alias= +build=x86_64-apple-darwin19.6.0 +build_os=darwin19.6.0 + +# A sed program that does not truncate output. +SED="/usr/local/bin/gsed" + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e 1s/^X//" + +# A grep program that handles long lines. +GREP="/usr/local/bin/ggrep" + +# An ERE matcher. +EGREP="/usr/local/bin/ggrep -E" + +# A literal string matcher. +FGREP="/usr/local/bin/ggrep -F" + +# A BSD- or MS-compatible name lister. +NM="/usr/bin/nm -B" + +# Whether we need soft or hard links. +LN_S="ln -s" + +# What is the maximum length of a command? +max_cmd_len=196608 + +# Object file suffix (normally "o"). +objext=o + +# Executable file suffix (normally ""). +exeext= + +# whether the shell understands "unset". +lt_unset=unset + +# turn spaces into newlines. +SP2NL="tr \\040 \\012" + +# turn newlines into spaces. +NL2SP="tr \\015\\012 \\040\\040" + +# convert $build file names to $host format. +to_host_file_cmd=func_convert_file_noop + +# convert $build files to toolchain format. +to_tool_file_cmd=func_convert_file_noop + +# An object symbol dumper. +OBJDUMP="objdump" + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method="pass_all" + +# Command to use when deplibs_check_method = "file_magic". +file_magic_cmd="\$MAGIC_CMD" + +# How to find potential files when deplibs_check_method = "file_magic". +file_magic_glob="" + +# Find potential files using nocaseglob when deplibs_check_method = "file_magic". +want_nocaseglob="no" + +# DLL creation program. +DLLTOOL="false" + +# Command to associate shared and link libraries. +sharedlib_from_linklib_cmd="printf %s\\n" + +# The archiver. +AR="/usr/bin/ar" + +# Flags to create an archive. +AR_FLAGS="cru" + +# How to feed a file listing to the archiver. +archiver_list_spec="" + +# A symbol stripping program. +STRIP="/usr/bin/strip" + +# Commands used to install an old-style archive. +RANLIB="/usr/bin/ranlib" +old_postinstall_cmds="chmod 644 \$oldlib~\$RANLIB \$tool_oldlib" +old_postuninstall_cmds="" + +# Whether to use a lock for old archive extraction. +lock_old_archive_extraction=yes + +# A C compiler. +LTCC="/usr/local/bin/ccache gcc" + +# LTCC compiler flags. +LTCFLAGS="-g -O2" + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([BCDEGRST][BCDEGRST]*\\)[ ][ ]*_\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 _\\2 \\2/p' | sed '/ __gnu_lto/d'" + +# Transform the output of nm in a proper C declaration. +global_symbol_to_cdecl="sed -n -e 's/^T .* \\(.*\\)\$/extern int \\1();/p' -e 's/^[BCDEGRST][BCDEGRST]* .* \\(.*\\)\$/extern char \\1;/p'" + +# Transform the output of nm into a list of symbols to manually relocate. +global_symbol_to_import="" + +# Transform the output of nm in a C name address pair. +global_symbol_to_c_name_address="sed -n -e 's/^: \\(.*\\) .*\$/ {\"\\1\", (void *) 0},/p' -e 's/^[BCDEGRST][BCDEGRST]* .* \\(.*\\)\$/ {\"\\1\", (void *) \\&\\1},/p'" + +# Transform the output of nm in a C name address pair when lib prefix is needed. +global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \\(.*\\) .*\$/ {\"\\1\", (void *) 0},/p' -e 's/^[BCDEGRST][BCDEGRST]* .* \\(lib.*\\)\$/ {\"\\1\", (void *) \\&\\1},/p' -e 's/^[BCDEGRST][BCDEGRST]* .* \\(.*\\)\$/ {\"lib\\1\", (void *) \\&\\1},/p'" + +# The name lister interface. +nm_interface="BSD nm" + +# Specify filename containing input files for $NM. +nm_file_list_spec="@" + +# The root where to search for dependent libraries,and where our libraries should be installed. +lt_sysroot= + +# Command to truncate a binary pipe. +lt_truncate_bin="/bin/dd bs=4096 count=1" + +# The name of the directory that contains temporary libtool files. +objdir=.libs + +# Used to examine libraries when file_magic_cmd begins with "file". +MAGIC_CMD=file + +# Must we lock files when doing compilation? +need_locks="no" + +# Manifest tool. +MANIFEST_TOOL=":" + +# Tool to manipulate archived DWARF debug symbol files on Mac OS X. +DSYMUTIL="dsymutil" + +# Tool to change global to local symbols on Mac OS X. +NMEDIT="nmedit" + +# Tool to manipulate fat objects and archives on Mac OS X. +LIPO="lipo" + +# ldd/readelf like tool for Mach-O binaries on Mac OS X. +OTOOL="otool" + +# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4. +OTOOL64=":" + +# Old archive suffix (normally "a"). +libext=a + +# Shared library suffix (normally ".so"). +shrext_cmds="\`test .\$module = .yes && echo .so || echo .dylib\`" + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds="" + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at link time. +variables_saved_for_relink="PATH DYLD_LIBRARY_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + +# Do we need the "lib" prefix for modules? +need_lib_prefix=no + +# Do we need a version for libraries? +need_version=no + +# Library versioning type. +version_type=darwin + +# Shared library runtime path variable. +runpath_var= + +# Shared library path variable. +shlibpath_var=DYLD_LIBRARY_PATH + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=yes + +# Format of library name prefix. +libname_spec="lib\$name" + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME +library_names_spec="\$libname\$release\$major\$shared_ext \$libname\$shared_ext" + +# The coded name of the library, if different from the real name. +soname_spec="\$libname\$release\$major\$shared_ext" + +# Permission mode override for installation of shared libraries. +install_override_mode="" + +# Command to use after installation of a shared archive. +postinstall_cmds="" + +# Command to use after uninstallation of a shared archive. +postuninstall_cmds="" + +# Commands used to finish a libtool library installation in a directory. +finish_cmds="" + +# As "finish_cmds", except a single script fragment to be evaled but +# not shown. +finish_eval="" + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=no + +# Compile-time system search path for libraries. +sys_lib_search_path_spec="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/12.0.0 /usr/local/lib" + +# Detected run-time system search path for libraries. +sys_lib_dlsearch_path_spec="/usr/local/lib /lib /usr/lib" + +# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. +configure_time_lt_sys_library_path="" + +# Whether dlopen is supported. +dlopen_support=unknown + +# Whether dlopen of programs is supported. +dlopen_self=unknown + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=unknown + +# Commands to strip libraries. +old_striplib="strip -S" +striplib="strip -x" + + +# The linker used to build libraries. +LD="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LTCC \$LTCFLAGS -nostdlib \$wl-r -o \$output\$reload_objs" + +# Commands used to build an old-style archive. +old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$tool_oldlib" + +# A language specific compiler. +CC="gcc" + +# Is the compiler the GNU compiler? +with_gcc=yes + +# Compiler flag to turn off builtin functions. +no_builtin_flag=" -fno-builtin -fno-rtti -fno-exceptions" + +# Additional compiler flags for building library objects. +pic_flag=" -fno-common -DPIC" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Compiler flag to prevent dynamic linking. +link_static_flag="" + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=no + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=no + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="\`for conv in \$convenience\\\"\\\"; do test -n \\\"\$conv\\\" && new_convenience=\\\"\$new_convenience \$wl-force_load,\$conv\\\"; done; func_echo_all \\\"\$new_convenience\\\"\`" + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object="no" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds="" + +# Commands used to build a shared archive. +archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring \$single_module" +archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring \$single_module \$wl-exported_symbols_list,\$output_objdir/\$libname-symbols.expsym" + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags" +module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags \$wl-exported_symbols_list,\$output_objdir/\$libname-symbols.expsym" + +# Whether we are building with GNU ld or not. +with_gnu_ld="no" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="\$wl-undefined \${wl}dynamic_lookup" + +# Flag that enforces no undefined symbols. +no_undefined_flag="" + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist +hardcode_libdir_flag_spec="" + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator="" + +# Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=no + +# Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting $shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=no + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=no + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=unsupported + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=yes + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=no + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=yes + +# Set to "yes" if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*" + +# Symbols that must always be exported. +include_expsyms="" + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds="" + +# Commands necessary for finishing linking programs. +postlink_cmds="" + +# Specify filename containing input files. +file_list_spec="" + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs="" + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects="" +postdep_objects="" +predeps="" +postdeps="" + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path="" + +# ### END LIBTOOL CONFIG + + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x$2 in + x) + ;; + *:) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" + ;; + x:*) + eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" + ;; + *) + eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" + ;; + esac +} + + +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in $*""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} + + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +#! /bin/sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2014-01-03.01 + +# libtool (GNU libtool) 2.4.6 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.4.6 +package_revision=2.4.6 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2015-01-20.17; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# Copyright (C) 2004-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# As a special exception to the GNU General Public License, if you distribute +# this file as part of a program or library that is built using GNU Libtool, +# you may include this file under the same distribution terms that you use +# for the rest of that program. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac +fi + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1+=\\ \$func_quote_for_eval_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1=\$$1\\ \$func_quote_for_eval_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: +# i) func_quote_for_eval_result +# double-quoted, suitable for a subsequent eval +# ii) func_quote_for_eval_unquoted_result +# has all characters that are still active within double +# quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + func_quote_for_eval_unquoted_result= + func_quote_for_eval_result= + while test 0 -lt $#; do + case $1 in + *[\\\`\"\$]*) + _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; + *) + _G_unquoted_arg=$1 ;; + esac + if test -n "$func_quote_for_eval_unquoted_result"; then + func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" + else + func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + fi + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg=\"$_G_unquoted_arg\" + ;; + *) + _G_quoted_arg=$_G_unquoted_arg + ;; + esac + + if test -n "$func_quote_for_eval_result"; then + func_append func_quote_for_eval_result " $_G_quoted_arg" + else + func_append func_quote_for_eval_result "$_G_quoted_arg" + fi + shift + done +} + + +# func_quote_for_expand ARG +# ------------------------- +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + $debug_cmd + + case $1 in + *[\\\`\"]*) + _G_arg=`$ECHO "$1" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; + *) + _G_arg=$1 ;; + esac + + case $_G_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_arg=\"$_G_arg\" + ;; + esac + + func_quote_for_expand_result=$_G_arg +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_for_expand "$_G_cmd" + eval "func_notquiet $func_quote_for_expand_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_for_expand "$_G_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Set a version string for this script. +scriptversion=2014-01-07.03; # UTC + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + eval $_G_hook '"$@"' + + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + done + + func_quote_for_eval ${1+"$@"} + func_run_hooks_result=$func_quote_for_eval_result +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, remove any +# options that you action, and then pass back the remaining unprocessed +# options in '_result', escaped suitably for +# 'eval'. Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# +# func_quote_for_eval ${1+"$@"} +# my_options_prep_result=$func_quote_for_eval_result +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# ;; +# *) set dummy "$_G_opt" "$*"; shift; break ;; +# esac +# done +# +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# +# func_quote_for_eval ${1+"$@"} +# my_option_validation_result=$func_quote_for_eval_result +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll alse need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + func_options_prep ${1+"$@"} + eval func_parse_options \ + ${func_options_prep_result+"$func_options_prep_result"} + eval func_validate_options \ + ${func_parse_options_result+"$func_parse_options_result"} + + eval func_run_hooks func_options \ + ${func_validate_options_result+"$func_validate_options_result"} + + # save modified positional parameters for caller + func_options_result=$func_run_hooks_result +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propogate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before +# returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + func_parse_options_result= + + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + + # Adjust func_parse_options positional parameters to match + eval set dummy "$func_run_hooks_result"; shift + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + test $# = 0 && func_missing_arg $_G_opt && break + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + func_run_hooks func_validate_options ${1+"$@"} + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs= + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + } + /^warranty; /q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.4.6' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --mode=MODE use operation mode MODE + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname (GNU libtool) 2.4.6 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func__fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." +} + + +# func_config +# ----------- +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + + +# func_features +# ------------- +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + + +# func_enable_tag TAGNAME +# ----------------------- +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname=$1 + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + + +# func_check_version_match +# ------------------------ +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Pass back the list of options. + func_quote_for_eval ${1+"$@"} + libtool_options_prep_result=$func_quote_for_eval_result +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + libtool_parse_options_result=$func_quote_for_eval_result +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + case $host in + # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 + # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote_for_eval ${1+"$@"} + libtool_validate_options_result=$func_quote_for_eval_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if 'file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case $lalib_p_line in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test yes = "$lalib_p" +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# 'FILE.' does not work on cygwin managed mounts. +func_source () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with '--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # Get the compilation command and the source file. + base_compile= + srcfile=$nonopt # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg=$arg + arg_mode=normal + ;; + + target ) + libobj=$arg + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify '-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs=$IFS; IFS=, + for arg in $args; do + IFS=$save_ifs + func_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg=$srcfile + srcfile=$arg + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with '-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj=$func_basename_result + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from '$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name '$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test yes = "$build_old_libs"; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test yes = "$need_locks"; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test warn = "$need_locks"; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a 'standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix '.c' with the +library object suffix, '.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to '-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the '--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the 'install' or 'cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with '-') are ignored. + +Every other argument is treated as a filename. Files ending in '.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in '.la', then a libtool library is created, +only library objects ('.lo' files) may be specified, and '-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created +using 'ar' and 'ranlib', or on Windows using 'lib'. + +If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # The first argument is the command name. + cmd=$nonopt + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "'$file' was not linked with '-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir=$func_dirname_result + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir=$func_dirname_result + ;; + + *) + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir=$absdir + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic=$magic + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file=$progdir/$program + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file=$progdir/$program + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if $opt_dry_run; then + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + else + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd=\$cmd$args + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the '-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the '$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the '$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the '$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the '$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir=$func_dirname_result + destname=$func_basename_result + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "'$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "'$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking '$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname=$1 + shift + + srcname=$realname + test -n "$relink_command" && srcname=${realname}T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try 'ln -sf' first, because the 'ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib=$destdir/$realname + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name=$func_basename_result + instname=$dir/${name}i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest=$destfile + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to '$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test yes = "$build_old_libs"; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext= + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=.exe + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script '$wrapper'" + + finalize=: + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink '$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file=$outputname + else + func_warning "cannot relink '$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name=$func_basename_result + + # Set up the ranlib parameters. + oldlib=$destdir/$name + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run '$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test install = "$opt_mode" && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms=${my_outputname}S.c + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist=$output_objdir/$my_outputname.nm + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols=$output_objdir/$outputname.exp + $opt_dry_run || { + $RM $export_symbols + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from '$dlprefile'" + func_basename "$dlprefile" + name=$func_basename_result + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' + + # Transform the symbol file into the correct name. + symfileobj=$output_objdir/${my_outputname}S.$objext + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for '$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + win32_libid_type=unknown + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $debug_cmd + + my_gentop=$1; shift + my_oldlibs=${1+"$@"} + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib=$func_basename_result + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches; do + func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" + $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" + cd "unfat-$$/$darwin_base_archive-$darwin_arch" + func_extract_an_archive "`pwd`" "$darwin_base_archive" + cd "$darwin_curdir" + $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory where it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + \$ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#if defined PATH_MAX +# define LT_PATHMAX PATH_MAX +#elif defined MAXPATHLEN +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined HAVE_DOS_BASED_FILE_SYSTEM + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined HAVE_DOS_BASED_FILE_SYSTEM + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = (size_t) (q - p); + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + size_t orig_value_len = strlen (orig_value); + size_t add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # what system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll that has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module=$wl-single_module + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg=$1 + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols=$arg + test -f "$arg" \ + || func_fatal_error "symbol file '$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex=$arg + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + if test none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file '$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; + precious_regex) + precious_files_regex=$arg + prev= + continue + ;; + release) + release=-$arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg=$arg + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "'-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test X-export-symbols = "X$arg"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between '-L' and '$1'" + else + func_fatal_error "need path for '-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test X-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module=$wl-multi_module + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -os2dllname) + prev=os2dllname + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -stdlib=* select c++ std lib with clang + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the '$prevarg' option requires an argument" + + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname=$func_basename_result + libobjs_save=$libobjs + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + func_dirname "$output" "/" "" + output_objdir=$func_dirname_result$objdir + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test lib = "$linkmode"; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=false + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test lib,link = "$linkmode,$pass"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs=$tmp_deplibs + fi + + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; then + case $pass in + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test lib,dlpreopen = "$linkmode,$pass"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs=$dlprefiles + fi + if test dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib=$searchdir/lib$name$search_ext + if test -f "$lib"; then + if test .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll=$l + done + if test "X$ll" = "X$old_library"; then # only static version available + found=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test conv = "$pass" && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "'-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test link = "$pass"; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=false + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "'$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir=$func_dirname_result + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + elif test prog != "$linkmode" && test lib != "$linkmode"; then + func_fatal_error "'$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib=$l + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + + # This library was specified with -dlopen. + if test dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of '$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir=$ladir + fi + ;; + esac + func_basename "$lib" + laname=$func_basename_result + + # Find the relevant object directory and library name. + if test yes = "$installed"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir + else + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir + fi + test yes = "$hardcode_automatic" && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir=$ladir + absdir=$abs_ladir + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" + fi + case $host in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if $linkalldeplibs; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then + # Make sure the rpath contains only unique directories. + case $temp_rpath: in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc* | *os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule= + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule=$dlpremoduletest + break + fi + done + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test lib = "$linkmode" && + test yes = "$hardcode_into_libs"; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname=$1 + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname=$dlname + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc* | *os2*) + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + esac + eval soname=\"$soname_spec\" + else + soname=$realname + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot=$soname + func_basename "$soroot" + soname=$func_basename_result + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from '$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for '$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; then + add=$dir/$linklib + case $host in + *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; + *-*-sysv4*uw2*) add_dir=-L$dir ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir=-L$dir ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we cannot + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library"; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add=$dir/$old_library + fi + elif test -n "$old_library"; then + add=$dir/$old_library + fi + fi + esac + elif test no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test prog = "$linkmode"; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib"; then + add=$inst_prefix_dir$libdir/$linklib + else + add=$libdir/$linklib + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir=-L$libdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + fi + + if test prog = "$linkmode"; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test prog = "$linkmode"; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test unsupported != "$hardcode_direct"; then + test -n "$old_library" && linklib=$old_library + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system cannot link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test yes = "$module"; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs=$temp_deplibs + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test no != "$link_all_deplibs"; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path=$deplib ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names"; then + for tmp in $deplibrary_names; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl"; then + depdepl=$absdir/$objdir/$depdepl + darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" + path= + fi + fi + ;; + *) + path=-L$absdir/$objdir + ;; + esac + else + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "'$deplib' seems to be moved" + + path=-L$absdir + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test link = "$pass"; then + if test prog = "$linkmode"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=deplibs + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i= + ;; + esac + if test -n "$i"; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "'-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "'-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs=$output + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form 'libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test pass_all != "$deplibs_check_method"; then + func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; then + # Building a libtool convenience library. + # Some compilers have problems with a '.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "'-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs=$IFS; IFS=: + set dummy $vinfo 0 0 0 + shift + IFS=$save_ifs + + test -n "$7" && \ + func_fatal_help "too many parameters to '-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major=$1 + number_minor=$2 + number_revision=$3 + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|qnx|sunos) + current=$number_major + revision=$number_minor + age=0 + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_minor + lt_irix_increment=no + ;; + esac + ;; + no) + current=$1 + revision=$2 + age=$3 + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT '$current' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION '$revision' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE '$age' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE '$age' is greater than the current interface number '$current'" + func_fatal_error "'$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring=$verstring_prefix$major.$revision + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test 0 -ne "$loop"; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring_prefix$major.$iface:$verstring + done + + # Before this point, $major must not contain '.'. + major=.$major + versuffix=$major.$revision + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=.$current.$age.$revision + verstring=$current.$age.$revision + + # Add in all the interfaces that we are compatible with. + loop=$age + while test 0 -ne "$loop"; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring:$iface.0 + done + + # Make executables depend on our current version. + func_append verstring ":$current.0" + ;; + + qnx) + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + + *) + func_fatal_configuration "unknown library version type '$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring=0.0 + ;; + esac + if test no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles=$dlfiles + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles=$dlprefiles + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test yes = "$build_libtool_libs"; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test yes = "$build_libtool_need_lc"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release= + versuffix= + major= + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib=$potent_lib + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | $SED 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; + *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib=$potent_lib # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs= + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test none = "$deplibs_check_method"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test yes = "$droppeddeps"; then + if test yes = "$module"; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test no = "$allow_undefined"; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs=$new_libs + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath=$finalize_shlibpath + test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname=$1 + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname=$realname + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib=$output_objdir/$realname + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols=$output_objdir/$libname.uexp + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + func_dll_def_p "$export_symbols" || { + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols=$export_symbols + export_symbols= + always_export_symbols=yes + } + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs=$IFS; IFS='~' + for cmd1 in $cmds; do + IFS=$save_ifs + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test yes = "$try_normal_branch" \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=$output_objdir/$output_la.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS=$save_ifs + if test -n "$export_symbols_regex" && test : != "$skipped_export"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test : != "$skipped_export" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs=$tmp_deplibs + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test yes = "$compiler_needs_object" && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test : != "$skipped_export" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-$k.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test -z "$objlist" || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test 1 -eq "$k"; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-$k.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-$k.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + ${skipped_export-false} && { + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + } + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs=$IFS; IFS='~' + for cmd in $concat_cmds; do + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + ${skipped_export-false} && { + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + } + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs=$IFS; IFS='~' + for cmd in $cmds; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "'-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object '$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj=$output + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + else + gentop=$output_objdir/${obj}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects + + # Create the old-style object. + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs + + output=$obj + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + test yes = "$build_libtool_libs" || { + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + } + + if test -n "$pic_flag" || test default != "$pic_mode"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output=$libobj + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "'-release' is ignored for programs" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test CXX = "$tagname"; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs=$new_libs + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath=$rpath + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath=$rpath + + if test -n "$libobjs" && test yes = "$build_old_libs"; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command=$compile_command$compile_rpath + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.$objext"; then + func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' + fi + + exit $exit_status + } + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test yes = "$no_install"; then + # We don't need to create a wrapper script. + link_command=$compile_var$compile_command$compile_rpath + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + case $hardcode_action,$fast_install in + relink,*) + # Fast installation is not supported + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource=$output_path/$objdir/lt-$output_name.c + cwrapper=$output_path/$output_name.exe + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host"; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + if test -n "$addlibs"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase=$func_basename_result + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj"; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test -z "$oldobjs"; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test yes = "$build_old_libs" && old_library=$libname.$libext + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; then + if test -z "$install_libdir"; then + break + fi + output=$output_objdir/${outputname}i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name=$func_basename_result + func_resolve_sysroot "$deplib" + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs=$newdependency_libs + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles=$newdlprefiles + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles=$newdlprefiles + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test -n "$bindir"; then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result/$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test no,yes = "$installed,$need_relink"; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=: ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif $rmforce; then + continue + fi + + rmfiles=$file + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case $opt_mode in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && test none != "$pic_object"; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && test none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the $objdir's in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +test -z "$opt_mode" && { + help=$generic_help + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode '$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# where we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: + +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# The linker used to build libraries. +LD="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LTCC \$LTCFLAGS -nostdlib \$wl-r -o \$output\$reload_objs" + +# Commands used to build an old-style archive. +old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$tool_oldlib" + +# A language specific compiler. +CC="g++" + +# Is the compiler the GNU compiler? +with_gcc=yes + +# Compiler flag to turn off builtin functions. +no_builtin_flag=" -fno-builtin" + +# Additional compiler flags for building library objects. +pic_flag=" -fno-common -DPIC" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Compiler flag to prevent dynamic linking. +link_static_flag="" + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=no + +# Whether or not to disallow shared libs when runtime libs are static. +allow_libtool_libs_with_static_runtimes=no + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="\`for conv in \$convenience\\\"\\\"; do test -n \\\"\$conv\\\" && new_convenience=\\\"\$new_convenience \$wl-force_load,\$conv\\\"; done; func_echo_all \\\"\$new_convenience\\\"\`" + +# Whether the compiler copes with passing no objects directly. +compiler_needs_object="no" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds="" + +# Commands used to build a shared archive. +archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring \$single_module" +archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring \$single_module \$wl-exported_symbols_list,\$output_objdir/\$libname-symbols.expsym" + +# Commands used to build a loadable module if different from building +# a shared archive. +module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags" +module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags \$wl-exported_symbols_list,\$output_objdir/\$libname-symbols.expsym" + +# Whether we are building with GNU ld or not. +with_gnu_ld="no" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="\$wl-undefined \${wl}dynamic_lookup" + +# Flag that enforces no undefined symbols. +no_undefined_flag="" + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist +hardcode_libdir_flag_spec="" + +# Whether we need a single "-rpath" flag with a separated argument. +hardcode_libdir_separator="" + +# Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes +# DIR into the resulting binary. +hardcode_direct=no + +# Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes +# DIR into the resulting binary and the resulting library dependency is +# "absolute",i.e impossible to change by setting $shlibpath_var if the +# library is relocated. +hardcode_direct_absolute=no + +# Set to "yes" if using the -LDIR flag during linking hardcodes DIR +# into the resulting binary. +hardcode_minus_L=no + +# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR +# into the resulting binary. +hardcode_shlibpath_var=unsupported + +# Set to "yes" if building a shared library automatically hardcodes DIR +# into the library and all subsequent libraries and executables linked +# against it. +hardcode_automatic=yes + +# Set to yes if linker adds runtime paths of dependent libraries +# to runtime path list. +inherit_rpath=no + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=yes + +# Set to "yes" if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*" + +# Symbols that must always be exported. +include_expsyms="" + +# Commands necessary for linking programs (against libraries) with templates. +prelink_cmds="" + +# Commands necessary for finishing linking programs. +postlink_cmds="" + +# Specify filename containing input files. +file_list_spec="" + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# The directories searched by this compiler when creating a shared library. +compiler_lib_search_dirs="" + +# Dependencies to place before and after the objects being linked to +# create a shared library. +predep_objects="" +postdep_objects="" +predeps="" +postdeps="" + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path="" + +# ### END LIBTOOL TAG CONFIG: CXX diff --git a/qa/pull-tester/build-tests.sh.in b/qa/pull-tester/build-tests.sh.in index 26e1518d..bcfc791b 100644 --- a/qa/pull-tester/build-tests.sh.in +++ b/qa/pull-tester/build-tests.sh.in @@ -3,43 +3,74 @@ # Param2: Path to java comparison tool # Param3: Number of make jobs. Defaults to 1. +# Exit immediately if anything fails: set -e set -o xtrace MINGWPREFIX=$1 JAVA_COMPARISON_TOOL=$2 -JOBS=${3-1} +RUN_LARGE_REORGS=$3 +JOBS=${4-1} +OUT_DIR=${5-} if [ $# -lt 2 ]; then - echo "Usage: $0 [mingw-prefix] [java-comparison-tool] " + echo "Usage: $0 [mingw-prefix] [java-comparison-tool] " exit 1 fi DISTDIR=@PACKAGE@-@VERSION@ +# Cross-compile for windows first (breaking the mingw/windows build is most common) cd @abs_top_srcdir@ make distdir -mv $DISTDIR linux-build -cd linux-build -./configure --with-comparison-tool="$JAVA_COMPARISON_TOOL" +mv $DISTDIR win32-build +cd win32-build +./configure --disable-silent-rules --disable-ccache --prefix=$MINGWPREFIX --host=i586-mingw32msvc --with-qt-bindir=$MINGWPREFIX/host/bin --with-qt-plugindir=$MINGWPREFIX/plugins --with-qt-incdir=$MINGWPREFIX/include --with-boost=$MINGWPREFIX --with-protoc-bindir=$MINGWPREFIX/host/bin CPPFLAGS=-I$MINGWPREFIX/include LDFLAGS=-L$MINGWPREFIX/lib make -j$JOBS -make check -#Test code coverage +# And compile for Linux: cd @abs_top_srcdir@ make distdir -mv $DISTDIR linux-coverage-build -cd linux-coverage-build -./configure --enable-lcov --with-comparison-tool="$JAVA_COMPARISON_TOOL" +mv $DISTDIR linux-build +cd linux-build +if [ $RUN_LARGE_REORGS = 1 ]; then + ./configure --disable-silent-rules --disable-ccache --with-comparison-tool="$JAVA_COMPARISON_TOOL" --enable-comparison-tool-reorg-tests +else + ./configure --disable-silent-rules --disable-ccache --with-comparison-tool="$JAVA_COMPARISON_TOOL" +fi make -j$JOBS -make cov - -# win32 build disabled until pull-tester has updated dependencies -##Test win32 build -#cd @abs_top_srcdir@ -#make distdir -#mv $DISTDIR win32-build -#cd win32-build -#./configure --prefix=$MINGWPREFIX --host=i586-mingw32msvc --with-qt-bindir=$MINGWPREFIX/host/bin --with-qt-plugindir=$MINGWPREFIX/plugins --with-qt-incdir=$MINGWPREFIX/include --with-boost=$MINGWPREFIX --with-protoc-bindir=$MINGWPREFIX/host/bin --with-comparison-tool="$JAVA_COMPARISON_TOOL" CPPFLAGS=-I$MINGWPREFIX/include LDFLAGS=-L$MINGWPREFIX/lib -#make -j$JOBS -#make check \ No newline at end of file + +# link interesting binaries to parent out/ directory, if it exists. Do this before +# running unit tests (we want bad binaries to be easy to find) +if [ -d "$OUT_DIR" -a -w "$OUT_DIR" ]; then + set +e + # Windows: + cp @abs_top_srcdir@/win32-build/src/bitcoind.exe $OUT_DIR/bitcoind.exe + cp @abs_top_srcdir@/win32-build/src/test/test_bitcoin.exe $OUT_DIR/test_bitcoin.exe + cp @abs_top_srcdir@/win32-build/src/qt/bitcoind-qt.exe $OUT_DIR/bitcoin-qt.exe + # Linux: + cp @abs_top_srcdir@/linux-build/src/bitcoind $OUT_DIR/bitcoind + cp @abs_top_srcdir@/linux-build/src/test/test_bitcoin $OUT_DIR/test_bitcoin + cp @abs_top_srcdir@/linux-build/src/qt/bitcoind-qt $OUT_DIR/bitcoin-qt + set -e +fi + +# Run unit tests and blockchain-tester on Linux: +cd @abs_top_srcdir@/linux-build +make check + +# Clean up builds (pull-tester machine doesn't have infinite disk space) +cd @abs_top_srcdir@/linux-build +make clean +cd @abs_top_srcdir@/win32-build +make clean + +# TODO: Fix code coverage builds on pull-tester machine +# # Test code coverage +# cd @abs_top_srcdir@ +# make distdir +# mv $DISTDIR linux-coverage-build +# cd linux-coverage-build +# ./configure --enable-lcov --disable-silent-rules --disable-ccache --with-comparison-tool="$JAVA_COMPARISON_TOOL" +# make -j$JOBS +# make cov \ No newline at end of file diff --git a/share/setup.nsi.in b/share/setup.nsi.in index c69d10be..0c1592d0 100644 --- a/share/setup.nsi.in +++ b/share/setup.nsi.in @@ -1,4 +1,4 @@ -Name @PACKAGE_NAME@ +Name "@PACKAGE_NAME@ (@WINDOWS_BITS@-bit)" RequestExecutionLevel highest SetCompressor /SOLID lzma @@ -6,7 +6,7 @@ SetCompressor /SOLID lzma # General Symbol Definitions !define REGKEY "SOFTWARE\$(^Name)" !define VERSION @CLIENT_VERSION_MAJOR@.@CLIENT_VERSION_MINOR@.@CLIENT_VERSION_REVISION@ -!define COMPANY "Bitcoin project" +!define COMPANY "Bitcoin Core project" !define URL http://www.bitcoin.org/ # MUI Symbol Definitions @@ -19,7 +19,7 @@ SetCompressor /SOLID lzma !define MUI_STARTMENUPAGE_REGISTRY_ROOT HKLM !define MUI_STARTMENUPAGE_REGISTRY_KEY ${REGKEY} !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME StartMenuGroup -!define MUI_STARTMENUPAGE_DEFAULTFOLDER @PACKAGE_NAME@ +!define MUI_STARTMENUPAGE_DEFAULTFOLDER "@PACKAGE_NAME@" !define MUI_FINISHPAGE_RUN $INSTDIR\bitcoin-qt.exe !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico" !define MUI_UNWELCOMEFINISHPAGE_BITMAP "@abs_top_srcdir@/share/pixmaps/nsis-wizard.bmp" @@ -28,6 +28,9 @@ SetCompressor /SOLID lzma # Included files !include Sections.nsh !include MUI2.nsh +!if "@WINDOWS_BITS@" == "64" +!include x64.nsh +!endif # Variables Var StartMenuGroup @@ -45,14 +48,18 @@ Var StartMenuGroup !insertmacro MUI_LANGUAGE English # Installer attributes -OutFile @abs_top_srcdir@/bitcoin-${VERSION}-win32-setup.exe +OutFile @abs_top_srcdir@/bitcoin-${VERSION}-win@WINDOWS_BITS@-setup.exe +!if "@WINDOWS_BITS@" == "64" +InstallDir $PROGRAMFILES64\Bitcoin +!else InstallDir $PROGRAMFILES\Bitcoin +!endif CRCCheck on XPStyle on BrandingText " " ShowInstDetails show VIProductVersion ${VERSION}.@CLIENT_VERSION_BUILD@ -VIAddVersionKey ProductName Bitcoin +VIAddVersionKey ProductName "Bitcoin Core" VIAddVersionKey ProductVersion "${VERSION}" VIAddVersionKey CompanyName "${COMPANY}" VIAddVersionKey CompanyWebsite "${URL}" @@ -71,8 +78,9 @@ Section -Main SEC0000 File /oname=readme.txt @abs_top_srcdir@/doc/README_windows.txt SetOutPath $INSTDIR\daemon File @abs_top_srcdir@/release/bitcoind.exe - SetOutPath $INSTDIR\src - File /r @abs_top_srcdir@/@PACKAGE@-@VERSION@/src\*.* + File @abs_top_srcdir@/release/bitcoin-cli.exe + SetOutPath $INSTDIR\doc + File /r @abs_top_srcdir@/doc\*.* SetOutPath $INSTDIR WriteRegStr HKCU "${REGKEY}\Components" Main 1 @@ -87,8 +95,8 @@ Section -post SEC0001 WriteUninstaller $INSTDIR\uninstall.exe !insertmacro MUI_STARTMENU_WRITE_BEGIN Application CreateDirectory $SMPROGRAMS\$StartMenuGroup - CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Bitcoin.lnk" $INSTDIR\bitcoin-qt.exe - CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall Bitcoin.lnk" $INSTDIR\uninstall.exe + CreateShortcut "$SMPROGRAMS\$StartMenuGroup\$(^Name).lnk" $INSTDIR\bitcoin-qt.exe + CreateShortcut "$SMPROGRAMS\$StartMenuGroup\Uninstall $(^Name).lnk" $INSTDIR\uninstall.exe !insertmacro MUI_STARTMENU_WRITE_END WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayName "$(^Name)" WriteRegStr HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" DisplayVersion "${VERSION}" @@ -123,14 +131,14 @@ Section /o -un.Main UNSEC0000 Delete /REBOOTOK $INSTDIR\COPYING.txt Delete /REBOOTOK $INSTDIR\readme.txt RMDir /r /REBOOTOK $INSTDIR\daemon - RMDir /r /REBOOTOK $INSTDIR\src + RMDir /r /REBOOTOK $INSTDIR\doc DeleteRegValue HKCU "${REGKEY}\Components" Main SectionEnd Section -un.post UNSEC0001 DeleteRegKey HKCU "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$(^Name)" - Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Uninstall Bitcoin.lnk" - Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Bitcoin.lnk" + Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\Uninstall $(^Name).lnk" + Delete /REBOOTOK "$SMPROGRAMS\$StartMenuGroup\$(^Name).lnk" Delete /REBOOTOK "$SMSTARTUP\Bitcoin.lnk" Delete /REBOOTOK $INSTDIR\uninstall.exe Delete /REBOOTOK $INSTDIR\debug.log @@ -152,6 +160,15 @@ SectionEnd # Installer functions Function .onInit InitPluginsDir +!if "@WINDOWS_BITS@" == "64" + ${If} ${RunningX64} + ; disable registry redirection (enable access to 64-bit portion of registry) + SetRegView 64 + ${Else} + MessageBox MB_OK|MB_ICONSTOP "Cannot install 64-bit version on a 32-bit system." + Abort + ${EndIf} +!endif FunctionEnd # Uninstaller functions diff --git a/src/MakeFile.am b/src/MakeFile.am index 231888e4..7e9ac977 100644 --- a/src/MakeFile.am +++ b/src/MakeFile.am @@ -1,48 +1,252 @@ -.PHONY: FORCE +AM_CPPFLAGS = $(INCLUDES) +AM_LDFLAGS = $(PTHREAD_CFLAGS) -LIBBITCOIN=$(top_builddir)/src/libbitcoin.a -LIBLEVELDB=$(top_builddir)/src/leveldb/libleveldb.a -LIBMEMENV=$(top_builddir)/src/leveldb/libmemenv.a -LIBBITCOINQT=$(top_builddir)/src/qt/libbitcoinqt.a +if EMBEDDED_LEVELDB +LEVELDB_CPPFLAGS += -I$(srcdir)/leveldb/include +LEVELDB_CPPFLAGS += -I$(srcdir)/leveldb/helpers/memenv +LIBLEVELDB += $(builddir)/leveldb/libleveldb.a +LIBMEMENV += $(builddir)/leveldb/libmemenv.a -$(LIBBITCOIN): - $(MAKE) -C $(top_builddir)/src $(@F) +# NOTE: This dependency is not strictly necessary, but without it make may try to build both in parallel, which breaks the LevelDB build system in a race +$(LIBLEVELDB): $(LIBMEMENV) $(LIBLEVELDB) $(LIBMEMENV): - $(MAKE) -C $(top_builddir)/src leveldb/$(@F) + @echo "Building LevelDB ..." && $(MAKE) -C $(@D) $(@F) CXX="$(CXX)" \ + CC="$(CC)" PLATFORM=$(TARGET_OS) AR="$(AR)" $(LEVELDB_TARGET_FLAGS) \ + OPT="$(CXXFLAGS) $(CPPFLAGS)" +endif -$(LIBBITCOINQT): - $(MAKE) -C $(top_builddir)/src/qt $(@F) +BITCOIN_CONFIG_INCLUDES=-I$(builddir)/config +BITCOIN_INCLUDES=-I$(builddir) -I$(builddir)/obj $(BITCOIN_CONFIG_INCLUDES) $(BOOST_CPPFLAGS) $(LEVELDB_CPPFLAGS) -.mm.o: - $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CXXFLAGS) $(QT_INCLUDES) $(CXXFLAGS) -c -o $@ $< +noinst_LIBRARIES = \ + libbitcoin_server.a \ + libbitcoin_common.a \ + libbitcoin_cli.a +if ENABLE_WALLET +BITCOIN_INCLUDES += $(BDB_CPPFLAGS) +noinst_LIBRARIES += libbitcoin_wallet.a +endif + +bin_PROGRAMS = +TESTS = + +if BUILD_BITCOIND + bin_PROGRAMS += bitcoind +endif + +if BUILD_BITCOIN_CLI + bin_PROGRAMS += bitcoin-cli +endif + +.PHONY: FORCE +# bitcoin core # +BITCOIN_CORE_H = \ + addrman.h \ + alert.h \ + allocators.h \ + base58.h \ + bloom.h \ + chainparams.h \ + checkpoints.h \ + checkqueue.h \ + clientversion.h \ + coincontrol.h \ + coins.h \ + compat.h \ + core.h \ + crypter.h \ + db.h \ + hash.h \ + init.h \ + key.h \ + keystore.h \ + leveldbwrapper.h \ + limitedmap.h \ + main.h \ + miner.h \ + mruset.h \ + netbase.h \ + net.h \ + noui.h \ + protocol.h \ + rpcclient.h \ + rpcprotocol.h \ + rpcserver.h \ + script.h \ + serialize.h \ + crypto/common.h \ + crypto/sha2.h \ + crypto/sha1.h \ + crypto/ripemd160.h \ + sync.h \ + threadsafety.h \ + tinyformat.h \ + txdb.h \ + txmempool.h \ + ui_interface.h \ + uint256.h \ + util.h \ + version.h \ + walletdb.h \ + wallet.h \ + compat/sanity.h + +JSON_H = \ + json/json_spirit.h \ + json/json_spirit_error_position.h \ + json/json_spirit_reader.h \ + json/json_spirit_reader_template.h \ + json/json_spirit_stream_reader.h \ + json/json_spirit_utils.h \ + json/json_spirit_value.h \ + json/json_spirit_writer.h \ + json/json_spirit_writer_template.h + +obj/build.h: FORCE + @$(MKDIR_P) $(builddir)/obj + @$(top_srcdir)/share/genbuild.sh $(abs_top_builddir)/src/obj/build.h \ + $(abs_top_srcdir) +libbitcoin_common_a-version.$(OBJEXT): obj/build.h + +libbitcoin_server_a_CPPFLAGS = $(BITCOIN_INCLUDES) +libbitcoin_server_a_SOURCES = \ + addrman.cpp \ + alert.cpp \ + bloom.cpp \ + checkpoints.cpp \ + coins.cpp \ + init.cpp \ + keystore.cpp \ + leveldbwrapper.cpp \ + main.cpp \ + miner.cpp \ + net.cpp \ + noui.cpp \ + rpcblockchain.cpp \ + rpcmining.cpp \ + rpcmisc.cpp \ + rpcnet.cpp \ + rpcrawtransaction.cpp \ + rpcserver.cpp \ + txdb.cpp \ + txmempool.cpp \ + $(JSON_H) \ + $(BITCOIN_CORE_H) + +libbitcoin_wallet_a_CPPFLAGS = $(BITCOIN_INCLUDES) +libbitcoin_wallet_a_SOURCES = \ + db.cpp \ + crypter.cpp \ + rpcdump.cpp \ + rpcwallet.cpp \ + wallet.cpp \ + walletdb.cpp \ + $(BITCOIN_CORE_H) + +libbitcoin_common_a_CPPFLAGS = $(BITCOIN_INCLUDES) +libbitcoin_common_a_SOURCES = \ + base58.cpp \ + allocators.cpp \ + chainparams.cpp \ + core.cpp \ + hash.cpp \ + key.cpp \ + netbase.cpp \ + protocol.cpp \ + rpcprotocol.cpp \ + script.cpp \ + crypto/sha1.cpp \ + crypto/sha2.cpp \ + crypto/ripemd160.cpp \ + sync.cpp \ + util.cpp \ + version.cpp \ + compat/glibc_sanity.cpp \ + compat/glibcxx_sanity.cpp \ + $(BITCOIN_CORE_H) + +if GLIBC_BACK_COMPAT +libbitcoin_common_a_SOURCES += compat/glibc_compat.cpp +libbitcoin_common_a_SOURCES += compat/glibcxx_compat.cpp +endif + +libbitcoin_cli_a_SOURCES = \ + rpcclient.cpp \ + $(BITCOIN_CORE_H) + +nodist_libbitcoin_common_a_SOURCES = $(srcdir)/obj/build.h +# + +# bitcoind binary # +bitcoind_LDADD = \ + libbitcoin_server.a \ + libbitcoin_common.a \ + $(LIBLEVELDB) \ + $(LIBMEMENV) +if ENABLE_WALLET +bitcoind_LDADD += libbitcoin_wallet.a +endif +bitcoind_SOURCES = bitcoind.cpp +# + +if TARGET_WINDOWS +bitcoind_SOURCES += bitcoind-res.rc +endif + +bitcoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) +bitcoind_CPPFLAGS = $(BITCOIN_INCLUDES) + +# bitcoin-cli binary # +bitcoin_cli_LDADD = \ + libbitcoin_cli.a \ + libbitcoin_common.a \ + $(BOOST_LIBS) +bitcoin_cli_SOURCES = bitcoin-cli.cpp +bitcoin_cli_CPPFLAGS = $(BITCOIN_INCLUDES) +# + +if TARGET_WINDOWS +bitcoin_cli_SOURCES += bitcoin-cli-res.rc +endif + +CLEANFILES = leveldb/libleveldb.a leveldb/libmemenv.a *.gcda *.gcno + +DISTCLEANFILES = obj/build.h + +EXTRA_DIST = leveldb + +clean-local: + -$(MAKE) -C leveldb clean + rm -f leveldb/*/*.gcno leveldb/helpers/memenv/*.gcno + -rm -f config.h .rc.o: - @test -f $(WINDRES) && $(WINDRES) -i $< -o $@ || \ - echo error: could not build $@ - -ui_%.h: %.ui - @test -d $(abs_builddir)/$(@D) || $(MKDIR_P) $(abs_builddir)/$(@D) - @test -f $(UIC) && $(UIC) -o $(abs_builddir)/$@ $(abs_srcdir)/$< || echo error: could not build $(abs_builddir)/$@ - $(SED) -i.bak -e '/^\*\*.*Created:/d' $(abs_builddir)/$@ && rm $(abs_builddir)/$@.bak - $(SED) -i.bak -e '/^\*\*.*by:/d' $(abs_builddir)/$@ && rm $(abs_builddir)/$@.bak - -%.moc: %.cpp - $(MOC) $(QT_INCLUDES) $(MOC_DEFS) -o $@ $< - $(SED) -i.bak -e '/^\*\*.*Created:/d' $@ && rm $@.bak - $(SED) -i.bak -e '/^\*\*.*by:/d' $@ && rm $@.bak - -moc_%.cpp: %.h - $(MOC) $(QT_INCLUDES) $(MOC_DEFS) -o $@ $< - $(SED) -i.bak -e '/^\*\*.*Created:/d' $@ && rm $@.bak - $(SED) -i.bak -e '/^\*\*.*by:/d' $@ && rm $@.bak - -%.qm: %.ts - @test -d $(abs_builddir)/$(@D) || $(MKDIR_P) $(abs_builddir)/$(@D) - @test -f $(LRELEASE) && $(LRELEASE) $(abs_srcdir)/$< -qm $(abs_builddir)/$@ || \ - echo error: could not build $(abs_builddir)/$@ + @test -f $(WINDRES) + $(AM_V_GEN) $(WINDRES) -i $< -o $@ + +.mm.o: + $(AM_V_CXX) $(OBJCXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CXXFLAGS) $(QT_INCLUDES) $(CXXFLAGS) -c -o $@ $< %.pb.cc %.pb.h: %.proto - test -f $(PROTOC) && $(PROTOC) --cpp_out=$(@D) --proto_path=$(abspath $( $@ + @echo "static unsigned const char $(*F)[] = {" >> $@ + @$(HEXDUMP) -v -e '8/1 "0x%02x, "' -e '"\n"' $< | $(SED) -e 's/0x ,//g' >> $@ + @echo "};};" >> $@ + @echo "Generated $@" -CLEANFILES = leveldb/libleveldb.a leveldb/libmemenv.a *.gcda *.gcno - -DISTCLEANFILES = obj/build.h - -EXTRA_DIST = leveldb Makefile.include - -clean-local: - -$(MAKE) -C leveldb clean - rm -f leveldb/port/*.gcno leveldb/db/*.gcno leveldb/table/*.gcno leveldb/helpers/*.gcno - rm -f leveldb/util/*.gcno leveldb/helpers/memenv/*.gcno \ No newline at end of file +%.raw.h: %.raw + @$(MKDIR_P) $(@D) + @echo "namespace alert_tests{" > $@ + @echo "static unsigned const char $(*F)[] = {" >> $@ + @$(HEXDUMP) -v -e '8/1 "0x%02x, "' -e '"\n"' $< | $(SED) -e 's/0x ,//g' >> $@ + @echo "};};" >> $@ + @echo "Generated $@" \ No newline at end of file diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include new file mode 100644 index 00000000..c447824b --- /dev/null +++ b/src/Makefile.qt.include @@ -0,0 +1,387 @@ +AM_CPPFLAGS += -I$(top_srcdir)/src \ + -I$(top_builddir)/src/qt \ + -I$(top_builddir)/src/qt/forms \ + $(PROTOBUF_CFLAGS) \ + $(QR_CFLAGS) +bin_PROGRAMS += qt/bitcoin-qt +noinst_LIBRARIES += qt/libbitcoinqt.a + +# bitcoin qt core # +QT_TS = \ + qt/locale/bitcoin_ach.ts \ + qt/locale/bitcoin_af_ZA.ts \ + qt/locale/bitcoin_ar.ts \ + qt/locale/bitcoin_be_BY.ts \ + qt/locale/bitcoin_bg.ts \ + qt/locale/bitcoin_bs.ts \ + qt/locale/bitcoin_ca_ES.ts \ + qt/locale/bitcoin_ca.ts \ + qt/locale/bitcoin_ca@valencia.ts \ + qt/locale/bitcoin_cmn.ts \ + qt/locale/bitcoin_cs.ts \ + qt/locale/bitcoin_cy.ts \ + qt/locale/bitcoin_da.ts \ + qt/locale/bitcoin_de.ts \ + qt/locale/bitcoin_el_GR.ts \ + qt/locale/bitcoin_en.ts \ + qt/locale/bitcoin_eo.ts \ + qt/locale/bitcoin_es_CL.ts \ + qt/locale/bitcoin_es_DO.ts \ + qt/locale/bitcoin_es_MX.ts \ + qt/locale/bitcoin_es.ts \ + qt/locale/bitcoin_es_UY.ts \ + qt/locale/bitcoin_et.ts \ + qt/locale/bitcoin_eu_ES.ts \ + qt/locale/bitcoin_fa_IR.ts \ + qt/locale/bitcoin_fa.ts \ + qt/locale/bitcoin_fi.ts \ + qt/locale/bitcoin_fr_CA.ts \ + qt/locale/bitcoin_fr.ts \ + qt/locale/bitcoin_gl.ts \ + qt/locale/bitcoin_gu_IN.ts \ + qt/locale/bitcoin_he.ts \ + qt/locale/bitcoin_hi_IN.ts \ + qt/locale/bitcoin_hr.ts \ + qt/locale/bitcoin_hu.ts \ + qt/locale/bitcoin_id_ID.ts \ + qt/locale/bitcoin_it.ts \ + qt/locale/bitcoin_ja.ts \ + qt/locale/bitcoin_ka.ts \ + qt/locale/bitcoin_kk_KZ.ts \ + qt/locale/bitcoin_ko_KR.ts \ + qt/locale/bitcoin_ky.ts \ + qt/locale/bitcoin_la.ts \ + qt/locale/bitcoin_lt.ts \ + qt/locale/bitcoin_lv_LV.ts \ + qt/locale/bitcoin_mn.ts \ + qt/locale/bitcoin_ms_MY.ts \ + qt/locale/bitcoin_nb.ts \ + qt/locale/bitcoin_nl.ts \ + qt/locale/bitcoin_pam.ts \ + qt/locale/bitcoin_pl.ts \ + qt/locale/bitcoin_pt_BR.ts \ + qt/locale/bitcoin_pt_PT.ts \ + qt/locale/bitcoin_ro_RO.ts \ + qt/locale/bitcoin_ru.ts \ + qt/locale/bitcoin_sah.ts \ + qt/locale/bitcoin_sk.ts \ + qt/locale/bitcoin_sl_SI.ts \ + qt/locale/bitcoin_sq.ts \ + qt/locale/bitcoin_sr.ts \ + qt/locale/bitcoin_sv.ts \ + qt/locale/bitcoin_th_TH.ts \ + qt/locale/bitcoin_tr.ts \ + qt/locale/bitcoin_uk.ts \ + qt/locale/bitcoin_ur_PK.ts \ + qt/locale/bitcoin_uz@Cyrl.ts \ + qt/locale/bitcoin_vi.ts \ + qt/locale/bitcoin_vi_VN.ts \ + qt/locale/bitcoin_zh_CN.ts \ + qt/locale/bitcoin_zh_HK.ts \ + qt/locale/bitcoin_zh_TW.ts + +QT_FORMS_UI = \ + qt/forms/aboutdialog.ui \ + qt/forms/addressbookpage.ui \ + qt/forms/askpassphrasedialog.ui \ + qt/forms/coincontroldialog.ui \ + qt/forms/editaddressdialog.ui \ + qt/forms/helpmessagedialog.ui \ + qt/forms/intro.ui \ + qt/forms/openuridialog.ui \ + qt/forms/optionsdialog.ui \ + qt/forms/overviewpage.ui \ + qt/forms/receivecoinsdialog.ui \ + qt/forms/receiverequestdialog.ui \ + qt/forms/rpcconsole.ui \ + qt/forms/sendcoinsdialog.ui \ + qt/forms/sendcoinsentry.ui \ + qt/forms/signverifymessagedialog.ui \ + qt/forms/transactiondescdialog.ui + +QT_MOC_CPP = \ + qt/moc_addressbookpage.cpp \ + qt/moc_addresstablemodel.cpp \ + qt/moc_askpassphrasedialog.cpp \ + qt/moc_bitcoinaddressvalidator.cpp \ + qt/moc_bitcoinamountfield.cpp \ + qt/moc_bitcoingui.cpp \ + qt/moc_bitcoinunits.cpp \ + qt/moc_clientmodel.cpp \ + qt/moc_coincontroldialog.cpp \ + qt/moc_coincontroltreewidget.cpp \ + qt/moc_csvmodelwriter.cpp \ + qt/moc_editaddressdialog.cpp \ + qt/moc_guiutil.cpp \ + qt/moc_intro.cpp \ + qt/moc_macdockiconhandler.cpp \ + qt/moc_macnotificationhandler.cpp \ + qt/moc_monitoreddatamapper.cpp \ + qt/moc_notificator.cpp \ + qt/moc_openuridialog.cpp \ + qt/moc_optionsdialog.cpp \ + qt/moc_optionsmodel.cpp \ + qt/moc_overviewpage.cpp \ + qt/moc_peertablemodel.cpp \ + qt/moc_paymentserver.cpp \ + qt/moc_qvalidatedlineedit.cpp \ + qt/moc_qvaluecombobox.cpp \ + qt/moc_receivecoinsdialog.cpp \ + qt/moc_receiverequestdialog.cpp \ + qt/moc_recentrequeststablemodel.cpp \ + qt/moc_rpcconsole.cpp \ + qt/moc_sendcoinsdialog.cpp \ + qt/moc_sendcoinsentry.cpp \ + qt/moc_signverifymessagedialog.cpp \ + qt/moc_splashscreen.cpp \ + qt/moc_trafficgraphwidget.cpp \ + qt/moc_transactiondesc.cpp \ + qt/moc_transactiondescdialog.cpp \ + qt/moc_transactionfilterproxy.cpp \ + qt/moc_transactiontablemodel.cpp \ + qt/moc_transactionview.cpp \ + qt/moc_utilitydialog.cpp \ + qt/moc_walletframe.cpp \ + qt/moc_walletmodel.cpp \ + qt/moc_walletview.cpp + +BITCOIN_MM = \ + qt/macdockiconhandler.mm \ + qt/macnotificationhandler.mm + +QT_MOC = \ + qt/bitcoin.moc \ + qt/intro.moc \ + qt/overviewpage.moc \ + qt/rpcconsole.moc + +QT_QRC_CPP = qt/qrc_bitcoin.cpp +QT_QRC = qt/bitcoin.qrc + +PROTOBUF_CC = qt/paymentrequest.pb.cc +PROTOBUF_H = qt/paymentrequest.pb.h +PROTOBUF_PROTO = qt/paymentrequest.proto + +BITCOIN_QT_H = \ + qt/addressbookpage.h \ + qt/addresstablemodel.h \ + qt/askpassphrasedialog.h \ + qt/bitcoinaddressvalidator.h \ + qt/bitcoinamountfield.h \ + qt/bitcoingui.h \ + qt/bitcoinunits.h \ + qt/clientmodel.h \ + qt/coincontroldialog.h \ + qt/coincontroltreewidget.h \ + qt/csvmodelwriter.h \ + qt/editaddressdialog.h \ + qt/guiconstants.h \ + qt/guiutil.h \ + qt/intro.h \ + qt/macdockiconhandler.h \ + qt/macnotificationhandler.h \ + qt/monitoreddatamapper.h \ + qt/notificator.h \ + qt/openuridialog.h \ + qt/optionsdialog.h \ + qt/optionsmodel.h \ + qt/overviewpage.h \ + qt/paymentrequestplus.h \ + qt/paymentserver.h \ + qt/peertablemodel.h \ + qt/qvalidatedlineedit.h \ + qt/qvaluecombobox.h \ + qt/receivecoinsdialog.h \ + qt/receiverequestdialog.h \ + qt/recentrequeststablemodel.h \ + qt/rpcconsole.h \ + qt/sendcoinsdialog.h \ + qt/sendcoinsentry.h \ + qt/signverifymessagedialog.h \ + qt/splashscreen.h \ + qt/trafficgraphwidget.h \ + qt/transactiondesc.h \ + qt/transactiondescdialog.h \ + qt/transactionfilterproxy.h \ + qt/transactionrecord.h \ + qt/transactiontablemodel.h \ + qt/transactionview.h \ + qt/utilitydialog.h \ + qt/walletframe.h \ + qt/walletmodel.h \ + qt/walletmodeltransaction.h \ + qt/walletview.h \ + qt/winshutdownmonitor.h + +RES_ICONS = \ + qt/res/icons/add.png \ + qt/res/icons/address-book.png \ + qt/res/icons/bitcoin.ico \ + qt/res/icons/bitcoin.png \ + qt/res/icons/bitcoin_testnet.ico \ + qt/res/icons/bitcoin_testnet.png \ + qt/res/icons/clock1.png \ + qt/res/icons/clock2.png \ + qt/res/icons/clock3.png \ + qt/res/icons/clock4.png \ + qt/res/icons/clock5.png \ + qt/res/icons/configure.png \ + qt/res/icons/connect0_16.png \ + qt/res/icons/connect1_16.png \ + qt/res/icons/connect2_16.png \ + qt/res/icons/connect3_16.png \ + qt/res/icons/connect4_16.png \ + qt/res/icons/debugwindow.png \ + qt/res/icons/edit.png \ + qt/res/icons/editcopy.png \ + qt/res/icons/editpaste.png \ + qt/res/icons/export.png \ + qt/res/icons/filesave.png \ + qt/res/icons/history.png \ + qt/res/icons/key.png \ + qt/res/icons/lock_closed.png \ + qt/res/icons/lock_open.png \ + qt/res/icons/overview.png \ + qt/res/icons/qrcode.png \ + qt/res/icons/quit.png \ + qt/res/icons/receive.png \ + qt/res/icons/remove.png \ + qt/res/icons/send.png \ + qt/res/icons/synced.png \ + qt/res/icons/toolbar.png \ + qt/res/icons/toolbar_testnet.png \ + qt/res/icons/transaction0.png \ + qt/res/icons/transaction2.png \ + qt/res/icons/transaction_conflicted.png \ + qt/res/icons/tx_inout.png \ + qt/res/icons/tx_input.png \ + qt/res/icons/tx_output.png \ + qt/res/icons/tx_mined.png + +BITCOIN_QT_CPP = \ + qt/bitcoinaddressvalidator.cpp \ + qt/bitcoinamountfield.cpp \ + qt/bitcoingui.cpp \ + qt/bitcoinunits.cpp \ + qt/clientmodel.cpp \ + qt/csvmodelwriter.cpp \ + qt/guiutil.cpp \ + qt/intro.cpp \ + qt/monitoreddatamapper.cpp \ + qt/notificator.cpp \ + qt/optionsdialog.cpp \ + qt/optionsmodel.cpp \ + qt/peertablemodel.cpp \ + qt/qvalidatedlineedit.cpp \ + qt/qvaluecombobox.cpp \ + qt/rpcconsole.cpp \ + qt/splashscreen.cpp \ + qt/trafficgraphwidget.cpp \ + qt/utilitydialog.cpp \ + qt/winshutdownmonitor.cpp + +if ENABLE_WALLET +BITCOIN_QT_CPP += \ + qt/addressbookpage.cpp \ + qt/addresstablemodel.cpp \ + qt/askpassphrasedialog.cpp \ + qt/coincontroldialog.cpp \ + qt/coincontroltreewidget.cpp \ + qt/editaddressdialog.cpp \ + qt/openuridialog.cpp \ + qt/overviewpage.cpp \ + qt/paymentrequestplus.cpp \ + qt/paymentserver.cpp \ + qt/receivecoinsdialog.cpp \ + qt/receiverequestdialog.cpp \ + qt/recentrequeststablemodel.cpp \ + qt/sendcoinsdialog.cpp \ + qt/sendcoinsentry.cpp \ + qt/signverifymessagedialog.cpp \ + qt/transactiondesc.cpp \ + qt/transactiondescdialog.cpp \ + qt/transactionfilterproxy.cpp \ + qt/transactionrecord.cpp \ + qt/transactiontablemodel.cpp \ + qt/transactionview.cpp \ + qt/walletframe.cpp \ + qt/walletmodel.cpp \ + qt/walletmodeltransaction.cpp \ + qt/walletview.cpp +endif + +RES_IMAGES = \ + qt/res/images/about.png \ + qt/res/images/splash.png \ + qt/res/images/splash_testnet.png + +RES_MOVIES = $(wildcard qt/res/movies/spinner-*.png) + +BITCOIN_RC = qt/res/bitcoin-qt-res.rc + +qt_libbitcoinqt_a_CPPFLAGS = $(AM_CPPFLAGS) $(QT_INCLUDES) \ + -I$(top_srcdir)/src/qt/forms $(QT_DBUS_INCLUDES) +qt_libbitcoinqt_a_SOURCES = $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(QT_FORMS_UI) \ + $(QT_QRC) $(QT_TS) $(PROTOBUF_PROTO) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) + +nodist_qt_libbitcoinqt_a_SOURCES = $(QT_MOC_CPP) $(QT_MOC) $(PROTOBUF_CC) \ + $(PROTOBUF_H) $(QT_QRC_CPP) + +# forms/foo.h -> forms/ui_foo.h +QT_FORMS_H=$(join $(dir $(QT_FORMS_UI)),$(addprefix ui_, $(notdir $(QT_FORMS_UI:.ui=.h)))) + +# Most files will depend on the forms and moc files as includes. Generate them +# before anything else. +$(QT_MOC): $(QT_FORMS_H) +$(qt_libbitcoinqt_a_OBJECTS) $(qt_bitcoin_qt_OBJECTS) : | $(QT_MOC) + +#Generating these with a half-written protobuf header leads to wacky results. +#This makes sure it's done. +$(QT_MOC): $(PROTOBUF_H) +$(QT_MOC_CPP): $(PROTOBUF_H) + +# bitcoin-qt binary # +qt_bitcoin_qt_CPPFLAGS = $(AM_CPPFLAGS) $(QT_INCLUDES) \ + -I$(top_srcdir)/src/qt/forms +qt_bitcoin_qt_SOURCES = qt/bitcoin.cpp +if TARGET_DARWIN + qt_bitcoin_qt_SOURCES += $(BITCOIN_MM) +endif +if TARGET_WINDOWS + qt_bitcoin_qt_SOURCES += $(BITCOIN_RC) +endif +qt_bitcoin_qt_LDADD = qt/libbitcoinqt.a $(LIBBITCOIN_SERVER) +if ENABLE_WALLET +qt_bitcoin_qt_LDADD += $(LIBBITCOIN_WALLET) +endif +qt_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBLEVELDB) $(LIBMEMENV) \ + $(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) +qt_bitcoin_qt_LDFLAGS = $(QT_LDFLAGS) + +#locale/foo.ts -> locale/foo.qm +QT_QM=$(QT_TS:.ts=.qm) + +.SECONDARY: $(QT_QM) + +qt/bitcoinstrings.cpp: $(libbitcoin_server_a_SOURCES) $(libbitcoin_common_a_SOURCES) $(libbitcoin_cli_a_SOURCES) + @test -n $(XGETTEXT) || echo "xgettext is required for updating translations" + @cd $(top_srcdir); XGETTEXT=$(XGETTEXT) share/qt/extract_strings_qt.py + +translate: qt/bitcoinstrings.cpp $(QT_FORMS_UI) $(QT_FORMS_UI) $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(BITCOIN_MM) + @test -n $(LUPDATE) || echo "lupdate is required for updating translations" + @QT_SELECT=$(QT_SELECT) $(LUPDATE) $^ -locations relative -no-obsolete -ts qt/locale/bitcoin_en.ts + +$(QT_QRC_CPP): $(QT_QRC) $(QT_QM) $(QT_FORMS_H) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) $(PROTOBUF_H) + @cd $(abs_srcdir); test -f $(RCC) && QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin -o $(abs_builddir)/$@ $< || \ + echo error: could not build $@ + $(SED) -e '/^\*\*.*Created:/d' $@ > $@.n && mv $@{.n,} + $(SED) -e '/^\*\*.*by:/d' $@ > $@.n && mv $@{.n,} + +CLEAN_QT = $(nodist_qt_libbitcoinqt_a_SOURCES) $(QT_QM) $(QT_FORMS_H) qt/*.gcda qt/*.gcno + +CLEANFILES += $(CLEAN_QT) + +bitcoin_qt_clean: FORCE + rm -f $(CLEAN_QT) $(qt_libbitcoinqt_a_OBJECTS) $(qt_bitcoin_qt_OBJECTS) qt/bitcoin-qt$(EXEEXT) $(LIBBITCOINQT) + +bitcoin_qt : qt/bitcoin-qt$(EXEEXT) \ No newline at end of file diff --git a/src/Makefile.qttest.include b/src/Makefile.qttest.include new file mode 100644 index 00000000..d0f085bf --- /dev/null +++ b/src/Makefile.qttest.include @@ -0,0 +1,52 @@ +AM_CPPFLAGS += -I$(top_srcdir)/src \ + -I$(top_srcdir)/src/qt \ + -I$(top_builddir)/src/qt \ + $(PROTOBUF_CFLAGS) \ + $(QR_CFLAGS) +bin_PROGRAMS += qt/test/test_bitcoin-qt +TESTS += qt/test/test_bitcoin-qt + +TEST_QT_MOC_CPP = qt/test/moc_uritests.cpp + +if ENABLE_WALLET +TEST_QT_MOC_CPP += qt/test/moc_paymentservertests.cpp +endif + +TEST_QT_H = \ + qt/test/uritests.h \ + qt/test/paymentrequestdata.h \ + qt/test/paymentservertests.h + +qt_test_test_bitcoin_qt_CPPFLAGS = $(AM_CPPFLAGS) $(QT_INCLUDES) $(QT_TEST_INCLUDES) + +qt_test_test_bitcoin_qt_SOURCES = \ + qt/test/test_main.cpp \ + qt/test/uritests.cpp \ + $(TEST_QT_H) +if ENABLE_WALLET +qt_test_test_bitcoin_qt_SOURCES += \ + qt/test/paymentservertests.cpp +endif + +nodist_qt_test_test_bitcoin_qt_SOURCES = $(TEST_QT_MOC_CPP) + +qt_test_test_bitcoin_qt_LDADD = $(LIBBITCOINQT) $(LIBBITCOIN_SERVER) +if ENABLE_WALLET +qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_WALLET) +endif +qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBLEVELDB) \ + $(LIBMEMENV) $(BOOST_LIBS) $(QT_DBUS_LIBS) $(QT_TEST_LIBS) $(QT_LIBS) \ + $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) +qt_test_test_bitcoin_qt_LDFLAGS = $(QT_LDFLAGS) + +CLEAN_BITCOIN_QT_TEST = $(TEST_QT_MOC_CPP) qt/test/*.gcda qt/test/*.gcno + +CLEANFILES += $(CLEAN_BITCOIN_QT_TEST) + +test_bitcoin_qt : qt/test/test_bitcoin-qt$(EXEEXT) + +test_bitcoin_qt_check : qt/test/test_bitcoin-qt$(EXEEXT) FORCE + $(MAKE) check-TESTS TESTS=$^ + +test_bitcoin_qt_clean: FORCE + rm -f $(CLEAN_BITCOIN_QT_TEST) $(qt_test_test_bitcoin_qt_OBJECTS) \ No newline at end of file diff --git a/src/Makefile.test.include b/src/Makefile.test.include new file mode 100644 index 00000000..b4f52dc3 --- /dev/null +++ b/src/Makefile.test.include @@ -0,0 +1,87 @@ +AM_CPPFLAGS += -I$(top_builddir)/src/test/ + +TESTS += test/test_bitcoin +bin_PROGRAMS += test/test_bitcoin +TEST_SRCDIR = test +TEST_BINARY=test/test_bitcoin$(EXEEXT) + +JSON_TEST_FILES = \ + test/data/script_valid.json \ + test/data/base58_keys_valid.json \ + test/data/sig_canonical.json \ + test/data/sig_noncanonical.json \ + test/data/base58_encode_decode.json \ + test/data/base58_keys_invalid.json \ + test/data/script_invalid.json \ + test/data/tx_invalid.json \ + test/data/tx_valid.json \ + test/data/sighash.json + +RAW_TEST_FILES = test/data/alertTests.raw + +GENERATED_TEST_FILES = $(JSON_TEST_FILES:.json=.json.h) $(RAW_TEST_FILES:.raw=.raw.h) + +BITCOIN_TESTS =\ + test/bignum.h \ + test/alert_tests.cpp \ + test/allocator_tests.cpp \ + test/base32_tests.cpp \ + test/base58_tests.cpp \ + test/base64_tests.cpp \ + test/bloom_tests.cpp \ + test/canonical_tests.cpp \ + test/checkblock_tests.cpp \ + test/Checkpoints_tests.cpp \ + test/compress_tests.cpp \ + test/DoS_tests.cpp \ + test/getarg_tests.cpp \ + test/key_tests.cpp \ + test/main_tests.cpp \ + test/miner_tests.cpp \ + test/mruset_tests.cpp \ + test/multisig_tests.cpp \ + test/netbase_tests.cpp \ + test/pmt_tests.cpp \ + test/rpc_tests.cpp \ + test/script_P2SH_tests.cpp \ + test/script_tests.cpp \ + test/serialize_tests.cpp \ + test/sigopcount_tests.cpp \ + test/test_bitcoin.cpp \ + test/transaction_tests.cpp \ + test/uint256_tests.cpp \ + test/util_tests.cpp \ + test/scriptnum_tests.cpp \ + test/sighash_tests.cpp + +if ENABLE_WALLET +BITCOIN_TESTS += \ + test/accounting_tests.cpp \ + test/wallet_tests.cpp \ + test/rpc_wallet_tests.cpp +endif + +test_test_bitcoin_SOURCES = $(BITCOIN_TESTS) $(JSON_TEST_FILES) $(RAW_TEST_FILES) +test_test_bitcoin_CPPFLAGS = $(AM_CPPFLAGS) $(TESTDEFS) +test_test_bitcoin_LDADD = $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBLEVELDB) $(LIBMEMENV) \ + $(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) +if ENABLE_WALLET +test_test_bitcoin_LDADD += $(LIBBITCOIN_WALLET) +endif +test_test_bitcoin_LDADD += $(BDB_LIBS) + +nodist_test_test_bitcoin_SOURCES = $(GENERATED_TEST_FILES) + +$(BITCOIN_TESTS): $(GENERATED_TEST_FILES) + +CLEAN_BITCOIN_TEST = test/*.gcda test/*.gcno $(GENERATED_TEST_FILES) + +CLEANFILES += $(CLEAN_BITCOIN_TEST) + +bitcoin_test: $(TEST_BINARY) + +bitcoin_test_check: $(TEST_BINARY) FORCE + $(MAKE) check-TESTS TESTS=$^ + +bitcoin_test_clean : FORCE + rm -f $(CLEAN_BITCOIN_TEST) $(test_test_bitcoin_OBJECTS) $(TEST_BINARY) \ No newline at end of file diff --git a/src/compat/.deps/libbitcoin_common_a-glibc_compat.Po b/src/compat/.deps/libbitcoin_common_a-glibc_compat.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/src/compat/.deps/libbitcoin_common_a-glibc_compat.Po @@ -0,0 +1 @@ +# dummy diff --git a/src/compat/.deps/libbitcoin_common_a-glibc_sanity.Po b/src/compat/.deps/libbitcoin_common_a-glibc_sanity.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/src/compat/.deps/libbitcoin_common_a-glibc_sanity.Po @@ -0,0 +1 @@ +# dummy diff --git a/src/compat/.deps/libbitcoin_common_a-glibcxx_compat.Po b/src/compat/.deps/libbitcoin_common_a-glibcxx_compat.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/src/compat/.deps/libbitcoin_common_a-glibcxx_compat.Po @@ -0,0 +1 @@ +# dummy diff --git a/src/compat/.deps/libbitcoin_common_a-glibcxx_sanity.Po b/src/compat/.deps/libbitcoin_common_a-glibcxx_sanity.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/src/compat/.deps/libbitcoin_common_a-glibcxx_sanity.Po @@ -0,0 +1 @@ +# dummy diff --git a/src/config/bitcoin-config.h b/src/config/bitcoin-config.h new file mode 100644 index 00000000..e5079bf7 --- /dev/null +++ b/src/config/bitcoin-config.h @@ -0,0 +1,314 @@ +/* src/config/bitcoin-config.h. Generated from bitcoin-config.h.in by configure. */ +/* src/config/bitcoin-config.h.in. Generated from configure.ac by autoheader. */ + +#ifndef BITCOIN_CONFIG_H + +#define BITCOIN_CONFIG_H + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* Version Build */ +#define CLIENT_VERSION_BUILD 4 + +/* Version is release */ +#define CLIENT_VERSION_IS_RELEASE true + +/* Major version */ +#define CLIENT_VERSION_MAJOR 1 + +/* Minor version */ +#define CLIENT_VERSION_MINOR 0 + +/* Build revision */ +#define CLIENT_VERSION_REVISION 3 + +/* Version is release */ +#define COPYRIGHT_YEAR 2014 + +/* Define to 1 to enable wallet functions */ +#define ENABLE_WALLET 1 + +/* parameter and return value type for __fdelt_chk */ +/* #undef FDELT_TYPE */ + +/* define if the Boost library is available */ +#define HAVE_BOOST /**/ + +/* define if the Boost::Chrono library is available */ +#define HAVE_BOOST_CHRONO /**/ + +/* define if the Boost::Filesystem library is available */ +#define HAVE_BOOST_FILESYSTEM /**/ + +/* define if the Boost::PROGRAM_OPTIONS library is available */ +#define HAVE_BOOST_PROGRAM_OPTIONS /**/ + +/* define if the Boost::System library is available */ +#define HAVE_BOOST_SYSTEM /**/ + +/* define if the Boost::Thread library is available */ +#define HAVE_BOOST_THREAD /**/ + +/* define if the Boost::Unit_Test_Framework library is available */ +/* #undef HAVE_BOOST_UNIT_TEST_FRAMEWORK */ + +/* Define to 1 if you have the declaration of `be32toh', and to 0 if you + don't. */ +#define HAVE_DECL_BE32TOH 0 + +/* Define to 1 if you have the declaration of `be64toh', and to 0 if you + don't. */ +#define HAVE_DECL_BE64TOH 0 + +/* Define to 1 if you have the declaration of `htobe32', and to 0 if you + don't. */ +#define HAVE_DECL_HTOBE32 0 + +/* Define to 1 if you have the declaration of `htobe64', and to 0 if you + don't. */ +#define HAVE_DECL_HTOBE64 0 + +/* Define to 1 if you have the declaration of `htole32', and to 0 if you + don't. */ +#define HAVE_DECL_HTOLE32 0 + +/* Define to 1 if you have the declaration of `htole64', and to 0 if you + don't. */ +#define HAVE_DECL_HTOLE64 0 + +/* Define to 1 if you have the declaration of `le32toh', and to 0 if you + don't. */ +#define HAVE_DECL_LE32TOH 0 + +/* Define to 1 if you have the declaration of `le64toh', and to 0 if you + don't. */ +#define HAVE_DECL_LE64TOH 0 + +/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you + don't. */ +#define HAVE_DECL_STRERROR_R 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_ENDIAN_H */ + +/* Define this symbol if you have getaddrinfo_a */ +/* #undef HAVE_GETADDRINFO_A */ + +/* Define this symbol if you have inet_pton */ +#define HAVE_INET_PTON 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `advapi32' library (-ladvapi32). */ +/* #undef HAVE_LIBADVAPI32 */ + +/* Define to 1 if you have the `comctl32' library (-lcomctl32). */ +/* #undef HAVE_LIBCOMCTL32 */ + +/* Define to 1 if you have the `comdlg32' library (-lcomdlg32). */ +/* #undef HAVE_LIBCOMDLG32 */ + +/* Define to 1 if you have the `crypt32' library (-lcrypt32). */ +/* #undef HAVE_LIBCRYPT32 */ + +/* Define to 1 if you have the `crypto' library (-lcrypto). */ +/* #undef HAVE_LIBCRYPTO */ + +/* Define to 1 if you have the `gdi32' library (-lgdi32). */ +/* #undef HAVE_LIBGDI32 */ + +/* Define to 1 if you have the `imm32' library (-limm32). */ +/* #undef HAVE_LIBIMM32 */ + +/* Define to 1 if you have the `iphlpapi' library (-liphlpapi). */ +/* #undef HAVE_LIBIPHLPAPI */ + +/* Define to 1 if you have the `kernel32' library (-lkernel32). */ +/* #undef HAVE_LIBKERNEL32 */ + +/* Define to 1 if you have the `mingwthrd' library (-lmingwthrd). */ +/* #undef HAVE_LIBMINGWTHRD */ + +/* Define to 1 if you have the `miniupnpc' library (-lminiupnpc). */ +#define HAVE_LIBMINIUPNPC 1 + +/* Define to 1 if you have the `mswsock' library (-lmswsock). */ +/* #undef HAVE_LIBMSWSOCK */ + +/* Define to 1 if you have the `ole32' library (-lole32). */ +/* #undef HAVE_LIBOLE32 */ + +/* Define to 1 if you have the `oleaut32' library (-loleaut32). */ +/* #undef HAVE_LIBOLEAUT32 */ + +/* Define to 1 if you have the `png ' library (-lpng ). */ +/* #undef HAVE_LIBPNG_ */ + +/* Define to 1 if you have the `protobuf ' library (-lprotobuf ). */ +/* #undef HAVE_LIBPROTOBUF_ */ + +/* Define to 1 if you have the `qrencode' library (-lqrencode). */ +/* #undef HAVE_LIBQRENCODE */ + +/* Define to 1 if you have the `rpcrt4' library (-lrpcrt4). */ +/* #undef HAVE_LIBRPCRT4 */ + +/* Define to 1 if you have the `shell32' library (-lshell32). */ +/* #undef HAVE_LIBSHELL32 */ + +/* Define to 1 if you have the `shlwapi' library (-lshlwapi). */ +/* #undef HAVE_LIBSHLWAPI */ + +/* Define to 1 if you have the `ssl' library (-lssl). */ +/* #undef HAVE_LIBSSL */ + +/* Define to 1 if you have the `user32' library (-luser32). */ +/* #undef HAVE_LIBUSER32 */ + +/* Define to 1 if you have the `uuid' library (-luuid). */ +/* #undef HAVE_LIBUUID */ + +/* Define to 1 if you have the `winmm' library (-lwinmm). */ +/* #undef HAVE_LIBWINMM */ + +/* Define to 1 if you have the `winspool' library (-lwinspool). */ +/* #undef HAVE_LIBWINSPOOL */ + +/* Define to 1 if you have the `ws2_32' library (-lws2_32). */ +/* #undef HAVE_LIBWS2_32 */ + +/* Define to 1 if you have the `z ' library (-lz ). */ +/* #undef HAVE_LIBZ_ */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MINIUPNPC_MINIUPNPC_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MINIUPNPC_MINIWGET_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MINIUPNPC_UPNPCOMMANDS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MINIUPNPC_UPNPERRORS_H 1 + +/* Define this symbol if you have MSG_NOSIGNAL */ +/* #undef HAVE_MSG_NOSIGNAL */ + +/* Define if you have POSIX threads libraries and header files. */ +#define HAVE_PTHREAD 1 + +/* Have PTHREAD_PRIO_INHERIT. */ +#define HAVE_PTHREAD_PRIO_INHERIT 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDIO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strerror_r' function. */ +#define HAVE_STRERROR_R 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SELECT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define this symbol if boost sleep works */ +/* #undef HAVE_WORKING_BOOST_SLEEP */ + +/* Define this symbol if boost sleep_for works */ +#define HAVE_WORKING_BOOST_SLEEP_FOR 1 + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#define LT_OBJDIR ".libs/" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "info@bitcoin.org" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "Bitcoin Core" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "Bitcoin Core 1.0.3" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "bitcoin" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.0.3" + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +/* #undef PTHREAD_CREATE_JOINABLE */ + +/* Define this symbol if qt plugins are static */ +/* #undef QT_STATICPLUGIN */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define to 1 if strerror_r returns char *. */ +/* #undef STRERROR_R_CHAR_P */ + +/* Define if dbus support should be compiled in */ +/* #undef USE_DBUS */ + +/* Define if QR support should be compiled in */ +/* #undef USE_QRCODE */ + +/* Define to 1 for upnp runtime support */ +#define USE_UPNP 0 + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif + +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +# define _DARWIN_USE_64_BIT_INODE 1 +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +/* #undef _FILE_OFFSET_BITS */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef _LARGE_FILES */ + +#endif //BITCOIN_CONFIG_H diff --git a/src/config/bitcoin-config.h.in b/src/config/bitcoin-config.h.in new file mode 100644 index 00000000..e10fa27a --- /dev/null +++ b/src/config/bitcoin-config.h.in @@ -0,0 +1,313 @@ +/* src/config/bitcoin-config.h.in. Generated from configure.ac by autoheader. */ + +#ifndef BITCOIN_CONFIG_H + +#define BITCOIN_CONFIG_H + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* Version Build */ +#undef CLIENT_VERSION_BUILD + +/* Version is release */ +#undef CLIENT_VERSION_IS_RELEASE + +/* Major version */ +#undef CLIENT_VERSION_MAJOR + +/* Minor version */ +#undef CLIENT_VERSION_MINOR + +/* Build revision */ +#undef CLIENT_VERSION_REVISION + +/* Version is release */ +#undef COPYRIGHT_YEAR + +/* Define to 1 to enable wallet functions */ +#undef ENABLE_WALLET + +/* parameter and return value type for __fdelt_chk */ +#undef FDELT_TYPE + +/* define if the Boost library is available */ +#undef HAVE_BOOST + +/* define if the Boost::Chrono library is available */ +#undef HAVE_BOOST_CHRONO + +/* define if the Boost::Filesystem library is available */ +#undef HAVE_BOOST_FILESYSTEM + +/* define if the Boost::PROGRAM_OPTIONS library is available */ +#undef HAVE_BOOST_PROGRAM_OPTIONS + +/* define if the Boost::System library is available */ +#undef HAVE_BOOST_SYSTEM + +/* define if the Boost::Thread library is available */ +#undef HAVE_BOOST_THREAD + +/* define if the Boost::Unit_Test_Framework library is available */ +#undef HAVE_BOOST_UNIT_TEST_FRAMEWORK + +/* Define to 1 if you have the declaration of `be32toh', and to 0 if you + don't. */ +#undef HAVE_DECL_BE32TOH + +/* Define to 1 if you have the declaration of `be64toh', and to 0 if you + don't. */ +#undef HAVE_DECL_BE64TOH + +/* Define to 1 if you have the declaration of `htobe32', and to 0 if you + don't. */ +#undef HAVE_DECL_HTOBE32 + +/* Define to 1 if you have the declaration of `htobe64', and to 0 if you + don't. */ +#undef HAVE_DECL_HTOBE64 + +/* Define to 1 if you have the declaration of `htole32', and to 0 if you + don't. */ +#undef HAVE_DECL_HTOLE32 + +/* Define to 1 if you have the declaration of `htole64', and to 0 if you + don't. */ +#undef HAVE_DECL_HTOLE64 + +/* Define to 1 if you have the declaration of `le32toh', and to 0 if you + don't. */ +#undef HAVE_DECL_LE32TOH + +/* Define to 1 if you have the declaration of `le64toh', and to 0 if you + don't. */ +#undef HAVE_DECL_LE64TOH + +/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you + don't. */ +#undef HAVE_DECL_STRERROR_R + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ENDIAN_H + +/* Define this symbol if you have getaddrinfo_a */ +#undef HAVE_GETADDRINFO_A + +/* Define this symbol if you have inet_pton */ +#undef HAVE_INET_PTON + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `advapi32' library (-ladvapi32). */ +#undef HAVE_LIBADVAPI32 + +/* Define to 1 if you have the `comctl32' library (-lcomctl32). */ +#undef HAVE_LIBCOMCTL32 + +/* Define to 1 if you have the `comdlg32' library (-lcomdlg32). */ +#undef HAVE_LIBCOMDLG32 + +/* Define to 1 if you have the `crypt32' library (-lcrypt32). */ +#undef HAVE_LIBCRYPT32 + +/* Define to 1 if you have the `crypto' library (-lcrypto). */ +#undef HAVE_LIBCRYPTO + +/* Define to 1 if you have the `gdi32' library (-lgdi32). */ +#undef HAVE_LIBGDI32 + +/* Define to 1 if you have the `imm32' library (-limm32). */ +#undef HAVE_LIBIMM32 + +/* Define to 1 if you have the `iphlpapi' library (-liphlpapi). */ +#undef HAVE_LIBIPHLPAPI + +/* Define to 1 if you have the `kernel32' library (-lkernel32). */ +#undef HAVE_LIBKERNEL32 + +/* Define to 1 if you have the `mingwthrd' library (-lmingwthrd). */ +#undef HAVE_LIBMINGWTHRD + +/* Define to 1 if you have the `miniupnpc' library (-lminiupnpc). */ +#undef HAVE_LIBMINIUPNPC + +/* Define to 1 if you have the `mswsock' library (-lmswsock). */ +#undef HAVE_LIBMSWSOCK + +/* Define to 1 if you have the `ole32' library (-lole32). */ +#undef HAVE_LIBOLE32 + +/* Define to 1 if you have the `oleaut32' library (-loleaut32). */ +#undef HAVE_LIBOLEAUT32 + +/* Define to 1 if you have the `png ' library (-lpng ). */ +#undef HAVE_LIBPNG_ + +/* Define to 1 if you have the `protobuf ' library (-lprotobuf ). */ +#undef HAVE_LIBPROTOBUF_ + +/* Define to 1 if you have the `qrencode' library (-lqrencode). */ +#undef HAVE_LIBQRENCODE + +/* Define to 1 if you have the `rpcrt4' library (-lrpcrt4). */ +#undef HAVE_LIBRPCRT4 + +/* Define to 1 if you have the `shell32' library (-lshell32). */ +#undef HAVE_LIBSHELL32 + +/* Define to 1 if you have the `shlwapi' library (-lshlwapi). */ +#undef HAVE_LIBSHLWAPI + +/* Define to 1 if you have the `ssl' library (-lssl). */ +#undef HAVE_LIBSSL + +/* Define to 1 if you have the `user32' library (-luser32). */ +#undef HAVE_LIBUSER32 + +/* Define to 1 if you have the `uuid' library (-luuid). */ +#undef HAVE_LIBUUID + +/* Define to 1 if you have the `winmm' library (-lwinmm). */ +#undef HAVE_LIBWINMM + +/* Define to 1 if you have the `winspool' library (-lwinspool). */ +#undef HAVE_LIBWINSPOOL + +/* Define to 1 if you have the `ws2_32' library (-lws2_32). */ +#undef HAVE_LIBWS2_32 + +/* Define to 1 if you have the `z ' library (-lz ). */ +#undef HAVE_LIBZ_ + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MINIUPNPC_MINIUPNPC_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MINIUPNPC_MINIWGET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MINIUPNPC_UPNPCOMMANDS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MINIUPNPC_UPNPERRORS_H + +/* Define this symbol if you have MSG_NOSIGNAL */ +#undef HAVE_MSG_NOSIGNAL + +/* Define if you have POSIX threads libraries and header files. */ +#undef HAVE_PTHREAD + +/* Have PTHREAD_PRIO_INHERIT. */ +#undef HAVE_PTHREAD_PRIO_INHERIT + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strerror_r' function. */ +#undef HAVE_STRERROR_R + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SELECT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define this symbol if boost sleep works */ +#undef HAVE_WORKING_BOOST_SLEEP + +/* Define this symbol if boost sleep_for works */ +#undef HAVE_WORKING_BOOST_SLEEP_FOR + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#undef LT_OBJDIR + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +#undef PTHREAD_CREATE_JOINABLE + +/* Define this symbol if qt plugins are static */ +#undef QT_STATICPLUGIN + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 if strerror_r returns char *. */ +#undef STRERROR_R_CHAR_P + +/* Define if dbus support should be compiled in */ +#undef USE_DBUS + +/* Define if QR support should be compiled in */ +#undef USE_QRCODE + +/* Define to 1 for upnp runtime support */ +#undef USE_UPNP + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif + +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +# define _DARWIN_USE_64_BIT_INODE 1 +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +#undef _FILE_OFFSET_BITS + +/* Define for large files, on AIX-style hosts. */ +#undef _LARGE_FILES + +#endif //BITCOIN_CONFIG_H diff --git a/src/config/stamp-h1 b/src/config/stamp-h1 new file mode 100644 index 00000000..390232e7 --- /dev/null +++ b/src/config/stamp-h1 @@ -0,0 +1 @@ +timestamp for src/config/bitcoin-config.h diff --git a/src/crypto/.deps/libbitcoin_common_a-ripemd160.Po b/src/crypto/.deps/libbitcoin_common_a-ripemd160.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/src/crypto/.deps/libbitcoin_common_a-ripemd160.Po @@ -0,0 +1 @@ +# dummy diff --git a/src/crypto/.deps/libbitcoin_common_a-sha1.Po b/src/crypto/.deps/libbitcoin_common_a-sha1.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/src/crypto/.deps/libbitcoin_common_a-sha1.Po @@ -0,0 +1 @@ +# dummy diff --git a/src/crypto/.deps/libbitcoin_common_a-sha2.Po b/src/crypto/.deps/libbitcoin_common_a-sha2.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/src/crypto/.deps/libbitcoin_common_a-sha2.Po @@ -0,0 +1 @@ +# dummy diff --git a/src/crypto/common/common.h b/src/crypto/common/common.h index 2a7d3569..07c2625e 100644 --- a/src/crypto/common/common.h +++ b/src/crypto/common/common.h @@ -5,6 +5,9 @@ #ifndef TX_CRYPTO_COMMON_H #define TX_CRYPTO_COMMON_H +#if defined(HAVE_CONFIG_H) +#include "bitcoin-config.h" +#endif #include #if defined(HAVE_ENDIAN_H) diff --git a/src/m4/bitcoin_find_bdb48.m4 b/src/m4/bitcoin_find_bdb48.m4 index 72ec49b6..d48ab718 100644 --- a/src/m4/bitcoin_find_bdb48.m4 +++ b/src/m4/bitcoin_find_bdb48.m4 @@ -51,7 +51,7 @@ AC_DEFUN([BITCOIN_FIND_BDB48],[ bdbpath="${bdb48path}" fi AC_SUBST(BDB_CPPFLAGS) - + # TODO: Ideally this could find the library version and make sure it matches the headers being used for searchlib in db_cxx-4.8 db_cxx; do AC_CHECK_LIB([$searchlib],[main],[ @@ -63,4 +63,4 @@ AC_DEFUN([BITCOIN_FIND_BDB48],[ AC_MSG_ERROR(libdb_cxx missing) fi AC_SUBST(BDB_LIBS) -]) +]) \ No newline at end of file diff --git a/src/m4/bitcoin_qt.m4 b/src/m4/bitcoin_qt.m4 index d5dc3319..27615675 100644 --- a/src/m4/bitcoin_qt.m4 +++ b/src/m4/bitcoin_qt.m4 @@ -3,7 +3,7 @@ dnl Output: If qt version is auto, set bitcoin_enable_qt to false. Else, exit. AC_DEFUN([BITCOIN_QT_FAIL],[ if test "x$bitcoin_qt_want_version" = "xauto" && test x$bitcoin_qt_force != xyes; then if test x$bitcoin_enable_qt != xno; then - AC_MSG_WARN([$1; darkcoin-qt frontend will not be built]) + AC_MSG_WARN([$1; bitcoin-qt frontend will not be built]) fi bitcoin_enable_qt=no else @@ -58,12 +58,10 @@ AC_DEFUN([BITCOIN_QT_INIT],[ fi ], [bitcoin_qt_want_version=auto]) - - AC_ARG_WITH([qt-incdir],[AS_HELP_STRING([--with-qt-incdir=INC_DIR],[specify qt include path (overridden by pkgconfig)])], [qt_include_path=$withval], []) - AC_ARG_WITH([qt-libdir],[AS_HELP_STRING([--with-qt-libdir=LIB_DIR],[specify qt lib path (overridden by pkgconfig)])], [qt_lib_path=$withval], []) - AC_ARG_WITH([qt-plugindir],[AS_HELP_STRING([--with-qt-plugindir=PLUGIN_DIR],[specify qt plugin path (overridden by pkgconfig)])], [qt_plugin_path=$withval], []) - AC_ARG_WITH([qt-bindir],[AS_HELP_STRING([--with-qt-bindir=BIN_DIR],[specify qt bin path])], [qt_bin_path=$withval], []) - + AC_ARG_WITH([qt-incdir],[AS_HELP_STRING([--with-gui-incdir=INC_DIR],[specify qt include path (overridden by pkgconfig)])], [qt_include_path=$withval], []) + AC_ARG_WITH([qt-libdir],[AS_HELP_STRING([--with-gui-libdir=LIB_DIR],[specify qt lib path (overridden by pkgconfig)])], [qt_lib_path=$withval], []) + AC_ARG_WITH([qt-plugindir],[AS_HELP_STRING([--with-gui-plugindir=PLUGIN_DIR],[specify qt plugin path (overridden by pkgconfig)])], [qt_plugin_path=$withval], []) + AC_ARG_WITH([qt-bindir],[AS_HELP_STRING([--with-gui-bindir=BIN_DIR],[specify qt bin path])], [qt_bin_path=$withval], []) AC_ARG_WITH([qtdbus], [AS_HELP_STRING([--with-qtdbus], [enable DBus support (default is yes if qt is enabled and QtDBus is found)])], @@ -80,11 +78,9 @@ dnl Outputs: Sets variables for all qt-related tools. dnl Outputs: bitcoin_enable_qt, bitcoin_enable_qt_dbus, bitcoin_enable_qt_test AC_DEFUN([BITCOIN_QT_CONFIGURE],[ use_pkgconfig=$1 - if test x$use_pkgconfig == x; then use_pkgconfig=yes fi - if test x$use_pkgconfig = xyes; then if test x$PKG_CONFIG == x; then AC_MSG_ERROR(pkg-config not found.) @@ -93,19 +89,11 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[ else BITCOIN_QT_CHECK([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG]) fi - - if test x$use_pkgconfig$qt_bin_path = xyes; then - if test x$bitcoin_qt_got_major_vers = x5; then - qt_bin_path="`$PKG_CONFIG --variable=host_bins Qt5Core 2>/dev/null`" - fi - 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([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([LRELEASE], [lrelease-qt${bitcoin_qt_got_major_vers} lrelease${bitcoin_qt_got_major_vers} lrelease], $qt_bin_path) BITCOIN_QT_PATH_PROGS([LUPDATE], [lupdate-qt${bitcoin_qt_got_major_vers} lupdate${bitcoin_qt_got_major_vers} lupdate],$qt_bin_path, yes) - MOC_DEFS='-DHAVE_CONFIG_H -I$(top_srcdir)/src' case $host in *darwin*) @@ -115,27 +103,21 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[ AX_CHECK_LINK_FLAG([[$base_frameworks]],[QT_LIBS="$QT_LIBS $base_frameworks"],[AC_MSG_ERROR(could not find base frameworks)]) ]) ;; - *mingw*) - BITCOIN_QT_CHECK([ - AX_CHECK_LINK_FLAG([[-mwindows]],[QT_LDFLAGS="$QT_LDFLAGS -mwindows"],[AC_MSG_WARN(-mwindows linker support not detected)]) - ]) esac - - dnl enable qt support - AC_MSG_CHECKING(whether to build Darkcoin Core GUI) + AC_MSG_CHECKING(if GUI should be enabled) BITCOIN_QT_CHECK([ bitcoin_enable_qt=yes bitcoin_enable_qt_test=yes if test x$have_qt_test = xno; then bitcoin_enable_qt_test=no fi - bitcoin_enable_qt_dbus=no - if test x$use_dbus != xno && test x$have_qt_dbus = xyes; then - bitcoin_enable_qt_dbus=yes - fi - if test x$use_dbus = xyes && test x$have_qt_dbus = xno; then - AC_MSG_ERROR("libQtDBus not found. Install libQtDBus or remove --with-qtdbus.") + bitcoin_enable_qt_dbus=yes + if test x$have_qt_dbus = xno; then + bitcoin_enable_qt_dbus=no + if test x$use_dbus = xyes; then + AC_MSG_ERROR("libQtDBus not found. Install libQtDBus or remove --with-qtdbus.") + fi fi if test x$LUPDATE == x; then AC_MSG_WARN("lupdate is required to update qt translations") @@ -144,10 +126,8 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[ bitcoin_enable_qt=no ]) AC_MSG_RESULT([$bitcoin_enable_qt (Qt${bitcoin_qt_got_major_vers})]) - AC_SUBST(QT_INCLUDES) AC_SUBST(QT_LIBS) - AC_SUBST(QT_LDFLAGS) AC_SUBST(QT_DBUS_INCLUDES) AC_SUBST(QT_DBUS_LIBS) AC_SUBST(QT_TEST_INCLUDES) @@ -250,7 +230,6 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITH_PKGCONFIG],[ elif test x$bitcoin_qt_want_version == xqt4 || ( test x$bitcoin_qt_want_version == xauto && test x$auto_priority_version == xqt4 ); then PKG_CHECK_MODULES([QT], [$qt4_modules], [QT_INCLUDES="$QT_CFLAGS"; have_qt=yes], [have_qt=no]) fi - 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$auto_priority_version = x$qt5; then @@ -290,11 +269,9 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[ CPPFLAGS="$QT_INCLUDES $CPPFLAGS" fi ]) - BITCOIN_QT_CHECK([AC_CHECK_HEADER([QtPlugin],,BITCOIN_QT_FAIL(QtCore headers missing))]) BITCOIN_QT_CHECK([AC_CHECK_HEADER([QApplication],, BITCOIN_QT_FAIL(QtGui headers missing))]) BITCOIN_QT_CHECK([AC_CHECK_HEADER([QLocalSocket],, BITCOIN_QT_FAIL(QtNetwork headers missing))]) - BITCOIN_QT_CHECK([ if test x$bitcoin_qt_want_version = xauto; then _BITCOIN_QT_CHECK_QT5 @@ -307,7 +284,6 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[ bitcoin_qt_got_major_vers=4 fi ]) - BITCOIN_QT_CHECK([ LIBS= if test x$qt_lib_path != x; then @@ -321,12 +297,10 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[ LIBS="$LIBS -L$qt_plugin_path/codecs" fi fi - if test x$TARGET_OS == xwindows; then AC_CHECK_LIB([imm32], [main],, BITCOIN_QT_FAIL(libimm32 not found)) fi ]) - BITCOIN_QT_CHECK(AC_CHECK_LIB([z] ,[main],,BITCOIN_QT_FAIL(zlib not found))) BITCOIN_QT_CHECK(AC_CHECK_LIB([png] ,[main],,BITCOIN_QT_FAIL(png not found))) BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Core] ,[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXCore not found))) @@ -337,7 +311,6 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[ fi QT_LIBS="$LIBS" LIBS="$TEMP_LIBS" - dnl This is ugly and complicated. Yuck. Works as follows: dnl We can't discern whether Qt4 builds are static or not. For Qt5, we can dnl check a header to find out. When Qt is built statically, some plugins must @@ -368,7 +341,6 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[ [-lqcncodecs -lqjpcodecs -lqtwcodecs -lqkrcodecs -lqtaccessiblewidgets]) fi ]) - BITCOIN_QT_CHECK([ LIBS= if test x$qt_lib_path != x; then @@ -390,4 +362,3 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[ CPPFLAGS="$TEMP_CPPFLAGS" LIBS="$TEMP_LIBS" ]) - diff --git a/src/m4/bitcoin_subdir_to_include.m4 b/src/m4/bitcoin_subdir_to_include.m4 index 66f106c7..2b46ffb7 100644 --- a/src/m4/bitcoin_subdir_to_include.m4 +++ b/src/m4/bitcoin_subdir_to_include.m4 @@ -5,10 +5,8 @@ AC_DEFUN([BITCOIN_SUBDIR_TO_INCLUDE],[ AC_MSG_RESULT([default]) else echo "#include <$2$3.h>" >conftest.cpp - newinclpath=`${CXXCPP} ${CPPFLAGS} -M conftest.cpp 2>/dev/null | [ tr -d '\\n\\r\\\\' | sed -e 's/^.*[[:space:]:]\(\/[^[:space:]]*\)]$3[\.h[[:space:]].*$/\1/' -e t -e d`] + newinclpath=`${CXXCPP} -M conftest.cpp 2>/dev/null | [ tr -d '\\n\\r\\\\' | sed -e 's/^.*[[:space:]:]\(\/[^[:space:]]*\)]$3[\.h[[:space:]].*$/\1/' -e t -e d`] AC_MSG_RESULT([${newinclpath}]) - if test "x${newinclpath}" != "x"; then - eval "$1=\"\$$1\"' -I${newinclpath}'" - fi + eval "$1=\"\$$1\"' -I${newinclpath}'" fi -]) +]) \ No newline at end of file diff --git a/src/m4/libtool.m4 b/src/m4/libtool.m4 new file mode 100644 index 00000000..92060119 --- /dev/null +++ b/src/m4/libtool.m4 @@ -0,0 +1,8364 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +# +# Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc. +# Written by Gordon Matzigkeit, 1996 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +m4_define([_LT_COPYING], [dnl +# Copyright (C) 2014 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program or library that is built +# using GNU Libtool, you may include this file under the same +# distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +]) + +# serial 58 LT_INIT + + +# LT_PREREQ(VERSION) +# ------------------ +# Complain and exit if this libtool version is less that VERSION. +m4_defun([LT_PREREQ], +[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Libtool version $1 or higher is required], + 63)])], + [$2])]) + + +# _LT_CHECK_BUILDDIR +# ------------------ +# Complain if the absolute build directory name contains unusual characters +m4_defun([_LT_CHECK_BUILDDIR], +[case `pwd` in + *\ * | *\ *) + AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;; +esac +]) + + +# LT_INIT([OPTIONS]) +# ------------------ +AC_DEFUN([LT_INIT], +[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK +AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +AC_BEFORE([$0], [LT_LANG])dnl +AC_BEFORE([$0], [LT_OUTPUT])dnl +AC_BEFORE([$0], [LTDL_INIT])dnl +m4_require([_LT_CHECK_BUILDDIR])dnl + +dnl Autoconf doesn't catch unexpanded LT_ macros by default: +m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl +m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl +dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4 +dnl unless we require an AC_DEFUNed macro: +AC_REQUIRE([LTOPTIONS_VERSION])dnl +AC_REQUIRE([LTSUGAR_VERSION])dnl +AC_REQUIRE([LTVERSION_VERSION])dnl +AC_REQUIRE([LTOBSOLETE_VERSION])dnl +m4_require([_LT_PROG_LTMAIN])dnl + +_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}]) + +dnl Parse OPTIONS +_LT_SET_OPTIONS([$0], [$1]) + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS=$ltmain + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +_LT_SETUP + +# Only expand once: +m4_define([LT_INIT]) +])# LT_INIT + +# Old names: +AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT]) +AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PROG_LIBTOOL], []) +dnl AC_DEFUN([AM_PROG_LIBTOOL], []) + + +# _LT_PREPARE_CC_BASENAME +# ----------------------- +m4_defun([_LT_PREPARE_CC_BASENAME], [ +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +func_cc_basename () +{ + for cc_temp in @S|@*""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac + done + func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` +} +])# _LT_PREPARE_CC_BASENAME + + +# _LT_CC_BASENAME(CC) +# ------------------- +# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME, +# but that macro is also expanded into generated libtool script, which +# arranges for $SED and $ECHO to be set by different means. +m4_defun([_LT_CC_BASENAME], +[m4_require([_LT_PREPARE_CC_BASENAME])dnl +AC_REQUIRE([_LT_DECL_SED])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl +func_cc_basename $1 +cc_basename=$func_cc_basename_result +]) + + +# _LT_FILEUTILS_DEFAULTS +# ---------------------- +# It is okay to use these file commands and assume they have been set +# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'. +m4_defun([_LT_FILEUTILS_DEFAULTS], +[: ${CP="cp -f"} +: ${MV="mv -f"} +: ${RM="rm -f"} +])# _LT_FILEUTILS_DEFAULTS + + +# _LT_SETUP +# --------- +m4_defun([_LT_SETUP], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl + +_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl +dnl +_LT_DECL([], [host_alias], [0], [The host system])dnl +_LT_DECL([], [host], [0])dnl +_LT_DECL([], [host_os], [0])dnl +dnl +_LT_DECL([], [build_alias], [0], [The build system])dnl +_LT_DECL([], [build], [0])dnl +_LT_DECL([], [build_os], [0])dnl +dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +dnl +AC_REQUIRE([AC_PROG_LN_S])dnl +test -z "$LN_S" && LN_S="ln -s" +_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl +dnl +AC_REQUIRE([LT_CMD_MAX_LEN])dnl +_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl +_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl +dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl +m4_require([_LT_CMD_RELOAD])dnl +m4_require([_LT_CHECK_MAGIC_METHOD])dnl +m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl +m4_require([_LT_CMD_OLD_ARCHIVE])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_WITH_SYSROOT])dnl +m4_require([_LT_CMD_TRUNCATE])dnl + +_LT_CONFIG_LIBTOOL_INIT([ +# See if we are running on zsh, and set the options that allow our +# commands through without removal of \ escapes INIT. +if test -n "\${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi +]) +if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST +fi + +_LT_CHECK_OBJDIR + +m4_require([_LT_TAG_COMPILER])dnl + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Global variables: +ofile=libtool +can_build_shared=yes + +# All known linkers require a '.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a + +with_gnu_ld=$lt_cv_prog_gnu_ld + +old_CC=$CC +old_CFLAGS=$CFLAGS + +# Set sane defaults for various variables +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$LD" && LD=ld +test -z "$ac_objext" && ac_objext=o + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +test -z "$MAGIC_CMD" && MAGIC_CMD=file +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + _LT_PATH_MAGIC + fi + ;; +esac + +# Use C for the default configuration in the libtool script +LT_SUPPORTED_TAG([CC]) +_LT_LANG_C_CONFIG +_LT_LANG_DEFAULT_CONFIG +_LT_CONFIG_COMMANDS +])# _LT_SETUP + + +# _LT_PREPARE_SED_QUOTE_VARS +# -------------------------- +# Define a few sed substitution that help us do robust quoting. +m4_defun([_LT_PREPARE_SED_QUOTE_VARS], +[# Backslashify metacharacters that are still active within +# double-quoted strings. +sed_quote_subst='s/\([["`$\\]]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([["`\\]]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to delay expansion of an escaped single quote. +delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' +]) + +# _LT_PROG_LTMAIN +# --------------- +# Note that this code is called both from 'configure', and 'config.status' +# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably, +# 'config.status' has no value for ac_aux_dir unless we are using Automake, +# so we pass a copy along to make sure it has a sensible value anyway. +m4_defun([_LT_PROG_LTMAIN], +[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl +_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir']) +ltmain=$ac_aux_dir/ltmain.sh +])# _LT_PROG_LTMAIN + + +## ------------------------------------- ## +## Accumulate code for creating libtool. ## +## ------------------------------------- ## + +# So that we can recreate a full libtool script including additional +# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS +# in macros and then make a single call at the end using the 'libtool' +# label. + + +# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS]) +# ---------------------------------------- +# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL_INIT], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_INIT], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_INIT]) + + +# _LT_CONFIG_LIBTOOL([COMMANDS]) +# ------------------------------ +# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later. +m4_define([_LT_CONFIG_LIBTOOL], +[m4_ifval([$1], + [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS], + [$1 +])])]) + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS]) + + +# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS]) +# ----------------------------------------------------- +m4_defun([_LT_CONFIG_SAVE_COMMANDS], +[_LT_CONFIG_LIBTOOL([$1]) +_LT_CONFIG_LIBTOOL_INIT([$2]) +]) + + +# _LT_FORMAT_COMMENT([COMMENT]) +# ----------------------------- +# Add leading comment marks to the start of each line, and a trailing +# full-stop to the whole comment if one is not present already. +m4_define([_LT_FORMAT_COMMENT], +[m4_ifval([$1], [ +m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])], + [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.]) +)]) + + + +## ------------------------ ## +## FIXME: Eliminate VARNAME ## +## ------------------------ ## + + +# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?]) +# ------------------------------------------------------------------- +# CONFIGNAME is the name given to the value in the libtool script. +# VARNAME is the (base) name used in the configure script. +# VALUE may be 0, 1 or 2 for a computed quote escaped value based on +# VARNAME. Any other value will be used directly. +m4_define([_LT_DECL], +[lt_if_append_uniq([lt_decl_varnames], [$2], [, ], + [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name], + [m4_ifval([$1], [$1], [$2])]) + lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3]) + m4_ifval([$4], + [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])]) + lt_dict_add_subkey([lt_decl_dict], [$2], + [tagged?], [m4_ifval([$5], [yes], [no])])]) +]) + + +# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION]) +# -------------------------------------------------------- +m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])]) + + +# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_tag_varnames], +[_lt_decl_filter([tagged?], [yes], $@)]) + + +# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..]) +# --------------------------------------------------------- +m4_define([_lt_decl_filter], +[m4_case([$#], + [0], [m4_fatal([$0: too few arguments: $#])], + [1], [m4_fatal([$0: too few arguments: $#: $1])], + [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)], + [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)], + [lt_dict_filter([lt_decl_dict], $@)])[]dnl +]) + + +# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...]) +# -------------------------------------------------- +m4_define([lt_decl_quote_varnames], +[_lt_decl_filter([value], [1], $@)]) + + +# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_dquote_varnames], +[_lt_decl_filter([value], [2], $@)]) + + +# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...]) +# --------------------------------------------------- +m4_define([lt_decl_varnames_tagged], +[m4_assert([$# <= 2])dnl +_$0(m4_quote(m4_default([$1], [[, ]])), + m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]), + m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))]) +m4_define([_lt_decl_varnames_tagged], +[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])]) + + +# lt_decl_all_varnames([SEPARATOR], [VARNAME1...]) +# ------------------------------------------------ +m4_define([lt_decl_all_varnames], +[_$0(m4_quote(m4_default([$1], [[, ]])), + m4_if([$2], [], + m4_quote(lt_decl_varnames), + m4_quote(m4_shift($@))))[]dnl +]) +m4_define([_lt_decl_all_varnames], +[lt_join($@, lt_decl_varnames_tagged([$1], + lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl +]) + + +# _LT_CONFIG_STATUS_DECLARE([VARNAME]) +# ------------------------------------ +# Quote a variable value, and forward it to 'config.status' so that its +# declaration there will have the same value as in 'configure'. VARNAME +# must have a single quote delimited value for this to work. +m4_define([_LT_CONFIG_STATUS_DECLARE], +[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`']) + + +# _LT_CONFIG_STATUS_DECLARATIONS +# ------------------------------ +# We delimit libtool config variables with single quotes, so when +# we write them to config.status, we have to be sure to quote all +# embedded single quotes properly. In configure, this macro expands +# each variable declared with _LT_DECL (and _LT_TAGDECL) into: +# +# ='`$ECHO "$" | $SED "$delay_single_quote_subst"`' +m4_defun([_LT_CONFIG_STATUS_DECLARATIONS], +[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames), + [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAGS +# ---------------- +# Output comment and list of tags supported by the script +m4_defun([_LT_LIBTOOL_TAGS], +[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl +available_tags='_LT_TAGS'dnl +]) + + +# _LT_LIBTOOL_DECLARE(VARNAME, [TAG]) +# ----------------------------------- +# Extract the dictionary values for VARNAME (optionally with TAG) and +# expand to a commented shell variable setting: +# +# # Some comment about what VAR is for. +# visible_name=$lt_internal_name +m4_define([_LT_LIBTOOL_DECLARE], +[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], + [description])))[]dnl +m4_pushdef([_libtool_name], + m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl +m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])), + [0], [_libtool_name=[$]$1], + [1], [_libtool_name=$lt_[]$1], + [2], [_libtool_name=$lt_[]$1], + [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl +m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl +]) + + +# _LT_LIBTOOL_CONFIG_VARS +# ----------------------- +# Produce commented declarations of non-tagged libtool config variables +# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool' +# script. Tagged libtool config variables (even for the LIBTOOL CONFIG +# section) are produced by _LT_LIBTOOL_TAG_VARS. +m4_defun([_LT_LIBTOOL_CONFIG_VARS], +[m4_foreach([_lt_var], + m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])]) + + +# _LT_LIBTOOL_TAG_VARS(TAG) +# ------------------------- +m4_define([_LT_LIBTOOL_TAG_VARS], +[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames), + [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])]) + + +# _LT_TAGVAR(VARNAME, [TAGNAME]) +# ------------------------------ +m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])]) + + +# _LT_CONFIG_COMMANDS +# ------------------- +# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of +# variables for single and double quote escaping we saved from calls +# to _LT_DECL, we can put quote escaped variables declarations +# into 'config.status', and then the shell code to quote escape them in +# for loops in 'config.status'. Finally, any additional code accumulated +# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded. +m4_defun([_LT_CONFIG_COMMANDS], +[AC_PROVIDE_IFELSE([LT_OUTPUT], + dnl If the libtool generation code has been placed in $CONFIG_LT, + dnl instead of duplicating it all over again into config.status, + dnl then we will have config.status run $CONFIG_LT later, so it + dnl needs to know what name is stored there: + [AC_CONFIG_COMMANDS([libtool], + [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])], + dnl If the libtool generation code is destined for config.status, + dnl expand the accumulated commands and init code now: + [AC_CONFIG_COMMANDS([libtool], + [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])]) +])#_LT_CONFIG_COMMANDS + + +# Initialize. +m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT], +[ + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +sed_quote_subst='$sed_quote_subst' +double_quote_subst='$double_quote_subst' +delay_variable_subst='$delay_variable_subst' +_LT_CONFIG_STATUS_DECLARATIONS +LTCC='$LTCC' +LTCFLAGS='$LTCFLAGS' +compiler='$compiler_DEFAULT' + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$[]1 +_LTECHO_EOF' +} + +# Quote evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_quote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +# Double-quote double-evaled strings. +for var in lt_decl_all_varnames([[ \ +]], lt_decl_dquote_varnames); do + case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in + *[[\\\\\\\`\\"\\\$]]*) + eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes + ;; + *) + eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\"" + ;; + esac +done + +_LT_OUTPUT_LIBTOOL_INIT +]) + +# _LT_GENERATED_FILE_INIT(FILE, [COMMENT]) +# ------------------------------------ +# Generate a child script FILE with all initialization necessary to +# reuse the environment learned by the parent script, and make the +# file executable. If COMMENT is supplied, it is inserted after the +# '#!' sequence but before initialization text begins. After this +# macro, additional text can be appended to FILE to form the body of +# the child script. The macro ends with non-zero status if the +# file could not be fully written (such as if the disk is full). +m4_ifdef([AS_INIT_GENERATED], +[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])], +[m4_defun([_LT_GENERATED_FILE_INIT], +[m4_require([AS_PREPARE])]dnl +[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl +[lt_write_fail=0 +cat >$1 <<_ASEOF || lt_write_fail=1 +#! $SHELL +# Generated by $as_me. +$2 +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$1 <<\_ASEOF || lt_write_fail=1 +AS_SHELL_SANITIZE +_AS_PREPARE +exec AS_MESSAGE_FD>&1 +_ASEOF +test 0 = "$lt_write_fail" && chmod +x $1[]dnl +m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT + +# LT_OUTPUT +# --------- +# This macro allows early generation of the libtool script (before +# AC_OUTPUT is called), incase it is used in configure for compilation +# tests. +AC_DEFUN([LT_OUTPUT], +[: ${CONFIG_LT=./config.lt} +AC_MSG_NOTICE([creating $CONFIG_LT]) +_LT_GENERATED_FILE_INIT(["$CONFIG_LT"], +[# Run this file to recreate a libtool stub with the current configuration.]) + +cat >>"$CONFIG_LT" <<\_LTEOF +lt_cl_silent=false +exec AS_MESSAGE_LOG_FD>>config.log +{ + echo + AS_BOX([Running $as_me.]) +} >&AS_MESSAGE_LOG_FD + +lt_cl_help="\ +'$as_me' creates a local libtool stub from the current configuration, +for use in further configure time tests before the real libtool is +generated. + +Usage: $[0] [[OPTIONS]] + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + +Report bugs to ." + +lt_cl_version="\ +m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl +m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION]) +configured by $[0], generated by m4_PACKAGE_STRING. + +Copyright (C) 2011 Free Software Foundation, Inc. +This config.lt script is free software; the Free Software Foundation +gives unlimited permision to copy, distribute and modify it." + +while test 0 != $[#] +do + case $[1] in + --version | --v* | -V ) + echo "$lt_cl_version"; exit 0 ;; + --help | --h* | -h ) + echo "$lt_cl_help"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --quiet | --q* | --silent | --s* | -q ) + lt_cl_silent=: ;; + + -*) AC_MSG_ERROR([unrecognized option: $[1] +Try '$[0] --help' for more information.]) ;; + + *) AC_MSG_ERROR([unrecognized argument: $[1] +Try '$[0] --help' for more information.]) ;; + esac + shift +done + +if $lt_cl_silent; then + exec AS_MESSAGE_FD>/dev/null +fi +_LTEOF + +cat >>"$CONFIG_LT" <<_LTEOF +_LT_OUTPUT_LIBTOOL_COMMANDS_INIT +_LTEOF + +cat >>"$CONFIG_LT" <<\_LTEOF +AC_MSG_NOTICE([creating $ofile]) +_LT_OUTPUT_LIBTOOL_COMMANDS +AS_EXIT(0) +_LTEOF +chmod +x "$CONFIG_LT" + +# configure is writing to config.log, but config.lt does its own redirection, +# appending to config.log, which fails on DOS, as config.log is still kept +# open by configure. Here we exec the FD to /dev/null, effectively closing +# config.log, so it can be properly (re)opened and appended to by config.lt. +lt_cl_success=: +test yes = "$silent" && + lt_config_lt_args="$lt_config_lt_args --quiet" +exec AS_MESSAGE_LOG_FD>/dev/null +$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false +exec AS_MESSAGE_LOG_FD>>config.log +$lt_cl_success || AS_EXIT(1) +])# LT_OUTPUT + + +# _LT_CONFIG(TAG) +# --------------- +# If TAG is the built-in tag, create an initial libtool script with a +# default configuration from the untagged config vars. Otherwise add code +# to config.status for appending the configuration named by TAG from the +# matching tagged config vars. +m4_defun([_LT_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_CONFIG_SAVE_COMMANDS([ + m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl + m4_if(_LT_TAG, [C], [ + # See if we are running on zsh, and set the options that allow our + # commands through without removal of \ escapes. + if test -n "${ZSH_VERSION+set}"; then + setopt NO_GLOB_SUBST + fi + + cfgfile=${ofile}T + trap "$RM \"$cfgfile\"; exit 1" 1 2 15 + $RM "$cfgfile" + + cat <<_LT_EOF >> "$cfgfile" +#! $SHELL +# Generated automatically by $as_me ($PACKAGE) $VERSION +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# NOTE: Changes made to this file will be lost: look at ltmain.sh. + +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit, 1996 + +_LT_COPYING +_LT_LIBTOOL_TAGS + +# Configured defaults for sys_lib_dlsearch_path munging. +: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} + +# ### BEGIN LIBTOOL CONFIG +_LT_LIBTOOL_CONFIG_VARS +_LT_LIBTOOL_TAG_VARS +# ### END LIBTOOL CONFIG + +_LT_EOF + + cat <<'_LT_EOF' >> "$cfgfile" + +# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE + +_LT_PREPARE_MUNGE_PATH_LIST +_LT_PREPARE_CC_BASENAME + +# ### END FUNCTIONS SHARED WITH CONFIGURE + +_LT_EOF + + case $host_os in + aix3*) + cat <<\_LT_EOF >> "$cfgfile" +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test set != "${COLLECT_NAMES+set}"; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +_LT_EOF + ;; + esac + + _LT_PROG_LTMAIN + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" \ + || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +], +[cat <<_LT_EOF >> "$ofile" + +dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded +dnl in a comment (ie after a #). +# ### BEGIN LIBTOOL TAG CONFIG: $1 +_LT_LIBTOOL_TAG_VARS(_LT_TAG) +# ### END LIBTOOL TAG CONFIG: $1 +_LT_EOF +])dnl /m4_if +], +[m4_if([$1], [], [ + PACKAGE='$PACKAGE' + VERSION='$VERSION' + RM='$RM' + ofile='$ofile'], []) +])dnl /_LT_CONFIG_SAVE_COMMANDS +])# _LT_CONFIG + + +# LT_SUPPORTED_TAG(TAG) +# --------------------- +# Trace this macro to discover what tags are supported by the libtool +# --tag option, using: +# autoconf --trace 'LT_SUPPORTED_TAG:$1' +AC_DEFUN([LT_SUPPORTED_TAG], []) + + +# C support is built-in for now +m4_define([_LT_LANG_C_enabled], []) +m4_define([_LT_TAGS], []) + + +# LT_LANG(LANG) +# ------------- +# Enable libtool support for the given language if not already enabled. +AC_DEFUN([LT_LANG], +[AC_BEFORE([$0], [LT_OUTPUT])dnl +m4_case([$1], + [C], [_LT_LANG(C)], + [C++], [_LT_LANG(CXX)], + [Go], [_LT_LANG(GO)], + [Java], [_LT_LANG(GCJ)], + [Fortran 77], [_LT_LANG(F77)], + [Fortran], [_LT_LANG(FC)], + [Windows Resource], [_LT_LANG(RC)], + [m4_ifdef([_LT_LANG_]$1[_CONFIG], + [_LT_LANG($1)], + [m4_fatal([$0: unsupported language: "$1"])])])dnl +])# LT_LANG + + +# _LT_LANG(LANGNAME) +# ------------------ +m4_defun([_LT_LANG], +[m4_ifdef([_LT_LANG_]$1[_enabled], [], + [LT_SUPPORTED_TAG([$1])dnl + m4_append([_LT_TAGS], [$1 ])dnl + m4_define([_LT_LANG_]$1[_enabled], [])dnl + _LT_LANG_$1_CONFIG($1)])dnl +])# _LT_LANG + + +m4_ifndef([AC_PROG_GO], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_GO. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +m4_defun([AC_PROG_GO], +[AC_LANG_PUSH(Go)dnl +AC_ARG_VAR([GOC], [Go compiler command])dnl +AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl +_AC_ARG_VAR_LDFLAGS()dnl +AC_CHECK_TOOL(GOC, gccgo) +if test -z "$GOC"; then + if test -n "$ac_tool_prefix"; then + AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo]) + fi +fi +if test -z "$GOC"; then + AC_CHECK_PROG(GOC, gccgo, gccgo, false) +fi +])#m4_defun +])#m4_ifndef + + +# _LT_LANG_DEFAULT_CONFIG +# ----------------------- +m4_defun([_LT_LANG_DEFAULT_CONFIG], +[AC_PROVIDE_IFELSE([AC_PROG_CXX], + [LT_LANG(CXX)], + [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])]) + +AC_PROVIDE_IFELSE([AC_PROG_F77], + [LT_LANG(F77)], + [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])]) + +AC_PROVIDE_IFELSE([AC_PROG_FC], + [LT_LANG(FC)], + [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])]) + +dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal +dnl pulling things in needlessly. +AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [LT_LANG(GCJ)], + [AC_PROVIDE_IFELSE([LT_PROG_GCJ], + [LT_LANG(GCJ)], + [m4_ifdef([AC_PROG_GCJ], + [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([A][M_PROG_GCJ], + [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])]) + m4_ifdef([LT_PROG_GCJ], + [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])]) + +AC_PROVIDE_IFELSE([AC_PROG_GO], + [LT_LANG(GO)], + [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])]) + +AC_PROVIDE_IFELSE([LT_PROG_RC], + [LT_LANG(RC)], + [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])]) +])# _LT_LANG_DEFAULT_CONFIG + +# Obsolete macros: +AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)]) +AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)]) +AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)]) +AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)]) +AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_CXX], []) +dnl AC_DEFUN([AC_LIBTOOL_F77], []) +dnl AC_DEFUN([AC_LIBTOOL_FC], []) +dnl AC_DEFUN([AC_LIBTOOL_GCJ], []) +dnl AC_DEFUN([AC_LIBTOOL_RC], []) + + +# _LT_TAG_COMPILER +# ---------------- +m4_defun([_LT_TAG_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl +_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl +_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl +_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_TAG_COMPILER + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +m4_defun([_LT_COMPILER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$RM conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +m4_defun([_LT_LINKER_BOILERPLATE], +[m4_require([_LT_DECL_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$RM -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# ------------------------- +m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + AC_CHECK_TOOL([LIPO], [lipo], [:]) + AC_CHECK_TOOL([OTOOL], [otool], [:]) + AC_CHECK_TOOL([OTOOL64], [otool64], [:]) + _LT_DECL([], [DSYMUTIL], [1], + [Tool to manipulate archived DWARF debug symbol files on Mac OS X]) + _LT_DECL([], [NMEDIT], [1], + [Tool to change global to local symbols on Mac OS X]) + _LT_DECL([], [LIPO], [1], + [Tool to manipulate fat objects and archives on Mac OS X]) + _LT_DECL([], [OTOOL], [1], + [ldd/readelf like tool for Mach-O binaries on Mac OS X]) + _LT_DECL([], [OTOOL64], [1], + [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "$LT_MULTI_MODULE"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + rm -rf libconftest.dylib* + echo "int foo(void){return 1;}" > conftest.c + echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ +-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib -Wl,-single_module conftest.c 2>conftest.err + _lt_result=$? + # If there is a non-empty error log, and "single_module" + # appears in it, assume the flag caused a linker warning + if test -s conftest.err && $GREP single_module conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + # Otherwise, if the output was created with a 0 exit code from + # the compiler, it worked. + elif test -f libconftest.dylib && test 0 = "$_lt_result"; then + lt_cv_apple_cc_single_mod=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -rf libconftest.dylib* + rm -f conftest.* + fi]) + + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS=$save_LDFLAGS + ]) + + AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load], + [lt_cv_ld_force_load=no + cat > conftest.c << _LT_EOF +int forced_loaded() { return 2;} +_LT_EOF + echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD + echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD + $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD + echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD + $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD + cat > conftest.c << _LT_EOF +int main() { return 0;} +_LT_EOF + echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD + $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err + _lt_result=$? + if test -s conftest.err && $GREP force_load conftest.err; then + cat conftest.err >&AS_MESSAGE_LOG_FD + elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then + lt_cv_ld_force_load=yes + else + cat conftest.err >&AS_MESSAGE_LOG_FD + fi + rm -f conftest.err libconftest.a conftest conftest.c + rm -rf conftest.dSYM + ]) + case $host_os in + rhapsody* | darwin1.[[012]]) + _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + darwin*) + case ${MACOSX_DEPLOYMENT_TARGET},$host in + 10.[[012]],*|,*powerpc*) + _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;; + *) + _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test yes = "$lt_cv_apple_cc_single_mod"; then + _lt_dar_single_mod='$single_module' + fi + if test yes = "$lt_cv_ld_exported_symbols_list"; then + _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym' + else + _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib' + fi + if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then + _lt_dsymutil='~$DSYMUTIL $lib || :' + else + _lt_dsymutil= + fi + ;; + esac +]) + + +# _LT_DARWIN_LINKER_FEATURES([TAG]) +# --------------------------------- +# Checks for linker and compiler features on darwin +m4_defun([_LT_DARWIN_LINKER_FEATURES], +[ + m4_require([_LT_REQUIRED_DARWIN_CHECKS]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_automatic, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + if test yes = "$lt_cv_ld_force_load"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`' + m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes], + [FC], [_LT_TAGVAR(compiler_needs_object, $1)=yes]) + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='' + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined + case $cc_basename in + ifort*|nagfor*) _lt_dar_can_shared=yes ;; + *) _lt_dar_can_shared=$GCC ;; + esac + if test yes = "$_lt_dar_can_shared"; then + output_verbose_link_cmd=func_echo_all + _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil" + _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil" + _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil" + m4_if([$1], [CXX], +[ if test yes != "$lt_cv_apple_cc_single_mod"; then + _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil" + _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil" + fi +],[]) + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi +]) + +# _LT_SYS_MODULE_PATH_AIX([TAGNAME]) +# ---------------------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# Store the results from the different compilers for each TAGNAME. +# Allow to override them for all tags through lt_cv_aix_libpath. +m4_defun([_LT_SYS_MODULE_PATH_AIX], +[m4_require([_LT_DECL_SED])dnl +if test set = "${lt_cv_aix_libpath+set}"; then + aix_libpath=$lt_cv_aix_libpath +else + AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])], + [AC_LINK_IFELSE([AC_LANG_PROGRAM],[ + lt_aix_libpath_sed='[ + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\([^ ]*\) *$/\1/ + p + } + }]' + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + # Check for a 64-bit object if we didn't find anything. + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` + fi],[]) + if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then + _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib + fi + ]) + aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1]) +fi +])# _LT_SYS_MODULE_PATH_AIX + + +# _LT_SHELL_INIT(ARG) +# ------------------- +m4_define([_LT_SHELL_INIT], +[m4_divert_text([M4SH-INIT], [$1 +])])# _LT_SHELL_INIT + + + +# _LT_PROG_ECHO_BACKSLASH +# ----------------------- +# Find how we can fake an echo command that does not interpret backslash. +# In particular, with Autoconf 2.60 or later we add some code to the start +# of the generated configure script that will find a shell with a builtin +# printf (that we can use as an echo command). +m4_defun([_LT_PROG_ECHO_BACKSLASH], +[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO +ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + +AC_MSG_CHECKING([how to print strings]) +# Test print first, because it will be a builtin if present. +if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \ + test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='print -r --' +elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then + ECHO='printf %s\n' +else + # Use this function as a fallback that always works. + func_fallback_echo () + { + eval 'cat <<_LTECHO_EOF +$[]1 +_LTECHO_EOF' + } + ECHO='func_fallback_echo' +fi + +# func_echo_all arg... +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + +case $ECHO in + printf*) AC_MSG_RESULT([printf]) ;; + print*) AC_MSG_RESULT([print -r]) ;; + *) AC_MSG_RESULT([cat]) ;; +esac + +m4_ifdef([_AS_DETECT_SUGGESTED], +[_AS_DETECT_SUGGESTED([ + test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || ( + ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO + ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO + PATH=/empty FPATH=/empty; export PATH FPATH + test "X`printf %s $ECHO`" = "X$ECHO" \ + || test "X`print -r -- $ECHO`" = "X$ECHO" )])]) + +_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts]) +_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes]) +])# _LT_PROG_ECHO_BACKSLASH + + +# _LT_WITH_SYSROOT +# ---------------- +AC_DEFUN([_LT_WITH_SYSROOT], +[AC_MSG_CHECKING([for sysroot]) +AC_ARG_WITH([sysroot], +[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@], + [Search for dependent libraries within DIR (or the compiler's sysroot + if not specified).])], +[], [with_sysroot=no]) + +dnl lt_sysroot will always be passed unquoted. We quote it here +dnl in case the user passed a directory name. +lt_sysroot= +case $with_sysroot in #( + yes) + if test yes = "$GCC"; then + lt_sysroot=`$CC --print-sysroot 2>/dev/null` + fi + ;; #( + /*) + lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"` + ;; #( + no|'') + ;; #( + *) + AC_MSG_RESULT([$with_sysroot]) + AC_MSG_ERROR([The sysroot must be an absolute path.]) + ;; +esac + + AC_MSG_RESULT([${lt_sysroot:-no}]) +_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl +[dependent libraries, and where our libraries should be installed.])]) + +# _LT_ENABLE_LOCK +# --------------- +m4_defun([_LT_ENABLE_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AS_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test no = "$enable_libtool_lock" || enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out what ABI is being produced by ac_compile, and set mode + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE=32 + ;; + *ELF-64*) + HPUX_IA64_MODE=64 + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test yes = "$lt_cv_prog_gnu_ld"; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +mips64*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + emul=elf + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + emul="${emul}32" + ;; + *64-bit*) + emul="${emul}64" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *MSB*) + emul="${emul}btsmip" + ;; + *LSB*) + emul="${emul}ltsmip" + ;; + esac + case `/usr/bin/file conftest.$ac_objext` in + *N32*) + emul="${emul}n32" + ;; + esac + LD="${LD-ld} -m $emul" + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \ +s390*-*linux*|s390*-*tpf*|sparc*-*linux*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. Note that the listed cases only cover the + # situations where additional linker options are needed (such as when + # doing 32-bit compilation for a host where ld defaults to 64-bit, or + # vice versa); the common cases where no linker options are needed do + # not appear in the list. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + case `/usr/bin/file conftest.o` in + *x86-64*) + LD="${LD-ld} -m elf32_x86_64" + ;; + *) + LD="${LD-ld} -m elf_i386" + ;; + esac + ;; + powerpc64le-*linux*) + LD="${LD-ld} -m elf32lppclinux" + ;; + powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + powerpcle-*linux*) + LD="${LD-ld} -m elf64lppc" + ;; + powerpc-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*|s390*-*tpf*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS=$CFLAGS + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test yes != "$lt_cv_cc_needs_belf"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS=$SAVE_CFLAGS + fi + ;; +*-*solaris*) + # Find out what ABI is being produced by ac_compile, and set linker + # options accordingly. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) + case $host in + i?86-*-solaris*|x86_64-*-solaris*) + LD="${LD-ld} -m elf_x86_64" + ;; + sparc*-*-solaris*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + # GNU ld 2.21 introduced _sol2 emulations. Use them if available. + if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then + LD=${LD-ld}_sol2 + fi + ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; +esac + +need_locks=$enable_libtool_lock +])# _LT_ENABLE_LOCK + + +# _LT_PROG_AR +# ----------- +m4_defun([_LT_PROG_AR], +[AC_CHECK_TOOLS(AR, [ar], false) +: ${AR=ar} +: ${AR_FLAGS=cru} +_LT_DECL([], [AR], [1], [The archiver]) +_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive]) + +AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file], + [lt_cv_ar_at_file=no + AC_COMPILE_IFELSE([AC_LANG_PROGRAM], + [echo conftest.$ac_objext > conftest.lst + lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD' + AC_TRY_EVAL([lt_ar_try]) + if test 0 -eq "$ac_status"; then + # Ensure the archiver fails upon bogus file names. + rm -f conftest.$ac_objext libconftest.a + AC_TRY_EVAL([lt_ar_try]) + if test 0 -ne "$ac_status"; then + lt_cv_ar_at_file=@ + fi + fi + rm -f conftest.* libconftest.a + ]) + ]) + +if test no = "$lt_cv_ar_at_file"; then + archiver_list_spec= +else + archiver_list_spec=$lt_cv_ar_at_file +fi +_LT_DECL([], [archiver_list_spec], [1], + [How to feed a file listing to the archiver]) +])# _LT_PROG_AR + + +# _LT_CMD_OLD_ARCHIVE +# ------------------- +m4_defun([_LT_CMD_OLD_ARCHIVE], +[_LT_PROG_AR + +AC_CHECK_TOOL(STRIP, strip, :) +test -z "$STRIP" && STRIP=: +_LT_DECL([], [STRIP], [1], [A symbol stripping program]) + +AC_CHECK_TOOL(RANLIB, ranlib, :) +test -z "$RANLIB" && RANLIB=: +_LT_DECL([], [RANLIB], [1], + [Commands used to install an old-style archive]) + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + bitrig* | openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib" +fi + +case $host_os in + darwin*) + lock_old_archive_extraction=yes ;; + *) + lock_old_archive_extraction=no ;; +esac +_LT_DECL([], [old_postinstall_cmds], [2]) +_LT_DECL([], [old_postuninstall_cmds], [2]) +_LT_TAGDECL([], [old_archive_cmds], [2], + [Commands used to build an old-style archive]) +_LT_DECL([], [lock_old_archive_extraction], [0], + [Whether to use a lock for old archive extraction]) +])# _LT_CMD_OLD_ARCHIVE + + +# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([_LT_COMPILER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" ## exclude from sc_useless_quotes_in_assignment + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $RM conftest* +]) + +if test yes = "[$]$2"; then + m4_if([$5], , :, [$5]) +else + m4_if([$6], , :, [$6]) +fi +])# _LT_COMPILER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], []) + + +# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------- +# Check whether the given linker option works +AC_DEFUN([_LT_LINKER_OPTION], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $RM -r conftest* + LDFLAGS=$save_LDFLAGS +]) + +if test yes = "[$]$2"; then + m4_if([$4], , :, [$4]) +else + m4_if([$5], , :, [$5]) +fi +])# _LT_LINKER_OPTION + +# Old name: +AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], []) + + +# LT_CMD_MAX_LEN +#--------------- +AC_DEFUN([LT_CMD_MAX_LEN], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring=ABCD + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw* | cegcc*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + mint*) + # On MiNT this can take a long time and run out of memory. + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + os2*) + # The test takes a long time on OS/2. + lt_cv_sys_max_cmd_len=8192 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len" && \ + test undefined != "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + # Make teststring a little bigger before we do anything with it. + # a 1K string should be a reasonable start. + for i in 1 2 3 4 5 6 7 8; do + teststring=$teststring$teststring + done + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + # If test is not a shell built-in, we'll probably end up computing a + # maximum length that is only half of the actual maximum length, but + # we can't tell. + while { test X`env echo "$teststring$teststring" 2>/dev/null` \ + = "X$teststring$teststring"; } >/dev/null 2>&1 && + test 17 != "$i" # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + # Only check the string length outside the loop. + lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1` + teststring= + # Add a significant safety factor because C++ compilers can tack on + # massive amounts of additional arguments before passing them to the + # linker. It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n "$lt_cv_sys_max_cmd_len"; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +max_cmd_len=$lt_cv_sys_max_cmd_len +_LT_DECL([], [max_cmd_len], [0], + [What is the maximum length of a command?]) +])# LT_CMD_MAX_LEN + +# Old name: +AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], []) + + +# _LT_HEADER_DLFCN +# ---------------- +m4_defun([_LT_HEADER_DLFCN], +[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl +])# _LT_HEADER_DLFCN + + +# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# ---------------------------------------------------------------- +m4_defun([_LT_TRY_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes = "$cross_compiling"; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +[#line $LINENO "configure" +#include "confdefs.h" + +#if HAVE_DLFCN_H +#include +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +/* When -fvisibility=hidden is used, assume the code has been annotated + correspondingly for the symbols needed. */ +#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3)) +int fnord () __attribute__((visibility("default"))); +#endif + +int fnord () { return 42; } +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else + { + if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + else puts (dlerror ()); + } + /* dlclose (self); */ + } + else + puts (dlerror ()); + + return status; +}] +_LT_EOF + if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_TRY_DLOPEN_SELF + + +# LT_SYS_DLOPEN_SELF +# ------------------ +AC_DEFUN([LT_SYS_DLOPEN_SELF], +[m4_require([_LT_HEADER_DLFCN])dnl +if test yes != "$enable_dlopen"; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen=load_add_on + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32* | cegcc*) + lt_cv_dlopen=LoadLibrary + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[ + lt_cv_dlopen=dyld + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + tpf*) + # Don't try to run any link tests for TPF. We know it's impossible + # because TPF is a cross-compiler, and we know how we open DSOs. + lt_cv_dlopen=dlopen + lt_cv_dlopen_libs= + lt_cv_dlopen_self=no + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen=shl_load], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen=dlopen], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test no = "$lt_cv_dlopen"; then + enable_dlopen=no + else + enable_dlopen=yes + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS=$CPPFLAGS + test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS=$LDFLAGS + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS=$LIBS + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test yes = "$lt_cv_dlopen_self"; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS=$save_CPPFLAGS + LDFLAGS=$save_LDFLAGS + LIBS=$save_LIBS + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +_LT_DECL([dlopen_support], [enable_dlopen], [0], + [Whether dlopen is supported]) +_LT_DECL([dlopen_self], [enable_dlopen_self], [0], + [Whether dlopen of programs is supported]) +_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0], + [Whether dlopen of statically linked programs is supported]) +])# LT_SYS_DLOPEN_SELF + +# Old name: +AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], []) + + +# _LT_COMPILER_C_O([TAGNAME]) +# --------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler. +# This macro does not hard code the compiler like AC_PROG_CC_C_O. +m4_defun([_LT_COMPILER_C_O], +[m4_require([_LT_DECL_SED])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $RM -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $RM conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files + $RM out/* && rmdir out + cd .. + $RM -r conftest + $RM conftest* +]) +_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1], + [Does compiler simultaneously support -c and -o options?]) +])# _LT_COMPILER_C_O + + +# _LT_COMPILER_FILE_LOCKS([TAGNAME]) +# ---------------------------------- +# Check to see if we can do hard links to lock some files if needed +m4_defun([_LT_COMPILER_FILE_LOCKS], +[m4_require([_LT_ENABLE_LOCK])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +_LT_COMPILER_C_O([$1]) + +hard_links=nottested +if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $RM conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test no = "$hard_links"; then + AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?]) +])# _LT_COMPILER_FILE_LOCKS + + +# _LT_CHECK_OBJDIR +# ---------------- +m4_defun([_LT_CHECK_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +_LT_DECL([], [objdir], [0], + [The name of the directory that contains temporary libtool files])dnl +m4_pattern_allow([LT_OBJDIR])dnl +AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/", + [Define to the sub-directory where libtool stores uninstalled libraries.]) +])# _LT_CHECK_OBJDIR + + +# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME]) +# -------------------------------------- +# Check hardcoding attributes. +m4_defun([_LT_LINKER_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" || + test -n "$_LT_TAGVAR(runpath_var, $1)" || + test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then + + # We can hardcode non-existent directories. + if test no != "$_LT_TAGVAR(hardcode_direct, $1)" && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" && + test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then + # Linking always hardcodes the temporary library directory. + _LT_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)]) + +if test relink = "$_LT_TAGVAR(hardcode_action, $1)" || + test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then + # Fast installation is not supported + enable_fast_install=no +elif test yes = "$shlibpath_overrides_runpath" || + test no = "$enable_shared"; then + # Fast installation is not necessary + enable_fast_install=needless +fi +_LT_TAGDECL([], [hardcode_action], [0], + [How to hardcode a shared library path into an executable]) +])# _LT_LINKER_HARDCODE_LIBPATH + + +# _LT_CMD_STRIPLIB +# ---------------- +m4_defun([_LT_CMD_STRIPLIB], +[m4_require([_LT_DECL_EGREP]) +striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP"; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +_LT_DECL([], [old_striplib], [1], [Commands to strip libraries]) +_LT_DECL([], [striplib], [1]) +])# _LT_CMD_STRIPLIB + + +# _LT_PREPARE_MUNGE_PATH_LIST +# --------------------------- +# Make sure func_munge_path_list() is defined correctly. +m4_defun([_LT_PREPARE_MUNGE_PATH_LIST], +[[# func_munge_path_list VARIABLE PATH +# ----------------------------------- +# VARIABLE is name of variable containing _space_ separated list of +# directories to be munged by the contents of PATH, which is string +# having a format: +# "DIR[:DIR]:" +# string "DIR[ DIR]" will be prepended to VARIABLE +# ":DIR[:DIR]" +# string "DIR[ DIR]" will be appended to VARIABLE +# "DIRP[:DIRP]::[DIRA:]DIRA" +# string "DIRP[ DIRP]" will be prepended to VARIABLE and string +# "DIRA[ DIRA]" will be appended to VARIABLE +# "DIR[:DIR]" +# VARIABLE will be replaced by "DIR[ DIR]" +func_munge_path_list () +{ + case x@S|@2 in + x) + ;; + *:) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\" + ;; + x:*) + eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + *::*) + eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" + eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\" + ;; + *) + eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\" + ;; + esac +} +]])# _LT_PREPARE_PATH_LIST + + +# _LT_SYS_DYNAMIC_LINKER([TAG]) +# ----------------------------- +# PORTME Fill in your ld.so characteristics +m4_defun([_LT_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_OBJDUMP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CHECK_SHELL_FEATURES])dnl +m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +m4_if([$1], + [], [ +if test yes = "$GCC"; then + case $host_os in + darwin*) lt_awk_arg='/^libraries:/,/LR/' ;; + *) lt_awk_arg='/^libraries:/' ;; + esac + case $host_os in + mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;; + *) lt_sed_strip_eq='s|=/|/|g' ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq` + case $lt_search_path_spec in + *\;*) + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'` + ;; + *) + lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"` + ;; + esac + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary... + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + # ...but if some path component already ends with the multilib dir we assume + # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer). + case "$lt_multi_os_dir; $lt_search_path_spec " in + "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*) + lt_multi_os_dir= + ;; + esac + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir" + elif test -n "$lt_multi_os_dir"; then + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk ' +BEGIN {RS = " "; FS = "/|\n";} { + lt_foo = ""; + lt_count = 0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo = "/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + # AWK program above erroneously prepends '/' to C:/dos/paths + # for these hosts. + case $host_os in + mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\ + $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;; + esac + sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=.so +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +AC_ARG_VAR([LT_SYS_LIBRARY_PATH], +[User-defined run-time library search path.]) + +case $host_os in +aix3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='$libname$release$shared_ext$major' + ;; + +aix[[4-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test ia64 = "$host_cpu"; then + # AIX 5 supports IA64 + library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line '#! .'. This would cause the generated library to + # depend on '.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # Using Import Files as archive members, it is possible to support + # filename-based versioning of shared library archives on AIX. While + # this would work for both with and without runtime linking, it will + # prevent static linking of such archives. So we do filename-based + # shared library versioning with .so extension only, which is used + # when both runtime linking and shared linking is enabled. + # Unfortunately, runtime linking may impact performance, so we do + # not want this to be the default eventually. Also, we use the + # versioned .so libs for executables only if there is the -brtl + # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only. + # To allow for filename-based versioning support, we need to create + # libNAME.so.V as an archive file, containing: + # *) an Import File, referring to the versioned filename of the + # archive as well as the shared archive member, telling the + # bitwidth (32 or 64) of that shared object, and providing the + # list of exported symbols of that shared object, eventually + # decorated with the 'weak' keyword + # *) the shared object with the F_LOADONLY flag set, to really avoid + # it being seen by the linker. + # At run time we better use the real file rather than another symlink, + # but for link time we create the symlink libNAME.so -> libNAME.so.V + + case $with_aix_soname,$aix_use_runtimelinking in + # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + aix,yes) # traditional libtool + dynamic_linker='AIX unversionable lib.so' + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + aix,no) # traditional AIX only + dynamic_linker='AIX lib.a[(]lib.so.V[)]' + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + ;; + svr4,*) # full svr4 only + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,yes) # both, prefer svr4 + dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]" + library_names_spec='$libname$release$shared_ext$major $libname$shared_ext' + # unpreferred sharedlib libNAME.a needs extra handling + postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"' + postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"' + # We do not specify a path in Import Files, so LIBPATH fires. + shlibpath_overrides_runpath=yes + ;; + *,no) # both, prefer aix + dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]" + library_names_spec='$libname$release.a $libname.a' + soname_spec='$libname$release$shared_ext$major' + # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling + postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)' + postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"' + ;; + esac + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + case $host_cpu in + powerpc) + # Since July 2007 AmigaOS4 officially supports .so libraries. + # When compiling the executable, add -use-dynld -Lsobjs: to the compileline. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + ;; + m68k) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + esac + ;; + +beos*) + library_names_spec='$libname$shared_ext' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32* | cegcc*) + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + + case $GCC,$cc_basename in + yes,*) + # gcc + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"]) + ;; + mingw* | cegcc*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + ;; + esac + dynamic_linker='Win32 ld.exe' + ;; + + *,cl*) + # Native MSVC + libname_spec='$name' + soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext' + library_names_spec='$libname.dll.lib' + + case $build_os in + mingw*) + sys_lib_search_path_spec= + lt_save_ifs=$IFS + IFS=';' + for lt_path in $LIB + do + IFS=$lt_save_ifs + # Let DOS variable expansion print the short 8.3 style file name. + lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"` + sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path" + done + IFS=$lt_save_ifs + # Convert to MSYS style. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'` + ;; + cygwin*) + # Convert to unix form, then to dos form, then back to unix form + # but this time dos style (no spaces!) so that the unix form looks + # like /cygdrive/c/PROGRA~1:/cygdr... + sys_lib_search_path_spec=`cygpath --path --unix "$LIB"` + sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null` + sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + ;; + *) + sys_lib_search_path_spec=$LIB + if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH. + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # FIXME: find the short name or the path components, as spaces are + # common. (e.g. "Program Files" -> "PROGRA~1") + ;; + esac + + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + shlibpath_overrides_runpath=yes + dynamic_linker='Win32 link.exe' + ;; + + *) + # Assume MSVC wrapper + library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib' + dynamic_linker='Win32 ld.exe' + ;; + esac + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$major$shared_ext $libname$shared_ext' + soname_spec='$libname$release$major$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' +m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[23]].*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2.*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +haiku*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + dynamic_linker="$host_os runtime_loader" + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LIBRARY_PATH + shlibpath_overrides_runpath=no + sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib' + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + if test 32 = "$HPUX_IA64_MODE"; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + sys_lib_dlsearch_path_spec=/usr/lib/hpux32 + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + sys_lib_dlsearch_path_spec=/usr/lib/hpux64 + fi + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555, ... + postinstall_cmds='chmod 555 $lib' + # or fails outright, so override atomically: + install_override_mode=555 + ;; + +interix[[3-9]]*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test yes = "$lt_cv_prog_gnu_ld"; then + version_type=linux # correct to gnu/linux during the next big refactor + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff" + sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +linux*android*) + version_type=none # Android doesn't support versioned libraries. + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext' + soname_spec='$libname$release$shared_ext' + finish_cmds= + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + dynamic_linker='Android linker' + # Don't embed -rpath directories since the linker doesn't support them. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + + # Some binutils ld are patched to set DT_RUNPATH + AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath], + [lt_cv_shlibpath_overrides_runpath=no + save_LDFLAGS=$LDFLAGS + save_libdir=$libdir + eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \ + LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\"" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null], + [lt_cv_shlibpath_overrides_runpath=yes])]) + LDFLAGS=$save_LDFLAGS + libdir=$save_libdir + ]) + shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath + + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + + # Ideally, we could use ldconfig to report *all* directores which are + # searched for libraries, however this is still not possible. Aside from not + # being certain /sbin/ldconfig is available, command + # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64, + # even though it is searched at run-time. Try to do the best guess by + # appending ld.so.conf contents (and includes) to the search path. + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +*nto* | *qnx*) + version_type=qnx + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + dynamic_linker='ldqnx.so' + ;; + +openbsd* | bitrig*) + version_type=sunos + sys_lib_dlsearch_path_spec=/usr/lib + need_lib_prefix=no + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + need_version=no + else + need_version=yes + fi + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +os2*) + libname_spec='$name' + version_type=windows + shrext_cmds=.dll + need_version=no + need_lib_prefix=no + # OS/2 can only load a DLL with a base name of 8 characters or less. + soname_spec='`test -n "$os2dllname" && libname="$os2dllname"; + v=$($ECHO $release$versuffix | tr -d .-); + n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _); + $ECHO $n$v`$shared_ext' + library_names_spec='${libname}_dll.$libext' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=BEGINLIBPATH + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + postinstall_cmds='base_file=`basename \$file`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname~ + if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then + eval '\''$striplib \$dldir/$dlname'\'' || exit \$?; + fi' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $RM \$dlpath' + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='$libname$release$shared_ext$major' + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test yes = "$with_gnu_ld"; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec; then + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext' + soname_spec='$libname$shared_ext.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=sco + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + if test yes = "$with_gnu_ld"; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +tpf*) + # TPF is a cross-target only. Preferred cross-host = GNU/Linux. + version_type=linux # correct to gnu/linux during the next big refactor + need_lib_prefix=no + need_version=no + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +uts4*) + version_type=linux # correct to gnu/linux during the next big refactor + library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext' + soname_spec='$libname$release$shared_ext$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test no = "$dynamic_linker" && can_build_shared=no + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test yes = "$GCC"; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then + sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec +fi + +if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then + sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec +fi + +# remember unaugmented sys_lib_dlsearch_path content for libtool script decls... +configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec + +# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code +func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH" + +# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool +configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH + +_LT_DECL([], [variables_saved_for_relink], [1], + [Variables whose values should be saved in libtool wrapper scripts and + restored at link time]) +_LT_DECL([], [need_lib_prefix], [0], + [Do we need the "lib" prefix for modules?]) +_LT_DECL([], [need_version], [0], [Do we need a version for libraries?]) +_LT_DECL([], [version_type], [0], [Library versioning type]) +_LT_DECL([], [runpath_var], [0], [Shared library runtime path variable]) +_LT_DECL([], [shlibpath_var], [0],[Shared library path variable]) +_LT_DECL([], [shlibpath_overrides_runpath], [0], + [Is shlibpath searched before the hard-coded library search path?]) +_LT_DECL([], [libname_spec], [1], [Format of library name prefix]) +_LT_DECL([], [library_names_spec], [1], + [[List of archive names. First name is the real one, the rest are links. + The last name is the one that the linker finds with -lNAME]]) +_LT_DECL([], [soname_spec], [1], + [[The coded name of the library, if different from the real name]]) +_LT_DECL([], [install_override_mode], [1], + [Permission mode override for installation of shared libraries]) +_LT_DECL([], [postinstall_cmds], [2], + [Command to use after installation of a shared archive]) +_LT_DECL([], [postuninstall_cmds], [2], + [Command to use after uninstallation of a shared archive]) +_LT_DECL([], [finish_cmds], [2], + [Commands used to finish a libtool library installation in a directory]) +_LT_DECL([], [finish_eval], [1], + [[As "finish_cmds", except a single script fragment to be evaled but + not shown]]) +_LT_DECL([], [hardcode_into_libs], [0], + [Whether we should hardcode library paths into libraries]) +_LT_DECL([], [sys_lib_search_path_spec], [2], + [Compile-time system search path for libraries]) +_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2], + [Detected run-time system search path for libraries]) +_LT_DECL([], [configure_time_lt_sys_library_path], [2], + [Explicit LT_SYS_LIBRARY_PATH set during ./configure time]) +])# _LT_SYS_DYNAMIC_LINKER + + +# _LT_PATH_TOOL_PREFIX(TOOL) +# -------------------------- +# find a file program that can recognize shared library +AC_DEFUN([_LT_PATH_TOOL_PREFIX], +[m4_require([_LT_DECL_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD=$MAGIC_CMD + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="m4_if([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$1"; then + lt_cv_path_MAGIC_CMD=$ac_dir/"$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD=$lt_cv_path_MAGIC_CMD + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <<_LT_EOF 1>&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +_LT_EOF + fi ;; + esac + fi + break + fi + done + IFS=$lt_save_ifs + MAGIC_CMD=$lt_save_MAGIC_CMD + ;; +esac]) +MAGIC_CMD=$lt_cv_path_MAGIC_CMD +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +_LT_DECL([], [MAGIC_CMD], [0], + [Used to examine libraries when file_magic_cmd begins with "file"])dnl +])# _LT_PATH_TOOL_PREFIX + +# Old name: +AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], []) + + +# _LT_PATH_MAGIC +# -------------- +# find a file program that can recognize a shared library +m4_defun([_LT_PATH_MAGIC], +[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# _LT_PATH_MAGIC + + +# LT_PATH_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([LT_PATH_LD], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PROG_ECHO_BACKSLASH])dnl + +AC_ARG_WITH([gnu-ld], + [AS_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test no = "$withval" || with_gnu_ld=yes], + [with_gnu_ld=no])dnl + +ac_prog=ld +if test yes = "$GCC"; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return, which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'` + while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do + ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD=$ac_prog + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test yes = "$with_gnu_ld"; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD=$ac_dir/$ac_prog + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 conftest.i +cat conftest.i conftest.i >conftest2.i +: ${lt_DD:=$DD} +AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd], +[if "$ac_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=: +fi]) +rm -f conftest.i conftest2.i conftest.out]) +])# _LT_PATH_DD + + +# _LT_CMD_TRUNCATE +# ---------------- +# find command to truncate a binary pipe +m4_defun([_LT_CMD_TRUNCATE], +[m4_require([_LT_PATH_DD]) +AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin], +[printf 0123456789abcdef0123456789abcdef >conftest.i +cat conftest.i conftest.i >conftest2.i +lt_cv_truncate_bin= +if "$ac_cv_path_lt_DD" bs=32 count=1 conftest.out 2>/dev/null; then + cmp -s conftest.i conftest.out \ + && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1" +fi +rm -f conftest.i conftest2.i conftest.out +test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"]) +_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1], + [Command to truncate a binary pipe]) +])# _LT_CMD_TRUNCATE + + +# _LT_CHECK_MAGIC_METHOD +# ---------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_MAGIC_METHOD], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +AC_CACHE_CHECK([how to recognize dependent libraries], +lt_cv_deplibs_check_method, +[lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# 'unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# that responds to the $file_magic_cmd with a given extended regex. +# If you have 'file' or equivalent on your system and you're not sure +# whether 'pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[[4-9]]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[[45]]*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + # Keep this pattern in sync with the one in func_win32_libid. + lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +cegcc*) + # use the weaker test based on 'objdump'. See mingw*. + lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +haiku*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be glibc/ELF. +linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +*nto* | *qnx*) + lt_cv_deplibs_check_method=pass_all + ;; + +openbsd* | bitrig*) + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +tpf*) + lt_cv_deplibs_check_method=pass_all + ;; +os2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) + +file_magic_glob= +want_nocaseglob=no +if test "$build" = "$host"; then + case $host_os in + mingw* | pw32*) + if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then + want_nocaseglob=yes + else + file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"` + fi + ;; + esac +fi + +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + +_LT_DECL([], [deplibs_check_method], [1], + [Method to check whether dependent libraries are shared objects]) +_LT_DECL([], [file_magic_cmd], [1], + [Command to use when deplibs_check_method = "file_magic"]) +_LT_DECL([], [file_magic_glob], [1], + [How to find potential files when deplibs_check_method = "file_magic"]) +_LT_DECL([], [want_nocaseglob], [1], + [Find potential files using nocaseglob when deplibs_check_method = "file_magic"]) +])# _LT_CHECK_MAGIC_METHOD + + +# LT_PATH_NM +# ---------- +# find the pathname to a BSD- or MS-compatible name lister +AC_DEFUN([LT_PATH_NM], +[AC_REQUIRE([AC_PROG_CC])dnl +AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM=$NM +else + lt_nm_to_check=${ac_tool_prefix}nm + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS=$lt_save_ifs + test -z "$ac_dir" && ac_dir=. + tmp_nm=$ac_dir/$lt_tmp_nm + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the 'sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + # MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty + case $build_os in + mingw*) lt_bad_file=conftest.nm/nofile ;; + *) lt_bad_file=/dev/null ;; + esac + case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in + *$lt_bad_file* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break 2 + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break 2 + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS=$lt_save_ifs + done + : ${lt_cv_path_NM=no} +fi]) +if test no != "$lt_cv_path_NM"; then + NM=$lt_cv_path_NM +else + # Didn't find any BSD compatible name lister, look for dumpbin. + if test -n "$DUMPBIN"; then : + # Let the user override the test. + else + AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :) + case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in + *COFF*) + DUMPBIN="$DUMPBIN -symbols -headers" + ;; + *) + DUMPBIN=: + ;; + esac + fi + AC_SUBST([DUMPBIN]) + if test : != "$DUMPBIN"; then + NM=$DUMPBIN + fi +fi +test -z "$NM" && NM=nm +AC_SUBST([NM]) +_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl + +AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface], + [lt_cv_nm_interface="BSD nm" + echo "int some_variable = 0;" > conftest.$ac_ext + (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$ac_compile" 2>conftest.err) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD) + (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) + cat conftest.err >&AS_MESSAGE_LOG_FD + (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD) + cat conftest.out >&AS_MESSAGE_LOG_FD + if $GREP 'External.*some_variable' conftest.out > /dev/null; then + lt_cv_nm_interface="MS dumpbin" + fi + rm -f conftest*]) +])# LT_PATH_NM + +# Old names: +AU_ALIAS([AM_PROG_NM], [LT_PATH_NM]) +AU_ALIAS([AC_PROG_NM], [LT_PATH_NM]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_PROG_NM], []) +dnl AC_DEFUN([AC_PROG_NM], []) + +# _LT_CHECK_SHAREDLIB_FROM_LINKLIB +# -------------------------------- +# how to determine the name of the shared library +# associated with a specific link library. +# -- PORTME fill in with the dynamic library characteristics +m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB], +[m4_require([_LT_DECL_EGREP]) +m4_require([_LT_DECL_OBJDUMP]) +m4_require([_LT_DECL_DLLTOOL]) +AC_CACHE_CHECK([how to associate runtime and link libraries], +lt_cv_sharedlib_from_linklib_cmd, +[lt_cv_sharedlib_from_linklib_cmd='unknown' + +case $host_os in +cygwin* | mingw* | pw32* | cegcc*) + # two different shell functions defined in ltmain.sh; + # decide which one to use based on capabilities of $DLLTOOL + case `$DLLTOOL --help 2>&1` in + *--identify-strict*) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib + ;; + *) + lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback + ;; + esac + ;; +*) + # fallback: assume linklib IS sharedlib + lt_cv_sharedlib_from_linklib_cmd=$ECHO + ;; +esac +]) +sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd +test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO + +_LT_DECL([], [sharedlib_from_linklib_cmd], [1], + [Command to associate shared and link libraries]) +])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB + + +# _LT_PATH_MANIFEST_TOOL +# ---------------------- +# locate the manifest tool +m4_defun([_LT_PATH_MANIFEST_TOOL], +[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :) +test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt +AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool], + [lt_cv_path_mainfest_tool=no + echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD + $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out + cat conftest.err >&AS_MESSAGE_LOG_FD + if $GREP 'Manifest Tool' conftest.out > /dev/null; then + lt_cv_path_mainfest_tool=yes + fi + rm -f conftest*]) +if test yes != "$lt_cv_path_mainfest_tool"; then + MANIFEST_TOOL=: +fi +_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl +])# _LT_PATH_MANIFEST_TOOL + + +# _LT_DLL_DEF_P([FILE]) +# --------------------- +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with func_dll_def_p in the libtool script +AC_DEFUN([_LT_DLL_DEF_P], +[dnl + test DEF = "`$SED -n dnl + -e '\''s/^[[ ]]*//'\'' dnl Strip leading whitespace + -e '\''/^\(;.*\)*$/d'\'' dnl Delete empty lines and comments + -e '\''s/^\(EXPORTS\|LIBRARY\)\([[ ]].*\)*$/DEF/p'\'' dnl + -e q dnl Only consider the first "real" line + $1`" dnl +])# _LT_DLL_DEF_P + + +# LT_LIB_M +# -------- +# check for math library +AC_DEFUN([LT_LIB_M], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw) + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM=-lm) + ;; +esac +AC_SUBST([LIBM]) +])# LT_LIB_M + +# Old name: +AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_CHECK_LIBM], []) + + +# _LT_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------- +m4_defun([_LT_COMPILER_NO_RTTI], +[m4_require([_LT_TAG_COMPILER])dnl + +_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test yes = "$GCC"; then + case $cc_basename in + nvcc*) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;; + *) + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;; + esac + + _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1], + [Compiler flag to turn off builtin functions]) +])# _LT_COMPILER_NO_RTTI + + +# _LT_CMD_GLOBAL_SYMBOLS +# ---------------------- +m4_defun([_LT_CMD_GLOBAL_SYMBOLS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([LT_PATH_NM])dnl +AC_REQUIRE([LT_PATH_LD])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_TAG_COMPILER])dnl + +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32* | cegcc*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) + if test ia64 = "$host_cpu"; then + symcode='[[ABCDEGRST]]' + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Gets list of data symbols to import. + lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'" + # Adjust the below global symbol transforms to fixup imported variables. + lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'" + lt_c_name_hook=" -e 's/^I .* \(.*\)$/ {\"\1\", (void *) 0},/p'" + lt_c_name_lib_hook="\ + -e 's/^I .* \(lib.*\)$/ {\"\1\", (void *) 0},/p'\ + -e 's/^I .* \(.*\)$/ {\"lib\1\", (void *) 0},/p'" +else + # Disable hooks by default. + lt_cv_sys_global_symbol_to_import= + lt_cdecl_hook= + lt_c_name_hook= + lt_c_name_lib_hook= +fi + +# Transform an extracted symbol line into a proper C declaration. +# Some systems (esp. on ia64) link data and code symbols differently, +# so use this general approach. +lt_cv_sys_global_symbol_to_cdecl="sed -n"\ +$lt_cdecl_hook\ +" -e 's/^T .* \(.*\)$/extern int \1();/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n"\ +$lt_c_name_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/p'" + +# Transform an extracted symbol line into symbol name with lib prefix and +# symbol address. +lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\ +$lt_c_name_lib_hook\ +" -e 's/^: \(.*\) .*$/ {\"\1\", (void *) 0},/p'"\ +" -e 's/^$symcode$symcode* .* \(lib.*\)$/ {\"\1\", (void *) \&\1},/p'"\ +" -e 's/^$symcode$symcode* .* \(.*\)$/ {\"lib\1\", (void *) \&\1},/p'" + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# Try without a prefix underscore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + if test "$lt_cv_nm_interface" = "MS dumpbin"; then + # Fake it for dumpbin and say T for any non-static function, + # D for any global variable and I for any imported variable. + # Also find C++ and __fastcall symbols from MSVC++, + # which start with @ or ?. + lt_cv_sys_global_symbol_pipe="$AWK ['"\ +" {last_section=section; section=\$ 3};"\ +" /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\ +" /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\ +" /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\ +" /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\ +" /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\ +" \$ 0!~/External *\|/{next};"\ +" / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\ +" {if(hide[section]) next};"\ +" {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\ +" {split(\$ 0,a,/\||\r/); split(a[2],s)};"\ +" s[1]~/^[@?]/{print f,s[1],s[1]; next};"\ +" s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\ +" ' prfx=^$ac_symprfx]" + else + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + fi + lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <<_LT_EOF +#ifdef __cplusplus +extern "C" { +#endif +char nm_test_var; +void nm_test_func(void); +void nm_test_func(void){} +#ifdef __cplusplus +} +#endif +int main(){nm_test_var='a';nm_test_func();return(0);} +_LT_EOF + + if AC_TRY_EVAL(ac_compile); then + # Now try to grab the symbols. + nlist=conftest.nm + if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if $GREP ' nm_test_var$' "$nlist" >/dev/null; then + if $GREP ' nm_test_func$' "$nlist" >/dev/null; then + cat <<_LT_EOF > conftest.$ac_ext +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT@&t@_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT@&t@_DLSYM_CONST +#else +# define LT@&t@_DLSYM_CONST const +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +_LT_EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext' + + cat <<_LT_EOF >> conftest.$ac_ext + +/* The mapping between symbol names and symbols. */ +LT@&t@_DLSYM_CONST struct { + const char *name; + void *address; +} +lt__PROGRAM__LTX_preloaded_symbols[[]] = +{ + { "@PROGRAM@", (void *) 0 }, +_LT_EOF + $SED "s/^$symcode$symcode* .* \(.*\)$/ {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext + cat <<\_LT_EOF >> conftest.$ac_ext + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt__PROGRAM__LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif +_LT_EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_globsym_save_LIBS=$LIBS + lt_globsym_save_CFLAGS=$CFLAGS + LIBS=conftstm.$ac_objext + CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then + pipe_works=yes + fi + LIBS=$lt_globsym_save_LIBS + CFLAGS=$lt_globsym_save_CFLAGS + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test yes = "$pipe_works"; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi + +# Response file support. +if test "$lt_cv_nm_interface" = "MS dumpbin"; then + nm_file_list_spec='@' +elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then + nm_file_list_spec='@' +fi + +_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1], + [Take the output of nm and produce a listing of raw symbols and C names]) +_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1], + [Transform the output of nm in a proper C declaration]) +_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1], + [Transform the output of nm into a list of symbols to manually relocate]) +_LT_DECL([global_symbol_to_c_name_address], + [lt_cv_sys_global_symbol_to_c_name_address], [1], + [Transform the output of nm in a C name address pair]) +_LT_DECL([global_symbol_to_c_name_address_lib_prefix], + [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1], + [Transform the output of nm in a C name address pair when lib prefix is needed]) +_LT_DECL([nm_interface], [lt_cv_nm_interface], [1], + [The name lister interface]) +_LT_DECL([], [nm_file_list_spec], [1], + [Specify filename containing input files for $NM]) +]) # _LT_CMD_GLOBAL_SYMBOLS + + +# _LT_COMPILER_PIC([TAGNAME]) +# --------------------------- +m4_defun([_LT_COMPILER_PIC], +[m4_require([_LT_TAG_COMPILER])dnl +_LT_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_TAGVAR(lt_prog_compiler_static, $1)= + +m4_if([$1], [CXX], [ + # C++ specific cases for pic, static, wl, etc. + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + mingw* | cygwin* | os2* | pw32* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + ecpc* ) + # old Intel C++ for x86_64, which still supported -KPIC. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + icpc* ) + # Intel C++, used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*) + # IBM XL 8.0, 9.0 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + *qnx* | *nto*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test yes = "$GCC"; then + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + m68k) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the '-m68020' flag to GCC prevents building anything better, + # like '-m68040'. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + esac + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + haiku*) + # PIC is the default for Haiku. + # The "-static" flag exists, but is broken. + _LT_TAGVAR(lt_prog_compiler_static, $1)= + ;; + + hpux*) + # PIC is the default for 64-bit PA HP-UX, but not for 32-bit + # PA HP-UX. On IA64 HP-UX, PIC is the default but the pic flag + # sets the default TLS model and affects inlining. + case $host_cpu in + hppa*64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + + case $cc_basename in + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker ' + if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)" + fi + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test ia64 = "$host_cpu"; then + # AIX 5 now supports IA64 processor + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + case $cc_basename in + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2* | cegcc*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + case $host_os in + os2*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static' + ;; + esac + ;; + + hpux9* | hpux10* | hpux11*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + # old Intel for x86_64, which still supported -KPIC. + ecc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # icc used to be incompatible with GCC. + # ICC 10 doesn't accept -KPIC any more. + icc* | ifort*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + # Lahey Fortran 8.1. + lf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared' + _LT_TAGVAR(lt_prog_compiler_static, $1)='--static' + ;; + nagfor*) + # NAG Fortran compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + xl* | bgxl* | bgf* | mpixl*) + # IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + *Sun\ F* | *Sun*Fortran*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + *Sun\ C*) + # Sun C 5.9 + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Intel*\ [[CF]]*Compiler*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + *Portland\ Group*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + esac + ;; + + newsos6) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *nto* | *qnx*) + # QNX uses GNU C++, but need to define -shared option too, otherwise + # it will coredump. + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared' + ;; + + osf3* | osf4* | osf5*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95* | sunf77* | sunf90* | sunf95*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +case $host_os in + # For platforms that do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +AC_CACHE_CHECK([for $compiler option to produce PIC], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)], + [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)]) +_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then + _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works], + [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)], + [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1], + [Additional compiler flags for building library objects]) + +_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1], + [How to pass a linker flag through the compiler]) +# +# Check to make sure the static flag actually works. +# +wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\" +_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_TAGVAR(lt_prog_compiler_static, $1)=]) +_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1], + [Compiler flag to prevent dynamic linking]) +])# _LT_COMPILER_PIC + + +# _LT_LINKER_SHLIBS([TAGNAME]) +# ---------------------------- +# See if the linker supports building shared libraries. +m4_defun([_LT_LINKER_SHLIBS], +[AC_REQUIRE([LT_PATH_LD])dnl +AC_REQUIRE([LT_PATH_NM])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_DECL_SED])dnl +m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl +m4_require([_LT_TAG_COMPILER])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +m4_if([$1], [CXX], [ + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds + ;; + cygwin* | mingw* | cegcc*) + case $cc_basename in + cl*) + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + ;; + esac + ;; + *) + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac +], [ + runpath_var= + _LT_TAGVAR(allow_undefined_flag, $1)= + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(archive_cmds, $1)= + _LT_TAGVAR(archive_expsym_cmds, $1)= + _LT_TAGVAR(compiler_needs_object, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(hardcode_automatic, $1)=no + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(hardcode_libdir_separator, $1)= + _LT_TAGVAR(hardcode_minus_L, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_TAGVAR(inherit_rpath, $1)=no + _LT_TAGVAR(link_all_deplibs, $1)=unknown + _LT_TAGVAR(module_cmds, $1)= + _LT_TAGVAR(module_expsym_cmds, $1)= + _LT_TAGVAR(old_archive_from_new_cmds, $1)= + _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_TAGVAR(thread_safe_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ' (' and ')$', so one must not match beginning or + # end of line. Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc', + # as well as any symbol that contains 'd'. + _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test yes != "$GCC"; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd* | bitrig*) + with_gnu_ld=no + ;; + esac + + _LT_TAGVAR(ld_shlibs, $1)=yes + + # On some targets, GNU ld is compatible enough with the native linker + # that we're better off using the native interface for both. + lt_use_gnu_ld_interface=no + if test yes = "$with_gnu_ld"; then + case $host_os in + aix*) + # The AIX port of GNU ld has always aspired to compatibility + # with the native linker. However, as the warning in the GNU ld + # block says, versions before 2.19.5* couldn't really create working + # shared libraries, regardless of the interface used. + case `$LD -v 2>&1` in + *\ \(GNU\ Binutils\)\ 2.19.5*) ;; + *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;; + *\ \(GNU\ Binutils\)\ [[3-9]]*) ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + ;; + *) + lt_use_gnu_ld_interface=yes + ;; + esac + fi + + if test yes = "$lt_use_gnu_ld_interface"; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='$wl' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in + *GNU\ gold*) supports_anon_versioning=yes ;; + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test ia64 != "$host_cpu"; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: the GNU linker, at least up to release 2.19, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to install binutils +*** 2.20 or above, or modify your PATH so that a non-GNU linker is found. +*** You will then need to restart the configuration process. + +_LT_EOF + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols' + _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'] + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu) + tmp_diet=no + if test linux-dietlibc = "$host_os"; then + case $cc_basename in + diet\ *) tmp_diet=yes;; # linux-dietlibc with static linking (!diet-dyn) + esac + fi + if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \ + && test no = "$tmp_diet" + then + tmp_addflag=' $pic_flag' + tmp_sharedflag='-shared' + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95* | pgfortran*) + # Portland Group f77 and f90 compilers + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + lf95*) # Lahey Fortran 8.1 + _LT_TAGVAR(whole_archive_flag_spec, $1)= + tmp_sharedflag='--shared' ;; + nagfor*) # NAGFOR 5.3 + tmp_sharedflag='-Wl,-shared' ;; + xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below) + tmp_sharedflag='-qmkshrobj' + tmp_addflag= ;; + nvcc*) # Cuda Compiler Driver 2.2 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + + case $cc_basename in + tcc*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic' + ;; + xlf* | bgf* | bgxlf* | mpixlf*) + # IBM XL Fortran 10.1 on PPC cannot create shared libs itself + _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib' + fi + ;; + esac + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then + runpath_var= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to GNU nm, but means don't demangle to AIX nm. + # Without the "-l" option, or with the "-B" option, AIX nm treats + # weak defined symbols like other global defined symbols, whereas + # GNU nm marks them as "W". + # While the 'weak' keyword is ignored in the Export File, we need + # it in the Import File for the 'aix-soname' feature, so we have + # to replace the "-B" option with "-P" for AIX nm. + if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then + _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols' + else + _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then + aix_use_runtimelinking=yes + break + fi + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # traditional, no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GCC"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag="$shared_flag "'$wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared libraries. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + amigaos*) + case $host_cpu in + powerpc) + # see comment about AmigaOS4 .so support + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='' + ;; + m68k) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + ;; + + bsdi[[45]]*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32* | cegcc*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + case $cc_basename in + cl*) + # Native MSVC + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*' + _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # Assume MSVC wrapper + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + esac + ;; + + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + dgux*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2.*) + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + + hpux10*) + if test yes,no = "$GCC,$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test yes,no = "$GCC,$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + m4_if($1, [], [ + # Older versions of the 11.00 compiler do not understand -b yet + # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does) + _LT_LINKER_OPTION([if $CC understands -b], + _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'], + [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])], + [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags']) + ;; + esac + fi + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + # Try to use the -exported_symbol ld option, if it does not + # work, assume that -exports_file does not work either and + # implicitly export all symbols. + # This should be the same for all languages, so no per-tag cache variable. + AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol], + [lt_cv_irix_exported_symbol], + [save_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null" + AC_LINK_IFELSE( + [AC_LANG_SOURCE( + [AC_LANG_CASE([C], [[int foo (void) { return 0; }]], + [C++], [[int foo (void) { return 0; }]], + [Fortran 77], [[ + subroutine foo + end]], + [Fortran], [[ + subroutine foo + end]])])], + [lt_cv_irix_exported_symbol=yes], + [lt_cv_irix_exported_symbol=no]) + LDFLAGS=$save_LDFLAGS]) + if test yes = "$lt_cv_irix_exported_symbol"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib' + fi + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + linux*) + case $cc_basename in + tcc*) + # Fabrice Bellard et al's Tiny C Compiler + _LT_TAGVAR(ld_shlibs, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *nto* | *qnx*) + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + fi + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + osf3*) + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test yes = "$GCC"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + else + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)='no' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_TAGVAR(no_undefined_flag, $1)=' -z defs' + if test yes = "$GCC"; then + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + else + case `$CC -V 2>&1` in + *"Compilers 5.0"*) + wlarc='' + _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp' + ;; + *) + wlarc='$wl' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp' + ;; + esac + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. GCC discards it without '$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test yes = "$GCC"; then + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test sequent = "$host_vendor"; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + if test yes = "$GCC"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + if test sni = "$host_vendor"; then + case $host in + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym' + ;; + esac + fi + fi +]) +AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) +test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + +_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld + +_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl +_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl +_LT_DECL([], [extract_expsyms_cmds], [2], + [The commands to extract the exported symbol list from a shared archive]) + +# +# Do we need to explicitly link libc? +# +case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test yes,yes = "$GCC,$enable_shared"; then + case $_LT_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_CACHE_CHECK([whether -lc should be explicitly linked in], + [lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1), + [$RM conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1) + _LT_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) + then + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no + else + lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $RM conftest* + ]) + _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1) + ;; + esac + fi + ;; +esac + +_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0], + [Whether or not to add -lc for building shared libraries]) +_LT_TAGDECL([allow_libtool_libs_with_static_runtimes], + [enable_shared_with_static_runtimes], [0], + [Whether or not to disallow shared libs when runtime libs are static]) +_LT_TAGDECL([], [export_dynamic_flag_spec], [1], + [Compiler flag to allow reflexive dlopens]) +_LT_TAGDECL([], [whole_archive_flag_spec], [1], + [Compiler flag to generate shared objects directly from archives]) +_LT_TAGDECL([], [compiler_needs_object], [1], + [Whether the compiler copes with passing no objects directly]) +_LT_TAGDECL([], [old_archive_from_new_cmds], [2], + [Create an old-style archive from a shared archive]) +_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2], + [Create a temporary old-style archive to link instead of a shared archive]) +_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive]) +_LT_TAGDECL([], [archive_expsym_cmds], [2]) +_LT_TAGDECL([], [module_cmds], [2], + [Commands used to build a loadable module if different from building + a shared archive.]) +_LT_TAGDECL([], [module_expsym_cmds], [2]) +_LT_TAGDECL([], [with_gnu_ld], [1], + [Whether we are building with GNU ld or not]) +_LT_TAGDECL([], [allow_undefined_flag], [1], + [Flag that allows shared libraries with undefined symbols to be built]) +_LT_TAGDECL([], [no_undefined_flag], [1], + [Flag that enforces no undefined symbols]) +_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1], + [Flag to hardcode $libdir into a binary during linking. + This must work even if $libdir does not exist]) +_LT_TAGDECL([], [hardcode_libdir_separator], [1], + [Whether we need a single "-rpath" flag with a separated argument]) +_LT_TAGDECL([], [hardcode_direct], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary]) +_LT_TAGDECL([], [hardcode_direct_absolute], [0], + [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes + DIR into the resulting binary and the resulting library dependency is + "absolute", i.e impossible to change by setting $shlibpath_var if the + library is relocated]) +_LT_TAGDECL([], [hardcode_minus_L], [0], + [Set to "yes" if using the -LDIR flag during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_shlibpath_var], [0], + [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR + into the resulting binary]) +_LT_TAGDECL([], [hardcode_automatic], [0], + [Set to "yes" if building a shared library automatically hardcodes DIR + into the library and all subsequent libraries and executables linked + against it]) +_LT_TAGDECL([], [inherit_rpath], [0], + [Set to yes if linker adds runtime paths of dependent libraries + to runtime path list]) +_LT_TAGDECL([], [link_all_deplibs], [0], + [Whether libtool must link a program against all its dependency libraries]) +_LT_TAGDECL([], [always_export_symbols], [0], + [Set to "yes" if exported symbols are required]) +_LT_TAGDECL([], [export_symbols_cmds], [2], + [The commands to list exported symbols]) +_LT_TAGDECL([], [exclude_expsyms], [1], + [Symbols that should not be listed in the preloaded symbols]) +_LT_TAGDECL([], [include_expsyms], [1], + [Symbols that must always be exported]) +_LT_TAGDECL([], [prelink_cmds], [2], + [Commands necessary for linking programs (against libraries) with templates]) +_LT_TAGDECL([], [postlink_cmds], [2], + [Commands necessary for finishing linking programs]) +_LT_TAGDECL([], [file_list_spec], [1], + [Specify filename containing input files]) +dnl FIXME: Not yet implemented +dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1], +dnl [Compiler flag to generate thread safe objects]) +])# _LT_LINKER_SHLIBS + + +# _LT_LANG_C_CONFIG([TAG]) +# ------------------------ +# Ensure that the configuration variables for a C compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_C_CONFIG], +[m4_require([_LT_DECL_EGREP])dnl +lt_save_CC=$CC +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_TAG_COMPILER +# Save the default compiler, since it gets overwritten when the other +# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP. +compiler_DEFAULT=$CC + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + LT_SYS_DLOPEN_SELF + _LT_CMD_STRIPLIB + + # Report what library types will actually be built + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_CONFIG($1) +fi +AC_LANG_POP +CC=$lt_save_CC +])# _LT_LANG_C_CONFIG + + +# _LT_LANG_CXX_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a C++ compiler are suitably +# defined. These variables are subsequently used by _LT_CONFIG to write +# the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_CXX_CONFIG], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +m4_require([_LT_DECL_EGREP])dnl +m4_require([_LT_PATH_MANIFEST_TOOL])dnl +if test -n "$CXX" && ( test no != "$CXX" && + ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) || + (test g++ != "$CXX"))); then + AC_PROG_CXXCPP +else + _lt_caught_CXX_error=yes +fi + +AC_LANG_PUSH(C++) +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(compiler_needs_object, $1)=no +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the CXX compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_caught_CXX_error"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="int some_variable = 0;" + + # Code to be used in simple link tests + lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_CFLAGS=$CFLAGS + lt_save_LD=$LD + lt_save_GCC=$GCC + GCC=$GXX + lt_save_with_gnu_ld=$with_gnu_ld + lt_save_path_LD=$lt_cv_path_LD + if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx + else + $as_unset lt_cv_prog_gnu_ld + fi + if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX + else + $as_unset lt_cv_path_LD + fi + test -z "${LDCXX+set}" || LD=$LDCXX + CC=${CXX-"c++"} + CFLAGS=$CXXFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + # We don't want -fno-exception when compiling C++ code, so set the + # no_builtin_flag separately + if test yes = "$GXX"; then + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + else + _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + fi + + if test yes = "$GXX"; then + # Set up default GNU C++ configuration + + LT_PATH_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test yes = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='$wl' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | + $GREP 'no-whole-archive' > /dev/null; then + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + else + _LT_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + GXX=no + with_gnu_ld=no + wlarc= + fi + + # PORTME: fill in a description of your system's C++ link characteristics + AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) + _LT_TAGVAR(ld_shlibs, $1)=yes + case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test ia64 = "$host_cpu"; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag= + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # have runtime linking enabled, and use it for executables. + # For shared libraries, we enable/disable runtime linking + # depending on the kind of the shared library created - + # when "with_aix_soname,aix_use_runtimelinking" is: + # "aix,no" lib.a(lib.so.V) shared, rtl:no, for executables + # "aix,yes" lib.so shared, rtl:yes, for executables + # lib.a static archive + # "both,no" lib.so.V(shr.o) shared, rtl:yes + # lib.a(lib.so.V) shared, rtl:no, for executables + # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a(lib.so.V) shared, rtl:no + # "svr4,*" lib.so.V(shr.o) shared, rtl:yes, for executables + # lib.a static archive + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then + # With aix-soname=svr4, we create the lib.so.V shared archives only, + # so we don't have lib.a shared libs to link our executables. + # We have to force runtime linking in this case. + aix_use_runtimelinking=yes + LDFLAGS="$LDFLAGS -Wl,-brtl" + fi + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_TAGVAR(archive_cmds, $1)='' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='$wl-f,' + case $with_aix_soname,$aix_use_runtimelinking in + aix,*) ;; # no import file + svr4,* | *,yes) # use import file + # The Import File defines what to hardcode. + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=no + ;; + esac + + if test yes = "$GXX"; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`$CC -print-prog-name=collect2` + if test -f "$collect2name" && + strings "$collect2name" | $GREP resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)= + fi + esac + shared_flag='-shared' + if test yes = "$aix_use_runtimelinking"; then + shared_flag=$shared_flag' $wl-G' + fi + # Need to ensure runtime linking is disabled for the traditional + # shared library, or the linker may eventually find shared libraries + # /with/ Import File - we do not want to mix them. + shared_flag_aix='-shared' + shared_flag_svr4='-shared $wl-G' + else + # not using gcc + if test ia64 = "$host_cpu"; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test yes = "$aix_use_runtimelinking"; then + shared_flag='$wl-G' + else + shared_flag='$wl-bM:SRE' + fi + shared_flag_aix='$wl-bM:SRE' + shared_flag_svr4='$wl-G' + fi + fi + + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall' + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to + # export. + _LT_TAGVAR(always_export_symbols, $1)=yes + if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + # The "-G" linker flag allows undefined symbols. + _LT_TAGVAR(no_undefined_flag, $1)='-bernotok' + # Determine the default libpath from the value encoded in an empty + # executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag + else + if test ia64 = "$host_cpu"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib' + _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an + # empty executable. + _LT_SYS_MODULE_PATH_AIX([$1]) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok' + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok' + if test yes = "$with_gnu_ld"; then + # We only use this code for GNU lds that support --whole-archive. + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + else + # Exported symbols can be pulled into shared objects from archives + _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + fi + _LT_TAGVAR(archive_cmds_need_lc, $1)=yes + _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d' + # -brtl affects multiple linker settings, -berok does not and is overridden later + compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`' + if test svr4 != "$with_aix_soname"; then + # This is similar to how AIX traditionally builds its shared + # libraries. Need -bnortl late, we may have -brtl in LDFLAGS. + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname' + fi + if test aix != "$with_aix_soname"; then + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp' + else + # used by -dlpreopen to get the symbols + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV $output_objdir/$realname.d/$soname $output_objdir' + fi + _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32* | cegcc*) + case $GXX,$cc_basename in + ,cl* | no,cl*) + # Native MSVC + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=yes + _LT_TAGVAR(file_list_spec, $1)='@' + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=.dll + # FIXME: Setting linknames here is a bad hack. + _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames=' + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp "$export_symbols" "$output_objdir/$soname.def"; + echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp"; + else + $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp; + fi~ + $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~ + linknames=' + # The linker will not automatically build a static lib if we build a DLL. + # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + # Don't use ranlib + _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib' + _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~ + lt_tool_outputfile="@TOOL_OUTPUT@"~ + case $lt_outputfile in + *.exe|*.EXE) ;; + *) + lt_outputfile=$lt_outputfile.exe + lt_tool_outputfile=$lt_tool_outputfile.exe + ;; + esac~ + func_to_tool_file "$lt_outputfile"~ + if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then + $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1; + $RM "$lt_outputfile.manifest"; + fi' + ;; + *) + # g++ + # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols' + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_TAGVAR(always_export_symbols, $1)=no + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file, use it as + # is; otherwise, prepend EXPORTS... + _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + darwin* | rhapsody*) + _LT_DARWIN_LINKER_FEATURES($1) + ;; + + os2*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_TAGVAR(hardcode_minus_L, $1)=yes + _LT_TAGVAR(allow_undefined_flag, $1)=unsupported + shrext_cmds=.dll + _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~ + $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~ + $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~ + $ECHO EXPORTS >> $output_objdir/$libname.def~ + prefix_cmds="$SED"~ + if test EXPORTS = "`$SED 1q $export_symbols`"; then + prefix_cmds="$prefix_cmds -e 1d"; + fi~ + prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~ + cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~ + $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~ + emximp -o $lib $output_objdir/$libname.def' + _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def' + _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + freebsd2.*) + # C++ shared libraries reported to be fairly broken before + # switch to ELF + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + freebsd-elf*) + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + haiku*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + + hpux9*) + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + hpux10*|hpux11*) + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + case $host_cpu in + hppa*64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + interix[[3-9]]*) + _LT_TAGVAR(hardcode_direct, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test yes = "$GXX"; then + if test no = "$with_gnu_ld"; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + else + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib' + fi + fi + _LT_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_TAGVAR(inherit_rpath, $1)=yes + ;; + + linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc* | ecpc* ) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + case `$CC -V` in + *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*) + _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~ + compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"' + _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~ + $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~ + $RANLIB $oldlib' + _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~ + rm -rf $tpldir~ + $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~ + $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 6 and above use weak symbols + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib $wl-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed' + ;; + xl* | mpixl* | bgxl*) + # IBM XL 8.0 on PPC, with GNU ld + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic' + _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib' + if test yes = "$supports_anon_versioning"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib' + fi + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive' + _LT_TAGVAR(compiler_needs_object, $1)=yes + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + + lynxos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + m88k*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + + *nto* | *qnx*) + _LT_TAGVAR(ld_shlibs, $1)=yes + ;; + + openbsd* | bitrig*) + if test -f /usr/libexec/ld.so; then + _LT_TAGVAR(hardcode_direct, $1)=yes + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_direct_absolute, $1)=yes + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib' + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E' + _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive' + fi + output_verbose_link_cmd=func_echo_all + else + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + case $host in + osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;; + *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;; + esac + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + case $host in + osf3*) + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + ;; + *) + _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~ + $RM $lib.exp' + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"' + ;; + *) + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*' + case $host in + osf3*) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib' + ;; + esac + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + psos*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + solaris*) + case $cc_basename in + CC* | sunCC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands '-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='func_echo_all' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test yes,no = "$GXX,$with_gnu_ld"; then + _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs' + if $CC --version | $GREP -v '^2\.7' > /dev/null; then + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + else + # g++ 2.7 appears to require '-G' NOT '-shared' on this + # platform. + _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib' + _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"' + fi + + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We CANNOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text' + _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs' + _LT_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir' + _LT_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_TAGVAR(link_all_deplibs, $1)=yes + _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~ + '"$_LT_TAGVAR(old_archive_cmds, $1)" + _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~ + '"$_LT_TAGVAR(reload_cmds, $1)" + ;; + *) + _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + vxworks*) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + + *) + # FIXME: insert proper C++ library support + _LT_TAGVAR(ld_shlibs, $1)=no + ;; + esac + + AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)]) + test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no + + _LT_TAGVAR(GCC, $1)=$GXX + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS + LDCXX=$LD + LD=$lt_save_LD + GCC=$lt_save_GCC + with_gnu_ld=$lt_save_with_gnu_ld + lt_cv_path_LDCXX=$lt_cv_path_LD + lt_cv_path_LD=$lt_save_path_LD + lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld + lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +fi # test yes != "$_lt_caught_CXX_error" + +AC_LANG_POP +])# _LT_LANG_CXX_CONFIG + + +# _LT_FUNC_STRIPNAME_CNF +# ---------------------- +# func_stripname_cnf prefix suffix name +# strip PREFIX and SUFFIX off of NAME. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +# +# This function is identical to the (non-XSI) version of func_stripname, +# except this one can be used by m4 code that may be executed by configure, +# rather than the libtool script. +m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl +AC_REQUIRE([_LT_DECL_SED]) +AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH]) +func_stripname_cnf () +{ + case @S|@2 in + .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;; + *) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;; + esac +} # func_stripname_cnf +])# _LT_FUNC_STRIPNAME_CNF + + +# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME]) +# --------------------------------- +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +m4_defun([_LT_SYS_HIDDEN_LIBDEPS], +[m4_require([_LT_FILEUTILS_DEFAULTS])dnl +AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl +# Dependencies to place before and after the object being linked: +_LT_TAGVAR(predep_objects, $1)= +_LT_TAGVAR(postdep_objects, $1)= +_LT_TAGVAR(predeps, $1)= +_LT_TAGVAR(postdeps, $1)= +_LT_TAGVAR(compiler_lib_search_path, $1)= + +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF +int a; +void foo (void) { a = 0; } +_LT_EOF +], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF +class Foo +{ +public: + Foo (void) { a = 0; } +private: + int a; +}; +_LT_EOF +], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer*4 a + a=0 + return + end +_LT_EOF +], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF + subroutine foo + implicit none + integer a + a=0 + return + end +_LT_EOF +], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF +public class foo { + private int a; + public void bar (void) { + a = 0; + } +}; +_LT_EOF +], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF +package foo +func foo() { +} +_LT_EOF +]) + +_lt_libdeps_save_CFLAGS=$CFLAGS +case "$CC $CFLAGS " in #( +*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;; +*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;; +*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;; +esac + +dnl Parse the compiler output and extract the necessary +dnl objects, libraries and library flags. +if AC_TRY_EVAL(ac_compile); then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + for p in `eval "$output_verbose_link_cmd"`; do + case $prev$p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test x-L = "$p" || + test x-R = "$p"; then + prev=$p + continue + fi + + # Expand the sysroot to ease extracting the directories later. + if test -z "$prev"; then + case $p in + -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;; + -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;; + -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;; + esac + fi + case $p in + =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;; + esac + if test no = "$pre_test_object_deps_done"; then + case $prev in + -L | -R) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then + _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p + else + _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$_LT_TAGVAR(postdeps, $1)"; then + _LT_TAGVAR(postdeps, $1)=$prev$p + else + _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p" + fi + fi + prev= + ;; + + *.lto.$objext) ;; # Ignore GCC LTO objects + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test no = "$pre_test_object_deps_done"; then + if test -z "$_LT_TAGVAR(predep_objects, $1)"; then + _LT_TAGVAR(predep_objects, $1)=$p + else + _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p" + fi + else + if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then + _LT_TAGVAR(postdep_objects, $1)=$p + else + _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling $1 test program" +fi + +$RM -f confest.$objext +CFLAGS=$_lt_libdeps_save_CFLAGS + +# PORTME: override above test on systems where it is broken +m4_if([$1], [CXX], +[case $host_os in +interix[[3-9]]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + _LT_TAGVAR(predep_objects,$1)= + _LT_TAGVAR(postdep_objects,$1)= + _LT_TAGVAR(postdeps,$1)= + ;; +esac +]) + +case " $_LT_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac + _LT_TAGVAR(compiler_lib_search_dirs, $1)= +if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then + _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'` +fi +_LT_TAGDECL([], [compiler_lib_search_dirs], [1], + [The directories searched by this compiler when creating a shared library]) +_LT_TAGDECL([], [predep_objects], [1], + [Dependencies to place before and after the objects being linked to + create a shared library]) +_LT_TAGDECL([], [postdep_objects], [1]) +_LT_TAGDECL([], [predeps], [1]) +_LT_TAGDECL([], [postdeps], [1]) +_LT_TAGDECL([], [compiler_lib_search_path], [1], + [The library search path used internally by the compiler when linking + a shared library]) +])# _LT_SYS_HIDDEN_LIBDEPS + + +# _LT_LANG_F77_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for a Fortran 77 compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_F77_CONFIG], +[AC_LANG_PUSH(Fortran 77) +if test -z "$F77" || test no = "$F77"; then + _lt_disable_F77=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the F77 compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_F77"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${F77-"f77"} + CFLAGS=$FFLAGS + compiler=$CC + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + GCC=$G77 + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$G77 + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_F77" + +AC_LANG_POP +])# _LT_LANG_F77_CONFIG + + +# _LT_LANG_FC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for a Fortran compiler are +# suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_FC_CONFIG], +[AC_LANG_PUSH(Fortran) + +if test -z "$FC" || test no = "$FC"; then + _lt_disable_FC=yes +fi + +_LT_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_TAGVAR(allow_undefined_flag, $1)= +_LT_TAGVAR(always_export_symbols, $1)=no +_LT_TAGVAR(archive_expsym_cmds, $1)= +_LT_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_TAGVAR(hardcode_direct, $1)=no +_LT_TAGVAR(hardcode_direct_absolute, $1)=no +_LT_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_TAGVAR(hardcode_libdir_separator, $1)= +_LT_TAGVAR(hardcode_minus_L, $1)=no +_LT_TAGVAR(hardcode_automatic, $1)=no +_LT_TAGVAR(inherit_rpath, $1)=no +_LT_TAGVAR(module_cmds, $1)= +_LT_TAGVAR(module_expsym_cmds, $1)= +_LT_TAGVAR(link_all_deplibs, $1)=unknown +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds +_LT_TAGVAR(no_undefined_flag, $1)= +_LT_TAGVAR(whole_archive_flag_spec, $1)= +_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for fc test sources. +ac_ext=${ac_fc_srcext-f} + +# Object file extension for compiled fc test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# No sense in running all these tests if we already determined that +# the FC compiler isn't working. Some variables (like enable_shared) +# are currently assumed to apply to all compilers on this platform, +# and will be corrupted by setting them based on a non-working compiler. +if test yes != "$_lt_disable_FC"; then + # Code to be used in simple compile tests + lt_simple_compile_test_code="\ + subroutine t + return + end +" + + # Code to be used in simple link tests + lt_simple_link_test_code="\ + program t + end +" + + # ltmain only uses $CC for tagged configurations so make sure $CC is set. + _LT_TAG_COMPILER + + # save warnings/boilerplate of simple test code + _LT_COMPILER_BOILERPLATE + _LT_LINKER_BOILERPLATE + + # Allow CC to be a program name with arguments. + lt_save_CC=$CC + lt_save_GCC=$GCC + lt_save_CFLAGS=$CFLAGS + CC=${FC-"f95"} + CFLAGS=$FCFLAGS + compiler=$CC + GCC=$ac_cv_fc_compiler_gnu + + _LT_TAGVAR(compiler, $1)=$CC + _LT_CC_BASENAME([$compiler]) + + if test -n "$compiler"; then + AC_MSG_CHECKING([if libtool supports shared libraries]) + AC_MSG_RESULT([$can_build_shared]) + + AC_MSG_CHECKING([whether to build shared libraries]) + test no = "$can_build_shared" && enable_shared=no + + # On AIX, shared libraries and static libraries use the same namespace, and + # are all built from PIC. + case $host_os in + aix3*) + test yes = "$enable_shared" && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + aix[[4-9]]*) + if test ia64 != "$host_cpu"; then + case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in + yes,aix,yes) ;; # shared object as lib.so file only + yes,svr4,*) ;; # shared object as lib.so archive member only + yes,*) enable_static=no ;; # shared object in lib.a archive as well + esac + fi + ;; + esac + AC_MSG_RESULT([$enable_shared]) + + AC_MSG_CHECKING([whether to build static libraries]) + # Make sure either enable_shared or enable_static is yes. + test yes = "$enable_shared" || enable_static=yes + AC_MSG_RESULT([$enable_static]) + + _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu + _LT_TAGVAR(LD, $1)=$LD + + ## CAVEAT EMPTOR: + ## There is no encapsulation within the following macros, do not change + ## the running order or otherwise move them around unless you know exactly + ## what you are doing... + _LT_SYS_HIDDEN_LIBDEPS($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_SYS_DYNAMIC_LINKER($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) + fi # test -n "$compiler" + + GCC=$lt_save_GCC + CC=$lt_save_CC + CFLAGS=$lt_save_CFLAGS +fi # test yes != "$_lt_disable_FC" + +AC_LANG_POP +])# _LT_LANG_FC_CONFIG + + +# _LT_LANG_GCJ_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Java Compiler compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GCJ_CONFIG], +[AC_REQUIRE([LT_PROG_GCJ])dnl +AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GCJ-"gcj"} +CFLAGS=$GCJFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GCJ_CONFIG + + +# _LT_LANG_GO_CONFIG([TAG]) +# -------------------------- +# Ensure that the configuration variables for the GNU Go compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_GO_CONFIG], +[AC_REQUIRE([LT_PROG_GO])dnl +AC_LANG_SAVE + +# Source file extension for Go test sources. +ac_ext=go + +# Object file extension for compiled Go test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="package main; func main() { }" + +# Code to be used in simple link tests +lt_simple_link_test_code='package main; func main() { }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC=yes +CC=${GOC-"gccgo"} +CFLAGS=$GOFLAGS +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_TAGVAR(LD, $1)=$LD +_LT_CC_BASENAME([$compiler]) + +# Go did not exist at the time GCC didn't implicitly link libc in. +_LT_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_TAGVAR(reload_flag, $1)=$reload_flag +_LT_TAGVAR(reload_cmds, $1)=$reload_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +if test -n "$compiler"; then + _LT_COMPILER_NO_RTTI($1) + _LT_COMPILER_PIC($1) + _LT_COMPILER_C_O($1) + _LT_COMPILER_FILE_LOCKS($1) + _LT_LINKER_SHLIBS($1) + _LT_LINKER_HARDCODE_LIBPATH($1) + + _LT_CONFIG($1) +fi + +AC_LANG_RESTORE + +GCC=$lt_save_GCC +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_GO_CONFIG + + +# _LT_LANG_RC_CONFIG([TAG]) +# ------------------------- +# Ensure that the configuration variables for the Windows resource compiler +# are suitably defined. These variables are subsequently used by _LT_CONFIG +# to write the compiler configuration to 'libtool'. +m4_defun([_LT_LANG_RC_CONFIG], +[AC_REQUIRE([LT_PROG_RC])dnl +AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code=$lt_simple_compile_test_code + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_TAG_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_CFLAGS=$CFLAGS +lt_save_GCC=$GCC +GCC= +CC=${RC-"windres"} +CFLAGS= +compiler=$CC +_LT_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +if test -n "$compiler"; then + : + _LT_CONFIG($1) +fi + +GCC=$lt_save_GCC +AC_LANG_RESTORE +CC=$lt_save_CC +CFLAGS=$lt_save_CFLAGS +])# _LT_LANG_RC_CONFIG + + +# LT_PROG_GCJ +# ----------- +AC_DEFUN([LT_PROG_GCJ], +[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ], + [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ], + [AC_CHECK_TOOL(GCJ, gcj,) + test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS)])])[]dnl +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_GCJ], []) + + +# LT_PROG_GO +# ---------- +AC_DEFUN([LT_PROG_GO], +[AC_CHECK_TOOL(GOC, gccgo,) +]) + + +# LT_PROG_RC +# ---------- +AC_DEFUN([LT_PROG_RC], +[AC_CHECK_TOOL(RC, windres,) +]) + +# Old name: +AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_RC], []) + + +# _LT_DECL_EGREP +# -------------- +# If we don't have a new enough Autoconf to choose the best grep +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_EGREP], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_REQUIRE([AC_PROG_FGREP])dnl +test -z "$GREP" && GREP=grep +_LT_DECL([], [GREP], [1], [A grep program that handles long lines]) +_LT_DECL([], [EGREP], [1], [An ERE matcher]) +_LT_DECL([], [FGREP], [1], [A literal string matcher]) +dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too +AC_SUBST([GREP]) +]) + + +# _LT_DECL_OBJDUMP +# -------------- +# If we don't have a new enough Autoconf to choose the best objdump +# available, choose the one first in the user's PATH. +m4_defun([_LT_DECL_OBJDUMP], +[AC_CHECK_TOOL(OBJDUMP, objdump, false) +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper]) +AC_SUBST([OBJDUMP]) +]) + +# _LT_DECL_DLLTOOL +# ---------------- +# Ensure DLLTOOL variable is set. +m4_defun([_LT_DECL_DLLTOOL], +[AC_CHECK_TOOL(DLLTOOL, dlltool, false) +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program]) +AC_SUBST([DLLTOOL]) +]) + +# _LT_DECL_SED +# ------------ +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +m4_defun([_LT_DECL_SED], +[AC_PROG_SED +test -z "$SED" && SED=sed +Xsed="$SED -e 1s/^X//" +_LT_DECL([], [SED], [1], [A sed program that does not truncate output]) +_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"], + [Sed that helps us avoid accidentally triggering echo(1) options like -n]) +])# _LT_DECL_SED + +m4_ifndef([AC_PROG_SED], [ +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ + +m4_defun([AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f "$lt_ac_sed" && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test 10 -lt "$lt_ac_count" && break + lt_ac_count=`expr $lt_ac_count + 1` + if test "$lt_ac_count" -gt "$lt_ac_max"; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +])#AC_PROG_SED +])#m4_ifndef + +# Old name: +AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED]) +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([LT_AC_PROG_SED], []) + + +# _LT_CHECK_SHELL_FEATURES +# ------------------------ +# Find out whether the shell is Bourne or XSI compatible, +# or has some other useful features. +m4_defun([_LT_CHECK_SHELL_FEATURES], +[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + lt_unset=unset +else + lt_unset=false +fi +_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl + +# test EBCDIC or ASCII +case `echo X|tr X '\101'` in + A) # ASCII based system + # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr + lt_SP2NL='tr \040 \012' + lt_NL2SP='tr \015\012 \040\040' + ;; + *) # EBCDIC based system + lt_SP2NL='tr \100 \n' + lt_NL2SP='tr \r\n \100\100' + ;; +esac +_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl +_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl +])# _LT_CHECK_SHELL_FEATURES + + +# _LT_PATH_CONVERSION_FUNCTIONS +# ----------------------------- +# Determine what file name conversion functions should be used by +# func_to_host_file (and, implicitly, by func_to_host_path). These are needed +# for certain cross-compile configurations and native mingw. +m4_defun([_LT_PATH_CONVERSION_FUNCTIONS], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_MSG_CHECKING([how to convert $build file names to $host format]) +AC_CACHE_VAL(lt_cv_to_host_file_cmd, +[case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32 + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32 + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32 + ;; + esac + ;; + *-*-cygwin* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin + ;; + *-*-cygwin* ) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; + * ) # otherwise, assume *nix + lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin + ;; + esac + ;; + * ) # unhandled hosts (and "normal" native builds) + lt_cv_to_host_file_cmd=func_convert_file_noop + ;; +esac +]) +to_host_file_cmd=$lt_cv_to_host_file_cmd +AC_MSG_RESULT([$lt_cv_to_host_file_cmd]) +_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd], + [0], [convert $build file names to $host format])dnl + +AC_MSG_CHECKING([how to convert $build file names to toolchain format]) +AC_CACHE_VAL(lt_cv_to_tool_file_cmd, +[#assume ordinary cross tools, or native build. +lt_cv_to_tool_file_cmd=func_convert_file_noop +case $host in + *-*-mingw* ) + case $build in + *-*-mingw* ) # actually msys + lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32 + ;; + esac + ;; +esac +]) +to_tool_file_cmd=$lt_cv_to_tool_file_cmd +AC_MSG_RESULT([$lt_cv_to_tool_file_cmd]) +_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd], + [0], [convert $build files to toolchain format])dnl +])# _LT_PATH_CONVERSION_FUNCTIONS diff --git a/src/m4/ltoptions.m4 b/src/m4/ltoptions.m4 new file mode 100644 index 00000000..94b08297 --- /dev/null +++ b/src/m4/ltoptions.m4 @@ -0,0 +1,437 @@ +# Helper functions for option handling. -*- Autoconf -*- +# +# Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 8 ltoptions.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])]) + + +# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME) +# ------------------------------------------ +m4_define([_LT_MANGLE_OPTION], +[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])]) + + +# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME) +# --------------------------------------- +# Set option OPTION-NAME for macro MACRO-NAME, and if there is a +# matching handler defined, dispatch to it. Other OPTION-NAMEs are +# saved as a flag. +m4_define([_LT_SET_OPTION], +[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl +m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]), + _LT_MANGLE_DEFUN([$1], [$2]), + [m4_warning([Unknown $1 option '$2'])])[]dnl +]) + + +# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET]) +# ------------------------------------------------------------ +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +m4_define([_LT_IF_OPTION], +[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])]) + + +# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET) +# ------------------------------------------------------- +# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME +# are set. +m4_define([_LT_UNLESS_OPTIONS], +[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option), + [m4_define([$0_found])])])[]dnl +m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3 +])[]dnl +]) + + +# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST) +# ---------------------------------------- +# OPTION-LIST is a space-separated list of Libtool options associated +# with MACRO-NAME. If any OPTION has a matching handler declared with +# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about +# the unknown option and exit. +m4_defun([_LT_SET_OPTIONS], +[# Set options +m4_foreach([_LT_Option], m4_split(m4_normalize([$2])), + [_LT_SET_OPTION([$1], _LT_Option)]) + +m4_if([$1],[LT_INIT],[ + dnl + dnl Simply set some default values (i.e off) if boolean options were not + dnl specified: + _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no + ]) + _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no + ]) + dnl + dnl If no reference was made to various pairs of opposing options, then + dnl we run the default mode handler for the pair. For example, if neither + dnl 'shared' nor 'disable-shared' was passed, we enable building of shared + dnl archives by default: + _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED]) + _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC]) + _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install], + [_LT_ENABLE_FAST_INSTALL]) + _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4], + [_LT_WITH_AIX_SONAME([aix])]) + ]) +])# _LT_SET_OPTIONS + + +## --------------------------------- ## +## Macros to handle LT_INIT options. ## +## --------------------------------- ## + +# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME) +# ----------------------------------------- +m4_define([_LT_MANGLE_DEFUN], +[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])]) + + +# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE) +# ----------------------------------------------- +m4_define([LT_OPTION_DEFINE], +[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl +])# LT_OPTION_DEFINE + + +# dlopen +# ------ +LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes +]) + +AU_DEFUN([AC_LIBTOOL_DLOPEN], +[_LT_SET_OPTION([LT_INIT], [dlopen]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'dlopen' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], []) + + +# win32-dll +# --------- +# Declare package support for building win32 dll's. +LT_OPTION_DEFINE([LT_INIT], [win32-dll], +[enable_win32_dll=yes + +case $host in +*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; +esac + +test -z "$AS" && AS=as +_LT_DECL([], [AS], [1], [Assembler program])dnl + +test -z "$DLLTOOL" && DLLTOOL=dlltool +_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl + +test -z "$OBJDUMP" && OBJDUMP=objdump +_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl +])# win32-dll + +AU_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +_LT_SET_OPTION([LT_INIT], [win32-dll]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'win32-dll' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], []) + + +# _LT_ENABLE_SHARED([DEFAULT]) +# ---------------------------- +# implement the --enable-shared flag, and supports the 'shared' and +# 'disable-shared' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_SHARED], +[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([shared], + [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_shared=]_LT_ENABLE_SHARED_DEFAULT) + + _LT_DECL([build_libtool_libs], [enable_shared], [0], + [Whether or not to build shared libraries]) +])# _LT_ENABLE_SHARED + +LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared]) +]) + +AC_DEFUN([AC_DISABLE_SHARED], +[_LT_SET_OPTION([LT_INIT], [disable-shared]) +]) + +AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_SHARED], []) +dnl AC_DEFUN([AM_DISABLE_SHARED], []) + + + +# _LT_ENABLE_STATIC([DEFAULT]) +# ---------------------------- +# implement the --enable-static flag, and support the 'static' and +# 'disable-static' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_STATIC], +[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([static], + [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_static=]_LT_ENABLE_STATIC_DEFAULT) + + _LT_DECL([build_old_libs], [enable_static], [0], + [Whether or not to build static libraries]) +])# _LT_ENABLE_STATIC + +LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])]) + +# Old names: +AC_DEFUN([AC_ENABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static]) +]) + +AC_DEFUN([AC_DISABLE_STATIC], +[_LT_SET_OPTION([LT_INIT], [disable-static]) +]) + +AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AM_ENABLE_STATIC], []) +dnl AC_DEFUN([AM_DISABLE_STATIC], []) + + + +# _LT_ENABLE_FAST_INSTALL([DEFAULT]) +# ---------------------------------- +# implement the --enable-fast-install flag, and support the 'fast-install' +# and 'disable-fast-install' LT_INIT options. +# DEFAULT is either 'yes' or 'no'. If omitted, it defaults to 'yes'. +m4_define([_LT_ENABLE_FAST_INSTALL], +[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl +AC_ARG_ENABLE([fast-install], + [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for pkg in $enableval; do + IFS=$lt_save_ifs + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT) + +_LT_DECL([fast_install], [enable_fast_install], [0], + [Whether or not to optimize for fast installation])dnl +])# _LT_ENABLE_FAST_INSTALL + +LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])]) +LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])]) + +# Old names: +AU_DEFUN([AC_ENABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'fast-install' option into LT_INIT's first parameter.]) +]) + +AU_DEFUN([AC_DISABLE_FAST_INSTALL], +[_LT_SET_OPTION([LT_INIT], [disable-fast-install]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you put +the 'disable-fast-install' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], []) +dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], []) + + +# _LT_WITH_AIX_SONAME([DEFAULT]) +# ---------------------------------- +# implement the --with-aix-soname flag, and support the `aix-soname=aix' +# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT +# is either `aix', `both' or `svr4'. If omitted, it defaults to `aix'. +m4_define([_LT_WITH_AIX_SONAME], +[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl +shared_archive_member_spec= +case $host,$enable_shared in +power*-*-aix[[5-9]]*,yes) + AC_MSG_CHECKING([which variant of shared library versioning to provide]) + AC_ARG_WITH([aix-soname], + [AS_HELP_STRING([--with-aix-soname=aix|svr4|both], + [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])], + [case $withval in + aix|svr4|both) + ;; + *) + AC_MSG_ERROR([Unknown argument to --with-aix-soname]) + ;; + esac + lt_cv_with_aix_soname=$with_aix_soname], + [AC_CACHE_VAL([lt_cv_with_aix_soname], + [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT) + with_aix_soname=$lt_cv_with_aix_soname]) + AC_MSG_RESULT([$with_aix_soname]) + if test aix != "$with_aix_soname"; then + # For the AIX way of multilib, we name the shared archive member + # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o', + # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File. + # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag, + # the AIX toolchain works better with OBJECT_MODE set (default 32). + if test 64 = "${OBJECT_MODE-32}"; then + shared_archive_member_spec=shr_64 + else + shared_archive_member_spec=shr + fi + fi + ;; +*) + with_aix_soname=aix + ;; +esac + +_LT_DECL([], [shared_archive_member_spec], [0], + [Shared archive member basename, for filename based shared library versioning on AIX])dnl +])# _LT_WITH_AIX_SONAME + +LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])]) +LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])]) + + +# _LT_WITH_PIC([MODE]) +# -------------------- +# implement the --with-pic flag, and support the 'pic-only' and 'no-pic' +# LT_INIT options. +# MODE is either 'yes' or 'no'. If omitted, it defaults to 'both'. +m4_define([_LT_WITH_PIC], +[AC_ARG_WITH([pic], + [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [lt_p=${PACKAGE-default} + case $withval in + yes|no) pic_mode=$withval ;; + *) + pic_mode=default + # Look at the argument we got. We use all the common list separators. + lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR, + for lt_pkg in $withval; do + IFS=$lt_save_ifs + if test "X$lt_pkg" = "X$lt_p"; then + pic_mode=yes + fi + done + IFS=$lt_save_ifs + ;; + esac], + [pic_mode=m4_default([$1], [default])]) + +_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl +])# _LT_WITH_PIC + +LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])]) +LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])]) + +# Old name: +AU_DEFUN([AC_LIBTOOL_PICMODE], +[_LT_SET_OPTION([LT_INIT], [pic-only]) +AC_DIAGNOSE([obsolete], +[$0: Remove this warning and the call to _LT_SET_OPTION when you +put the 'pic-only' option into LT_INIT's first parameter.]) +]) + +dnl aclocal-1.4 backwards compatibility: +dnl AC_DEFUN([AC_LIBTOOL_PICMODE], []) + +## ----------------- ## +## LTDL_INIT Options ## +## ----------------- ## + +m4_define([_LTDL_MODE], []) +LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive], + [m4_define([_LTDL_MODE], [nonrecursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [recursive], + [m4_define([_LTDL_MODE], [recursive])]) +LT_OPTION_DEFINE([LTDL_INIT], [subproject], + [m4_define([_LTDL_MODE], [subproject])]) + +m4_define([_LTDL_TYPE], []) +LT_OPTION_DEFINE([LTDL_INIT], [installable], + [m4_define([_LTDL_TYPE], [installable])]) +LT_OPTION_DEFINE([LTDL_INIT], [convenience], + [m4_define([_LTDL_TYPE], [convenience])]) diff --git a/src/m4/ltsugar.m4 b/src/m4/ltsugar.m4 new file mode 100644 index 00000000..48bc9344 --- /dev/null +++ b/src/m4/ltsugar.m4 @@ -0,0 +1,124 @@ +# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software +# Foundation, Inc. +# Written by Gary V. Vaughan, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 6 ltsugar.m4 + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])]) + + +# lt_join(SEP, ARG1, [ARG2...]) +# ----------------------------- +# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their +# associated separator. +# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier +# versions in m4sugar had bugs. +m4_define([lt_join], +[m4_if([$#], [1], [], + [$#], [2], [[$2]], + [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])]) +m4_define([_lt_join], +[m4_if([$#$2], [2], [], + [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])]) + + +# lt_car(LIST) +# lt_cdr(LIST) +# ------------ +# Manipulate m4 lists. +# These macros are necessary as long as will still need to support +# Autoconf-2.59, which quotes differently. +m4_define([lt_car], [[$1]]) +m4_define([lt_cdr], +[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])], + [$#], 1, [], + [m4_dquote(m4_shift($@))])]) +m4_define([lt_unquote], $1) + + +# lt_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'. +# Note that neither SEPARATOR nor STRING are expanded; they are appended +# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked). +# No SEPARATOR is output if MACRO-NAME was previously undefined (different +# than defined and empty). +# +# This macro is needed until we can rely on Autoconf 2.62, since earlier +# versions of m4sugar mistakenly expanded SEPARATOR but not STRING. +m4_define([lt_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])]) + + + +# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...]) +# ---------------------------------------------------------- +# Produce a SEP delimited list of all paired combinations of elements of +# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list +# has the form PREFIXmINFIXSUFFIXn. +# Needed until we can rely on m4_combine added in Autoconf 2.62. +m4_define([lt_combine], +[m4_if(m4_eval([$# > 3]), [1], + [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl +[[m4_foreach([_Lt_prefix], [$2], + [m4_foreach([_Lt_suffix], + ]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[, + [_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])]) + + +# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ]) +# ----------------------------------------------------------------------- +# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited +# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ. +m4_define([lt_if_append_uniq], +[m4_ifdef([$1], + [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1], + [lt_append([$1], [$2], [$3])$4], + [$5])], + [lt_append([$1], [$2], [$3])$4])]) + + +# lt_dict_add(DICT, KEY, VALUE) +# ----------------------------- +m4_define([lt_dict_add], +[m4_define([$1($2)], [$3])]) + + +# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE) +# -------------------------------------------- +m4_define([lt_dict_add_subkey], +[m4_define([$1($2:$3)], [$4])]) + + +# lt_dict_fetch(DICT, KEY, [SUBKEY]) +# ---------------------------------- +m4_define([lt_dict_fetch], +[m4_ifval([$3], + m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]), + m4_ifdef([$1($2)], [m4_defn([$1($2)])]))]) + + +# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE]) +# ----------------------------------------------------------------- +m4_define([lt_if_dict_fetch], +[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4], + [$5], + [$6])]) + + +# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...]) +# -------------------------------------------------------------- +m4_define([lt_dict_filter], +[m4_if([$5], [], [], + [lt_join(m4_quote(m4_default([$4], [[, ]])), + lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]), + [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl +]) diff --git a/src/m4/ltversion.m4 b/src/m4/ltversion.m4 new file mode 100644 index 00000000..fa04b52a --- /dev/null +++ b/src/m4/ltversion.m4 @@ -0,0 +1,23 @@ +# ltversion.m4 -- version numbers -*- Autoconf -*- +# +# Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc. +# Written by Scott James Remnant, 2004 +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# @configure_input@ + +# serial 4179 ltversion.m4 +# This file is part of GNU Libtool + +m4_define([LT_PACKAGE_VERSION], [2.4.6]) +m4_define([LT_PACKAGE_REVISION], [2.4.6]) + +AC_DEFUN([LTVERSION_VERSION], +[macro_version='2.4.6' +macro_revision='2.4.6' +_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?]) +_LT_DECL(, macro_revision, 0) +]) diff --git a/src/m4/lt~obsolete.m4 b/src/m4/lt~obsolete.m4 new file mode 100644 index 00000000..c6b26f88 --- /dev/null +++ b/src/m4/lt~obsolete.m4 @@ -0,0 +1,99 @@ +# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*- +# +# Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software +# Foundation, Inc. +# Written by Scott James Remnant, 2004. +# +# This file is free software; the Free Software Foundation gives +# unlimited permission to copy and/or distribute it, with or without +# modifications, as long as this notice is preserved. + +# serial 5 lt~obsolete.m4 + +# These exist entirely to fool aclocal when bootstrapping libtool. +# +# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN), +# which have later been changed to m4_define as they aren't part of the +# exported API, or moved to Autoconf or Automake where they belong. +# +# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN +# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us +# using a macro with the same name in our local m4/libtool.m4 it'll +# pull the old libtool.m4 in (it doesn't see our shiny new m4_define +# and doesn't know about Autoconf macros at all.) +# +# So we provide this file, which has a silly filename so it's always +# included after everything else. This provides aclocal with the +# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything +# because those macros already exist, or will be overwritten later. +# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. +# +# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here. +# Yes, that means every name once taken will need to remain here until +# we give up compatibility with versions before 1.7, at which point +# we need to keep only those names which we still refer to. + +# This is to help aclocal find these macros, as it can't see m4_define. +AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])]) + +m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])]) +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])]) +m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])]) +m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])]) +m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])]) +m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])]) +m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])]) +m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])]) +m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])]) +m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])]) +m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])]) +m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])]) +m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])]) +m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])]) +m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])]) +m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])]) +m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])]) +m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])]) +m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])]) +m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])]) +m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])]) +m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])]) +m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])]) +m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])]) +m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])]) +m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])]) +m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])]) +m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])]) +m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])]) +m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])]) +m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])]) +m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])]) +m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])]) +m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])]) +m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])]) +m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])]) +m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])]) +m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])]) +m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])]) +m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])]) +m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])]) +m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])]) +m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])]) +m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])]) +m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])]) +m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])]) +m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])]) +m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])]) +m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])]) +m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])]) +m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])]) +m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])]) +m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])]) +m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])]) +m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])]) diff --git a/src/makefile.bsd b/src/makefile.bsd deleted file mode 100644 index 31167a64..00000000 --- a/src/makefile.bsd +++ /dev/null @@ -1,206 +0,0 @@ -# Copyright (c) 2009-2010 Satoshi Nakamoto -# Distributed under the MIT/X11 software license, see the accompanying -# file COPYING or http://www.opensource.org/licenses/mit-license.php. - -USE_UPNP:=0 -USE_WALLET:=1 - -LINK:=$(CXX) - -DEFS=-DBOOST_SPIRIT_THREADSAFE - -DEFS += $(addprefix -I,$(CURDIR) $(CURDIR)/obj $(BOOST_INCLUDE_PATH) $(BDB_INCLUDE_PATH) $(OPENSSL_INCLUDE_PATH)) -LIBS = $(addprefix -L,$(BOOST_LIB_PATH) $(BDB_LIB_PATH) $(OPENSSL_LIB_PATH)) - -LMODE = dynamic -LMODE2 = dynamic -ifdef STATIC - LMODE = static - ifeq (${STATIC}, all) - LMODE2 = static - endif -endif - -# for boost 1.37, add -mt to the boost libraries -LIBS += \ - -Wl,-B$(LMODE) \ - -l boost_system$(BOOST_LIB_SUFFIX) \ - -l boost_filesystem$(BOOST_LIB_SUFFIX) \ - -l boost_program_options$(BOOST_LIB_SUFFIX) \ - -l boost_thread$(BOOST_LIB_SUFFIX) \ - -l db_cxx$(BDB_LIB_SUFFIX) \ - -l ssl \ - -l crypto \ - -l execinfo - -ifndef USE_UPNP - override USE_UPNP = - -endif -ifneq (${USE_UPNP}, -) - LIBS += -l miniupnpc - DEFS += -DUSE_UPNP=$(USE_UPNP) -endif - -LIBS+= \ - -Wl,-B$(LMODE2) \ - -l z \ - -l dl \ - -l pthread - - -# Hardening -# Make some classes of vulnerabilities unexploitable in case one is discovered. -# - # This is a workaround for Ubuntu bug #691722, the default -fstack-protector causes - # -fstack-protector-all to be ignored unless -fno-stack-protector is used first. - # see: https://bugs.launchpad.net/ubuntu/+source/gcc-4.5/+bug/691722 - HARDENING=-fno-stack-protector - - # Stack Canaries - # Put numbers at the beginning of each stack frame and check that they are the same. - # If a stack buffer if overflowed, it writes over the canary number and then on return - # when that number is checked, it won't be the same and the program will exit with - # a "Stack smashing detected" error instead of being exploited. - HARDENING+=-fstack-protector-all -Wstack-protector - - # Make some important things such as the global offset table read only as soon as - # the dynamic linker is finished building it. This will prevent overwriting of addresses - # which would later be jumped to. - LDHARDENING+=-Wl,-z,relro -Wl,-z,now - - # Build position independent code to take advantage of Address Space Layout Randomization - # offered by some kernels. - # see doc/build-unix.txt for more information. - ifdef PIE - HARDENING+=-fPIE - LDHARDENING+=-pie - endif - - # -D_FORTIFY_SOURCE=2 does some checking for potentially exploitable code patterns in - # the source such overflowing a statically defined buffer. - HARDENING+=-D_FORTIFY_SOURCE=2 -# - - -DEBUGFLAGS=-g - -# CXXFLAGS can be specified on the make command line, so we use xCXXFLAGS that only -# adds some defaults in front. Unfortunately, CXXFLAGS=... $(CXXFLAGS) does not work. -xCXXFLAGS=-O0 -msse2 -pthread -Wall -Wextra -Wno-ignored-qualifiers -Wformat -Wformat-security -Wno-unused-parameter \ - $(DEBUGFLAGS) $(DEFS) $(HARDENING) $(CXXFLAGS) - -# LDFLAGS can be specified on the make command line, so we use xLDFLAGS that only -# adds some defaults in front. Unfortunately, LDFLAGS=... $(LDFLAGS) does not work. -xLDFLAGS=$(LDHARDENING) $(LDFLAGS) - -OBJS= \ - obj/alert.o \ - obj/blocksizecalculator.o \ - obj/blockparams.o \ - obj/chainparams.o \ - obj/allocators.o \ - obj/version.o \ - obj/velocity.o \ - obj/support/cleanse.o \ - obj/checkpoints.o \ - obj/netbase.o \ - obj/addrman.o \ - obj/base58.o \ - obj/crypter.o \ - obj/key.o \ - obj/pubkey.o \ - obj/ecwrapper.o \ - obj/init.o \ - obj/bitcoind.o \ - obj/keystore.o \ - obj/chain.o \ - obj/main.o \ - obj/net.o \ - obj/protocol.o \ - obj/rpcclient.o \ - obj/rpcprotocol.o \ - obj/rpcserver.o \ - obj/rpcvelocity.o \ - obj/rpcmisc.o \ - obj/rpcnet.o \ - obj/rpcblockchain.o \ - obj/rpcrawtransaction.o \ - obj/script.o \ - obj/scrypt.o \ - obj/sync.o \ - obj/txmempool.o \ - obj/util.o \ - obj/hash.o \ - obj/noui.o \ - obj/kernel.o \ - obj/pbkdf2.o \ - obj/stealth.o \ - obj/activemasternode.o \ - obj/mnengine.o \ - obj/instantx.o \ - obj/smessage.o \ - obj/rpcsmessage.o \ - obj/webwalletconnector.o \ - obj/masternodeconfig.o \ - obj/masternodeman.o \ - obj/masternode.o \ - obj/masternode-payments.o \ - obj/rpcmnengine.o \ - obj/spork.o \ - obj/crypto/common/hmac_sha256.o \ - obj/crypto/common/hmac_sha512.o \ - obj/crypto/common/ripemd160.o \ - obj/crypto/common/sha1.o \ - obj/crypto/common/sha256.o \ - obj/crypto/common/sha512.o \ - obj/crypto/common/aes_helper.o \ - obj/crypto/common/bmw.o \ - obj/crypto/common/echo.o - -ifeq (${USE_WALLET}, 1) - DEFS += -DENABLE_WALLET - OBJS += \ - obj/db.o \ - obj/miner.o \ - obj/rpcdump.o \ - obj/rpcmining.o \ - obj/rpcwallet.o \ - obj/wallet.o \ - obj/walletdb.o -endif - -all: DigitalNoted - -LIBS += $(CURDIR)/leveldb/libleveldb.a $(CURDIR)/leveldb/libmemenv.a -DEFS += $(addprefix -I,$(CURDIR)/leveldb/include) -DEFS += $(addprefix -I,$(CURDIR)/leveldb/helpers) -OBJS += obj/txdb-leveldb.o -leveldb/libleveldb.a: - @echo "Building LevelDB ..."; cd leveldb; make libleveldb.a libmemenv.a; cd ..; -obj/txdb-leveldb.o: leveldb/libleveldb.a - -# auto-generated dependencies: --include obj/*.P - -obj/build.h: FORCE - /bin/sh ../share/genbuild.sh obj/build.h -version.cpp: obj/build.h -DEFS += -DHAVE_BUILD_INFO - -obj/%.o: %.cpp - $(CXX) -c $(xCXXFLAGS) -MMD -MF $(@:%.o=%.d) -o $@ $< - @cp $(@:%.o=%.d) $(@:%.o=%.P); \ - sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ - -e '/^$$/ d' -e 's/$$/ :/' < $(@:%.o=%.d) >> $(@:%.o=%.P); \ - rm -f $(@:%.o=%.d) - -DigitalNoted: $(OBJS:obj/%=obj/%) - $(LINK) $(xCXXFLAGS) -o $@ $^ $(xLDFLAGS) $(LIBS) - -clean: - -rm -f DigitalNoted - -rm -f obj/*.o - -rm -f obj/*.P - -rm -f obj/build.h - -FORCE: diff --git a/src/net.h b/src/net.h index eeae2763..728c743b 100644 --- a/src/net.h +++ b/src/net.h @@ -43,9 +43,9 @@ namespace boost { static const int PING_INTERVAL = 1 * 60; /** Time after which to disconnect, after waiting for a ping response (or inactivity). */ static const int TIMEOUT_INTERVAL = 30 * 60; -/** Time between cycles to check for idle nodes, force disconnect (seconds) **/ +/** Time between cycles to check for idle nodes, force disconnect (seconds) **/ static const int IDLE_TIMEOUT = 15 * 60; -/** Time between cycles to check for idle nodes, force disconnect (seconds) **/ +/** Time between cycles to check for idle nodes, force disconnect (seconds) **/ static const int DATA_TIMEOUT = 30 * 60; /** Maximum length of strSubVer in `version` message */ static const unsigned int MAX_SUBVERSION_LENGTH = 256; @@ -251,7 +251,7 @@ class CBanEntry SetNull(); nCreateTime = nCreateTimeIn; } - + IMPLEMENT_SERIALIZE ( READWRITE(this->nVersion); @@ -281,7 +281,7 @@ class CBanEntry } } }; - + typedef std::map banmap_t; /** Information about a DigitalNote (D-Note) peer */ @@ -489,7 +489,7 @@ class CNode unsigned int GetTotalRecvSize() { unsigned int total = 0; - BOOST_FOREACH(const CNetMessage &msg, vRecvMsg) + BOOST_FOREACH(const CNetMessage &msg, vRecvMsg) total += msg.vRecv.size() + 24; return total; } diff --git a/src/netbase.cpp b/src/netbase.cpp index a287a50b..6e107744 100644 --- a/src/netbase.cpp +++ b/src/netbase.cpp @@ -3,6 +3,18 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#ifdef HAVE_CONFIG_H +#include "bitcoin-config.h" +#endif + +#ifdef HAVE_INET_PTON +#include +#endif + +#ifdef HAVE_GETADDRINFO_A +#include +#endif + #include "netbase.h" #include "hash.h" @@ -75,6 +87,28 @@ bool static LookupIntern(const char *pszName, std::vector& vIP, unsign } } +#ifdef HAVE_GETADDRINFO_A + struct in_addr ipv4_addr; +#ifdef HAVE_INET_PTON + if (inet_pton(AF_INET, pszName, &ipv4_addr) > 0) { + vIP.push_back(CNetAddr(ipv4_addr)); + return true; + } + + struct in6_addr ipv6_addr; + if (inet_pton(AF_INET6, pszName, &ipv6_addr) > 0) { + vIP.push_back(CNetAddr(ipv6_addr)); + return true; + } +#else + ipv4_addr.s_addr = inet_addr(pszName); + if (ipv4_addr.s_addr != INADDR_NONE) { + vIP.push_back(CNetAddr(ipv4_addr)); + return true; + } +#endif +#endif + struct addrinfo aiHint; memset(&aiHint, 0, sizeof(struct addrinfo)); @@ -87,7 +121,31 @@ bool static LookupIntern(const char *pszName, std::vector& vIP, unsign aiHint.ai_flags = fAllowLookup ? AI_ADDRCONFIG : AI_NUMERICHOST; #endif struct addrinfo *aiRes = NULL; +#ifdef HAVE_GETADDRINFO_A + struct gaicb gcb, *query = &gcb; + memset(query, 0, sizeof(struct gaicb)); + gcb.ar_name = pszName; + gcb.ar_request = &aiHint; + int nErr = getaddrinfo_a(GAI_NOWAIT, &query, 1, NULL); + if (nErr) + return false; + + do { + // Should set the timeout limit to a resonable value to avoid + // generating unnecessary checking call during the polling loop, + // while it can still response to stop request quick enough. + // 2 seconds looks fine in our situation. + struct timespec ts = { 2, 0 }; + gai_suspend(&query, 1, &ts); + boost::this_thread::interruption_point(); + + nErr = gai_error(query); + if (0 == nErr) + aiRes = query->ar_result; + } while (nErr == EAI_INPROGRESS); +#else int nErr = getaddrinfo(pszName, NULL, &aiHint, &aiRes); +#endif if (nErr) return false; diff --git a/src/qt/MakeFile.am b/src/qt/MakeFile.am new file mode 100644 index 00000000..ac4fb337 --- /dev/null +++ b/src/qt/MakeFile.am @@ -0,0 +1,267 @@ +include $(top_srcdir)/src/Makefile.include + +AM_CPPFLAGS += -I$(top_srcdir)/src \ + -I$(top_builddir)/src/qt \ + -I$(top_builddir)/src/qt/forms \ + $(PROTOBUF_CFLAGS) \ + $(QR_CFLAGS) +bin_PROGRAMS = bitcoin-qt +noinst_LIBRARIES = libbitcoinqt.a +SUBDIRS = $(BUILD_TEST_QT) +DIST_SUBDIRS = test + +# bitcoin qt core # +QT_TS = \ + locale/bitcoin_ach.ts \ + locale/bitcoin_af_ZA.ts \ + locale/bitcoin_ar.ts \ + locale/bitcoin_be_BY.ts \ + locale/bitcoin_bg.ts \ + locale/bitcoin_bs.ts \ + locale/bitcoin_ca_ES.ts \ + locale/bitcoin_ca.ts \ + locale/bitcoin_cs.ts \ + locale/bitcoin_cy.ts \ + locale/bitcoin_da.ts \ + locale/bitcoin_de_AT.ts \ + locale/bitcoin_de.ts \ + locale/bitcoin_el_GR.ts \ + locale/bitcoin_en.ts \ + locale/bitcoin_eo.ts \ + locale/bitcoin_es_CL.ts \ + locale/bitcoin_es_MX.ts \ + locale/bitcoin_es.ts \ + locale/bitcoin_et.ts \ + locale/bitcoin_eu_ES.ts \ + locale/bitcoin_fa_IR.ts \ + locale/bitcoin_fa.ts \ + locale/bitcoin_fi.ts \ + locale/bitcoin_fr_CA.ts \ + locale/bitcoin_fr.ts \ + locale/bitcoin_gl.ts \ + locale/bitcoin_gu_IN.ts \ + locale/bitcoin_he.ts \ + locale/bitcoin_hi_IN.ts \ + locale/bitcoin_hr.ts \ + locale/bitcoin_hu.ts \ + locale/bitcoin_id_ID.ts \ + locale/bitcoin_it.ts \ + locale/bitcoin_ja.ts \ + locale/bitcoin_kk_KZ.ts \ + locale/bitcoin_ko_KR.ts \ + locale/bitcoin_la.ts \ + locale/bitcoin_lt.ts \ + locale/bitcoin_lv_LV.ts \ + locale/bitcoin_ms_MY.ts \ + locale/bitcoin_nb.ts \ + locale/bitcoin_nl.ts \ + locale/bitcoin_pam.ts \ + locale/bitcoin_pl.ts \ + locale/bitcoin_pt_BR.ts \ + locale/bitcoin_pt_PT.ts \ + locale/bitcoin_ro_RO.ts \ + locale/bitcoin_ru.ts \ + locale/bitcoin_sk.ts \ + locale/bitcoin_sl_SI.ts \ + locale/bitcoin_sq.ts \ + locale/bitcoin_sr.ts \ + locale/bitcoin_sv.ts \ + locale/bitcoin_th_TH.ts \ + locale/bitcoin_tr.ts \ + locale/bitcoin_uk.ts \ + locale/bitcoin_vi.ts \ + locale/bitcoin_vi_VN.ts \ + locale/bitcoin_zh_CN.ts \ + locale/bitcoin_zh_TW.ts + +QT_FORMS_UI = forms/aboutdialog.ui forms/addressbookpage.ui \ + forms/askpassphrasedialog.ui \ + forms/coincontroldialog.ui \ + forms/editaddressdialog.ui \ + forms/intro.ui \ + forms/openuridialog.ui \ + forms/optionsdialog.ui forms/overviewpage.ui forms/receiverequestdialog.ui \ + forms/receivecoinsdialog.ui \ + forms/rpcconsole.ui forms/sendcoinsdialog.ui forms/sendcoinsentry.ui \ + forms/signverifymessagedialog.ui forms/transactiondescdialog.ui + +QT_MOC_CPP = moc_aboutdialog.cpp moc_addressbookpage.cpp \ + moc_addresstablemodel.cpp moc_askpassphrasedialog.cpp \ + moc_bitcoinaddressvalidator.cpp moc_bitcoinamountfield.cpp \ + moc_bitcoingui.cpp moc_bitcoinunits.cpp moc_clientmodel.cpp \ + moc_coincontroldialog.cpp \ + moc_coincontroltreewidget.cpp \ + moc_csvmodelwriter.cpp moc_editaddressdialog.cpp moc_guiutil.cpp \ + moc_intro.cpp moc_macdockiconhandler.cpp moc_macnotificationhandler.cpp \ + moc_monitoreddatamapper.cpp moc_notificator.cpp \ + moc_openuridialog.cpp \ + moc_optionsdialog.cpp \ + moc_optionsmodel.cpp moc_overviewpage.cpp moc_paymentserver.cpp \ + moc_receiverequestdialog.cpp moc_qvalidatedlineedit.cpp moc_qvaluecombobox.cpp \ + moc_receivecoinsdialog.cpp \ + moc_recentrequeststablemodel.cpp \ + moc_rpcconsole.cpp moc_sendcoinsdialog.cpp moc_sendcoinsentry.cpp \ + moc_signverifymessagedialog.cpp moc_splashscreen.cpp moc_trafficgraphwidget.cpp moc_transactiondesc.cpp \ + moc_transactiondescdialog.cpp moc_transactionfilterproxy.cpp \ + moc_transactiontablemodel.cpp moc_transactionview.cpp moc_walletframe.cpp \ + moc_walletmodel.cpp moc_walletview.cpp + +BITCOIN_MM = macdockiconhandler.mm macnotificationhandler.mm + +QT_MOC = intro.moc overviewpage.moc rpcconsole.moc bitcoin.moc + +QT_QRC_CPP = qrc_bitcoin.cpp +QT_QRC = bitcoin.qrc + +PROTOBUF_CC = paymentrequest.pb.cc +PROTOBUF_H = paymentrequest.pb.h +PROTOBUF_PROTO = paymentrequest.proto + +BITCOIN_QT_H = aboutdialog.h addressbookpage.h addresstablemodel.h \ + askpassphrasedialog.h bitcoinaddressvalidator.h bitcoinamountfield.h \ + bitcoingui.h bitcoinunits.h clientmodel.h coincontroldialog.h coincontroltreewidget.h csvmodelwriter.h \ + editaddressdialog.h guiconstants.h guiutil.h intro.h macdockiconhandler.h \ + macnotificationhandler.h monitoreddatamapper.h notificator.h \ + openuridialog.h \ + optionsdialog.h \ + optionsmodel.h overviewpage.h paymentrequestplus.h paymentserver.h \ + receivecoinsdialog.h \ + recentrequeststablemodel.h \ + receiverequestdialog.h qvalidatedlineedit.h qvaluecombobox.h rpcconsole.h \ + sendcoinsdialog.h sendcoinsentry.h signverifymessagedialog.h splashscreen.h \ + trafficgraphwidget.h transactiondescdialog.h transactiondesc.h transactionfilterproxy.h \ + transactionrecord.h transactiontablemodel.h transactionview.h walletframe.h \ + walletmodel.h walletmodeltransaction.h walletview.h + +RES_ICONS = res/icons/bitcoin.png res/icons/address-book.png \ + res/icons/quit.png res/icons/send.png res/icons/toolbar.png \ + res/icons/connect0_16.png res/icons/connect1_16.png \ + res/icons/connect2_16.png res/icons/connect3_16.png \ + res/icons/connect4_16.png res/icons/transaction0.png \ + res/icons/transaction2.png res/icons/clock1.png res/icons/clock2.png \ + res/icons/clock3.png res/icons/clock4.png res/icons/clock5.png \ + res/icons/configure.png res/icons/receive.png res/icons/editpaste.png \ + res/icons/editcopy.png res/icons/add.png res/icons/bitcoin_testnet.png \ + res/icons/toolbar_testnet.png res/icons/edit.png res/icons/history.png \ + res/icons/overview.png res/icons/export.png res/icons/synced.png \ + res/icons/remove.png res/icons/tx_mined.png res/icons/tx_input.png \ + res/icons/tx_output.png res/icons/tx_inout.png res/icons/lock_closed.png \ + res/icons/lock_open.png res/icons/key.png res/icons/filesave.png \ + res/icons/qrcode.png res/icons/debugwindow.png res/icons/bitcoin.ico \ + res/icons/bitcoin_testnet.ico + +BITCOIN_QT_CPP = \ + aboutdialog.cpp \ + bitcoinaddressvalidator.cpp \ + bitcoinamountfield.cpp \ + bitcoin.cpp \ + bitcoingui.cpp \ + bitcoinunits.cpp \ + clientmodel.cpp \ + csvmodelwriter.cpp \ + guiutil.cpp \ + intro.cpp \ + monitoreddatamapper.cpp \ + notificator.cpp \ + optionsdialog.cpp \ + optionsmodel.cpp \ + qvalidatedlineedit.cpp \ + qvaluecombobox.cpp \ + rpcconsole.cpp \ + signverifymessagedialog.cpp \ + splashscreen.cpp \ + trafficgraphwidget.cpp + +if ENABLE_WALLET +BITCOIN_QT_CPP += \ + addressbookpage.cpp \ + addresstablemodel.cpp \ + askpassphrasedialog.cpp \ + coincontroldialog.cpp \ + coincontroltreewidget.cpp \ + editaddressdialog.cpp \ + openuridialog.cpp \ + overviewpage.cpp \ + paymentrequestplus.cpp \ + paymentserver.cpp \ + receivecoinsdialog.cpp \ + receiverequestdialog.cpp \ + recentrequeststablemodel.cpp \ + sendcoinsdialog.cpp \ + sendcoinsentry.cpp \ + transactiondesc.cpp \ + transactiondescdialog.cpp \ + transactionfilterproxy.cpp \ + transactionrecord.cpp \ + transactiontablemodel.cpp \ + transactionview.cpp \ + walletframe.cpp \ + walletmodel.cpp \ + walletmodeltransaction.cpp \ + walletview.cpp +endif + +RES_IMAGES = res/images/about.png res/images/splash.png \ + res/images/splash_testnet.png + +RES_MOVIES = res/movies/update_spinner.mng + +BITCOIN_RC = res/bitcoin-qt-res.rc + +libbitcoinqt_a_CPPFLAGS = $(AM_CPPFLAGS) $(QT_INCLUDES) \ + -I$(top_srcdir)/src/qt/forms $(QT_DBUS_INCLUDES) +libbitcoinqt_a_SOURCES = $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(QT_FORMS_UI) \ + $(QT_QRC) $(QT_TS) $(PROTOBUF_PROTO) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) + +nodist_libbitcoinqt_a_SOURCES = $(QT_MOC_CPP) $(QT_MOC) $(PROTOBUF_CC) \ + $(PROTOBUF_H) $(QT_QRC_CPP) + +BUILT_SOURCES = $(nodist_libbitcoinqt_a_SOURCES) + +#Generating these with a half-written protobuf header leads to wacky results. +#This makes sure it's done. +$(QT_MOC): $(PROTOBUF_H) +$(QT_MOC_CPP): $(PROTOBUF_H) + +if TARGET_DARWIN + libbitcoinqt_a_SOURCES += $(BITCOIN_MM) +endif +if TARGET_WINDOWS + libbitcoinqt_a_SOURCES += $(BITCOIN_RC) +endif +# + +# bitcoin-qt binary # +bitcoin_qt_CPPFLAGS = $(AM_CPPFLAGS) $(QT_INCLUDES) \ + -I$(top_srcdir)/src/qt/forms +bitcoin_qt_SOURCES = bitcoin.cpp +bitcoin_qt_LDADD = libbitcoinqt.a $(LIBBITCOIN_SERVER) +if ENABLE_WALLET +bitcoin_qt_LDADD += $(LIBBITCOIN_WALLET) +endif +bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBLEVELDB) $(LIBMEMENV) \ + $(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) + +# forms/foo.h -> forms/ui_foo.h +QT_FORMS_H=$(join $(dir $(QT_FORMS_UI)),$(addprefix ui_, $(notdir $(QT_FORMS_UI:.ui=.h)))) + +#locale/foo.ts -> locale/foo.qm +QT_QM=$(QT_TS:.ts=.qm) + +.PHONY: FORCE +.SECONDARY: $(QT_QM) + +bitcoinstrings.cpp: FORCE + $(MAKE) -C $(top_srcdir)/src qt/bitcoinstrings.cpp + +translate: bitcoinstrings.cpp $(QT_FORMS_UI) $(QT_FORMS_UI) $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(BITCOIN_MM) + @test -n $(LUPDATE) || echo "lupdate is required for updating translations" + @QT_SELECT=$(QT_SELECT) $(LUPDATE) $^ -locations relative -no-obsolete -ts locale/bitcoin_en.ts + +$(QT_QRC_CPP): $(QT_QRC) $(QT_QM) $(QT_FORMS_H) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) $(PROTOBUF_H) + @cd $(abs_srcdir); test -f $(RCC) && QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin -o $(abs_builddir)/$@ $< || \ + echo error: could not build $@ + $(SED) -i.bak -e '/^\*\*.*Created:/d' $@ && rm $@.bak + $(SED) -i.bak -e '/^\*\*.*by:/d' $@ && rm $@.bak + +CLEANFILES = $(BUILT_SOURCES) $(QT_QM) $(QT_FORMS_H) *.gcda *.gcno \ No newline at end of file diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index 0aa7bd04..48dcfd2c 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -15,7 +15,9 @@ #include "util.h" #include "wallet.h" #include "ui_interface.h" +#ifdef ENABLE_WALLET #include "paymentserver.h" +#endif #ifdef Q_OS_MAC #include "macdockiconhandler.h" #endif diff --git a/src/qt/test/MakeFile.am b/src/qt/test/MakeFile.am index 315ad818..d3ed67f0 100644 --- a/src/qt/test/MakeFile.am +++ b/src/qt/test/MakeFile.am @@ -1,11 +1,10 @@ include $(top_srcdir)/src/Makefile.include -AM_CPPFLAGS = $(INCLUDES) -I$(top_builddir)/src/obj \ - -I$(top_srcdir)/src/leveldb/include -I$(top_srcdir)/src \ - -I$(top_srcdir)/src/leveldb/helpers -I$(top_srcdir)/src/qt \ - -I$(top_builddir)/src/qt $(BOOST_INCLUDES) $(PROTOBUF_CFLAGS) \ +AM_CPPFLAGS += -I$(top_srcdir)/src \ + -I$(top_srcdir)/src/qt \ + -I$(top_builddir)/src/qt \ + $(PROTOBUF_CFLAGS) \ $(QR_CFLAGS) -AM_LDFLAGS = $(PTHREAD_CFLAGS) bin_PROGRAMS = test_bitcoin-qt TESTS = test_bitcoin-qt @@ -18,8 +17,8 @@ BUILT_SOURCES = $(TEST_QT_MOC_CPP) test_bitcoin_qt_CPPFLAGS = $(AM_CPPFLAGS) $(QT_INCLUDES) $(QT_TEST_INCLUDES) test_bitcoin_qt_SOURCES = test_main.cpp uritests.cpp paymentservertests.cpp $(TEST_QT_H) nodist_test_bitcoin_qt_SOURCES = $(TEST_QT_MOC_CPP) -test_bitcoin_qt_LDADD = $(LIBBITCOINQT) $(LIBBITCOIN) $(LIBLEVELDB) \ +test_bitcoin_qt_LDADD = $(LIBBITCOINQT) $(LIBBITCOIN_SERVER) $(LIBBITCOIN_WALLET) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBLEVELDB) \ $(LIBMEMENV) $(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QT_TEST_LIBS) \ - $(QR_LIBS) $(PROTOBUF_LIBS) + $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) -CLEANFILES = $(BUILT_SOURCES) *.gcda *.gcno \ No newline at end of file +CLEANFILES = $(BUILT_SOURCES) *.gcda *.gcno diff --git a/src/test/MakeFile.am b/src/test/MakeFile.am index ef6296d0..df6606ed 100644 --- a/src/test/MakeFile.am +++ b/src/test/MakeFile.am @@ -1,38 +1,46 @@ include $(top_srcdir)/src/Makefile.include -AM_CPPFLAGS = $(INCLUDES) -I$(top_builddir)/src/obj \ - -I$(top_srcdir)/src/leveldb/include -I$(top_srcdir)/src/leveldb/helpers \ - -I$(top_srcdir)/src $(BOOST_INCLUDES) - -AM_LDFLAGS = $(PTHREAD_CFLAGS) +AM_CPPFLAGS += -I$(top_srcdir)/src bin_PROGRAMS = test_bitcoin TESTS = test_bitcoin -TEST_DATA_DIR=$(top_srcdir)/src/test/data +JSON_TEST_FILES= data/script_valid.json \ + data/base58_keys_valid.json data/sig_canonical.json \ + data/sig_noncanonical.json \ + data/base58_encode_decode.json \ + data/base58_keys_invalid.json \ + data/script_invalid.json data/tx_invalid.json \ + data/tx_valid.json + +RAW_TEST_FILES = data/alertTests.raw -TEST_DATA_FILES= $(TEST_DATA_DIR)/script_valid.json \ - $(TEST_DATA_DIR)/base58_keys_valid.json $(TEST_DATA_DIR)/sig_canonical.json \ - $(TEST_DATA_DIR)/sig_noncanonical.json \ - $(TEST_DATA_DIR)/base58_encode_decode.json $(TEST_DATA_DIR)/alertTests \ - $(TEST_DATA_DIR)/base58_keys_invalid.json \ - $(TEST_DATA_DIR)/script_invalid.json $(TEST_DATA_DIR)/tx_invalid.json \ - $(TEST_DATA_DIR)/tx_valid.json +BUILT_SOURCES = $(JSON_TEST_FILES:.json=.json.h) $(RAW_TEST_FILES:.raw=.raw.h) # test_bitcoin binary # -test_bitcoin_CPPFLAGS = $(AM_CPPFLAGS) $(TESTDEFS) \ - -DTEST_DATA_DIR=$(TEST_DATA_DIR) -test_bitcoin_LDADD = $(LIBBITCOIN) $(LIBLEVELDB) $(LIBMEMENV) \ +test_bitcoin_CPPFLAGS = $(AM_CPPFLAGS) $(TESTDEFS) +test_bitcoin_LDADD = $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBLEVELDB) $(LIBMEMENV) \ $(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) -test_bitcoin_SOURCES = accounting_tests.cpp alert_tests.cpp \ +if ENABLE_WALLET +test_bitcoin_LDADD += $(LIBBITCOIN_WALLET) +endif +test_bitcoin_LDADD += $(BDB_LIBS) + +test_bitcoin_SOURCES = alert_tests.cpp \ allocator_tests.cpp base32_tests.cpp base58_tests.cpp base64_tests.cpp \ bignum_tests.cpp bloom_tests.cpp canonical_tests.cpp checkblock_tests.cpp \ Checkpoints_tests.cpp compress_tests.cpp DoS_tests.cpp getarg_tests.cpp \ - key_tests.cpp miner_tests.cpp mruset_tests.cpp multisig_tests.cpp \ + key_tests.cpp mruset_tests.cpp multisig_tests.cpp \ netbase_tests.cpp pmt_tests.cpp rpc_tests.cpp script_P2SH_tests.cpp \ script_tests.cpp serialize_tests.cpp sigopcount_tests.cpp test_bitcoin.cpp \ transaction_tests.cpp uint160_tests.cpp uint256_tests.cpp util_tests.cpp \ - wallet_tests.cpp $(TEST_DATA_FILES) + sighash_tests.cpp $(JSON_TEST_FILES) $(RAW_TEST_FILES) + +if ENABLE_WALLET +test_bitcoin_SOURCES += accounting_tests.cpp wallet_tests.cpp miner_tests.cpp +endif + +nodist_test_bitcoin_SOURCES = $(BUILT_SOURCES) -CLEANFILES = *.gcda *.gcno \ No newline at end of file +CLEANFILES = *.gcda *.gcno $(BUILT_SOURCES) \ No newline at end of file diff --git a/src/test/alert_tests.cpp b/src/test/alert_tests.cpp new file mode 100644 index 00000000..3b663e08 --- /dev/null +++ b/src/test/alert_tests.cpp @@ -0,0 +1,175 @@ +// +// Unit tests for alert system +// + +#include +#include +#include + +#include "alert.h" +#include "serialize.h" +#include "util.h" +#include "data/alertTests.raw.h" + +#if 0 +// +// alertTests contains 7 alerts, generated with this code: +// (SignAndSave code not shown, alert signing key is secret) +// +{ + CAlert alert; + alert.nRelayUntil = 60; + alert.nExpiration = 24 * 60 * 60; + alert.nID = 1; + alert.nCancel = 0; // cancels previous messages up to this ID number + alert.nMinVer = 0; // These versions are protocol versions + alert.nMaxVer = 70001; + alert.nPriority = 1; + alert.strComment = "Alert comment"; + alert.strStatusBar = "Alert 1"; + + SignAndSave(alert, "test/alertTests"); + + alert.setSubVer.insert(std::string("/Satoshi:0.1.0/")); + alert.strStatusBar = "Alert 1 for Satoshi 0.1.0"; + SignAndSave(alert, "test/alertTests"); + + alert.setSubVer.insert(std::string("/Satoshi:0.2.0/")); + alert.strStatusBar = "Alert 1 for Satoshi 0.1.0, 0.2.0"; + SignAndSave(alert, "test/alertTests"); + + alert.setSubVer.clear(); + ++alert.nID; + alert.nCancel = 1; + alert.nPriority = 100; + alert.strStatusBar = "Alert 2, cancels 1"; + SignAndSave(alert, "test/alertTests"); + + alert.nExpiration += 60; + ++alert.nID; + SignAndSave(alert, "test/alertTests"); + + ++alert.nID; + alert.nMinVer = 11; + alert.nMaxVer = 22; + SignAndSave(alert, "test/alertTests"); + + ++alert.nID; + alert.strStatusBar = "Alert 2 for Satoshi 0.1.0"; + alert.setSubVer.insert(std::string("/Satoshi:0.1.0/")); + SignAndSave(alert, "test/alertTests"); + + ++alert.nID; + alert.nMinVer = 0; + alert.nMaxVer = 999999; + alert.strStatusBar = "Evil Alert'; /bin/ls; echo '"; + alert.setSubVer.clear(); + SignAndSave(alert, "test/alertTests"); +} +#endif + +struct ReadAlerts +{ + ReadAlerts() + { + std::vector vch(alert_tests::alertTests, alert_tests::alertTests + sizeof(alert_tests::alertTests)); + CDataStream stream(vch, SER_DISK, CLIENT_VERSION); + try { + while (stream.good()) + { + CAlert alert; + stream >> alert; + alerts.push_back(alert); + } + } + catch (std::exception) { } + } + ~ReadAlerts() { } + + static std::vector read_lines(boost::filesystem::path filepath) + { + std::vector result; + + std::ifstream f(filepath.string().c_str()); + std::string line; + while (std::getline(f,line)) + result.push_back(line); + + return result; + } + + std::vector alerts; +}; + +BOOST_FIXTURE_TEST_SUITE(Alert_tests, ReadAlerts) + + +BOOST_AUTO_TEST_CASE(AlertApplies) +{ + SetMockTime(11); + + BOOST_FOREACH(const CAlert& alert, alerts) + { + BOOST_CHECK(alert.CheckSignature()); + } + + BOOST_CHECK(alerts.size() >= 3); + + // Matches: + BOOST_CHECK(alerts[0].AppliesTo(1, "")); + BOOST_CHECK(alerts[0].AppliesTo(70001, "")); + BOOST_CHECK(alerts[0].AppliesTo(1, "/Satoshi:11.11.11/")); + + BOOST_CHECK(alerts[1].AppliesTo(1, "/Satoshi:0.1.0/")); + BOOST_CHECK(alerts[1].AppliesTo(70001, "/Satoshi:0.1.0/")); + + BOOST_CHECK(alerts[2].AppliesTo(1, "/Satoshi:0.1.0/")); + BOOST_CHECK(alerts[2].AppliesTo(1, "/Satoshi:0.2.0/")); + + // Don't match: + BOOST_CHECK(!alerts[0].AppliesTo(-1, "")); + BOOST_CHECK(!alerts[0].AppliesTo(70002, "")); + + BOOST_CHECK(!alerts[1].AppliesTo(1, "")); + BOOST_CHECK(!alerts[1].AppliesTo(1, "Satoshi:0.1.0")); + BOOST_CHECK(!alerts[1].AppliesTo(1, "/Satoshi:0.1.0")); + BOOST_CHECK(!alerts[1].AppliesTo(1, "Satoshi:0.1.0/")); + BOOST_CHECK(!alerts[1].AppliesTo(-1, "/Satoshi:0.1.0/")); + BOOST_CHECK(!alerts[1].AppliesTo(70002, "/Satoshi:0.1.0/")); + BOOST_CHECK(!alerts[1].AppliesTo(1, "/Satoshi:0.2.0/")); + + BOOST_CHECK(!alerts[2].AppliesTo(1, "/Satoshi:0.3.0/")); + + SetMockTime(0); +} + + +// This uses sh 'echo' to test the -alertnotify function, writing to a +// /tmp file. So skip it on Windows: +#ifndef WIN32 +BOOST_AUTO_TEST_CASE(AlertNotify) +{ + SetMockTime(11); + + boost::filesystem::path temp = GetTempPath() / "alertnotify.txt"; + boost::filesystem::remove(temp); + + mapArgs["-alertnotify"] = std::string("echo %s >> ") + temp.string(); + + BOOST_FOREACH(CAlert alert, alerts) + alert.ProcessAlert(false); + + std::vector r = read_lines(temp); + BOOST_CHECK_EQUAL(r.size(), 4u); + BOOST_CHECK_EQUAL(r[0], "Alert 1"); + BOOST_CHECK_EQUAL(r[1], "Alert 2, cancels 1"); + BOOST_CHECK_EQUAL(r[2], "Alert 2, cancels 1"); + BOOST_CHECK_EQUAL(r[3], "Evil Alert; /bin/ls; echo "); // single-quotes should be removed + + boost::filesystem::remove(temp); + + SetMockTime(0); +} +#endif + +BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file diff --git a/src/test/base58_tests.cpp b/src/test/base58_tests.cpp index ff9b89bd..863e9fd2 100644 --- a/src/test/base58_tests.cpp +++ b/src/test/base58_tests.cpp @@ -2,20 +2,21 @@ #include "json/json_spirit_reader_template.h" #include "json/json_spirit_writer_template.h" #include "json/json_spirit_utils.h" +#include "data/base58_encode_decode.json.h" +#include "data/base58_keys_invalid.json.h" +#include "data/base58_keys_valid.json.h" #include "base58.h" #include "util.h" - using namespace json_spirit; -extern Array read_json(const std::string& filename); +extern Array read_json(const std::string& jsondata); BOOST_AUTO_TEST_SUITE(base58_tests) // Goal: test low-level base58 encoding functionality BOOST_AUTO_TEST_CASE(base58_EncodeBase58) { - Array tests = read_json("base58_encode_decode.json"); - + Array tests = read_json(std::string(json_tests::base58_encode_decode, json_tests::base58_encode_decode + sizeof(json_tests::base58_encode_decode))); BOOST_FOREACH(Value& tv, tests) { Array test = tv.get_array(); @@ -36,7 +37,7 @@ BOOST_AUTO_TEST_CASE(base58_EncodeBase58) // Goal: test low-level base58 decoding functionality BOOST_AUTO_TEST_CASE(base58_DecodeBase58) { - Array tests = read_json("base58_encode_decode.json"); + Array tests = read_json(std::string(json_tests::base58_encode_decode, json_tests::base58_encode_decode + sizeof(json_tests::base58_encode_decode))); std::vector result; BOOST_FOREACH(Value& tv, tests) @@ -104,10 +105,10 @@ class TestPayloadVisitor : public boost::static_visitor // Goal: check that parsed keys match test payload BOOST_AUTO_TEST_CASE(base58_keys_valid_parse) { - Array tests = read_json("base58_keys_valid.json"); + Array tests = read_json(std::string(json_tests::base58_keys_valid, json_tests::base58_keys_valid + sizeof(json_tests::base58_keys_valid))); std::vector result; - CDigitalNoteSecret secret; - CDigitalNoteAddress addr; + CBitcoinSecret secret; + CBitcoinAddress addr; BOOST_FOREACH(Value& tv, tests) { @@ -131,7 +132,7 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_parse) { bool isCompressed = find_value(metadata, "isCompressed").get_bool(); // Must be valid private key - // Note: CDigitalNoteSecret::SetString tests isValid, whereas CDigitalNoteAddress does not! + // Note: CBitcoinSecret::SetString tests isValid, whereas CBitcoinAddress does not! BOOST_CHECK_MESSAGE(secret.SetString(exp_base58string), "!SetString:"+ strTest); BOOST_CHECK_MESSAGE(secret.IsValid(), "!IsValid:" + strTest); CKey privkey = secret.GetKey(); @@ -163,7 +164,7 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_parse) // Goal: check that generated keys match test vectors BOOST_AUTO_TEST_CASE(base58_keys_valid_gen) { - Array tests = read_json("base58_keys_valid.json"); + Array tests = read_json(std::string(json_tests::base58_keys_valid, json_tests::base58_keys_valid + sizeof(json_tests::base58_keys_valid))); std::vector result; BOOST_FOREACH(Value& tv, tests) { @@ -189,7 +190,7 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_gen) CKey key; key.Set(exp_payload.begin(), exp_payload.end(), isCompressed); assert(key.IsValid()); - CDigitalNoteSecret secret; + CBitcoinSecret secret; secret.SetKey(key); BOOST_CHECK_MESSAGE(secret.ToString() == exp_base58string, "result mismatch: " + strTest); } @@ -214,16 +215,16 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_gen) BOOST_ERROR("Bad addrtype: " << strTest); continue; } - CDigitalNoteAddress addrOut; - BOOST_CHECK_MESSAGE(boost::apply_visitor(CDigitalNoteAddressVisitor(&addrOut), dest), "encode dest: " + strTest); + CBitcoinAddress addrOut; + BOOST_CHECK_MESSAGE(boost::apply_visitor(CBitcoinAddressVisitor(&addrOut), dest), "encode dest: " + strTest); BOOST_CHECK_MESSAGE(addrOut.ToString() == exp_base58string, "mismatch: " + strTest); } } // Visiting a CNoDestination must fail - CDigitalNoteAddress dummyAddr; + CBitcoinAddress dummyAddr; CTxDestination nodest = CNoDestination(); - BOOST_CHECK(!boost::apply_visitor(CDigitalNoteAddressVisitor(&dummyAddr), nodest)); + BOOST_CHECK(!boost::apply_visitor(CBitcoinAddressVisitor(&dummyAddr), nodest)); SelectParams(CChainParams::MAIN); } @@ -231,10 +232,10 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_gen) // Goal: check that base58 parsing code is robust against a variety of corrupted data BOOST_AUTO_TEST_CASE(base58_keys_invalid) { - Array tests = read_json("base58_keys_invalid.json"); // Negative testcases + Array tests = read_json(std::string(json_tests::base58_keys_invalid, json_tests::base58_keys_invalid + sizeof(json_tests::base58_keys_invalid))); // Negative testcases std::vector result; - CDigitalNoteSecret secret; - CDigitalNoteAddress addr; + CBitcoinSecret secret; + CBitcoinAddress addr; BOOST_FOREACH(Value& tv, tests) { @@ -257,4 +258,3 @@ BOOST_AUTO_TEST_CASE(base58_keys_invalid) BOOST_AUTO_TEST_SUITE_END() - diff --git a/src/test/canonical_tests.cpp b/src/test/canonical_tests.cpp new file mode 100644 index 00000000..4a0b5841 --- /dev/null +++ b/src/test/canonical_tests.cpp @@ -0,0 +1,89 @@ +// +// Unit tests for canonical signatures + +#include "json/json_spirit_writer_template.h" +#include +#include + +#include "key.h" +#include "script.h" +#include "util.h" +#include "data/sig_noncanonical.json.h" +#include "data/sig_canonical.json.h" + +using namespace std; +using namespace json_spirit; + + +// In script_tests.cpp +extern Array read_json(const std::string& jsondata); + +BOOST_AUTO_TEST_SUITE(canonical_tests) + +// OpenSSL-based test for canonical signature (without test for hashtype byte) +bool static IsCanonicalSignature_OpenSSL_inner(const std::vector& vchSig) +{ + if (vchSig.size() == 0) + return false; + const unsigned char *input = &vchSig[0]; + ECDSA_SIG *psig = NULL; + d2i_ECDSA_SIG(&psig, &input, vchSig.size()); + if (psig == NULL) + return false; + unsigned char buf[256]; + unsigned char *pbuf = buf; + unsigned int nLen = i2d_ECDSA_SIG(psig, NULL); + if (nLen != vchSig.size()) { + ECDSA_SIG_free(psig); + return false; + } + nLen = i2d_ECDSA_SIG(psig, &pbuf); + ECDSA_SIG_free(psig); + return (memcmp(&vchSig[0], &buf[0], nLen) == 0); +} + +// OpenSSL-based test for canonical signature +bool static IsCanonicalSignature_OpenSSL(const std::vector &vchSignature) { + if (vchSignature.size() < 1) + return false; + if (vchSignature.size() > 127) + return false; + if (vchSignature[vchSignature.size() - 1] & 0x7C) + return false; + + std::vector vchSig(vchSignature); + vchSig.pop_back(); + if (!IsCanonicalSignature_OpenSSL_inner(vchSig)) + return false; + return true; +} + +BOOST_AUTO_TEST_CASE(script_canon) +{ + Array tests = read_json(std::string(json_tests::sig_canonical, json_tests::sig_canonical + sizeof(json_tests::sig_canonical))); + + BOOST_FOREACH(Value &tv, tests) { + string test = tv.get_str(); + if (IsHex(test)) { + std::vector sig = ParseHex(test); + BOOST_CHECK_MESSAGE(IsCanonicalSignature(sig, SCRIPT_VERIFY_STRICTENC), test); + BOOST_CHECK_MESSAGE(IsCanonicalSignature_OpenSSL(sig), test); + } + } +} + +BOOST_AUTO_TEST_CASE(script_noncanon) +{ + Array tests = read_json(std::string(json_tests::sig_noncanonical, json_tests::sig_noncanonical + sizeof(json_tests::sig_noncanonical))); + + BOOST_FOREACH(Value &tv, tests) { + string test = tv.get_str(); + if (IsHex(test)) { + std::vector sig = ParseHex(test); + BOOST_CHECK_MESSAGE(!IsCanonicalSignature(sig, SCRIPT_VERIFY_STRICTENC), test); + BOOST_CHECK_MESSAGE(!IsCanonicalSignature_OpenSSL(sig), test); + } + } +} + +BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp new file mode 100644 index 00000000..61224823 --- /dev/null +++ b/src/test/script_tests.cpp @@ -0,0 +1,434 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "json/json_spirit_reader_template.h" +#include "json/json_spirit_writer_template.h" +#include "json/json_spirit_utils.h" + +#include "main.h" +#include "wallet.h" +#include "data/script_invalid.json.h" +#include "data/script_valid.json.h" + +using namespace std; +using namespace json_spirit; +using namespace boost::algorithm; + +extern uint256 SignatureHash(CScript scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType); + +static const unsigned int flags = SCRIPT_VERIFY_P2SH | SCRIPT_VERIFY_STRICTENC; + +CScript +ParseScript(string s) +{ + CScript result; + + static map mapOpNames; + + if (mapOpNames.size() == 0) + { + for (int op = 0; op <= OP_NOP10; op++) + { + // Allow OP_RESERVED to get into mapOpNames + if (op < OP_NOP && op != OP_RESERVED) + continue; + + const char* name = GetOpName((opcodetype)op); + if (strcmp(name, "OP_UNKNOWN") == 0) + continue; + string strName(name); + mapOpNames[strName] = (opcodetype)op; + // Convenience: OP_ADD and just ADD are both recognized: + replace_first(strName, "OP_", ""); + mapOpNames[strName] = (opcodetype)op; + } + } + + vector words; + split(words, s, is_any_of(" \t\n"), token_compress_on); + + BOOST_FOREACH(string w, words) + { + if (all(w, is_digit()) || + (starts_with(w, "-") && all(string(w.begin()+1, w.end()), is_digit()))) + { + // Number + int64 n = atoi64(w); + result << n; + } + else if (starts_with(w, "0x") && IsHex(string(w.begin()+2, w.end()))) + { + // Raw hex data, inserted NOT pushed onto stack: + std::vector raw = ParseHex(string(w.begin()+2, w.end())); + result.insert(result.end(), raw.begin(), raw.end()); + } + else if (w.size() >= 2 && starts_with(w, "'") && ends_with(w, "'")) + { + // Single-quoted string, pushed as data. NOTE: this is poor-man's + // parsing, spaces/tabs/newlines in single-quoted strings won't work. + std::vector value(w.begin()+1, w.end()-1); + result << value; + } + else if (mapOpNames.count(w)) + { + // opcode, e.g. OP_ADD or ADD: + result << mapOpNames[w]; + } + else + { + BOOST_ERROR("Parse error: " << s); + return CScript(); + } + } + + return result; +} + +Array +read_json(const std::string& jsondata) +{ + Value v; + + if (!read_string(jsondata, v) || v.type() != array_type) + { + BOOST_ERROR("Parse error."); + return Array(); + } + return v.get_array(); +} + +BOOST_AUTO_TEST_SUITE(script_tests) + +BOOST_AUTO_TEST_CASE(script_valid) +{ + // Read tests from test/data/script_valid.json + // Format is an array of arrays + // Inner arrays are [ "scriptSig", "scriptPubKey" ] + // ... where scriptSig and scriptPubKey are stringified + // scripts. + Array tests = read_json(std::string(json_tests::script_valid, json_tests::script_valid + sizeof(json_tests::script_valid))); + + BOOST_FOREACH(Value& tv, tests) + { + Array test = tv.get_array(); + string strTest = write_string(tv, false); + if (test.size() < 2) // Allow size > 2; extra stuff ignored (useful for comments) + { + BOOST_ERROR("Bad test: " << strTest); + continue; + } + string scriptSigString = test[0].get_str(); + CScript scriptSig = ParseScript(scriptSigString); + string scriptPubKeyString = test[1].get_str(); + CScript scriptPubKey = ParseScript(scriptPubKeyString); + + CTransaction tx; + BOOST_CHECK_MESSAGE(VerifyScript(scriptSig, scriptPubKey, tx, 0, flags, SIGHASH_NONE), strTest); + } +} + +BOOST_AUTO_TEST_CASE(script_invalid) +{ + // Scripts that should evaluate as invalid + Array tests = read_json(std::string(json_tests::script_invalid, json_tests::script_invalid + sizeof(json_tests::script_invalid))); + + BOOST_FOREACH(Value& tv, tests) + { + Array test = tv.get_array(); + string strTest = write_string(tv, false); + if (test.size() < 2) // Allow size > 2; extra stuff ignored (useful for comments) + { + BOOST_ERROR("Bad test: " << strTest); + continue; + } + string scriptSigString = test[0].get_str(); + CScript scriptSig = ParseScript(scriptSigString); + string scriptPubKeyString = test[1].get_str(); + CScript scriptPubKey = ParseScript(scriptPubKeyString); + + CTransaction tx; + BOOST_CHECK_MESSAGE(!VerifyScript(scriptSig, scriptPubKey, tx, 0, flags, SIGHASH_NONE), strTest); + } +} + +BOOST_AUTO_TEST_CASE(script_PushData) +{ + // Check that PUSHDATA1, PUSHDATA2, and PUSHDATA4 create the same value on + // the stack as the 1-75 opcodes do. + static const unsigned char direct[] = { 1, 0x5a }; + static const unsigned char pushdata1[] = { OP_PUSHDATA1, 1, 0x5a }; + static const unsigned char pushdata2[] = { OP_PUSHDATA2, 1, 0, 0x5a }; + static const unsigned char pushdata4[] = { OP_PUSHDATA4, 1, 0, 0, 0, 0x5a }; + + vector > directStack; + BOOST_CHECK(EvalScript(directStack, CScript(&direct[0], &direct[sizeof(direct)]), CTransaction(), 0, true, 0)); + + vector > pushdata1Stack; + BOOST_CHECK(EvalScript(pushdata1Stack, CScript(&pushdata1[0], &pushdata1[sizeof(pushdata1)]), CTransaction(), 0, true, 0)); + BOOST_CHECK(pushdata1Stack == directStack); + + vector > pushdata2Stack; + BOOST_CHECK(EvalScript(pushdata2Stack, CScript(&pushdata2[0], &pushdata2[sizeof(pushdata2)]), CTransaction(), 0, true, 0)); + BOOST_CHECK(pushdata2Stack == directStack); + + vector > pushdata4Stack; + BOOST_CHECK(EvalScript(pushdata4Stack, CScript(&pushdata4[0], &pushdata4[sizeof(pushdata4)]), CTransaction(), 0, true, 0)); + BOOST_CHECK(pushdata4Stack == directStack); +} + +CScript +sign_multisig(CScript scriptPubKey, std::vector keys, CTransaction transaction) +{ + uint256 hash = SignatureHash(scriptPubKey, transaction, 0, SIGHASH_ALL); + + CScript result; + // + // NOTE: CHECKMULTISIG has an unfortunate bug; it requires + // one extra item on the stack, before the signatures. + // Putting OP_0 on the stack is the workaround; + // fixing the bug would mean splitting the block chain (old + // clients would not accept new CHECKMULTISIG transactions, + // and vice-versa) + // + result << OP_0; + BOOST_FOREACH(const CKey &key, keys) + { + vector vchSig; + BOOST_CHECK(key.Sign(hash, vchSig)); + vchSig.push_back((unsigned char)SIGHASH_ALL); + result << vchSig; + } + return result; +} +CScript +sign_multisig(CScript scriptPubKey, const CKey &key, CTransaction transaction) +{ + std::vector keys; + keys.push_back(key); + return sign_multisig(scriptPubKey, keys, transaction); +} + +BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG12) +{ + CKey key1, key2, key3; + key1.MakeNewKey(true); + key2.MakeNewKey(false); + key3.MakeNewKey(true); + + CScript scriptPubKey12; + scriptPubKey12 << OP_1 << key1.GetPubKey() << key2.GetPubKey() << OP_2 << OP_CHECKMULTISIG; + + CTransaction txFrom12; + txFrom12.vout.resize(1); + txFrom12.vout[0].scriptPubKey = scriptPubKey12; + + CTransaction txTo12; + txTo12.vin.resize(1); + txTo12.vout.resize(1); + txTo12.vin[0].prevout.n = 0; + txTo12.vin[0].prevout.hash = txFrom12.GetHash(); + txTo12.vout[0].nValue = 1; + + CScript goodsig1 = sign_multisig(scriptPubKey12, key1, txTo12); + BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey12, txTo12, 0, flags, 0)); + txTo12.vout[0].nValue = 2; + BOOST_CHECK(!VerifyScript(goodsig1, scriptPubKey12, txTo12, 0, flags, 0)); + + CScript goodsig2 = sign_multisig(scriptPubKey12, key2, txTo12); + BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey12, txTo12, 0, flags, 0)); + + CScript badsig1 = sign_multisig(scriptPubKey12, key3, txTo12); + BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey12, txTo12, 0, flags, 0)); +} + +BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG23) +{ + CKey key1, key2, key3, key4; + key1.MakeNewKey(true); + key2.MakeNewKey(false); + key3.MakeNewKey(true); + key4.MakeNewKey(false); + + CScript scriptPubKey23; + scriptPubKey23 << OP_2 << key1.GetPubKey() << key2.GetPubKey() << key3.GetPubKey() << OP_3 << OP_CHECKMULTISIG; + + CTransaction txFrom23; + txFrom23.vout.resize(1); + txFrom23.vout[0].scriptPubKey = scriptPubKey23; + + CTransaction txTo23; + txTo23.vin.resize(1); + txTo23.vout.resize(1); + txTo23.vin[0].prevout.n = 0; + txTo23.vin[0].prevout.hash = txFrom23.GetHash(); + txTo23.vout[0].nValue = 1; + + std::vector keys; + keys.push_back(key1); keys.push_back(key2); + CScript goodsig1 = sign_multisig(scriptPubKey23, keys, txTo23); + BOOST_CHECK(VerifyScript(goodsig1, scriptPubKey23, txTo23, 0, flags, 0)); + + keys.clear(); + keys.push_back(key1); keys.push_back(key3); + CScript goodsig2 = sign_multisig(scriptPubKey23, keys, txTo23); + BOOST_CHECK(VerifyScript(goodsig2, scriptPubKey23, txTo23, 0, flags, 0)); + + keys.clear(); + keys.push_back(key2); keys.push_back(key3); + CScript goodsig3 = sign_multisig(scriptPubKey23, keys, txTo23); + BOOST_CHECK(VerifyScript(goodsig3, scriptPubKey23, txTo23, 0, flags, 0)); + + keys.clear(); + keys.push_back(key2); keys.push_back(key2); // Can't re-use sig + CScript badsig1 = sign_multisig(scriptPubKey23, keys, txTo23); + BOOST_CHECK(!VerifyScript(badsig1, scriptPubKey23, txTo23, 0, flags, 0)); + + keys.clear(); + keys.push_back(key2); keys.push_back(key1); // sigs must be in correct order + CScript badsig2 = sign_multisig(scriptPubKey23, keys, txTo23); + BOOST_CHECK(!VerifyScript(badsig2, scriptPubKey23, txTo23, 0, flags, 0)); + + keys.clear(); + keys.push_back(key3); keys.push_back(key2); // sigs must be in correct order + CScript badsig3 = sign_multisig(scriptPubKey23, keys, txTo23); + BOOST_CHECK(!VerifyScript(badsig3, scriptPubKey23, txTo23, 0, flags, 0)); + + keys.clear(); + keys.push_back(key4); keys.push_back(key2); // sigs must match pubkeys + CScript badsig4 = sign_multisig(scriptPubKey23, keys, txTo23); + BOOST_CHECK(!VerifyScript(badsig4, scriptPubKey23, txTo23, 0, flags, 0)); + + keys.clear(); + keys.push_back(key1); keys.push_back(key4); // sigs must match pubkeys + CScript badsig5 = sign_multisig(scriptPubKey23, keys, txTo23); + BOOST_CHECK(!VerifyScript(badsig5, scriptPubKey23, txTo23, 0, flags, 0)); + + keys.clear(); // Must have signatures + CScript badsig6 = sign_multisig(scriptPubKey23, keys, txTo23); + BOOST_CHECK(!VerifyScript(badsig6, scriptPubKey23, txTo23, 0, flags, 0)); +} + +BOOST_AUTO_TEST_CASE(script_combineSigs) +{ + // Test the CombineSignatures function + CBasicKeyStore keystore; + vector keys; + vector pubkeys; + for (int i = 0; i < 3; i++) + { + CKey key; + key.MakeNewKey(i%2 == 1); + keys.push_back(key); + pubkeys.push_back(key.GetPubKey()); + keystore.AddKey(key); + } + + CTransaction txFrom; + txFrom.vout.resize(1); + txFrom.vout[0].scriptPubKey.SetDestination(keys[0].GetPubKey().GetID()); + CScript& scriptPubKey = txFrom.vout[0].scriptPubKey; + CTransaction txTo; + txTo.vin.resize(1); + txTo.vout.resize(1); + txTo.vin[0].prevout.n = 0; + txTo.vin[0].prevout.hash = txFrom.GetHash(); + CScript& scriptSig = txTo.vin[0].scriptSig; + txTo.vout[0].nValue = 1; + + CScript empty; + CScript combined = CombineSignatures(scriptPubKey, txTo, 0, empty, empty); + BOOST_CHECK(combined.empty()); + + // Single signature case: + SignSignature(keystore, txFrom, txTo, 0); // changes scriptSig + combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSig, empty); + BOOST_CHECK(combined == scriptSig); + combined = CombineSignatures(scriptPubKey, txTo, 0, empty, scriptSig); + BOOST_CHECK(combined == scriptSig); + CScript scriptSigCopy = scriptSig; + // Signing again will give a different, valid signature: + SignSignature(keystore, txFrom, txTo, 0); + combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSigCopy, scriptSig); + BOOST_CHECK(combined == scriptSigCopy || combined == scriptSig); + + // P2SH, single-signature case: + CScript pkSingle; pkSingle << keys[0].GetPubKey() << OP_CHECKSIG; + keystore.AddCScript(pkSingle); + scriptPubKey.SetDestination(pkSingle.GetID()); + SignSignature(keystore, txFrom, txTo, 0); + combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSig, empty); + BOOST_CHECK(combined == scriptSig); + combined = CombineSignatures(scriptPubKey, txTo, 0, empty, scriptSig); + BOOST_CHECK(combined == scriptSig); + scriptSigCopy = scriptSig; + SignSignature(keystore, txFrom, txTo, 0); + combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSigCopy, scriptSig); + BOOST_CHECK(combined == scriptSigCopy || combined == scriptSig); + // dummy scriptSigCopy with placeholder, should always choose non-placeholder: + scriptSigCopy = CScript() << OP_0 << static_cast >(pkSingle); + combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSigCopy, scriptSig); + BOOST_CHECK(combined == scriptSig); + combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSig, scriptSigCopy); + BOOST_CHECK(combined == scriptSig); + + // Hardest case: Multisig 2-of-3 + scriptPubKey.SetMultisig(2, pubkeys); + keystore.AddCScript(scriptPubKey); + SignSignature(keystore, txFrom, txTo, 0); + combined = CombineSignatures(scriptPubKey, txTo, 0, scriptSig, empty); + BOOST_CHECK(combined == scriptSig); + combined = CombineSignatures(scriptPubKey, txTo, 0, empty, scriptSig); + BOOST_CHECK(combined == scriptSig); + + // A couple of partially-signed versions: + vector sig1; + uint256 hash1 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_ALL); + BOOST_CHECK(keys[0].Sign(hash1, sig1)); + sig1.push_back(SIGHASH_ALL); + vector sig2; + uint256 hash2 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_NONE); + BOOST_CHECK(keys[1].Sign(hash2, sig2)); + sig2.push_back(SIGHASH_NONE); + vector sig3; + uint256 hash3 = SignatureHash(scriptPubKey, txTo, 0, SIGHASH_SINGLE); + BOOST_CHECK(keys[2].Sign(hash3, sig3)); + sig3.push_back(SIGHASH_SINGLE); + + // Not fussy about order (or even existence) of placeholders or signatures: + CScript partial1a = CScript() << OP_0 << sig1 << OP_0; + CScript partial1b = CScript() << OP_0 << OP_0 << sig1; + CScript partial2a = CScript() << OP_0 << sig2; + CScript partial2b = CScript() << sig2 << OP_0; + CScript partial3a = CScript() << sig3; + CScript partial3b = CScript() << OP_0 << OP_0 << sig3; + CScript partial3c = CScript() << OP_0 << sig3 << OP_0; + CScript complete12 = CScript() << OP_0 << sig1 << sig2; + CScript complete13 = CScript() << OP_0 << sig1 << sig3; + CScript complete23 = CScript() << OP_0 << sig2 << sig3; + + combined = CombineSignatures(scriptPubKey, txTo, 0, partial1a, partial1b); + BOOST_CHECK(combined == partial1a); + combined = CombineSignatures(scriptPubKey, txTo, 0, partial1a, partial2a); + BOOST_CHECK(combined == complete12); + combined = CombineSignatures(scriptPubKey, txTo, 0, partial2a, partial1a); + BOOST_CHECK(combined == complete12); + combined = CombineSignatures(scriptPubKey, txTo, 0, partial1b, partial2b); + BOOST_CHECK(combined == complete12); + combined = CombineSignatures(scriptPubKey, txTo, 0, partial3b, partial1b); + BOOST_CHECK(combined == complete13); + combined = CombineSignatures(scriptPubKey, txTo, 0, partial2a, partial3a); + BOOST_CHECK(combined == complete23); + combined = CombineSignatures(scriptPubKey, txTo, 0, partial3b, partial2b); + BOOST_CHECK(combined == complete23); + combined = CombineSignatures(scriptPubKey, txTo, 0, partial3b, partial3a); + BOOST_CHECK(combined == partial3c); +} + +BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp new file mode 100644 index 00000000..659fd7ea --- /dev/null +++ b/src/test/transaction_tests.cpp @@ -0,0 +1,278 @@ +#include +#include +#include +#include "json/json_spirit_writer_template.h" + +#include "main.h" +#include "wallet.h" +#include "data/tx_invalid.json.h" +#include "data/tx_valid.json.h" + +using namespace std; +using namespace json_spirit; + +// In script_tests.cpp +extern Array read_json(const std::string& jsondata); +extern CScript ParseScript(string s); + +BOOST_AUTO_TEST_SUITE(transaction_tests) + +BOOST_AUTO_TEST_CASE(tx_valid) +{ + // Read tests from test/data/tx_valid.json + // Format is an array of arrays + // Inner arrays are either [ "comment" ] + // or [[[prevout hash, prevout index, prevout scriptPubKey], [input 2], ...],"], serializedTransaction, enforceP2SH + // ... where all scripts are stringified scripts. + Array tests = read_json(std::string(json_tests::tx_valid, json_tests::tx_valid + sizeof(json_tests::tx_valid))); + + BOOST_FOREACH(Value& tv, tests) + { + Array test = tv.get_array(); + string strTest = write_string(tv, false); + if (test[0].type() == array_type) + { + if (test.size() != 3 || test[1].type() != str_type || test[2].type() != bool_type) + { + BOOST_ERROR("Bad test: " << strTest); + continue; + } + + map mapprevOutScriptPubKeys; + Array inputs = test[0].get_array(); + bool fValid = true; + BOOST_FOREACH(Value& input, inputs) + { + if (input.type() != array_type) + { + fValid = false; + break; + } + Array vinput = input.get_array(); + if (vinput.size() != 3) + { + fValid = false; + break; + } + + mapprevOutScriptPubKeys[COutPoint(uint256(vinput[0].get_str()), vinput[1].get_int())] = ParseScript(vinput[2].get_str()); + } + if (!fValid) + { + BOOST_ERROR("Bad test: " << strTest); + continue; + } + + string transaction = test[1].get_str(); + CDataStream stream(ParseHex(transaction), SER_NETWORK, PROTOCOL_VERSION); + CTransaction tx; + stream >> tx; + + CValidationState state; + BOOST_CHECK_MESSAGE(CheckTransaction(tx, state), strTest); + BOOST_CHECK(state.IsValid()); + + for (unsigned int i = 0; i < tx.vin.size(); i++) + { + if (!mapprevOutScriptPubKeys.count(tx.vin[i].prevout)) + { + BOOST_ERROR("Bad test: " << strTest); + break; + } + + BOOST_CHECK_MESSAGE(VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout], tx, i, test[2].get_bool() ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE, 0), strTest); + } + } + } +} + +BOOST_AUTO_TEST_CASE(tx_invalid) +{ + // Read tests from test/data/tx_invalid.json + // Format is an array of arrays + // Inner arrays are either [ "comment" ] + // or [[[prevout hash, prevout index, prevout scriptPubKey], [input 2], ...],"], serializedTransaction, enforceP2SH + // ... where all scripts are stringified scripts. + Array tests = read_json(std::string(json_tests::tx_invalid, json_tests::tx_invalid + sizeof(json_tests::tx_invalid))); + + BOOST_FOREACH(Value& tv, tests) + { + Array test = tv.get_array(); + string strTest = write_string(tv, false); + if (test[0].type() == array_type) + { + if (test.size() != 3 || test[1].type() != str_type || test[2].type() != bool_type) + { + BOOST_ERROR("Bad test: " << strTest); + continue; + } + + map mapprevOutScriptPubKeys; + Array inputs = test[0].get_array(); + bool fValid = true; + BOOST_FOREACH(Value& input, inputs) + { + if (input.type() != array_type) + { + fValid = false; + break; + } + Array vinput = input.get_array(); + if (vinput.size() != 3) + { + fValid = false; + break; + } + + mapprevOutScriptPubKeys[COutPoint(uint256(vinput[0].get_str()), vinput[1].get_int())] = ParseScript(vinput[2].get_str()); + } + if (!fValid) + { + BOOST_ERROR("Bad test: " << strTest); + continue; + } + + string transaction = test[1].get_str(); + CDataStream stream(ParseHex(transaction), SER_NETWORK, PROTOCOL_VERSION); + CTransaction tx; + stream >> tx; + + CValidationState state; + fValid = CheckTransaction(tx, state) && state.IsValid(); + + for (unsigned int i = 0; i < tx.vin.size() && fValid; i++) + { + if (!mapprevOutScriptPubKeys.count(tx.vin[i].prevout)) + { + BOOST_ERROR("Bad test: " << strTest); + break; + } + + fValid = VerifyScript(tx.vin[i].scriptSig, mapprevOutScriptPubKeys[tx.vin[i].prevout], tx, i, test[2].get_bool() ? SCRIPT_VERIFY_P2SH : SCRIPT_VERIFY_NONE, 0); + } + + BOOST_CHECK_MESSAGE(!fValid, strTest); + } + } +} + +BOOST_AUTO_TEST_CASE(basic_transaction_tests) +{ + // Random real transaction (e2769b09e784f32f62ef849763d4f45b98e07ba658647343b915ff832b110436) + unsigned char ch[] = {0x01, 0x00, 0x00, 0x00, 0x01, 0x6b, 0xff, 0x7f, 0xcd, 0x4f, 0x85, 0x65, 0xef, 0x40, 0x6d, 0xd5, 0xd6, 0x3d, 0x4f, 0xf9, 0x4f, 0x31, 0x8f, 0xe8, 0x20, 0x27, 0xfd, 0x4d, 0xc4, 0x51, 0xb0, 0x44, 0x74, 0x01, 0x9f, 0x74, 0xb4, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x49, 0x30, 0x46, 0x02, 0x21, 0x00, 0xda, 0x0d, 0xc6, 0xae, 0xce, 0xfe, 0x1e, 0x06, 0xef, 0xdf, 0x05, 0x77, 0x37, 0x57, 0xde, 0xb1, 0x68, 0x82, 0x09, 0x30, 0xe3, 0xb0, 0xd0, 0x3f, 0x46, 0xf5, 0xfc, 0xf1, 0x50, 0xbf, 0x99, 0x0c, 0x02, 0x21, 0x00, 0xd2, 0x5b, 0x5c, 0x87, 0x04, 0x00, 0x76, 0xe4, 0xf2, 0x53, 0xf8, 0x26, 0x2e, 0x76, 0x3e, 0x2d, 0xd5, 0x1e, 0x7f, 0xf0, 0xbe, 0x15, 0x77, 0x27, 0xc4, 0xbc, 0x42, 0x80, 0x7f, 0x17, 0xbd, 0x39, 0x01, 0x41, 0x04, 0xe6, 0xc2, 0x6e, 0xf6, 0x7d, 0xc6, 0x10, 0xd2, 0xcd, 0x19, 0x24, 0x84, 0x78, 0x9a, 0x6c, 0xf9, 0xae, 0xa9, 0x93, 0x0b, 0x94, 0x4b, 0x7e, 0x2d, 0xb5, 0x34, 0x2b, 0x9d, 0x9e, 0x5b, 0x9f, 0xf7, 0x9a, 0xff, 0x9a, 0x2e, 0xe1, 0x97, 0x8d, 0xd7, 0xfd, 0x01, 0xdf, 0xc5, 0x22, 0xee, 0x02, 0x28, 0x3d, 0x3b, 0x06, 0xa9, 0xd0, 0x3a, 0xcf, 0x80, 0x96, 0x96, 0x8d, 0x7d, 0xbb, 0x0f, 0x91, 0x78, 0xff, 0xff, 0xff, 0xff, 0x02, 0x8b, 0xa7, 0x94, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x19, 0x76, 0xa9, 0x14, 0xba, 0xde, 0xec, 0xfd, 0xef, 0x05, 0x07, 0x24, 0x7f, 0xc8, 0xf7, 0x42, 0x41, 0xd7, 0x3b, 0xc0, 0x39, 0x97, 0x2d, 0x7b, 0x88, 0xac, 0x40, 0x94, 0xa8, 0x02, 0x00, 0x00, 0x00, 0x00, 0x19, 0x76, 0xa9, 0x14, 0xc1, 0x09, 0x32, 0x48, 0x3f, 0xec, 0x93, 0xed, 0x51, 0xf5, 0xfe, 0x95, 0xe7, 0x25, 0x59, 0xf2, 0xcc, 0x70, 0x43, 0xf9, 0x88, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00}; + vector vch(ch, ch + sizeof(ch) -1); + CDataStream stream(vch, SER_DISK, CLIENT_VERSION); + CTransaction tx; + stream >> tx; + CValidationState state; + BOOST_CHECK_MESSAGE(CheckTransaction(tx, state) && state.IsValid(), "Simple deserialized transaction should be valid."); + + // Check that duplicate txins fail + tx.vin.push_back(tx.vin[0]); + BOOST_CHECK_MESSAGE(!CheckTransaction(tx, state) || !state.IsValid(), "Transaction with duplicate txins should be invalid."); +} + +// +// Helper: create two dummy transactions, each with +// two outputs. The first has 11 and 50 CENT outputs +// paid to a TX_PUBKEY, the second 21 and 22 CENT outputs +// paid to a TX_PUBKEYHASH. +// +static std::vector +SetupDummyInputs(CBasicKeyStore& keystoreRet, CCoinsView & coinsRet) +{ + std::vector dummyTransactions; + dummyTransactions.resize(2); + + // Add some keys to the keystore: + CKey key[4]; + for (int i = 0; i < 4; i++) + { + key[i].MakeNewKey(i % 2); + keystoreRet.AddKey(key[i]); + } + + // Create some dummy input transactions + dummyTransactions[0].vout.resize(2); + dummyTransactions[0].vout[0].nValue = 11*CENT; + dummyTransactions[0].vout[0].scriptPubKey << key[0].GetPubKey() << OP_CHECKSIG; + dummyTransactions[0].vout[1].nValue = 50*CENT; + dummyTransactions[0].vout[1].scriptPubKey << key[1].GetPubKey() << OP_CHECKSIG; + coinsRet.SetCoins(dummyTransactions[0].GetHash(), CCoins(dummyTransactions[0], 0)); + + dummyTransactions[1].vout.resize(2); + dummyTransactions[1].vout[0].nValue = 21*CENT; + dummyTransactions[1].vout[0].scriptPubKey.SetDestination(key[2].GetPubKey().GetID()); + dummyTransactions[1].vout[1].nValue = 22*CENT; + dummyTransactions[1].vout[1].scriptPubKey.SetDestination(key[3].GetPubKey().GetID()); + coinsRet.SetCoins(dummyTransactions[1].GetHash(), CCoins(dummyTransactions[1], 0)); + + return dummyTransactions; +} + +BOOST_AUTO_TEST_CASE(test_Get) +{ + CBasicKeyStore keystore; + CCoinsView coinsDummy; + CCoinsViewCache coins(coinsDummy); + std::vector dummyTransactions = SetupDummyInputs(keystore, coins); + + CTransaction t1; + t1.vin.resize(3); + t1.vin[0].prevout.hash = dummyTransactions[0].GetHash(); + t1.vin[0].prevout.n = 1; + t1.vin[0].scriptSig << std::vector(65, 0); + t1.vin[1].prevout.hash = dummyTransactions[1].GetHash(); + t1.vin[1].prevout.n = 0; + t1.vin[1].scriptSig << std::vector(65, 0) << std::vector(33, 4); + t1.vin[2].prevout.hash = dummyTransactions[1].GetHash(); + t1.vin[2].prevout.n = 1; + t1.vin[2].scriptSig << std::vector(65, 0) << std::vector(33, 4); + t1.vout.resize(2); + t1.vout[0].nValue = 90*CENT; + t1.vout[0].scriptPubKey << OP_1; + + BOOST_CHECK(AreInputsStandard(t1, coins)); + BOOST_CHECK_EQUAL(coins.GetValueIn(t1), (50+21+22)*CENT); + + // Adding extra junk to the scriptSig should make it non-standard: + t1.vin[0].scriptSig << OP_11; + BOOST_CHECK(!AreInputsStandard(t1, coins)); + + // ... as should not having enough: + t1.vin[0].scriptSig = CScript(); + BOOST_CHECK(!AreInputsStandard(t1, coins)); +} + +BOOST_AUTO_TEST_CASE(test_IsStandard) +{ + CBasicKeyStore keystore; + CCoinsView coinsDummy; + CCoinsViewCache coins(coinsDummy); + std::vector dummyTransactions = SetupDummyInputs(keystore, coins); + + CTransaction t; + t.vin.resize(1); + t.vin[0].prevout.hash = dummyTransactions[0].GetHash(); + t.vin[0].prevout.n = 1; + t.vin[0].scriptSig << std::vector(65, 0); + t.vout.resize(1); + t.vout[0].nValue = 90*CENT; + CKey key; + key.MakeNewKey(true); + t.vout[0].scriptPubKey.SetDestination(key.GetPubKey().GetID()); + + string reason; + BOOST_CHECK(IsStandardTx(t, reason)); + + t.vout[0].nValue = 5011; // dust + BOOST_CHECK(!IsStandardTx(t, reason)); + + t.vout[0].nValue = 6011; // not dust + BOOST_CHECK(IsStandardTx(t, reason)); + + t.vout[0].scriptPubKey = CScript() << OP_1; + BOOST_CHECK(!IsStandardTx(t, reason)); +} + +BOOST_AUTO_TEST_SUITE_END() \ No newline at end of file From 042711e03eb15adac5caa1b9c2b0e5bc85b8d685 Mon Sep 17 00:00:00 2001 From: 2a5A1Ghu1 <13294167+2a5A1Ghu1@users.noreply.github.com> Date: Sun, 8 Nov 2020 17:59:40 -0800 Subject: [PATCH 05/35] [BUILD] More Upstream Updates note: bignum.h still errors TODO: Add Cross compile dependencies for linux ie depends structure. Current upstream commit: https://github.com/dashpay/dash/commit/27368e76260564268a7994d7e179a675750dbd05#diff-49473dca262eeab3b4a43002adb08b4db31020d190caaad1594b47f1d5daa810 --- Makefile.am | 52 +- autogen.sh | 6 +- build-aux/compile | 348 + build-aux/config.guess | 1687 +++ build-aux/config.sub | 1851 +++ build-aux/depcomp | 791 ++ build-aux/install-sh | 529 + build-aux/ltmain.sh | 11147 ++++++++++++++++ {src => build-aux}/m4/ax_boost_base.m4 | 0 {src => build-aux}/m4/ax_boost_chrono.m4 | 0 {src => build-aux}/m4/ax_boost_filesystem.m4 | 0 .../m4/ax_boost_program_options.m4 | 0 {src => build-aux}/m4/ax_boost_system.m4 | 0 {src => build-aux}/m4/ax_boost_thread.m4 | 0 .../m4/ax_boost_unit_test_framework.m4 | 0 build-aux/m4/ax_check_compile_flag.m4 | 466 + {src => build-aux}/m4/ax_check_link_flag.m4 | 0 .../m4/ax_check_preproc_flag.m4 | 0 .../m4/ax_cxx_compile_stdcxx.m4 | 0 {src => build-aux}/m4/ax_pthread.m4 | 0 {src => build-aux}/m4/bitcoin_find_bdb48.m4 | 18 +- {src => build-aux}/m4/bitcoin_qt.m4 | 193 +- .../m4/bitcoin_subdir_to_include.m4 | 8 +- {src => build-aux}/m4/libtool.m4 | 0 {src => build-aux}/m4/ltoptions.m4 | 0 {src => build-aux}/m4/ltsugar.m4 | 0 {src => build-aux}/m4/ltversion.m4 | 0 {src => build-aux}/m4/lt~obsolete.m4 | 0 build-aux/missing | 215 + build-aux/test-driver | 148 + configure.ac | 284 +- src/MakeFile.am | 165 +- src/Makefile.qt.include | 83 +- src/Makefile.qttest.include | 17 +- src/Makefile.test.include | 34 +- src/bignum.h | 2 +- .../.deps/libbitcoin_util_a-glibc_compat.Po | 1 + .../.deps/libbitcoin_util_a-glibc_sanity.Po | 1 + .../.deps/libbitcoin_util_a-glibcxx_compat.Po | 1 + .../.deps/libbitcoin_util_a-glibcxx_sanity.Po | 1 + src/config/bitcoin-config.h | 34 +- src/config/bitcoin-config.h.in | 30 +- src/config/dash-config.h.in | 373 + src/config/ohmcoin-config.h.in | 361 + .../.deps/libbitcoin_crypto_a-ripemd160.Po | 1 + src/crypto/.deps/libbitcoin_crypto_a-sha1.Po | 1 + src/crypto/.deps/libbitcoin_crypto_a-sha2.Po | 1 + src/qt/bitcoin.cpp | 10 + src/test/bctest.py | 53 + src/test/bitcoin-util-test.py | 12 + src/test/buildenv.py | 2 + src/test/buildenv.py.in | 2 + src/test/data/bitcoin-util-test.json | 50 + src/univalue/.deps/univalue.Po | 1 + src/univalue/.deps/univalue_read.Po | 1 + src/univalue/.deps/univalue_write.Po | 1 + src/util.cpp | 9 +- 57 files changed, 18688 insertions(+), 302 deletions(-) create mode 100755 build-aux/compile create mode 100755 build-aux/config.guess create mode 100755 build-aux/config.sub create mode 100755 build-aux/depcomp create mode 100755 build-aux/install-sh create mode 100644 build-aux/ltmain.sh rename {src => build-aux}/m4/ax_boost_base.m4 (100%) rename {src => build-aux}/m4/ax_boost_chrono.m4 (100%) rename {src => build-aux}/m4/ax_boost_filesystem.m4 (100%) rename {src => build-aux}/m4/ax_boost_program_options.m4 (100%) rename {src => build-aux}/m4/ax_boost_system.m4 (100%) rename {src => build-aux}/m4/ax_boost_thread.m4 (100%) rename {src => build-aux}/m4/ax_boost_unit_test_framework.m4 (100%) create mode 100644 build-aux/m4/ax_check_compile_flag.m4 rename {src => build-aux}/m4/ax_check_link_flag.m4 (100%) rename {src => build-aux}/m4/ax_check_preproc_flag.m4 (100%) rename src/m4/ax_check_compile_flag.m4 => build-aux/m4/ax_cxx_compile_stdcxx.m4 (100%) rename {src => build-aux}/m4/ax_pthread.m4 (100%) rename {src => build-aux}/m4/bitcoin_find_bdb48.m4 (81%) rename {src => build-aux}/m4/bitcoin_qt.m4 (68%) rename {src => build-aux}/m4/bitcoin_subdir_to_include.m4 (54%) rename {src => build-aux}/m4/libtool.m4 (100%) rename {src => build-aux}/m4/ltoptions.m4 (100%) rename {src => build-aux}/m4/ltsugar.m4 (100%) rename {src => build-aux}/m4/ltversion.m4 (100%) rename {src => build-aux}/m4/lt~obsolete.m4 (100%) create mode 100755 build-aux/missing create mode 100755 build-aux/test-driver create mode 100644 src/compat/.deps/libbitcoin_util_a-glibc_compat.Po create mode 100644 src/compat/.deps/libbitcoin_util_a-glibc_sanity.Po create mode 100644 src/compat/.deps/libbitcoin_util_a-glibcxx_compat.Po create mode 100644 src/compat/.deps/libbitcoin_util_a-glibcxx_sanity.Po create mode 100644 src/config/dash-config.h.in create mode 100644 src/config/ohmcoin-config.h.in create mode 100644 src/crypto/.deps/libbitcoin_crypto_a-ripemd160.Po create mode 100644 src/crypto/.deps/libbitcoin_crypto_a-sha1.Po create mode 100644 src/crypto/.deps/libbitcoin_crypto_a-sha2.Po create mode 100644 src/test/bctest.py create mode 100644 src/test/bitcoin-util-test.py create mode 100644 src/test/buildenv.py create mode 100644 src/test/buildenv.py.in create mode 100644 src/test/data/bitcoin-util-test.json create mode 100644 src/univalue/.deps/univalue.Po create mode 100644 src/univalue/.deps/univalue_read.Po create mode 100644 src/univalue/.deps/univalue_write.Po diff --git a/Makefile.am b/Makefile.am index 220911ad..b3fcec22 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,11 +1,12 @@ -ACLOCAL_AMFLAGS = -I src/m4 +ACLOCAL_AMFLAGS = -I build-aux/m4 SUBDIRS = src -.PHONY: deploy +.PHONY: deploy FORCE GZIP_ENV="-9n" BITCOIND_BIN=$(top_builddir)/src/bitcoind$(EXEEXT) BITCOIN_QT_BIN=$(top_builddir)/src/qt/bitcoin-qt$(EXEEXT) +BITCOIN_CLI_BIN=$(top_builddir)/src/bitcoin-cli$(EXEEXT) BITCOIN_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win$(WINDOWS_BITS)-setup$(EXEEXT) OSX_APP=Bitcoin-Qt.app @@ -16,7 +17,7 @@ OSX_INSTALLER_ICONS=$(top_srcdir)/src/qt/res/icons/bitcoin.icns OSX_PLIST=$(top_srcdir)/share/qt/Info.plist #not installed OSX_QT_TRANSLATIONS = da,de,es,hu,ru,uk,zh_CN,zh_TW -DIST_DOCS = $(wildcard doc/*.md) +DIST_DOCS = $(wildcard doc/*.md) $(wildcard doc/release-notes/*.md) WINDOWS_PACKAGING = $(top_srcdir)/share/pixmaps/bitcoin.ico \ $(top_srcdir)/share/pixmaps/nsis-header.bmp \ @@ -34,6 +35,7 @@ COVERAGE_INFO = baseline_filtered_combined.info baseline.info block_test.info \ dist-hook: -$(MAKE) -C $(top_distdir)/src/leveldb clean + -$(MAKE) -C $(top_distdir)/src/secp256k1 distclean -$(GIT) archive --format=tar HEAD -- src/version.cpp | $(AMTAR) -C $(top_distdir) -xf - distcheck-hook: @@ -44,16 +46,16 @@ distcheck-hook: distcleancheck: @: -$(BITCOIN_WIN_INSTALLER): $(BITCOIND_BIN) $(BITCOIN_QT_BIN) $(BITCOIN_CLI_BIN) +$(BITCOIN_WIN_INSTALLER): all-recursive $(MKDIR_P) $(top_builddir)/release - $(INSTALL_STRIP_PROGRAM) $(BITCOIND_BIN) $(top_builddir)/release - $(INSTALL_STRIP_PROGRAM) $(BITCOIN_QT_BIN) $(top_builddir)/release - $(INSTALL_STRIP_PROGRAM) $(BITCOIN_CLI_BIN) $(top_builddir)/release + STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BITCOIND_BIN) $(top_builddir)/release + STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BITCOIN_QT_BIN) $(top_builddir)/release + STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $(BITCOIN_CLI_BIN) $(top_builddir)/release @test -f $(MAKENSIS) && $(MAKENSIS) $(top_builddir)/share/setup.nsi || \ echo error: could not build $@ -$(BITCOIND_BIN) $(BITCOIN_QT_BIN) $(BITCOIN_CLI_BIN): - make -C $(dir $@) $(notdir $@) +$(if $(findstring src/,$(MAKECMDGOALS)),$(MAKECMDGOALS), none): FORCE + $(MAKE) -C src $(patsubst src/%,%,$@) $(OSX_APP)/Contents/PkgInfo: $(MKDIR_P) $(@D) @@ -65,15 +67,15 @@ $(OSX_APP)/Contents/Resources/empty.lproj: $(OSX_APP)/Contents/Info.plist: $(OSX_PLIST) $(MKDIR_P) $(@D) - $(INSTALL) $< $@ + $(INSTALL_DATA) $< $@ $(OSX_APP)/Contents/Resources/bitcoin.icns: $(OSX_INSTALLER_ICONS) $(MKDIR_P) $(@D) - $(INSTALL) $< $@ + $(INSTALL_DATA) $< $@ $(OSX_APP)/Contents/MacOS/Bitcoin-Qt: $(BITCOIN_QT_BIN) $(MKDIR_P) $(@D) - $(INSTALL_STRIP_PROGRAM) $< $@ + STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $< $@ OSX_APP_BUILT=$(OSX_APP)/Contents/PkgInfo $(OSX_APP)/Contents/Resources/empty.lproj \ $(OSX_APP)/Contents/Resources/bitcoin.icns $(OSX_APP)/Contents/Info.plist \ @@ -81,11 +83,11 @@ OSX_APP_BUILT=$(OSX_APP)/Contents/PkgInfo $(OSX_APP)/Contents/Resources/empty.lp if BUILD_DARWIN $(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING) - $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -add-qt-tr $(OSX_QT_TRANSLATIONS) -dmg -fancy $(OSX_FANCY_PLIST) -verbose 2 + $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -add-qt-tr $(OSX_QT_TRANSLATIONS) -translations-dir=$(QT_TRANSLATION_DIR) -dmg -fancy $(OSX_FANCY_PLIST) -verbose 2 else $(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING) - INSTALLNAMETOOL=$(INSTALLNAMETOOL) OTOOL=$(OTOOL) STRIP=$(STRIP) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -add-qt-tr $(OSX_QT_TRANSLATIONS) -verbose 2 + INSTALLNAMETOOL=$(INSTALLNAMETOOL) OTOOL=$(OTOOL) STRIP=$(STRIP) $(OSX_DEPLOY_SCRIPT) $(OSX_APP) -add-qt-tr $(OSX_QT_TRANSLATIONS) -translations-dir=$(QT_TRANSLATION_DIR) -verbose 2 $(MKDIR_P) dist/.background $(INSTALL) contrib/macdeploy/background.png dist/.background $(INSTALL) contrib/macdeploy/DS_Store dist/.DS_Store @@ -94,12 +96,22 @@ $(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING) endif if TARGET_DARWIN +appbundle: $(OSX_APP_BUILT) deploy: $(OSX_DMG) endif if TARGET_WINDOWS deploy: $(BITCOIN_WIN_INSTALLER) endif +$(BITCOIN_QT_BIN): FORCE + $(MAKE) -C src qt/$(@F) + +$(BITCOIND_BIN): FORCE + $(MAKE) -C src $(@F) + +$(BITCOIN_CLI_BIN): FORCE + $(MAKE) -C src $(@F) + if USE_LCOV baseline.info: @@ -127,7 +139,8 @@ test_bitcoin_filtered.info: test_bitcoin.info $(LCOV) -r $< "/usr/include/*" -o $@ block_test.info: test_bitcoin_filtered.info - -@TIMEOUT=15 qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -Xmx2G -jar $(JAVA_COMPARISON_TOOL) 1 18444 + $(MKDIR_P) qa/tmp + -@TIMEOUT=15 qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool 0 $(LCOV) -c -d $(abs_builddir)/src --t BitcoinJBlockTest -o $@ $(LCOV) -z -d $(abs_builddir)/src $(LCOV) -z -d $(abs_builddir)/src/leveldb @@ -155,14 +168,15 @@ endif if USE_COMPARISON_TOOL check-local: - @qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -Xmx2G -jar $(JAVA_COMPARISON_TOOL) 1 18444 + $(MKDIR_P) qa/tmp + @qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool $(COMPARISON_TOOL_REORG_TESTS) 2>&1 endif -EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/pull-tester.sh $(DIST_DOCS) $(WINDOWS_PACKAGING) $(OSX_PACKAGING) +EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/pull-tester.sh qa/rpc-tests $(DIST_DOCS) $(WINDOWS_PACKAGING) $(OSX_PACKAGING) CLEANFILES = $(OSX_DMG) $(BITCOIN_WIN_INSTALLER) -.INTERMEDIATE: $(OSX_APP_BUILT) $(COVERAGE_INFO) +.INTERMEDIATE: $(COVERAGE_INFO) clean-local: - rm -rf test_bitcoin.coverage/ total.coverage/ \ No newline at end of file + rm -rf test_bitcoin.coverage/ total.coverage/ $(OSX_APP) \ No newline at end of file diff --git a/autogen.sh b/autogen.sh index a32bc03d..433ccff7 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,8 +1,8 @@ -#!/bin/sh set -e srcdir="$(dirname $0)" cd "$srcdir" if [ -z ${LIBTOOLIZE} ] && GLIBTOOLIZE="`which glibtoolize 2>/dev/null`"; then - export LIBTOOLIZE="${GLIBTOOLIZE}" + LIBTOOLIZE="${GLIBTOOLIZE}" + export LIBTOOLIZE fi -autoreconf --install --force \ No newline at end of file +autoreconf --install --force --warnings=all \ No newline at end of file diff --git a/build-aux/compile b/build-aux/compile new file mode 100755 index 00000000..23fcba01 --- /dev/null +++ b/build-aux/compile @@ -0,0 +1,348 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1999-2020 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN* | MSYS*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/* | msys/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/build-aux/config.guess b/build-aux/config.guess new file mode 100755 index 00000000..9aff91cf --- /dev/null +++ b/build-aux/config.guess @@ -0,0 +1,1687 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2020 Free Software Foundation, Inc. + +timestamp='2020-08-17' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2020 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039 + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD="$driver" + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if test -f /.attbin/uname ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "$UNAME_SYSTEM" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + set_cc_for_build + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + + # If ldd exists, use it to detect musl libc. + if command -v ldd >/dev/null && \ + ldd --version 2>&1 | grep -q ^musl + then + LIBC=musl + fi + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + "/sbin/$sysctl" 2>/dev/null || \ + "/usr/sbin/$sysctl" 2>/dev/null || \ + echo unknown)` + case "$UNAME_MACHINE_ARCH" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine="${arch}${endian}"-unknown + ;; + *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case "$UNAME_MACHINE_ARCH" in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "$UNAME_VERSION" in + Debian*) + release='-gnu' + ;; + *) + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "$machine-${os}${release}${abi-}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" + exit ;; + *:MidnightBSD:*:*) + echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" + exit ;; + *:ekkoBSD:*:*) + echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" + exit ;; + *:SolidBSD:*:*) + echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" + exit ;; + *:OS108:*:*) + echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE" + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:MirBSD:*:*) + echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:Sortix:*:*) + echo "$UNAME_MACHINE"-unknown-sortix + exit ;; + *:Twizzler:*:*) + echo "$UNAME_MACHINE"-unknown-twizzler + exit ;; + *:Redox:*:*) + echo "$UNAME_MACHINE"-unknown-redox + exit ;; + mips:OSF1:*.*) + echo mips-dec-osf1 + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix"$UNAME_RELEASE" + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux"$UNAME_RELEASE" + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + set_cc_for_build + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos"$UNAME_RELEASE" + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos"$UNAME_RELEASE" + ;; + sun4) + echo sparc-sun-sunos"$UNAME_RELEASE" + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos"$UNAME_RELEASE" + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint"$UNAME_RELEASE" + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint"$UNAME_RELEASE" + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint"$UNAME_RELEASE" + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten"$UNAME_RELEASE" + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten"$UNAME_RELEASE" + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix"$UNAME_RELEASE" + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix"$UNAME_RELEASE" + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix"$UNAME_RELEASE" + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos"$UNAME_RELEASE" + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 + then + if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ + test "$TARGET_BINARY_INTERFACE"x = x + then + echo m88k-dg-dgux"$UNAME_RELEASE" + else + echo m88k-dg-dguxbcs"$UNAME_RELEASE" + fi + else + echo i586-dg-dgux"$UNAME_RELEASE" + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if test -x /usr/bin/oslevel ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if test -x /usr/bin/lslpp ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$IBM_ARCH"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + case "$UNAME_MACHINE" in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if test -x /usr/bin/getconf; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "$sc_cpu_version" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "$sc_kernel_bits" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if test "$HP_ARCH" = ""; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if test "$HP_ARCH" = hppa2.0w + then + set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + echo "$HP_ARCH"-hp-hpux"$HPUX_REV" + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux"$HPUX_REV" + exit ;; + 3050*:HI-UX:*:*) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if test -x /usr/sbin/sysversion ; then + echo "$UNAME_MACHINE"-unknown-osf1mk + else + echo "$UNAME_MACHINE"-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:BSD/OS:*:*) + echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" + exit ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi + else + echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf + fi + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case "$UNAME_PROCESSOR" in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + i*:CYGWIN*:*) + echo "$UNAME_MACHINE"-pc-cygwin + exit ;; + *:MINGW64*:*) + echo "$UNAME_MACHINE"-pc-mingw64 + exit ;; + *:MINGW*:*) + echo "$UNAME_MACHINE"-pc-mingw32 + exit ;; + *:MSYS*:*) + echo "$UNAME_MACHINE"-pc-msys + exit ;; + i*:PW*:*) + echo "$UNAME_MACHINE"-pc-pw32 + exit ;; + *:Interix*:*) + case "$UNAME_MACHINE" in + x86) + echo i586-pc-interix"$UNAME_RELEASE" + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix"$UNAME_RELEASE" + exit ;; + IA64) + echo ia64-unknown-interix"$UNAME_RELEASE" + exit ;; + esac ;; + i*:UWIN*:*) + echo "$UNAME_MACHINE"-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-pc-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + *:GNU:*:*) + # the GNU system + echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" + exit ;; + *:Minix:*:*) + echo "$UNAME_MACHINE"-unknown-minix + exit ;; + aarch64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arm*:Linux:*:*) + set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + else + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + cris:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + crisv32:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + e2k:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + frv:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + hexagon:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + ia64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + k1om:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m32r*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m68*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + MIPS_ENDIAN=el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + MIPS_ENDIAN= + #else + MIPS_ENDIAN= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + ;; + mips64el:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-"$LIBC" + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-"$LIBC" + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-"$LIBC" + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; + PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; + *) echo hppa-unknown-linux-"$LIBC" ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-"$LIBC" + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-"$LIBC" + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-"$LIBC" + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-"$LIBC" + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" + exit ;; + sh64*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sh*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + tile*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + vax:Linux:*:*) + echo "$UNAME_MACHINE"-dec-linux-"$LIBC" + exit ;; + x86_64:Linux:*:*) + set_cc_for_build + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_X32 >/dev/null + then + LIBCABI="$LIBC"x32 + fi + fi + echo "$UNAME_MACHINE"-pc-linux-"$LIBCABI" + exit ;; + xtensa*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo "$UNAME_MACHINE"-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo "$UNAME_MACHINE"-unknown-stop + exit ;; + i*86:atheos:*:*) + echo "$UNAME_MACHINE"-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo "$UNAME_MACHINE"-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos"$UNAME_RELEASE" + exit ;; + i*86:*DOS:*:*) + echo "$UNAME_MACHINE"-pc-msdosdjgpp + exit ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}" + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos"$UNAME_RELEASE" + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos"$UNAME_RELEASE" + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv"$UNAME_RELEASE" + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo "$UNAME_MACHINE"-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo "$UNAME_MACHINE"-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux"$UNAME_RELEASE" + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if test -d /usr/nec; then + echo mips-nec-sysv"$UNAME_RELEASE" + else + echo mips-unknown-sysv"$UNAME_RELEASE" + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux"$UNAME_RELEASE" + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux"$UNAME_RELEASE" + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux"$UNAME_RELEASE" + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux"$UNAME_RELEASE" + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux"$UNAME_RELEASE" + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Rhapsody:*:*) + echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" + exit ;; + arm64:Darwin:*:*) + echo aarch64-apple-darwin"$UNAME_RELEASE" + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build + fi + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE + fi + echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-*:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSR-*:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSV-*:NONSTOP_KERNEL:*:*) + echo nsv-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk"$UNAME_RELEASE" + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + # shellcheck disable=SC2154 + if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo "$UNAME_MACHINE"-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux"$UNAME_RELEASE" + exit ;; + *:DragonFly:*:*) + echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "$UNAME_MACHINE" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" + exit ;; + i*86:rdos:*:*) + echo "$UNAME_MACHINE"-pc-rdos + exit ;; + i*86:AROS:*:*) + echo "$UNAME_MACHINE"-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo "$UNAME_MACHINE"-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; + *:Unleashed:*:*) + echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE" + exit ;; +esac + +# No uname command or uname output not recognized. +set_cc_for_build +cat > "$dummy.c" < +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); +#endif + +#if defined (vax) +#if !defined (ultrix) +#include +#if defined (BSD) +#if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +#else +#if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#endif +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#else +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } + +echo "$0: unable to guess system type" >&2 + +case "$UNAME_MACHINE:$UNAME_SYSTEM" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 <&2 </dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" +EOF +fi + +exit 1 + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/build-aux/config.sub b/build-aux/config.sub new file mode 100755 index 00000000..0753e308 --- /dev/null +++ b/build-aux/config.sub @@ -0,0 +1,1851 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2020 Free Software Foundation, Inc. + +timestamp='2020-08-17' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2020 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo "$1" + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Split fields of configuration type +# shellcheck disable=SC2162 +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 + ;; + *-*-*-*) + basic_machine=$field1-$field2 + basic_os=$field3-$field4 + ;; + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + basic_os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + basic_os=linux-android + ;; + *) + basic_machine=$field1-$field2 + basic_os=$field3 + ;; + esac + ;; + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + basic_os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + basic_os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + basic_os= + ;; + *) + basic_machine=$field1 + basic_os=$field2 + ;; + esac + ;; + esac + ;; + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + basic_os=bsd + ;; + a29khif) + basic_machine=a29k-amd + basic_os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + basic_os=scout + ;; + alliant) + basic_machine=fx80-alliant + basic_os= + ;; + altos | altos3068) + basic_machine=m68k-altos + basic_os= + ;; + am29k) + basic_machine=a29k-none + basic_os=bsd + ;; + amdahl) + basic_machine=580-amdahl + basic_os=sysv + ;; + amiga) + basic_machine=m68k-unknown + basic_os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + basic_os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + basic_os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + basic_os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + basic_os=bsd + ;; + aros) + basic_machine=i386-pc + basic_os=aros + ;; + aux) + basic_machine=m68k-apple + basic_os=aux + ;; + balance) + basic_machine=ns32k-sequent + basic_os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + basic_os=linux + ;; + cegcc) + basic_machine=arm-unknown + basic_os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + basic_os=bsd + ;; + convex-c2) + basic_machine=c2-convex + basic_os=bsd + ;; + convex-c32) + basic_machine=c32-convex + basic_os=bsd + ;; + convex-c34) + basic_machine=c34-convex + basic_os=bsd + ;; + convex-c38) + basic_machine=c38-convex + basic_os=bsd + ;; + cray) + basic_machine=j90-cray + basic_os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + basic_os= + ;; + da30) + basic_machine=m68k-da30 + basic_os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + basic_os= + ;; + delta88) + basic_machine=m88k-motorola + basic_os=sysv3 + ;; + dicos) + basic_machine=i686-pc + basic_os=dicos + ;; + djgpp) + basic_machine=i586-pc + basic_os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + basic_os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + basic_os=ose + ;; + gmicro) + basic_machine=tron-gmicro + basic_os=sysv + ;; + go32) + basic_machine=i386-pc + basic_os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + basic_os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + basic_os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + basic_os=hms + ;; + harris) + basic_machine=m88k-harris + basic_os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + basic_os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + basic_os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + basic_os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + basic_os=proelf + ;; + i386mach) + basic_machine=i386-mach + basic_os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + basic_os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + basic_os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + basic_os=sysv + ;; + merlin) + basic_machine=ns32k-utek + basic_os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + basic_os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + basic_os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + basic_os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + basic_os=coff + ;; + morphos) + basic_machine=powerpc-unknown + basic_os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + basic_os=moxiebox + ;; + msdos) + basic_machine=i386-pc + basic_os=msdos + ;; + msys) + basic_machine=i686-pc + basic_os=msys + ;; + mvs) + basic_machine=i370-ibm + basic_os=mvs + ;; + nacl) + basic_machine=le32-unknown + basic_os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + basic_os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + basic_os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + basic_os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + basic_os=newsos + ;; + news1000) + basic_machine=m68030-sony + basic_os=newsos + ;; + necv70) + basic_machine=v70-nec + basic_os=sysv + ;; + nh3000) + basic_machine=m68k-harris + basic_os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + basic_os=cxux + ;; + nindy960) + basic_machine=i960-intel + basic_os=nindy + ;; + mon960) + basic_machine=i960-intel + basic_os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + basic_os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + basic_os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + basic_os=ose + ;; + os68k) + basic_machine=m68k-none + basic_os=os68k + ;; + paragon) + basic_machine=i860-intel + basic_os=osf + ;; + parisc) + basic_machine=hppa-unknown + basic_os=linux + ;; + psp) + basic_machine=mipsallegrexel-sony + basic_os=psp + ;; + pw32) + basic_machine=i586-unknown + basic_os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + basic_os=rdos + ;; + rdos32) + basic_machine=i386-pc + basic_os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + basic_os=coff + ;; + sa29200) + basic_machine=a29k-amd + basic_os=udi + ;; + sei) + basic_machine=mips-sei + basic_os=seiux + ;; + sequent) + basic_machine=i386-sequent + basic_os= + ;; + sps7) + basic_machine=m68k-bull + basic_os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + basic_os= + ;; + stratus) + basic_machine=i860-stratus + basic_os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + basic_os= + ;; + sun2os3) + basic_machine=m68000-sun + basic_os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + basic_os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + basic_os= + ;; + sun3os3) + basic_machine=m68k-sun + basic_os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + basic_os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + basic_os= + ;; + sun4os3) + basic_machine=sparc-sun + basic_os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + basic_os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + basic_os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + basic_os= + ;; + sv1) + basic_machine=sv1-cray + basic_os=unicos + ;; + symmetry) + basic_machine=i386-sequent + basic_os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + basic_os=unicos + ;; + t90) + basic_machine=t90-cray + basic_os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + basic_os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + basic_os=tpf + ;; + udi29k) + basic_machine=a29k-amd + basic_os=udi + ;; + ultra3) + basic_machine=a29k-nyu + basic_os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + basic_os=none + ;; + vaxv) + basic_machine=vax-dec + basic_os=sysv + ;; + vms) + basic_machine=vax-dec + basic_os=vms + ;; + vsta) + basic_machine=i386-pc + basic_os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + basic_os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + basic_os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + basic_os=vxworks + ;; + xbox) + basic_machine=i686-pc + basic_os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + basic_os=unicos + ;; + *) + basic_machine=$1 + basic_os= + ;; + esac + ;; +esac + +# Decode 1-component or ad-hoc basic machines +case $basic_machine in + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond + ;; + op50n) + cpu=hppa1.1 + vendor=oki + ;; + op60c) + cpu=hppa1.1 + vendor=oki + ;; + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple + ;; + + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + basic_os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + basic_os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + basic_os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + basic_os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + basic_os=${basic_os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv32 + ;; + i*86v4*) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv4 + ;; + i*86v) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv + ;; + i*86sol2) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + basic_os=${basic_os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $basic_os in + irix*) + ;; + *) + basic_os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + basic_os=mint + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + basic_os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $basic_os in + openstep*) + ;; + nextstep*) + ;; + ns2*) + basic_os=nextstep2 + ;; + *) + basic_os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + basic_os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + basic_os=${basic_os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + basic_os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + basic_os=proelf + ;; + none) + cpu=none + vendor=none + ;; + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine + ;; + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` + ;; + + *-*) + # shellcheck disable=SC2162 + IFS="-" read cpu vendor <&2 + exit 1 + ;; + esac + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $vendor in + digital*) + vendor=dec + ;; + commodore*) + vendor=cbm + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if test x$basic_os != x +then + +# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just +# set os. +case $basic_os in + gnu/linux*) + kernel=linux + os=`echo $basic_os | sed -e 's|gnu/linux|gnu|'` + ;; + nto-qnx*) + kernel=nto + os=`echo $basic_os | sed -e 's|nto-qnx|qnx|'` + ;; + *-*) + # shellcheck disable=SC2162 + IFS="-" read kernel os <&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os in + linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* | linux-musl* | linux-uclibc* ) + ;; + -dietlibc* | -newlib* | -musl* | -uclibc* ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + kfreebsd*-gnu* | kopensolaris*-gnu*) + ;; + nto-qnx*) + ;; + *-eabi* | *-gnueabi*) + ;; + -*) + # Blank kernel with real OS is always fine. + ;; + *-*) + echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + exit 1 + ;; +esac + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +case $vendor in + unknown) + case $cpu-$os in + *-riscix*) + vendor=acorn + ;; + *-sunos*) + vendor=sun + ;; + *-cnk* | *-aix*) + vendor=ibm + ;; + *-beos*) + vendor=be + ;; + *-hpux*) + vendor=hp + ;; + *-mpeix*) + vendor=hp + ;; + *-hiux*) + vendor=hitachi + ;; + *-unos*) + vendor=crds + ;; + *-dgux*) + vendor=dg + ;; + *-luna*) + vendor=omron + ;; + *-genix*) + vendor=ns + ;; + *-clix*) + vendor=intergraph + ;; + *-mvs* | *-opened*) + vendor=ibm + ;; + *-os400*) + vendor=ibm + ;; + s390-* | s390x-*) + vendor=ibm + ;; + *-ptx*) + vendor=sequent + ;; + *-tpf*) + vendor=ibm + ;; + *-vxsim* | *-vxworks* | *-windiss*) + vendor=wrs + ;; + *-aux*) + vendor=apple + ;; + *-hms*) + vendor=hitachi + ;; + *-mpw* | *-macos*) + vendor=apple + ;; + *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) + vendor=atari + ;; + *-vos*) + vendor=stratus + ;; + esac + ;; +esac + +echo "$cpu-$vendor-${kernel:+$kernel-}$os" +exit + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/build-aux/depcomp b/build-aux/depcomp new file mode 100755 index 00000000..6b391623 --- /dev/null +++ b/build-aux/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1999-2020 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/build-aux/install-sh b/build-aux/install-sh new file mode 100755 index 00000000..20d8b2ea --- /dev/null +++ b/build-aux/install-sh @@ -0,0 +1,529 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2018-03-11.20; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in 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: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# 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 +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dstbase=`basename "$src"` + case $dst in + */) dst=$dst$dstbase;; + *) dst=$dst/$dstbase;; + esac + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + case $dstdir in + */) dstdirslash=$dstdir;; + *) dstdirslash=$dstdir/;; + esac + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + # Note that $RANDOM variable is not portable (e.g. dash); Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + + trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p' feature. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=${dstdirslash}_inst.$$_ + rmtmp=${dstdirslash}_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && + { test -z "$stripcmd" || { + # Create $dsttmp read-write so that cp doesn't create it read-only, + # which would cause strip to fail. + if test -z "$doit"; then + : >"$dsttmp" # No need to fork-exec 'touch'. + else + $doit touch "$dsttmp" + fi + } + } && + $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/build-aux/ltmain.sh b/build-aux/ltmain.sh new file mode 100644 index 00000000..0f0a2da3 --- /dev/null +++ b/build-aux/ltmain.sh @@ -0,0 +1,11147 @@ +#! /bin/sh +## DO NOT EDIT - This file generated from ./build-aux/ltmain.in +## by inline-source v2014-01-03.01 + +# libtool (GNU libtool) 2.4.6 +# Provide generalized library-building support services. +# Written by Gordon Matzigkeit , 1996 + +# Copyright (C) 1996-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# GNU Libtool is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# As a special exception to the GNU General Public License, +# if you distribute this file as part of a program or library that +# is built using GNU Libtool, you may include this file under the +# same distribution terms that you use for the rest of that program. +# +# GNU Libtool is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + + +PROGRAM=libtool +PACKAGE=libtool +VERSION=2.4.6 +package_revision=2.4.6 + + +## ------ ## +## Usage. ## +## ------ ## + +# Run './libtool --help' for help with using this script from the +# command line. + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# After configure completes, it has a better idea of some of the +# shell tools we need than the defaults used by the functions shared +# with bootstrap, so set those here where they can still be over- +# ridden by the user, but otherwise take precedence. + +: ${AUTOCONF="autoconf"} +: ${AUTOMAKE="automake"} + + +## -------------------------- ## +## Source external libraries. ## +## -------------------------- ## + +# Much of our low-level functionality needs to be sourced from external +# libraries, which are installed to $pkgauxdir. + +# Set a version string for this script. +scriptversion=2015-01-20.17; # UTC + +# General shell script boiler plate, and helper functions. +# Written by Gary V. Vaughan, 2004 + +# Copyright (C) 2004-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. + +# As a special exception to the GNU General Public License, if you distribute +# this file as part of a program or library that is built using GNU Libtool, +# you may include this file under the same distribution terms that you use +# for the rest of that program. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNES FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# Evaluate this file near the top of your script to gain access to +# the functions and variables defined here: +# +# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh +# +# If you need to override any of the default environment variable +# settings, do that before evaluating this file. + + +## -------------------- ## +## Shell normalisation. ## +## -------------------- ## + +# Some shells need a little help to be as Bourne compatible as possible. +# Before doing anything else, make sure all that help has been provided! + +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac +fi + +# NLS nuisances: We save the old values in case they are required later. +_G_user_locale= +_G_safe_locale= +for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES +do + eval "if test set = \"\${$_G_var+set}\"; then + save_$_G_var=\$$_G_var + $_G_var=C + export $_G_var + _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" + _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" + fi" +done + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Make sure IFS has a sensible default +sp=' ' +nl=' +' +IFS="$sp $nl" + +# There are apparently some retarded systems that use ';' as a PATH separator! +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + + +## ------------------------- ## +## Locate command utilities. ## +## ------------------------- ## + + +# func_executable_p FILE +# ---------------------- +# Check that FILE is an executable regular file. +func_executable_p () +{ + test -f "$1" && test -x "$1" +} + + +# func_path_progs PROGS_LIST CHECK_FUNC [PATH] +# -------------------------------------------- +# Search for either a program that responds to --version with output +# containing "GNU", or else returned by CHECK_FUNC otherwise, by +# trying all the directories in PATH with each of the elements of +# PROGS_LIST. +# +# CHECK_FUNC should accept the path to a candidate program, and +# set $func_check_prog_result if it truncates its output less than +# $_G_path_prog_max characters. +func_path_progs () +{ + _G_progs_list=$1 + _G_check_func=$2 + _G_PATH=${3-"$PATH"} + + _G_path_prog_max=0 + _G_path_prog_found=false + _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} + for _G_dir in $_G_PATH; do + IFS=$_G_save_IFS + test -z "$_G_dir" && _G_dir=. + for _G_prog_name in $_G_progs_list; do + for _exeext in '' .EXE; do + _G_path_prog=$_G_dir/$_G_prog_name$_exeext + func_executable_p "$_G_path_prog" || continue + case `"$_G_path_prog" --version 2>&1` in + *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; + *) $_G_check_func $_G_path_prog + func_path_progs_result=$func_check_prog_result + ;; + esac + $_G_path_prog_found && break 3 + done + done + done + IFS=$_G_save_IFS + test -z "$func_path_progs_result" && { + echo "no acceptable sed could be found in \$PATH" >&2 + exit 1 + } +} + + +# We want to be able to use the functions in this file before configure +# has figured out where the best binaries are kept, which means we have +# to search for them ourselves - except when the results are already set +# where we skip the searches. + +# Unless the user overrides by setting SED, search the path for either GNU +# sed, or the sed that truncates its output the least. +test -z "$SED" && { + _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ + for _G_i in 1 2 3 4 5 6 7; do + _G_sed_script=$_G_sed_script$nl$_G_sed_script + done + echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed + _G_sed_script= + + func_check_prog_sed () + { + _G_path_prog=$1 + + _G_count=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo '' >> conftest.nl + "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin + rm -f conftest.sed + SED=$func_path_progs_result +} + + +# Unless the user overrides by setting GREP, search the path for either GNU +# grep, or the grep that truncates its output the least. +test -z "$GREP" && { + func_check_prog_grep () + { + _G_path_prog=$1 + + _G_count=0 + _G_path_prog_max=0 + printf 0123456789 >conftest.in + while : + do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo 'GREP' >> conftest.nl + "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break + diff conftest.out conftest.nl >/dev/null 2>&1 || break + _G_count=`expr $_G_count + 1` + if test "$_G_count" -gt "$_G_path_prog_max"; then + # Best one so far, save it but keep looking for a better one + func_check_prog_result=$_G_path_prog + _G_path_prog_max=$_G_count + fi + # 10*(2^10) chars as input seems more than enough + test 10 -lt "$_G_count" && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out + } + + func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin + GREP=$func_path_progs_result +} + + +## ------------------------------- ## +## User overridable command paths. ## +## ------------------------------- ## + +# All uppercase variable names are used for environment variables. These +# variables can be overridden by the user before calling a script that +# uses them if a suitable command of that name is not already available +# in the command search PATH. + +: ${CP="cp -f"} +: ${ECHO="printf %s\n"} +: ${EGREP="$GREP -E"} +: ${FGREP="$GREP -F"} +: ${LN_S="ln -s"} +: ${MAKE="make"} +: ${MKDIR="mkdir"} +: ${MV="mv -f"} +: ${RM="rm -f"} +: ${SHELL="${CONFIG_SHELL-/bin/sh}"} + + +## -------------------- ## +## Useful sed snippets. ## +## -------------------- ## + +sed_dirname='s|/[^/]*$||' +sed_basename='s|^.*/||' + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='s|\([`"$\\]\)|\\\1|g' + +# Same as above, but do not quote variable references. +sed_double_quote_subst='s/\(["`\\]\)/\\\1/g' + +# Sed substitution that turns a string into a regex matching for the +# string literally. +sed_make_literal_regex='s|[].[^$\\*\/]|\\&|g' + +# Sed substitution that converts a w32 file name or path +# that contains forward slashes, into one that contains +# (escaped) backslashes. A very naive implementation. +sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' + +# Re-'\' parameter expansions in output of sed_double_quote_subst that +# were '\'-ed in input to the same. If an odd number of '\' preceded a +# '$' in input to sed_double_quote_subst, that '$' was protected from +# expansion. Since each input '\' is now two '\'s, look for any number +# of runs of four '\'s followed by two '\'s and then a '$'. '\' that '$'. +_G_bs='\\' +_G_bs2='\\\\' +_G_bs4='\\\\\\\\' +_G_dollar='\$' +sed_double_backslash="\ + s/$_G_bs4/&\\ +/g + s/^$_G_bs2$_G_dollar/$_G_bs&/ + s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g + s/\n//g" + + +## ----------------- ## +## Global variables. ## +## ----------------- ## + +# Except for the global variables explicitly listed below, the following +# functions in the '^func_' namespace, and the '^require_' namespace +# variables initialised in the 'Resource management' section, sourcing +# this file will not pollute your global namespace with anything +# else. There's no portable way to scope variables in Bourne shell +# though, so actually running these functions will sometimes place +# results into a variable named after the function, and often use +# temporary variables in the '^_G_' namespace. If you are careful to +# avoid using those namespaces casually in your sourcing script, things +# should continue to work as you expect. And, of course, you can freely +# overwrite any of the functions or variables defined here before +# calling anything to customize them. + +EXIT_SUCCESS=0 +EXIT_FAILURE=1 +EXIT_MISMATCH=63 # $? = 63 is used to indicate version mismatch to missing. +EXIT_SKIP=77 # $? = 77 is used to indicate a skipped test to automake. + +# Allow overriding, eg assuming that you follow the convention of +# putting '$debug_cmd' at the start of all your functions, you can get +# bash to show function call trace with: +# +# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name +debug_cmd=${debug_cmd-":"} +exit_cmd=: + +# By convention, finish your script with: +# +# exit $exit_status +# +# so that you can set exit_status to non-zero if you want to indicate +# something went wrong during execution without actually bailing out at +# the point of failure. +exit_status=$EXIT_SUCCESS + +# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh +# is ksh but when the shell is invoked as "sh" and the current value of +# the _XPG environment variable is not equal to 1 (one), the special +# positional parameter $0, within a function call, is the name of the +# function. +progpath=$0 + +# The name of this program. +progname=`$ECHO "$progpath" |$SED "$sed_basename"` + +# Make sure we have an absolute progpath for reexecution: +case $progpath in + [\\/]*|[A-Za-z]:\\*) ;; + *[\\/]*) + progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` + progdir=`cd "$progdir" && pwd` + progpath=$progdir/$progname + ;; + *) + _G_IFS=$IFS + IFS=${PATH_SEPARATOR-:} + for progdir in $PATH; do + IFS=$_G_IFS + test -x "$progdir/$progname" && break + done + IFS=$_G_IFS + test -n "$progdir" || progdir=`pwd` + progpath=$progdir/$progname + ;; +esac + + +## ----------------- ## +## Standard options. ## +## ----------------- ## + +# The following options affect the operation of the functions defined +# below, and should be set appropriately depending on run-time para- +# meters passed on the command line. + +opt_dry_run=false +opt_quiet=false +opt_verbose=false + +# Categories 'all' and 'none' are always available. Append any others +# you will pass as the first argument to func_warning from your own +# code. +warning_categories= + +# By default, display warnings according to 'opt_warning_types'. Set +# 'warning_func' to ':' to elide all warnings, or func_fatal_error to +# treat the next displayed warning as a fatal error. +warning_func=func_warn_and_continue + +# Set to 'all' to display all warnings, 'none' to suppress all +# warnings, or a space delimited list of some subset of +# 'warning_categories' to display only the listed warnings. +opt_warning_types=all + + +## -------------------- ## +## Resource management. ## +## -------------------- ## + +# This section contains definitions for functions that each ensure a +# particular resource (a file, or a non-empty configuration variable for +# example) is available, and if appropriate to extract default values +# from pertinent package files. Call them using their associated +# 'require_*' variable to ensure that they are executed, at most, once. +# +# It's entirely deliberate that calling these functions can set +# variables that don't obey the namespace limitations obeyed by the rest +# of this file, in order that that they be as useful as possible to +# callers. + + +# require_term_colors +# ------------------- +# Allow display of bold text on terminals that support it. +require_term_colors=func_require_term_colors +func_require_term_colors () +{ + $debug_cmd + + test -t 1 && { + # COLORTERM and USE_ANSI_COLORS environment variables take + # precedence, because most terminfo databases neglect to describe + # whether color sequences are supported. + test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} + + if test 1 = "$USE_ANSI_COLORS"; then + # Standard ANSI escape sequences + tc_reset='' + tc_bold=''; tc_standout='' + tc_red=''; tc_green='' + tc_blue=''; tc_cyan='' + else + # Otherwise trust the terminfo database after all. + test -n "`tput sgr0 2>/dev/null`" && { + tc_reset=`tput sgr0` + test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` + tc_standout=$tc_bold + test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` + test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` + test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` + test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` + test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` + } + fi + } + + require_term_colors=: +} + + +## ----------------- ## +## Function library. ## +## ----------------- ## + +# This section contains a variety of useful functions to call in your +# scripts. Take note of the portable wrappers for features provided by +# some modern shells, which will fall back to slower equivalents on +# less featureful shells. + + +# func_append VAR VALUE +# --------------------- +# Append VALUE onto the existing contents of VAR. + + # We should try to minimise forks, especially on Windows where they are + # unreasonably slow, so skip the feature probes when bash or zsh are + # being used: + if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then + : ${_G_HAVE_ARITH_OP="yes"} + : ${_G_HAVE_XSI_OPS="yes"} + # The += operator was introduced in bash 3.1 + case $BASH_VERSION in + [12].* | 3.0 | 3.0*) ;; + *) + : ${_G_HAVE_PLUSEQ_OP="yes"} + ;; + esac + fi + + # _G_HAVE_PLUSEQ_OP + # Can be empty, in which case the shell is probed, "yes" if += is + # useable or anything else if it does not work. + test -z "$_G_HAVE_PLUSEQ_OP" \ + && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ + && _G_HAVE_PLUSEQ_OP=yes + +if test yes = "$_G_HAVE_PLUSEQ_OP" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_append () + { + $debug_cmd + + eval "$1+=\$2" + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_append () + { + $debug_cmd + + eval "$1=\$$1\$2" + } +fi + + +# func_append_quoted VAR VALUE +# ---------------------------- +# Quote VALUE and append to the end of shell variable VAR, separated +# by a space. +if test yes = "$_G_HAVE_PLUSEQ_OP"; then + eval 'func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1+=\\ \$func_quote_for_eval_result" + }' +else + func_append_quoted () + { + $debug_cmd + + func_quote_for_eval "$2" + eval "$1=\$$1\\ \$func_quote_for_eval_result" + } +fi + + +# func_append_uniq VAR VALUE +# -------------------------- +# Append unique VALUE onto the existing contents of VAR, assuming +# entries are delimited by the first character of VALUE. For example: +# +# func_append_uniq options " --another-option option-argument" +# +# will only append to $options if " --another-option option-argument " +# is not already present somewhere in $options already (note spaces at +# each end implied by leading space in second argument). +func_append_uniq () +{ + $debug_cmd + + eval _G_current_value='`$ECHO $'$1'`' + _G_delim=`expr "$2" : '\(.\)'` + + case $_G_delim$_G_current_value$_G_delim in + *"$2$_G_delim"*) ;; + *) func_append "$@" ;; + esac +} + + +# func_arith TERM... +# ------------------ +# Set func_arith_result to the result of evaluating TERMs. + test -z "$_G_HAVE_ARITH_OP" \ + && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ + && _G_HAVE_ARITH_OP=yes + +if test yes = "$_G_HAVE_ARITH_OP"; then + eval 'func_arith () + { + $debug_cmd + + func_arith_result=$(( $* )) + }' +else + func_arith () + { + $debug_cmd + + func_arith_result=`expr "$@"` + } +fi + + +# func_basename FILE +# ------------------ +# Set func_basename_result to FILE with everything up to and including +# the last / stripped. +if test yes = "$_G_HAVE_XSI_OPS"; then + # If this shell supports suffix pattern removal, then use it to avoid + # forking. Hide the definitions single quotes in case the shell chokes + # on unsupported syntax... + _b='func_basename_result=${1##*/}' + _d='case $1 in + */*) func_dirname_result=${1%/*}$2 ;; + * ) func_dirname_result=$3 ;; + esac' + +else + # ...otherwise fall back to using sed. + _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' + _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` + if test "X$func_dirname_result" = "X$1"; then + func_dirname_result=$3 + else + func_append func_dirname_result "$2" + fi' +fi + +eval 'func_basename () +{ + $debug_cmd + + '"$_b"' +}' + + +# func_dirname FILE APPEND NONDIR_REPLACEMENT +# ------------------------------------------- +# Compute the dirname of FILE. If nonempty, add APPEND to the result, +# otherwise set result to NONDIR_REPLACEMENT. +eval 'func_dirname () +{ + $debug_cmd + + '"$_d"' +}' + + +# func_dirname_and_basename FILE APPEND NONDIR_REPLACEMENT +# -------------------------------------------------------- +# Perform func_basename and func_dirname in a single function +# call: +# dirname: Compute the dirname of FILE. If nonempty, +# add APPEND to the result, otherwise set result +# to NONDIR_REPLACEMENT. +# value returned in "$func_dirname_result" +# basename: Compute filename of FILE. +# value retuned in "$func_basename_result" +# For efficiency, we do not delegate to the functions above but instead +# duplicate the functionality here. +eval 'func_dirname_and_basename () +{ + $debug_cmd + + '"$_b"' + '"$_d"' +}' + + +# func_echo ARG... +# ---------------- +# Echo program name prefixed message. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_echo_all ARG... +# -------------------- +# Invoke $ECHO with all args, space-separated. +func_echo_all () +{ + $ECHO "$*" +} + + +# func_echo_infix_1 INFIX ARG... +# ------------------------------ +# Echo program name, followed by INFIX on the first line, with any +# additional lines not showing INFIX. +func_echo_infix_1 () +{ + $debug_cmd + + $require_term_colors + + _G_infix=$1; shift + _G_indent=$_G_infix + _G_prefix="$progname: $_G_infix: " + _G_message=$* + + # Strip color escape sequences before counting printable length + for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" + do + test -n "$_G_tc" && { + _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` + _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` + } + done + _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes + + func_echo_infix_1_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_infix_1_IFS + $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 + _G_prefix=$_G_indent + done + IFS=$func_echo_infix_1_IFS +} + + +# func_error ARG... +# ----------------- +# Echo program name prefixed message to standard error. +func_error () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 +} + + +# func_fatal_error ARG... +# ----------------------- +# Echo program name prefixed message to standard error, and exit. +func_fatal_error () +{ + $debug_cmd + + func_error "$*" + exit $EXIT_FAILURE +} + + +# func_grep EXPRESSION FILENAME +# ----------------------------- +# Check whether EXPRESSION matches any line of FILENAME, without output. +func_grep () +{ + $debug_cmd + + $GREP "$1" "$2" >/dev/null 2>&1 +} + + +# func_len STRING +# --------------- +# Set func_len_result to the length of STRING. STRING may not +# start with a hyphen. + test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_len () + { + $debug_cmd + + func_len_result=${#1} + }' +else + func_len () + { + $debug_cmd + + func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` + } +fi + + +# func_mkdir_p DIRECTORY-PATH +# --------------------------- +# Make sure the entire path to DIRECTORY-PATH is available. +func_mkdir_p () +{ + $debug_cmd + + _G_directory_path=$1 + _G_dir_list= + + if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then + + # Protect directory names starting with '-' + case $_G_directory_path in + -*) _G_directory_path=./$_G_directory_path ;; + esac + + # While some portion of DIR does not yet exist... + while test ! -d "$_G_directory_path"; do + # ...make a list in topmost first order. Use a colon delimited + # list incase some portion of path contains whitespace. + _G_dir_list=$_G_directory_path:$_G_dir_list + + # If the last portion added has no slash in it, the list is done + case $_G_directory_path in */*) ;; *) break ;; esac + + # ...otherwise throw away the child directory and loop + _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` + done + _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` + + func_mkdir_p_IFS=$IFS; IFS=: + for _G_dir in $_G_dir_list; do + IFS=$func_mkdir_p_IFS + # mkdir can fail with a 'File exist' error if two processes + # try to create one of the directories concurrently. Don't + # stop in that case! + $MKDIR "$_G_dir" 2>/dev/null || : + done + IFS=$func_mkdir_p_IFS + + # Bail out if we (or some other process) failed to create a directory. + test -d "$_G_directory_path" || \ + func_fatal_error "Failed to create '$1'" + fi +} + + +# func_mktempdir [BASENAME] +# ------------------------- +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, BASENAME is the basename for that directory. +func_mktempdir () +{ + $debug_cmd + + _G_template=${TMPDIR-/tmp}/${1-$progname} + + if test : = "$opt_dry_run"; then + # Return a directory name, but don't create it in dry-run mode + _G_tmpdir=$_G_template-$$ + else + + # If mktemp works, use that first and foremost + _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` + + if test ! -d "$_G_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + _G_tmpdir=$_G_template-${RANDOM-0}$$ + + func_mktempdir_umask=`umask` + umask 0077 + $MKDIR "$_G_tmpdir" + umask $func_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$_G_tmpdir" || \ + func_fatal_error "cannot create temporary directory '$_G_tmpdir'" + fi + + $ECHO "$_G_tmpdir" +} + + +# func_normal_abspath PATH +# ------------------------ +# Remove doubled-up and trailing slashes, "." path components, +# and cancel out any ".." path components in PATH after making +# it an absolute path. +func_normal_abspath () +{ + $debug_cmd + + # These SED scripts presuppose an absolute path with a trailing slash. + _G_pathcar='s|^/\([^/]*\).*$|\1|' + _G_pathcdr='s|^/[^/]*||' + _G_removedotparts=':dotsl + s|/\./|/|g + t dotsl + s|/\.$|/|' + _G_collapseslashes='s|/\{1,\}|/|g' + _G_finalslash='s|/*$|/|' + + # Start from root dir and reassemble the path. + func_normal_abspath_result= + func_normal_abspath_tpath=$1 + func_normal_abspath_altnamespace= + case $func_normal_abspath_tpath in + "") + # Empty path, that just means $cwd. + func_stripname '' '/' "`pwd`" + func_normal_abspath_result=$func_stripname_result + return + ;; + # The next three entries are used to spot a run of precisely + # two leading slashes without using negated character classes; + # we take advantage of case's first-match behaviour. + ///*) + # Unusual form of absolute path, do nothing. + ;; + //*) + # Not necessarily an ordinary path; POSIX reserves leading '//' + # and for example Cygwin uses it to access remote file shares + # over CIFS/SMB, so we conserve a leading double slash if found. + func_normal_abspath_altnamespace=/ + ;; + /*) + # Absolute path, do nothing. + ;; + *) + # Relative path, prepend $cwd. + func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath + ;; + esac + + # Cancel out all the simple stuff to save iterations. We also want + # the path to end with a slash for ease of parsing, so make sure + # there is one (and only one) here. + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_finalslash"` + while :; do + # Processed it all yet? + if test / = "$func_normal_abspath_tpath"; then + # If we ascended to the root using ".." the result may be empty now. + if test -z "$func_normal_abspath_result"; then + func_normal_abspath_result=/ + fi + break + fi + func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcar"` + func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ + -e "$_G_pathcdr"` + # Figure out what to do with it + case $func_normal_abspath_tcomponent in + "") + # Trailing empty path component, ignore it. + ;; + ..) + # Parent dir; strip last assembled component from result. + func_dirname "$func_normal_abspath_result" + func_normal_abspath_result=$func_dirname_result + ;; + *) + # Actual path component, append it. + func_append func_normal_abspath_result "/$func_normal_abspath_tcomponent" + ;; + esac + done + # Restore leading double-slash if one was found on entry. + func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result +} + + +# func_notquiet ARG... +# -------------------- +# Echo program name prefixed message only when not in quiet mode. +func_notquiet () +{ + $debug_cmd + + $opt_quiet || func_echo ${1+"$@"} + + # A bug in bash halts the script if the last line of a function + # fails when set -e is in force, so we need another command to + # work around that: + : +} + + +# func_relative_path SRCDIR DSTDIR +# -------------------------------- +# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. +func_relative_path () +{ + $debug_cmd + + func_relative_path_result= + func_normal_abspath "$1" + func_relative_path_tlibdir=$func_normal_abspath_result + func_normal_abspath "$2" + func_relative_path_tbindir=$func_normal_abspath_result + + # Ascend the tree starting from libdir + while :; do + # check if we have found a prefix of bindir + case $func_relative_path_tbindir in + $func_relative_path_tlibdir) + # found an exact match + func_relative_path_tcancelled= + break + ;; + $func_relative_path_tlibdir*) + # found a matching prefix + func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir" + func_relative_path_tcancelled=$func_stripname_result + if test -z "$func_relative_path_result"; then + func_relative_path_result=. + fi + break + ;; + *) + func_dirname $func_relative_path_tlibdir + func_relative_path_tlibdir=$func_dirname_result + if test -z "$func_relative_path_tlibdir"; then + # Have to descend all the way to the root! + func_relative_path_result=../$func_relative_path_result + func_relative_path_tcancelled=$func_relative_path_tbindir + break + fi + func_relative_path_result=../$func_relative_path_result + ;; + esac + done + + # Now calculate path; take care to avoid doubling-up slashes. + func_stripname '' '/' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + func_stripname '/' '/' "$func_relative_path_tcancelled" + if test -n "$func_stripname_result"; then + func_append func_relative_path_result "/$func_stripname_result" + fi + + # Normalisation. If bindir is libdir, return '.' else relative path. + if test -n "$func_relative_path_result"; then + func_stripname './' '' "$func_relative_path_result" + func_relative_path_result=$func_stripname_result + fi + + test -n "$func_relative_path_result" || func_relative_path_result=. + + : +} + + +# func_quote_for_eval ARG... +# -------------------------- +# Aesthetically quote ARGs to be evaled later. +# This function returns two values: +# i) func_quote_for_eval_result +# double-quoted, suitable for a subsequent eval +# ii) func_quote_for_eval_unquoted_result +# has all characters that are still active within double +# quotes backslashified. +func_quote_for_eval () +{ + $debug_cmd + + func_quote_for_eval_unquoted_result= + func_quote_for_eval_result= + while test 0 -lt $#; do + case $1 in + *[\\\`\"\$]*) + _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; + *) + _G_unquoted_arg=$1 ;; + esac + if test -n "$func_quote_for_eval_unquoted_result"; then + func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" + else + func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" + fi + + case $_G_unquoted_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting, command substitution and variable expansion + # for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_quoted_arg=\"$_G_unquoted_arg\" + ;; + *) + _G_quoted_arg=$_G_unquoted_arg + ;; + esac + + if test -n "$func_quote_for_eval_result"; then + func_append func_quote_for_eval_result " $_G_quoted_arg" + else + func_append func_quote_for_eval_result "$_G_quoted_arg" + fi + shift + done +} + + +# func_quote_for_expand ARG +# ------------------------- +# Aesthetically quote ARG to be evaled later; same as above, +# but do not quote variable references. +func_quote_for_expand () +{ + $debug_cmd + + case $1 in + *[\\\`\"]*) + _G_arg=`$ECHO "$1" | $SED \ + -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; + *) + _G_arg=$1 ;; + esac + + case $_G_arg in + # Double-quote args containing shell metacharacters to delay + # word splitting and command substitution for a subsequent eval. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + _G_arg=\"$_G_arg\" + ;; + esac + + func_quote_for_expand_result=$_G_arg +} + + +# func_stripname PREFIX SUFFIX NAME +# --------------------------------- +# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. +# PREFIX and SUFFIX must not contain globbing or regex special +# characters, hashes, percent signs, but SUFFIX may contain a leading +# dot (in which case that matches only a dot). +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_stripname () + { + $debug_cmd + + # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are + # positional parameters, so assign one to ordinary variable first. + func_stripname_result=$3 + func_stripname_result=${func_stripname_result#"$1"} + func_stripname_result=${func_stripname_result%"$2"} + }' +else + func_stripname () + { + $debug_cmd + + case $2 in + .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; + *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; + esac + } +fi + + +# func_show_eval CMD [FAIL_EXP] +# ----------------------------- +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. +func_show_eval () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + func_quote_for_expand "$_G_cmd" + eval "func_notquiet $func_quote_for_expand_result" + + $opt_dry_run || { + eval "$_G_cmd" + _G_status=$? + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_show_eval_locale CMD [FAIL_EXP] +# ------------------------------------ +# Unless opt_quiet is true, then output CMD. Then, if opt_dryrun is +# not true, evaluate CMD. If the evaluation of CMD fails, and FAIL_EXP +# is given, then evaluate it. Use the saved locale for evaluation. +func_show_eval_locale () +{ + $debug_cmd + + _G_cmd=$1 + _G_fail_exp=${2-':'} + + $opt_quiet || { + func_quote_for_expand "$_G_cmd" + eval "func_echo $func_quote_for_expand_result" + } + + $opt_dry_run || { + eval "$_G_user_locale + $_G_cmd" + _G_status=$? + eval "$_G_safe_locale" + if test 0 -ne "$_G_status"; then + eval "(exit $_G_status); $_G_fail_exp" + fi + } +} + + +# func_tr_sh +# ---------- +# Turn $1 into a string suitable for a shell variable name. +# Result is stored in $func_tr_sh_result. All characters +# not in the set a-zA-Z0-9_ are replaced with '_'. Further, +# if $1 begins with a digit, a '_' is prepended as well. +func_tr_sh () +{ + $debug_cmd + + case $1 in + [0-9]* | *[!a-zA-Z0-9_]*) + func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` + ;; + * ) + func_tr_sh_result=$1 + ;; + esac +} + + +# func_verbose ARG... +# ------------------- +# Echo program name prefixed message in verbose mode only. +func_verbose () +{ + $debug_cmd + + $opt_verbose && func_echo "$*" + + : +} + + +# func_warn_and_continue ARG... +# ----------------------------- +# Echo program name prefixed warning message to standard error. +func_warn_and_continue () +{ + $debug_cmd + + $require_term_colors + + func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 +} + + +# func_warning CATEGORY ARG... +# ---------------------------- +# Echo program name prefixed warning message to standard error. Warning +# messages can be filtered according to CATEGORY, where this function +# elides messages where CATEGORY is not listed in the global variable +# 'opt_warning_types'. +func_warning () +{ + $debug_cmd + + # CATEGORY must be in the warning_categories list! + case " $warning_categories " in + *" $1 "*) ;; + *) func_internal_error "invalid warning category '$1'" ;; + esac + + _G_category=$1 + shift + + case " $opt_warning_types " in + *" $_G_category "*) $warning_func ${1+"$@"} ;; + esac +} + + +# func_sort_ver VER1 VER2 +# ----------------------- +# 'sort -V' is not generally available. +# Note this deviates from the version comparison in automake +# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a +# but this should suffice as we won't be specifying old +# version formats or redundant trailing .0 in bootstrap.conf. +# If we did want full compatibility then we should probably +# use m4_version_compare from autoconf. +func_sort_ver () +{ + $debug_cmd + + printf '%s\n%s\n' "$1" "$2" \ + | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n +} + +# func_lt_ver PREV CURR +# --------------------- +# Return true if PREV and CURR are in the correct order according to +# func_sort_ver, otherwise false. Use it like this: +# +# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." +func_lt_ver () +{ + $debug_cmd + + test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: +#! /bin/sh + +# Set a version string for this script. +scriptversion=2014-01-07.03; # UTC + +# A portable, pluggable option parser for Bourne shell. +# Written by Gary V. Vaughan, 2010 + +# Copyright (C) 2010-2015 Free Software Foundation, Inc. +# This is free software; see the source for copying conditions. There is NO +# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Please report bugs or propose patches to gary@gnu.org. + + +## ------ ## +## Usage. ## +## ------ ## + +# This file is a library for parsing options in your shell scripts along +# with assorted other useful supporting features that you can make use +# of too. +# +# For the simplest scripts you might need only: +# +# #!/bin/sh +# . relative/path/to/funclib.sh +# . relative/path/to/options-parser +# scriptversion=1.0 +# func_options ${1+"$@"} +# eval set dummy "$func_options_result"; shift +# ...rest of your script... +# +# In order for the '--version' option to work, you will need to have a +# suitably formatted comment like the one at the top of this file +# starting with '# Written by ' and ending with '# warranty; '. +# +# For '-h' and '--help' to work, you will also need a one line +# description of your script's purpose in a comment directly above the +# '# Written by ' line, like the one at the top of this file. +# +# The default options also support '--debug', which will turn on shell +# execution tracing (see the comment above debug_cmd below for another +# use), and '--verbose' and the func_verbose function to allow your script +# to display verbose messages only when your user has specified +# '--verbose'. +# +# After sourcing this file, you can plug processing for additional +# options by amending the variables from the 'Configuration' section +# below, and following the instructions in the 'Option parsing' +# section further down. + +## -------------- ## +## Configuration. ## +## -------------- ## + +# You should override these variables in your script after sourcing this +# file so that they reflect the customisations you have added to the +# option parser. + +# The usage line for option parsing errors and the start of '-h' and +# '--help' output messages. You can embed shell variables for delayed +# expansion at the time the message is displayed, but you will need to +# quote other shell meta-characters carefully to prevent them being +# expanded when the contents are evaled. +usage='$progpath [OPTION]...' + +# Short help message in response to '-h' and '--help'. Add to this or +# override it after sourcing this library to reflect the full set of +# options your script accepts. +usage_message="\ + --debug enable verbose shell tracing + -W, --warnings=CATEGORY + report the warnings falling in CATEGORY [all] + -v, --verbose verbosely report processing + --version print version information and exit + -h, --help print short or long help message and exit +" + +# Additional text appended to 'usage_message' in response to '--help'. +long_help_message=" +Warning categories include: + 'all' show all warnings + 'none' turn off all the warnings + 'error' warnings are treated as fatal errors" + +# Help message printed before fatal option parsing errors. +fatal_help="Try '\$progname --help' for more information." + + + +## ------------------------- ## +## Hook function management. ## +## ------------------------- ## + +# This section contains functions for adding, removing, and running hooks +# to the main code. A hook is just a named list of of function, that can +# be run in order later on. + +# func_hookable FUNC_NAME +# ----------------------- +# Declare that FUNC_NAME will run hooks added with +# 'func_add_hook FUNC_NAME ...'. +func_hookable () +{ + $debug_cmd + + func_append hookable_fns " $1" +} + + +# func_add_hook FUNC_NAME HOOK_FUNC +# --------------------------------- +# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must +# first have been declared "hookable" by a call to 'func_hookable'. +func_add_hook () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not accept hook functions." ;; + esac + + eval func_append ${1}_hooks '" $2"' +} + + +# func_remove_hook FUNC_NAME HOOK_FUNC +# ------------------------------------ +# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. +func_remove_hook () +{ + $debug_cmd + + eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' +} + + +# func_run_hooks FUNC_NAME [ARG]... +# --------------------------------- +# Run all hook functions registered to FUNC_NAME. +# It is assumed that the list of hook functions contains nothing more +# than a whitespace-delimited list of legal shell function names, and +# no effort is wasted trying to catch shell meta-characters or preserve +# whitespace. +func_run_hooks () +{ + $debug_cmd + + case " $hookable_fns " in + *" $1 "*) ;; + *) func_fatal_error "'$1' does not support hook funcions.n" ;; + esac + + eval _G_hook_fns=\$$1_hooks; shift + + for _G_hook in $_G_hook_fns; do + eval $_G_hook '"$@"' + + # store returned options list back into positional + # parameters for next 'cmd' execution. + eval _G_hook_result=\$${_G_hook}_result + eval set dummy "$_G_hook_result"; shift + done + + func_quote_for_eval ${1+"$@"} + func_run_hooks_result=$func_quote_for_eval_result +} + + + +## --------------- ## +## Option parsing. ## +## --------------- ## + +# In order to add your own option parsing hooks, you must accept the +# full positional parameter list in your hook function, remove any +# options that you action, and then pass back the remaining unprocessed +# options in '_result', escaped suitably for +# 'eval'. Like this: +# +# my_options_prep () +# { +# $debug_cmd +# +# # Extend the existing usage message. +# usage_message=$usage_message' +# -s, --silent don'\''t print informational messages +# ' +# +# func_quote_for_eval ${1+"$@"} +# my_options_prep_result=$func_quote_for_eval_result +# } +# func_add_hook func_options_prep my_options_prep +# +# +# my_silent_option () +# { +# $debug_cmd +# +# # Note that for efficiency, we parse as many options as we can +# # recognise in a loop before passing the remainder back to the +# # caller on the first unrecognised argument we encounter. +# while test $# -gt 0; do +# opt=$1; shift +# case $opt in +# --silent|-s) opt_silent=: ;; +# # Separate non-argument short options: +# -s*) func_split_short_opt "$_G_opt" +# set dummy "$func_split_short_opt_name" \ +# "-$func_split_short_opt_arg" ${1+"$@"} +# shift +# ;; +# *) set dummy "$_G_opt" "$*"; shift; break ;; +# esac +# done +# +# func_quote_for_eval ${1+"$@"} +# my_silent_option_result=$func_quote_for_eval_result +# } +# func_add_hook func_parse_options my_silent_option +# +# +# my_option_validation () +# { +# $debug_cmd +# +# $opt_silent && $opt_verbose && func_fatal_help "\ +# '--silent' and '--verbose' options are mutually exclusive." +# +# func_quote_for_eval ${1+"$@"} +# my_option_validation_result=$func_quote_for_eval_result +# } +# func_add_hook func_validate_options my_option_validation +# +# You'll alse need to manually amend $usage_message to reflect the extra +# options you parse. It's preferable to append if you can, so that +# multiple option parsing hooks can be added safely. + + +# func_options [ARG]... +# --------------------- +# All the functions called inside func_options are hookable. See the +# individual implementations for details. +func_hookable func_options +func_options () +{ + $debug_cmd + + func_options_prep ${1+"$@"} + eval func_parse_options \ + ${func_options_prep_result+"$func_options_prep_result"} + eval func_validate_options \ + ${func_parse_options_result+"$func_parse_options_result"} + + eval func_run_hooks func_options \ + ${func_validate_options_result+"$func_validate_options_result"} + + # save modified positional parameters for caller + func_options_result=$func_run_hooks_result +} + + +# func_options_prep [ARG]... +# -------------------------- +# All initialisations required before starting the option parse loop. +# Note that when calling hook functions, we pass through the list of +# positional parameters. If a hook function modifies that list, and +# needs to propogate that back to rest of this script, then the complete +# modified list must be put in 'func_run_hooks_result' before +# returning. +func_hookable func_options_prep +func_options_prep () +{ + $debug_cmd + + # Option defaults: + opt_verbose=false + opt_warning_types= + + func_run_hooks func_options_prep ${1+"$@"} + + # save modified positional parameters for caller + func_options_prep_result=$func_run_hooks_result +} + + +# func_parse_options [ARG]... +# --------------------------- +# The main option parsing loop. +func_hookable func_parse_options +func_parse_options () +{ + $debug_cmd + + func_parse_options_result= + + # this just eases exit handling + while test $# -gt 0; do + # Defer to hook functions for initial option parsing, so they + # get priority in the event of reusing an option name. + func_run_hooks func_parse_options ${1+"$@"} + + # Adjust func_parse_options positional parameters to match + eval set dummy "$func_run_hooks_result"; shift + + # Break out of the loop if we already parsed every option. + test $# -gt 0 || break + + _G_opt=$1 + shift + case $_G_opt in + --debug|-x) debug_cmd='set -x' + func_echo "enabling shell trace mode" + $debug_cmd + ;; + + --no-warnings|--no-warning|--no-warn) + set dummy --warnings none ${1+"$@"} + shift + ;; + + --warnings|--warning|-W) + test $# = 0 && func_missing_arg $_G_opt && break + case " $warning_categories $1" in + *" $1 "*) + # trailing space prevents matching last $1 above + func_append_uniq opt_warning_types " $1" + ;; + *all) + opt_warning_types=$warning_categories + ;; + *none) + opt_warning_types=none + warning_func=: + ;; + *error) + opt_warning_types=$warning_categories + warning_func=func_fatal_error + ;; + *) + func_fatal_error \ + "unsupported warning category: '$1'" + ;; + esac + shift + ;; + + --verbose|-v) opt_verbose=: ;; + --version) func_version ;; + -\?|-h) func_usage ;; + --help) func_help ;; + + # Separate optargs to long options (plugins may need this): + --*=*) func_split_equals "$_G_opt" + set dummy "$func_split_equals_lhs" \ + "$func_split_equals_rhs" ${1+"$@"} + shift + ;; + + # Separate optargs to short options: + -W*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + # Separate non-argument short options: + -\?*|-h*|-v*|-x*) + func_split_short_opt "$_G_opt" + set dummy "$func_split_short_opt_name" \ + "-$func_split_short_opt_arg" ${1+"$@"} + shift + ;; + + --) break ;; + -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + func_parse_options_result=$func_quote_for_eval_result +} + + +# func_validate_options [ARG]... +# ------------------------------ +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +func_hookable func_validate_options +func_validate_options () +{ + $debug_cmd + + # Display all warnings if -W was not given. + test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" + + func_run_hooks func_validate_options ${1+"$@"} + + # Bail if the options were screwed! + $exit_cmd $EXIT_FAILURE + + # save modified positional parameters for caller + func_validate_options_result=$func_run_hooks_result +} + + + +## ----------------- ## +## Helper functions. ## +## ----------------- ## + +# This section contains the helper functions used by the rest of the +# hookable option parser framework in ascii-betical order. + + +# func_fatal_help ARG... +# ---------------------- +# Echo program name prefixed message to standard error, followed by +# a help hint, and exit. +func_fatal_help () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + eval \$ECHO \""$fatal_help"\" + func_error ${1+"$@"} + exit $EXIT_FAILURE +} + + +# func_help +# --------- +# Echo long help message to standard output and exit. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message" + exit 0 +} + + +# func_missing_arg ARGNAME +# ------------------------ +# Echo program name prefixed message to standard error and set global +# exit_cmd. +func_missing_arg () +{ + $debug_cmd + + func_error "Missing argument for '$1'." + exit_cmd=exit +} + + +# func_split_equals STRING +# ------------------------ +# Set func_split_equals_lhs and func_split_equals_rhs shell variables after +# splitting STRING at the '=' sign. +test -z "$_G_HAVE_XSI_OPS" \ + && (eval 'x=a/b/c; + test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ + && _G_HAVE_XSI_OPS=yes + +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=${1%%=*} + func_split_equals_rhs=${1#*=} + test "x$func_split_equals_lhs" = "x$1" \ + && func_split_equals_rhs= + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_equals () + { + $debug_cmd + + func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` + func_split_equals_rhs= + test "x$func_split_equals_lhs" = "x$1" \ + || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` + } +fi #func_split_equals + + +# func_split_short_opt SHORTOPT +# ----------------------------- +# Set func_split_short_opt_name and func_split_short_opt_arg shell +# variables after splitting SHORTOPT after the 2nd character. +if test yes = "$_G_HAVE_XSI_OPS" +then + # This is an XSI compatible shell, allowing a faster implementation... + eval 'func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_arg=${1#??} + func_split_short_opt_name=${1%"$func_split_short_opt_arg"} + }' +else + # ...otherwise fall back to using expr, which is often a shell builtin. + func_split_short_opt () + { + $debug_cmd + + func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` + func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` + } +fi #func_split_short_opt + + +# func_usage +# ---------- +# Echo short help message to standard output and exit. +func_usage () +{ + $debug_cmd + + func_usage_message + $ECHO "Run '$progname --help |${PAGER-more}' for full usage" + exit 0 +} + + +# func_usage_message +# ------------------ +# Echo short help message to standard output. +func_usage_message () +{ + $debug_cmd + + eval \$ECHO \""Usage: $usage"\" + echo + $SED -n 's|^# || + /^Written by/{ + x;p;x + } + h + /^Written by/q' < "$progpath" + echo + eval \$ECHO \""$usage_message"\" +} + + +# func_version +# ------------ +# Echo version message to standard output and exit. +func_version () +{ + $debug_cmd + + printf '%s\n' "$progname $scriptversion" + $SED -n ' + /(C)/!b go + :more + /\./!{ + N + s|\n# | | + b more + } + :go + /^# Written by /,/# warranty; / { + s|^# || + s|^# *$|| + s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| + p + } + /^# Written by / { + s|^# || + p + } + /^warranty; /q' < "$progpath" + + exit $? +} + + +# Local variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" +# time-stamp-time-zone: "UTC" +# End: + +# Set a version string. +scriptversion='(GNU libtool) 2.4.6' + + +# func_echo ARG... +# ---------------- +# Libtool also displays the current mode in messages, so override +# funclib.sh func_echo with this custom definition. +func_echo () +{ + $debug_cmd + + _G_message=$* + + func_echo_IFS=$IFS + IFS=$nl + for _G_line in $_G_message; do + IFS=$func_echo_IFS + $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" + done + IFS=$func_echo_IFS +} + + +# func_warning ARG... +# ------------------- +# Libtool warnings are not categorized, so override funclib.sh +# func_warning with this simpler definition. +func_warning () +{ + $debug_cmd + + $warning_func ${1+"$@"} +} + + +## ---------------- ## +## Options parsing. ## +## ---------------- ## + +# Hook in the functions to make sure our own options are parsed during +# the option parsing loop. + +usage='$progpath [OPTION]... [MODE-ARG]...' + +# Short help message in response to '-h'. +usage_message="Options: + --config show all configuration variables + --debug enable verbose shell tracing + -n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --mode=MODE use operation mode MODE + --no-warnings equivalent to '-Wnone' + --preserve-dup-deps don't remove duplicate dependency libraries + --quiet, --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + -v, --verbose print more informational messages than default + --version print version information + -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] + -h, --help, --help-all print short, long, or detailed help message +" + +# Additional text appended to 'usage_message' in response to '--help'. +func_help () +{ + $debug_cmd + + func_usage_message + $ECHO "$long_help_message + +MODE must be one of the following: + + clean remove files from the build directory + compile compile a source file into a libtool object + execute automatically set library path, then run a program + finish complete the installation of libtool libraries + install install libraries or executables + link create a library or an executable + uninstall remove libraries from an installed directory + +MODE-ARGS vary depending on the MODE. When passed as first option, +'--mode=MODE' may be abbreviated as 'MODE' or a unique abbreviation of that. +Try '$progname --help --mode=MODE' for a more detailed description of MODE. + +When reporting a bug, please describe a test case to reproduce it and +include the following information: + + host-triplet: $host + shell: $SHELL + compiler: $LTCC + compiler flags: $LTCFLAGS + linker: $LD (gnu? $with_gnu_ld) + version: $progname (GNU libtool) 2.4.6 + automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` + autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` + +Report bugs to . +GNU libtool home page: . +General help using GNU software: ." + exit 0 +} + + +# func_lo2o OBJECT-NAME +# --------------------- +# Transform OBJECT-NAME from a '.lo' suffix to the platform specific +# object suffix. + +lo2o=s/\\.lo\$/.$objext/ +o2lo=s/\\.$objext\$/.lo/ + +if test yes = "$_G_HAVE_XSI_OPS"; then + eval 'func_lo2o () + { + case $1 in + *.lo) func_lo2o_result=${1%.lo}.$objext ;; + * ) func_lo2o_result=$1 ;; + esac + }' + + # func_xform LIBOBJ-OR-SOURCE + # --------------------------- + # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) + # suffix to a '.lo' libtool-object suffix. + eval 'func_xform () + { + func_xform_result=${1%.*}.lo + }' +else + # ...otherwise fall back to using sed. + func_lo2o () + { + func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` + } + + func_xform () + { + func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` + } +fi + + +# func_fatal_configuration ARG... +# ------------------------------- +# Echo program name prefixed message to standard error, followed by +# a configuration failure hint, and exit. +func_fatal_configuration () +{ + func__fatal_error ${1+"$@"} \ + "See the $PACKAGE documentation for more information." \ + "Fatal configuration error." +} + + +# func_config +# ----------- +# Display the configuration for all the tags in this script. +func_config () +{ + re_begincf='^# ### BEGIN LIBTOOL' + re_endcf='^# ### END LIBTOOL' + + # Default configuration. + $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath" + + # Now print the configurations for the tags. + for tagname in $taglist; do + $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath" + done + + exit $? +} + + +# func_features +# ------------- +# Display the features supported by this script. +func_features () +{ + echo "host: $host" + if test yes = "$build_libtool_libs"; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test yes = "$build_old_libs"; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + + exit $? +} + + +# func_enable_tag TAGNAME +# ----------------------- +# Verify that TAGNAME is valid, and either flag an error and exit, or +# enable the TAGNAME tag. We also add TAGNAME to the global $taglist +# variable here. +func_enable_tag () +{ + # Global variable: + tagname=$1 + + re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$" + re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$" + sed_extractcf=/$re_begincf/,/$re_endcf/p + + # Validate tagname. + case $tagname in + *[!-_A-Za-z0-9,/]*) + func_fatal_error "invalid tag name: $tagname" + ;; + esac + + # Don't test for the "default" C tag, as we know it's + # there but not specially marked. + case $tagname in + CC) ;; + *) + if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then + taglist="$taglist $tagname" + + # Evaluate the configuration. Be careful to quote the path + # and the sed script, to avoid splitting on whitespace, but + # also don't use non-portable quotes within backquotes within + # quotes we have to do it in 2 steps: + extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"` + eval "$extractedcf" + else + func_error "ignoring unknown tag $tagname" + fi + ;; + esac +} + + +# func_check_version_match +# ------------------------ +# Ensure that we are using m4 macros, and libtool script from the same +# release of libtool. +func_check_version_match () +{ + if test "$package_revision" != "$macro_revision"; then + if test "$VERSION" != "$macro_version"; then + if test -z "$macro_version"; then + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from an older release. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, but the +$progname: definition of this LT_INIT comes from $PACKAGE $macro_version. +$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION +$progname: and run autoconf again. +_LT_EOF + fi + else + cat >&2 <<_LT_EOF +$progname: Version mismatch error. This is $PACKAGE $VERSION, revision $package_revision, +$progname: but the definition of this LT_INIT comes from revision $macro_revision. +$progname: You should recreate aclocal.m4 with macros from revision $package_revision +$progname: of $PACKAGE $VERSION and run autoconf again. +_LT_EOF + fi + + exit $EXIT_MISMATCH + fi +} + + +# libtool_options_prep [ARG]... +# ----------------------------- +# Preparation for options parsed by libtool. +libtool_options_prep () +{ + $debug_mode + + # Option defaults: + opt_config=false + opt_dlopen= + opt_dry_run=false + opt_help=false + opt_mode= + opt_preserve_dup_deps=false + opt_quiet=false + + nonopt= + preserve_args= + + # Shorthand for --mode=foo, only valid as the first argument + case $1 in + clean|clea|cle|cl) + shift; set dummy --mode clean ${1+"$@"}; shift + ;; + compile|compil|compi|comp|com|co|c) + shift; set dummy --mode compile ${1+"$@"}; shift + ;; + execute|execut|execu|exec|exe|ex|e) + shift; set dummy --mode execute ${1+"$@"}; shift + ;; + finish|finis|fini|fin|fi|f) + shift; set dummy --mode finish ${1+"$@"}; shift + ;; + install|instal|insta|inst|ins|in|i) + shift; set dummy --mode install ${1+"$@"}; shift + ;; + link|lin|li|l) + shift; set dummy --mode link ${1+"$@"}; shift + ;; + uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u) + shift; set dummy --mode uninstall ${1+"$@"}; shift + ;; + esac + + # Pass back the list of options. + func_quote_for_eval ${1+"$@"} + libtool_options_prep_result=$func_quote_for_eval_result +} +func_add_hook func_options_prep libtool_options_prep + + +# libtool_parse_options [ARG]... +# --------------------------------- +# Provide handling for libtool specific options. +libtool_parse_options () +{ + $debug_cmd + + # Perform our own loop to consume as many options as possible in + # each iteration. + while test $# -gt 0; do + _G_opt=$1 + shift + case $_G_opt in + --dry-run|--dryrun|-n) + opt_dry_run=: + ;; + + --config) func_config ;; + + --dlopen|-dlopen) + opt_dlopen="${opt_dlopen+$opt_dlopen +}$1" + shift + ;; + + --preserve-dup-deps) + opt_preserve_dup_deps=: ;; + + --features) func_features ;; + + --finish) set dummy --mode finish ${1+"$@"}; shift ;; + + --help) opt_help=: ;; + + --help-all) opt_help=': help-all' ;; + + --mode) test $# = 0 && func_missing_arg $_G_opt && break + opt_mode=$1 + case $1 in + # Valid mode arguments: + clean|compile|execute|finish|install|link|relink|uninstall) ;; + + # Catch anything else as an error + *) func_error "invalid argument for $_G_opt" + exit_cmd=exit + break + ;; + esac + shift + ;; + + --no-silent|--no-quiet) + opt_quiet=false + func_append preserve_args " $_G_opt" + ;; + + --no-warnings|--no-warning|--no-warn) + opt_warning=false + func_append preserve_args " $_G_opt" + ;; + + --no-verbose) + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --silent|--quiet) + opt_quiet=: + opt_verbose=false + func_append preserve_args " $_G_opt" + ;; + + --tag) test $# = 0 && func_missing_arg $_G_opt && break + opt_tag=$1 + func_append preserve_args " $_G_opt $1" + func_enable_tag "$1" + shift + ;; + + --verbose|-v) opt_quiet=false + opt_verbose=: + func_append preserve_args " $_G_opt" + ;; + + # An option not handled by this hook function: + *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; + esac + done + + + # save modified positional parameters for caller + func_quote_for_eval ${1+"$@"} + libtool_parse_options_result=$func_quote_for_eval_result +} +func_add_hook func_parse_options libtool_parse_options + + + +# libtool_validate_options [ARG]... +# --------------------------------- +# Perform any sanity checks on option settings and/or unconsumed +# arguments. +libtool_validate_options () +{ + # save first non-option argument + if test 0 -lt $#; then + nonopt=$1 + shift + fi + + # preserve --debug + test : = "$debug_cmd" || func_append preserve_args " --debug" + + case $host in + # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 + # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 + *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) + # don't eliminate duplications in $postdeps and $predeps + opt_duplicate_compiler_generated_deps=: + ;; + *) + opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps + ;; + esac + + $opt_help || { + # Sanity checks first: + func_check_version_match + + test yes != "$build_libtool_libs" \ + && test yes != "$build_old_libs" \ + && func_fatal_configuration "not configured to build any kind of library" + + # Darwin sucks + eval std_shrext=\"$shrext_cmds\" + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$opt_dlopen" && test execute != "$opt_mode"; then + func_error "unrecognized option '-dlopen'" + $ECHO "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help=$help + help="Try '$progname --help --mode=$opt_mode' for more information." + } + + # Pass back the unparsed argument list + func_quote_for_eval ${1+"$@"} + libtool_validate_options_result=$func_quote_for_eval_result +} +func_add_hook func_validate_options libtool_validate_options + + +# Process options as early as possible so that --help and --version +# can return quickly. +func_options ${1+"$@"} +eval set dummy "$func_options_result"; shift + + + +## ----------- ## +## Main. ## +## ----------- ## + +magic='%%%MAGIC variable%%%' +magic_exe='%%%MAGIC EXE variable%%%' + +# Global variables. +extracted_archives= +extracted_serial=0 + +# If this variable is set in any of the actions, the command in it +# will be execed at the end. This prevents here-documents from being +# left over by shells. +exec_cmd= + + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +$1 +_LTECHO_EOF' +} + +# func_generated_by_libtool +# True iff stdin has been generated by Libtool. This function is only +# a basic sanity check; it will hardly flush out determined imposters. +func_generated_by_libtool_p () +{ + $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 +} + +# func_lalib_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_lalib_p () +{ + test -f "$1" && + $SED -e 4q "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_lalib_unsafe_p file +# True iff FILE is a libtool '.la' library or '.lo' object file. +# This function implements the same check as func_lalib_p without +# resorting to external programs. To this end, it redirects stdin and +# closes it afterwards, without saving the original file descriptor. +# As a safety measure, use it only where a negative result would be +# fatal anyway. Works if 'file' does not exist. +func_lalib_unsafe_p () +{ + lalib_p=no + if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then + for lalib_p_l in 1 2 3 4 + do + read lalib_p_line + case $lalib_p_line in + \#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;; + esac + done + exec 0<&5 5<&- + fi + test yes = "$lalib_p" +} + +# func_ltwrapper_script_p file +# True iff FILE is a libtool wrapper script +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_script_p () +{ + test -f "$1" && + $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p +} + +# func_ltwrapper_executable_p file +# True iff FILE is a libtool wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_executable_p () +{ + func_ltwrapper_exec_suffix= + case $1 in + *.exe) ;; + *) func_ltwrapper_exec_suffix=.exe ;; + esac + $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1 +} + +# func_ltwrapper_scriptname file +# Assumes file is an ltwrapper_executable +# uses $file to determine the appropriate filename for a +# temporary ltwrapper_script. +func_ltwrapper_scriptname () +{ + func_dirname_and_basename "$1" "" "." + func_stripname '' '.exe' "$func_basename_result" + func_ltwrapper_scriptname_result=$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper +} + +# func_ltwrapper_p file +# True iff FILE is a libtool wrapper script or wrapper executable +# This function is only a basic sanity check; it will hardly flush out +# determined imposters. +func_ltwrapper_p () +{ + func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1" +} + + +# func_execute_cmds commands fail_cmd +# Execute tilde-delimited COMMANDS. +# If FAIL_CMD is given, eval that upon failure. +# FAIL_CMD may read-access the current command in variable CMD! +func_execute_cmds () +{ + $debug_cmd + + save_ifs=$IFS; IFS='~' + for cmd in $1; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + func_show_eval "$cmd" "${2-:}" + done + IFS=$save_ifs +} + + +# func_source file +# Source FILE, adding directory component if necessary. +# Note that it is not necessary on cygwin/mingw to append a dot to +# FILE even if both FILE and FILE.exe exist: automatic-append-.exe +# behavior happens only for exec(3), not for open(2)! Also, sourcing +# 'FILE.' does not work on cygwin managed mounts. +func_source () +{ + $debug_cmd + + case $1 in + */* | *\\*) . "$1" ;; + *) . "./$1" ;; + esac +} + + +# func_resolve_sysroot PATH +# Replace a leading = in PATH with a sysroot. Store the result into +# func_resolve_sysroot_result +func_resolve_sysroot () +{ + func_resolve_sysroot_result=$1 + case $func_resolve_sysroot_result in + =*) + func_stripname '=' '' "$func_resolve_sysroot_result" + func_resolve_sysroot_result=$lt_sysroot$func_stripname_result + ;; + esac +} + +# func_replace_sysroot PATH +# If PATH begins with the sysroot, replace it with = and +# store the result into func_replace_sysroot_result. +func_replace_sysroot () +{ + case $lt_sysroot:$1 in + ?*:"$lt_sysroot"*) + func_stripname "$lt_sysroot" '' "$1" + func_replace_sysroot_result='='$func_stripname_result + ;; + *) + # Including no sysroot. + func_replace_sysroot_result=$1 + ;; + esac +} + +# func_infer_tag arg +# Infer tagged configuration to use if any are available and +# if one wasn't chosen via the "--tag" command line option. +# Only attempt this if the compiler in the base compile +# command doesn't match the default compiler. +# arg is usually of the form 'gcc ...' +func_infer_tag () +{ + $debug_cmd + + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case $@ in + # Blanks in the command may have been stripped by the calling shell, + # but not from the CC environment variable when configure was run. + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;; + # Blanks at the start of $base_compile will cause this to fail + # if we don't check for them as well. + *) + for z in $available_tags; do + if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then + # Evaluate the configuration. + eval "`$SED -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`" + CC_quoted= + for arg in $CC; do + # Double-quote args containing other shell metacharacters. + func_append_quoted CC_quoted "$arg" + done + CC_expanded=`func_echo_all $CC` + CC_quoted_expanded=`func_echo_all $CC_quoted` + case "$@ " in + " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \ + " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) + # The compiler in the base compile command matches + # the one in the tagged configuration. + # Assume this is the tagged configuration we want. + tagname=$z + break + ;; + esac + fi + done + # If $tagname still isn't set, then no tagged configuration + # was found and let the user know that the "--tag" command + # line option must be used. + if test -z "$tagname"; then + func_echo "unable to infer tagged configuration" + func_fatal_error "specify a tag with '--tag'" +# else +# func_verbose "using $tagname tagged configuration" + fi + ;; + esac + fi +} + + + +# func_write_libtool_object output_name pic_name nonpic_name +# Create a libtool object file (analogous to a ".la" file), +# but don't create it if we're doing a dry run. +func_write_libtool_object () +{ + write_libobj=$1 + if test yes = "$build_libtool_libs"; then + write_lobj=\'$2\' + else + write_lobj=none + fi + + if test yes = "$build_old_libs"; then + write_oldobj=\'$3\' + else + write_oldobj=none + fi + + $opt_dry_run || { + cat >${write_libobj}T </dev/null` + if test "$?" -eq 0 && test -n "$func_convert_core_file_wine_to_w32_tmp"; then + func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" | + $SED -e "$sed_naive_backslashify"` + else + func_convert_core_file_wine_to_w32_result= + fi + fi +} +# end: func_convert_core_file_wine_to_w32 + + +# func_convert_core_path_wine_to_w32 ARG +# Helper function used by path conversion functions when $build is *nix, and +# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly +# configured wine environment available, with the winepath program in $build's +# $PATH. Assumes ARG has no leading or trailing path separator characters. +# +# ARG is path to be converted from $build format to win32. +# Result is available in $func_convert_core_path_wine_to_w32_result. +# Unconvertible file (directory) names in ARG are skipped; if no directory names +# are convertible, then the result may be empty. +func_convert_core_path_wine_to_w32 () +{ + $debug_cmd + + # unfortunately, winepath doesn't convert paths, only file names + func_convert_core_path_wine_to_w32_result= + if test -n "$1"; then + oldIFS=$IFS + IFS=: + for func_convert_core_path_wine_to_w32_f in $1; do + IFS=$oldIFS + func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f" + if test -n "$func_convert_core_file_wine_to_w32_result"; then + if test -z "$func_convert_core_path_wine_to_w32_result"; then + func_convert_core_path_wine_to_w32_result=$func_convert_core_file_wine_to_w32_result + else + func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result" + fi + fi + done + IFS=$oldIFS + fi +} +# end: func_convert_core_path_wine_to_w32 + + +# func_cygpath ARGS... +# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when +# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2) +# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or +# (2), returns the Cygwin file name or path in func_cygpath_result (input +# file name or path is assumed to be in w32 format, as previously converted +# from $build's *nix or MSYS format). In case (3), returns the w32 file name +# or path in func_cygpath_result (input file name or path is assumed to be in +# Cygwin format). Returns an empty string on error. +# +# ARGS are passed to cygpath, with the last one being the file name or path to +# be converted. +# +# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH +# environment variable; do not put it in $PATH. +func_cygpath () +{ + $debug_cmd + + if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then + func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null` + if test "$?" -ne 0; then + # on failure, ensure result is empty + func_cygpath_result= + fi + else + func_cygpath_result= + func_error "LT_CYGPATH is empty or specifies non-existent file: '$LT_CYGPATH'" + fi +} +#end: func_cygpath + + +# func_convert_core_msys_to_w32 ARG +# Convert file name or path ARG from MSYS format to w32 format. Return +# result in func_convert_core_msys_to_w32_result. +func_convert_core_msys_to_w32 () +{ + $debug_cmd + + # awkward: cmd appends spaces to result + func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | + $SED -e 's/[ ]*$//' -e "$sed_naive_backslashify"` +} +#end: func_convert_core_msys_to_w32 + + +# func_convert_file_check ARG1 ARG2 +# Verify that ARG1 (a file name in $build format) was converted to $host +# format in ARG2. Otherwise, emit an error message, but continue (resetting +# func_to_host_file_result to ARG1). +func_convert_file_check () +{ + $debug_cmd + + if test -z "$2" && test -n "$1"; then + func_error "Could not determine host file name corresponding to" + func_error " '$1'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback: + func_to_host_file_result=$1 + fi +} +# end func_convert_file_check + + +# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH +# Verify that FROM_PATH (a path in $build format) was converted to $host +# format in TO_PATH. Otherwise, emit an error message, but continue, resetting +# func_to_host_file_result to a simplistic fallback value (see below). +func_convert_path_check () +{ + $debug_cmd + + if test -z "$4" && test -n "$3"; then + func_error "Could not determine the host path corresponding to" + func_error " '$3'" + func_error "Continuing, but uninstalled executables may not work." + # Fallback. This is a deliberately simplistic "conversion" and + # should not be "improved". See libtool.info. + if test "x$1" != "x$2"; then + lt_replace_pathsep_chars="s|$1|$2|g" + func_to_host_path_result=`echo "$3" | + $SED -e "$lt_replace_pathsep_chars"` + else + func_to_host_path_result=$3 + fi + fi +} +# end func_convert_path_check + + +# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG +# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT +# and appending REPL if ORIG matches BACKPAT. +func_convert_path_front_back_pathsep () +{ + $debug_cmd + + case $4 in + $1 ) func_to_host_path_result=$3$func_to_host_path_result + ;; + esac + case $4 in + $2 ) func_append func_to_host_path_result "$3" + ;; + esac +} +# end func_convert_path_front_back_pathsep + + +################################################## +# $build to $host FILE NAME CONVERSION FUNCTIONS # +################################################## +# invoked via '$to_host_file_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# Result will be available in $func_to_host_file_result. + + +# func_to_host_file ARG +# Converts the file name ARG from $build format to $host format. Return result +# in func_to_host_file_result. +func_to_host_file () +{ + $debug_cmd + + $to_host_file_cmd "$1" +} +# end func_to_host_file + + +# func_to_tool_file ARG LAZY +# converts the file name ARG from $build format to toolchain format. Return +# result in func_to_tool_file_result. If the conversion in use is listed +# in (the comma separated) LAZY, no conversion takes place. +func_to_tool_file () +{ + $debug_cmd + + case ,$2, in + *,"$to_tool_file_cmd",*) + func_to_tool_file_result=$1 + ;; + *) + $to_tool_file_cmd "$1" + func_to_tool_file_result=$func_to_host_file_result + ;; + esac +} +# end func_to_tool_file + + +# func_convert_file_noop ARG +# Copy ARG to func_to_host_file_result. +func_convert_file_noop () +{ + func_to_host_file_result=$1 +} +# end func_convert_file_noop + + +# func_convert_file_msys_to_w32 ARG +# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_file_result. +func_convert_file_msys_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_to_host_file_result=$func_convert_core_msys_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_w32 + + +# func_convert_file_cygwin_to_w32 ARG +# Convert file name ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_file_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # because $build is cygwin, we call "the" cygpath in $PATH; no need to use + # LT_CYGPATH in this case. + func_to_host_file_result=`cygpath -m "$1"` + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_cygwin_to_w32 + + +# func_convert_file_nix_to_w32 ARG +# Convert file name ARG from *nix to w32 format. Requires a wine environment +# and a working winepath. Returns result in func_to_host_file_result. +func_convert_file_nix_to_w32 () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_file_wine_to_w32 "$1" + func_to_host_file_result=$func_convert_core_file_wine_to_w32_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_w32 + + +# func_convert_file_msys_to_cygwin ARG +# Convert file name ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_file_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + func_convert_core_msys_to_w32 "$1" + func_cygpath -u "$func_convert_core_msys_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_msys_to_cygwin + + +# func_convert_file_nix_to_cygwin ARG +# Convert file name ARG from *nix to Cygwin format. Requires Cygwin installed +# in a wine environment, working winepath, and LT_CYGPATH set. Returns result +# in func_to_host_file_result. +func_convert_file_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_file_result=$1 + if test -n "$1"; then + # convert from *nix to w32, then use cygpath to convert from w32 to cygwin. + func_convert_core_file_wine_to_w32 "$1" + func_cygpath -u "$func_convert_core_file_wine_to_w32_result" + func_to_host_file_result=$func_cygpath_result + fi + func_convert_file_check "$1" "$func_to_host_file_result" +} +# end func_convert_file_nix_to_cygwin + + +############################################# +# $build to $host PATH CONVERSION FUNCTIONS # +############################################# +# invoked via '$to_host_path_cmd ARG' +# +# In each case, ARG is the path to be converted from $build to $host format. +# The result will be available in $func_to_host_path_result. +# +# Path separators are also converted from $build format to $host format. If +# ARG begins or ends with a path separator character, it is preserved (but +# converted to $host format) on output. +# +# All path conversion functions are named using the following convention: +# file name conversion function : func_convert_file_X_to_Y () +# path conversion function : func_convert_path_X_to_Y () +# where, for any given $build/$host combination the 'X_to_Y' value is the +# same. If conversion functions are added for new $build/$host combinations, +# the two new functions must follow this pattern, or func_init_to_host_path_cmd +# will break. + + +# func_init_to_host_path_cmd +# Ensures that function "pointer" variable $to_host_path_cmd is set to the +# appropriate value, based on the value of $to_host_file_cmd. +to_host_path_cmd= +func_init_to_host_path_cmd () +{ + $debug_cmd + + if test -z "$to_host_path_cmd"; then + func_stripname 'func_convert_file_' '' "$to_host_file_cmd" + to_host_path_cmd=func_convert_path_$func_stripname_result + fi +} + + +# func_to_host_path ARG +# Converts the path ARG from $build format to $host format. Return result +# in func_to_host_path_result. +func_to_host_path () +{ + $debug_cmd + + func_init_to_host_path_cmd + $to_host_path_cmd "$1" +} +# end func_to_host_path + + +# func_convert_path_noop ARG +# Copy ARG to func_to_host_path_result. +func_convert_path_noop () +{ + func_to_host_path_result=$1 +} +# end func_convert_path_noop + + +# func_convert_path_msys_to_w32 ARG +# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic +# conversion to w32 is not available inside the cwrapper. Returns result in +# func_to_host_path_result. +func_convert_path_msys_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from ARG. MSYS + # behavior is inconsistent here; cygpath turns them into '.;' and ';.'; + # and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_msys_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_msys_to_w32 + + +# func_convert_path_cygwin_to_w32 ARG +# Convert path ARG from Cygwin to w32 format. Returns result in +# func_to_host_file_result. +func_convert_path_cygwin_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"` + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_cygwin_to_w32 + + +# func_convert_path_nix_to_w32 ARG +# Convert path ARG from *nix to w32 format. Requires a wine environment and +# a working winepath. Returns result in func_to_host_file_result. +func_convert_path_nix_to_w32 () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_to_host_path_result=$func_convert_core_path_wine_to_w32_result + func_convert_path_check : ";" \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" ";" "$1" + fi +} +# end func_convert_path_nix_to_w32 + + +# func_convert_path_msys_to_cygwin ARG +# Convert path ARG from MSYS to Cygwin format. Requires LT_CYGPATH set. +# Returns result in func_to_host_file_result. +func_convert_path_msys_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # See func_convert_path_msys_to_w32: + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_msys_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_msys_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_msys_to_cygwin + + +# func_convert_path_nix_to_cygwin ARG +# Convert path ARG from *nix to Cygwin format. Requires Cygwin installed in a +# a wine environment, working winepath, and LT_CYGPATH set. Returns result in +# func_to_host_file_result. +func_convert_path_nix_to_cygwin () +{ + $debug_cmd + + func_to_host_path_result=$1 + if test -n "$1"; then + # Remove leading and trailing path separator characters from + # ARG. msys behavior is inconsistent here, cygpath turns them + # into '.;' and ';.', and winepath ignores them completely. + func_stripname : : "$1" + func_to_host_path_tmp1=$func_stripname_result + func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1" + func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result" + func_to_host_path_result=$func_cygpath_result + func_convert_path_check : : \ + "$func_to_host_path_tmp1" "$func_to_host_path_result" + func_convert_path_front_back_pathsep ":*" "*:" : "$1" + fi +} +# end func_convert_path_nix_to_cygwin + + +# func_dll_def_p FILE +# True iff FILE is a Windows DLL '.def' file. +# Keep in sync with _LT_DLL_DEF_P in libtool.m4 +func_dll_def_p () +{ + $debug_cmd + + func_dll_def_p_tmp=`$SED -n \ + -e 's/^[ ]*//' \ + -e '/^\(;.*\)*$/d' \ + -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ + -e q \ + "$1"` + test DEF = "$func_dll_def_p_tmp" +} + + +# func_mode_compile arg... +func_mode_compile () +{ + $debug_cmd + + # Get the compilation command and the source file. + base_compile= + srcfile=$nonopt # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + pie_flag= + + for arg + do + case $arg_mode in + arg ) + # do not "continue". Instead, add this to base_compile + lastarg=$arg + arg_mode=normal + ;; + + target ) + libobj=$arg + arg_mode=normal + continue + ;; + + normal ) + # Accept any command-line options. + case $arg in + -o) + test -n "$libobj" && \ + func_fatal_error "you cannot specify '-o' more than once" + arg_mode=target + continue + ;; + + -pie | -fpie | -fPIE) + func_append pie_flag " $arg" + continue + ;; + + -shared | -static | -prefer-pic | -prefer-non-pic) + func_append later " $arg" + continue + ;; + + -no-suppress) + suppress_opt=no + continue + ;; + + -Xcompiler) + arg_mode=arg # the next one goes into the "base_compile" arg list + continue # The current "srcfile" will either be retained or + ;; # replaced later. I would guess that would be a bug. + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + lastarg= + save_ifs=$IFS; IFS=, + for arg in $args; do + IFS=$save_ifs + func_append_quoted lastarg "$arg" + done + IFS=$save_ifs + func_stripname ' ' '' "$lastarg" + lastarg=$func_stripname_result + + # Add the arguments to base_compile. + func_append base_compile " $lastarg" + continue + ;; + + *) + # Accept the current argument as the source file. + # The previous "srcfile" becomes the current argument. + # + lastarg=$srcfile + srcfile=$arg + ;; + esac # case $arg + ;; + esac # case $arg_mode + + # Aesthetically quote the previous argument. + func_append_quoted base_compile "$lastarg" + done # for arg + + case $arg_mode in + arg) + func_fatal_error "you must specify an argument for -Xcompile" + ;; + target) + func_fatal_error "you must specify a target with '-o'" + ;; + *) + # Get the name of the library object. + test -z "$libobj" && { + func_basename "$srcfile" + libobj=$func_basename_result + } + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + case $libobj in + *.[cCFSifmso] | \ + *.ada | *.adb | *.ads | *.asm | \ + *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \ + *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup) + func_xform "$libobj" + libobj=$func_xform_result + ;; + esac + + case $libobj in + *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;; + *) + func_fatal_error "cannot determine name of library object from '$libobj'" + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -shared) + test yes = "$build_libtool_libs" \ + || func_fatal_configuration "cannot build a shared library" + build_old_libs=no + continue + ;; + + -static) + build_libtool_libs=no + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + func_quote_for_eval "$libobj" + test "X$libobj" != "X$func_quote_for_eval_result" \ + && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && func_warning "libobj name '$libobj' may not contain shell special characters." + func_dirname_and_basename "$obj" "/" "" + objname=$func_basename_result + xdir=$func_dirname_result + lobj=$xdir$objdir/$objname + + test -z "$base_compile" && \ + func_fatal_help "you must specify a compilation command" + + # Delete any leftover library objects. + if test yes = "$build_old_libs"; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2* | cegcc*) + pic_mode=default + ;; + esac + if test no = "$pic_mode" && test pass_all != "$deplibs_check_method"; then + # non-PIC code in shared libraries is not supported + pic_mode=default + fi + + # Calculate the filename of the output object if compiler does + # not support -o with -c + if test no = "$compiler_c_o"; then + output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.$objext + lockfile=$output_obj.lock + else + output_obj= + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test yes = "$need_locks"; then + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + elif test warn = "$need_locks"; then + if test -f "$lockfile"; then + $ECHO "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + func_append removelist " $output_obj" + $ECHO "$srcfile" > "$lockfile" + fi + + $opt_dry_run || $RM $removelist + func_append removelist " $lockfile" + trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15 + + func_to_tool_file "$srcfile" func_convert_file_msys_to_w32 + srcfile=$func_to_tool_file_result + func_quote_for_eval "$srcfile" + qsrcfile=$func_quote_for_eval_result + + # Only build a PIC object if we are building libtool libraries. + if test yes = "$build_libtool_libs"; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test no != "$pic_mode"; then + command="$base_compile $qsrcfile $pic_flag" + else + # Don't build PIC code + command="$base_compile $qsrcfile" + fi + + func_mkdir_p "$xdir$objdir" + + if test -z "$output_obj"; then + # Place PIC objects in $objdir + func_append command " -o $lobj" + fi + + func_show_eval_locale "$command" \ + 'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed, then go on to compile the next one + if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then + func_show_eval '$MV "$output_obj" "$lobj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + + # Allow error messages only from the first compilation. + if test yes = "$suppress_opt"; then + suppress_output=' >/dev/null 2>&1' + fi + fi + + # Only build a position-dependent object if we build old libraries. + if test yes = "$build_old_libs"; then + if test yes != "$pic_mode"; then + # Don't build PIC code + command="$base_compile $qsrcfile$pie_flag" + else + command="$base_compile $qsrcfile $pic_flag" + fi + if test yes = "$compiler_c_o"; then + func_append command " -o $obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + func_append command "$suppress_output" + func_show_eval_locale "$command" \ + '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' + + if test warn = "$need_locks" && + test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then + $ECHO "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support '-c' and '-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $opt_dry_run || $RM $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + func_show_eval '$MV "$output_obj" "$obj"' \ + 'error=$?; $opt_dry_run || $RM $removelist; exit $error' + fi + fi + + $opt_dry_run || { + func_write_libtool_object "$libobj" "$objdir/$objname" "$objname" + + # Unlock the critical section if it was locked + if test no != "$need_locks"; then + removelist=$lockfile + $RM "$lockfile" + fi + } + + exit $EXIT_SUCCESS +} + +$opt_help || { + test compile = "$opt_mode" && func_mode_compile ${1+"$@"} +} + +func_mode_help () +{ + # We need to display help for each of the modes. + case $opt_mode in + "") + # Generic help is extracted from the usage comments + # at the start of this file. + func_help + ;; + + clean) + $ECHO \ +"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE... + +Remove files from the build directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, object or program, all the files associated +with it are deleted. Otherwise, only FILE itself is deleted using RM." + ;; + + compile) + $ECHO \ +"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -no-suppress do not suppress compiler output for multiple passes + -prefer-pic try to build PIC objects only + -prefer-non-pic try to build non-PIC objects only + -shared do not build a '.o' file suitable for static linking + -static only build a '.o' file suitable for static linking + -Wc,FLAG pass FLAG directly to the compiler + +COMPILE-COMMAND is a command to be used in creating a 'standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix '.c' with the +library object suffix, '.lo'." + ;; + + execute) + $ECHO \ +"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to '-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + + finish) + $ECHO \ +"Usage: $progname [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the '--dry-run' option if you just want to see what would be executed." + ;; + + install) + $ECHO \ +"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the 'install' or 'cp' program. + +The following components of INSTALL-COMMAND are treated specially: + + -inst-prefix-dir PREFIX-DIR Use PREFIX-DIR as a staging area for installation + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + + link) + $ECHO \ +"Usage: $progname [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -bindir BINDIR specify path to binaries directory (for systems where + libraries must be found in the PATH setting at runtime) + -dlopen FILE '-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-fast-install disable the fast-install mode + -no-install link a not-installable executable + -no-undefined declare that a library does not refer to external symbols + -o OUTPUT-FILE create OUTPUT-FILE from the specified objects + -objectlist FILE use a list of object files found in FILE to specify objects + -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) + -precious-files-regex REGEX + don't remove output files matching REGEX + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -shared only do dynamic linking of libtool libraries + -shrext SUFFIX override the standard shared library file extension + -static do not do any dynamic linking of uninstalled libtool libraries + -static-libtool-libs + do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + -weak LIBNAME declare that the target provides the LIBNAME interface + -Wc,FLAG + -Xcompiler FLAG pass linker-specific FLAG directly to the compiler + -Wl,FLAG + -Xlinker FLAG pass linker-specific FLAG directly to the linker + -XCClinker FLAG pass link-specific FLAG to the compiler driver (CC) + +All other options (arguments beginning with '-') are ignored. + +Every other argument is treated as a filename. Files ending in '.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in '.la', then a libtool library is created, +only library objects ('.lo' files) may be specified, and '-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in '.a' or '.lib', then a standard library is created +using 'ar' and 'ranlib', or on Windows using 'lib'. + +If OUTPUT-FILE ends in '.lo' or '.$objext', then a reloadable object file +is created, otherwise an executable program is created." + ;; + + uninstall) + $ECHO \ +"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically '/bin/rm'). RM-OPTIONS are options (such as '-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + + *) + func_fatal_help "invalid operation mode '$opt_mode'" + ;; + esac + + echo + $ECHO "Try '$progname --help' for more information about other modes." +} + +# Now that we've collected a possible --mode arg, show help if necessary +if $opt_help; then + if test : = "$opt_help"; then + func_mode_help + else + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + func_mode_help + done + } | $SED -n '1p; 2,$s/^Usage:/ or: /p' + { + func_help noexit + for opt_mode in compile link execute install finish uninstall clean; do + echo + func_mode_help + done + } | + $SED '1d + /^When reporting/,/^Report/{ + H + d + } + $x + /information about other modes/d + /more detailed .*MODE/d + s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/' + fi + exit $? +fi + + +# func_mode_execute arg... +func_mode_execute () +{ + $debug_cmd + + # The first argument is the command name. + cmd=$nonopt + test -z "$cmd" && \ + func_fatal_help "you must specify a COMMAND" + + # Handle -dlopen flags immediately. + for file in $opt_dlopen; do + test -f "$file" \ + || func_fatal_help "'$file' is not a file" + + dir= + case $file in + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$lib' is not a valid libtool archive" + + # Read the libtool library. + dlname= + library_names= + func_source "$file" + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && \ + func_warning "'$file' was not linked with '-export-dynamic'" + continue + fi + + func_dirname "$file" "" "." + dir=$func_dirname_result + + if test -f "$dir/$objdir/$dlname"; then + func_append dir "/$objdir" + else + if test ! -f "$dir/$dlname"; then + func_fatal_error "cannot find '$dlname' in '$dir' or '$dir/$objdir'" + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + func_dirname "$file" "" "." + dir=$func_dirname_result + ;; + + *) + func_warning "'-dlopen' is ignored for non-libtool libraries and objects" + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir=$absdir + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic=$magic + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -* | *.la | *.lo ) ;; + *) + # Do a test to see if this is really a libtool program. + if func_ltwrapper_script_p "$file"; then + func_source "$file" + # Transform arg to wrapped name. + file=$progdir/$program + elif func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + func_source "$func_ltwrapper_scriptname_result" + # Transform arg to wrapped name. + file=$progdir/$program + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + func_append_quoted args "$file" + done + + if $opt_dry_run; then + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\"" + echo "export $shlibpath_var" + fi + $ECHO "$cmd$args" + exit $EXIT_SUCCESS + else + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved environment variables + for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES + do + eval "if test \"\${save_$lt_var+set}\" = set; then + $lt_var=\$save_$lt_var; export $lt_var + else + $lt_unset $lt_var + fi" + done + + # Now prepare to actually exec the command. + exec_cmd=\$cmd$args + fi +} + +test execute = "$opt_mode" && func_mode_execute ${1+"$@"} + + +# func_mode_finish arg... +func_mode_finish () +{ + $debug_cmd + + libs= + libdirs= + admincmds= + + for opt in "$nonopt" ${1+"$@"} + do + if test -d "$opt"; then + func_append libdirs " $opt" + + elif test -f "$opt"; then + if func_lalib_unsafe_p "$opt"; then + func_append libs " $opt" + else + func_warning "'$opt' is not a valid libtool archive" + fi + + else + func_fatal_error "invalid argument '$opt'" + fi + done + + if test -n "$libs"; then + if test -n "$lt_sysroot"; then + sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"` + sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;" + else + sysroot_cmd= + fi + + # Remove sysroot references + if $opt_dry_run; then + for lib in $libs; do + echo "removing references to $lt_sysroot and '=' prefixes from $lib" + done + else + tmpdir=`func_mktempdir` + for lib in $libs; do + $SED -e "$sysroot_cmd s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \ + > $tmpdir/tmp-la + mv -f $tmpdir/tmp-la $lib + done + ${RM}r "$tmpdir" + fi + fi + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + func_execute_cmds "$finish_cmds" 'admincmds="$admincmds +'"$cmd"'"' + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $opt_dry_run || eval "$cmds" || func_append admincmds " + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + $opt_quiet && exit $EXIT_SUCCESS + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + $ECHO " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use the '-LLIBDIR'" + echo "flag during linking and do at least one of the following:" + if test -n "$shlibpath_var"; then + echo " - add LIBDIR to the '$shlibpath_var' environment variable" + echo " during execution" + fi + if test -n "$runpath_var"; then + echo " - add LIBDIR to the '$runpath_var' environment variable" + echo " during linking" + fi + if test -n "$hardcode_libdir_flag_spec"; then + libdir=LIBDIR + eval flag=\"$hardcode_libdir_flag_spec\" + + $ECHO " - use the '$flag' linker flag" + fi + if test -n "$admincmds"; then + $ECHO " - have your system administrator run these commands:$admincmds" + fi + if test -f /etc/ld.so.conf; then + echo " - have your system administrator add LIBDIR to '/etc/ld.so.conf'" + fi + echo + + echo "See any operating system documentation about shared libraries for" + case $host in + solaris2.[6789]|solaris2.1[0-9]) + echo "more information, such as the ld(1), crle(1) and ld.so(8) manual" + echo "pages." + ;; + *) + echo "more information, such as the ld(1) and ld.so(8) manual pages." + ;; + esac + echo "----------------------------------------------------------------------" + fi + exit $EXIT_SUCCESS +} + +test finish = "$opt_mode" && func_mode_finish ${1+"$@"} + + +# func_mode_install arg... +func_mode_install () +{ + $debug_cmd + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || + # Allow the use of GNU shtool's install command. + case $nonopt in *shtool*) :;; *) false;; esac + then + # Aesthetically quote it. + func_quote_for_eval "$nonopt" + install_prog="$func_quote_for_eval_result " + arg=$1 + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + func_quote_for_eval "$arg" + func_append install_prog "$func_quote_for_eval_result" + install_shared_prog=$install_prog + case " $install_prog " in + *[\\\ /]cp\ *) install_cp=: ;; + *) install_cp=false ;; + esac + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=false + stripme= + no_mode=: + for arg + do + arg2= + if test -n "$dest"; then + func_append files " $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=: ;; + -f) + if $install_cp; then :; else + prev=$arg + fi + ;; + -g | -m | -o) + prev=$arg + ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + if test X-m = "X$prev" && test -n "$install_override_mode"; then + arg2=$install_override_mode + no_mode=false + fi + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + func_quote_for_eval "$arg" + func_append install_prog " $func_quote_for_eval_result" + if test -n "$arg2"; then + func_quote_for_eval "$arg2" + fi + func_append install_shared_prog " $func_quote_for_eval_result" + done + + test -z "$install_prog" && \ + func_fatal_help "you must specify an install program" + + test -n "$prev" && \ + func_fatal_help "the '$prev' option requires an argument" + + if test -n "$install_override_mode" && $no_mode; then + if $install_cp; then :; else + func_quote_for_eval "$install_override_mode" + func_append install_shared_prog " -m $func_quote_for_eval_result" + fi + fi + + if test -z "$files"; then + if test -z "$dest"; then + func_fatal_help "no file or destination specified" + else + func_fatal_help "you must specify a destination" + fi + fi + + # Strip any trailing slash from the destination. + func_stripname '' '/' "$dest" + dest=$func_stripname_result + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=: + if $isdir; then + destdir=$dest + destname= + else + func_dirname_and_basename "$dest" "" "." + destdir=$func_dirname_result + destname=$func_basename_result + + # Not a directory, so check to see that there is only one file specified. + set dummy $files; shift + test "$#" -gt 1 && \ + func_fatal_help "'$dest' is not a directory" + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + func_fatal_help "'$destdir' must be an absolute directory name" + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + func_append staticlibs " $file" + ;; + + *.la) + func_resolve_sysroot "$file" + file=$func_resolve_sysroot_result + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$file" \ + || func_fatal_help "'$file' is not a valid libtool archive" + + library_names= + old_library= + relink_command= + func_source "$file" + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) func_append current_libdirs " $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) func_append future_libdirs " $libdir" ;; + esac + fi + + func_dirname "$file" "/" "" + dir=$func_dirname_result + func_append dir "$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"` + + # Don't allow the user to place us outside of our expected + # location b/c this prevents finding dependent libraries that + # are installed to the same prefix. + # At present, this check doesn't affect windows .dll's that + # are installed into $libdir/../bin (currently, that works fine) + # but it's something to keep an eye on. + test "$inst_prefix_dir" = "$destdir" && \ + func_fatal_error "error: cannot install '$file' to a directory not ending in $libdir" + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"` + else + relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"` + fi + + func_warning "relinking '$file'" + func_show_eval "$relink_command" \ + 'func_fatal_error "error: relink '\''$file'\'' with the above command before installing it"' + fi + + # See the names of the shared library. + set dummy $library_names; shift + if test -n "$1"; then + realname=$1 + shift + + srcname=$realname + test -n "$relink_command" && srcname=${realname}T + + # Install the shared library and build the symlinks. + func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \ + 'exit $?' + tstripme=$stripme + case $host_os in + cygwin* | mingw* | pw32* | cegcc*) + case $realname in + *.dll.a) + tstripme= + ;; + esac + ;; + os2*) + case $realname in + *_dll.a) + tstripme= + ;; + esac + ;; + esac + if test -n "$tstripme" && test -n "$striplib"; then + func_show_eval "$striplib $destdir/$realname" 'exit $?' + fi + + if test "$#" -gt 0; then + # Delete the old symlinks, and create new ones. + # Try 'ln -sf' first, because the 'ln' binary might depend on + # the symlink we replace! Solaris /bin/ln does not understand -f, + # so we also need to try rm && ln -s. + for linkname + do + test "$linkname" != "$realname" \ + && func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })" + done + fi + + # Do each command in the postinstall commands. + lib=$destdir/$realname + func_execute_cmds "$postinstall_cmds" 'exit $?' + fi + + # Install the pseudo-library for information purposes. + func_basename "$file" + name=$func_basename_result + instname=$dir/${name}i + func_show_eval "$install_prog $instname $destdir/$name" 'exit $?' + + # Maybe install the static library, too. + test -n "$old_library" && func_append staticlibs " $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + func_lo2o "$destfile" + staticdest=$func_lo2o_result + ;; + *.$objext) + staticdest=$destfile + destfile= + ;; + *) + func_fatal_help "cannot copy a libtool object to '$destfile'" + ;; + esac + + # Install the libtool object if requested. + test -n "$destfile" && \ + func_show_eval "$install_prog $file $destfile" 'exit $?' + + # Install the old object if enabled. + if test yes = "$build_old_libs"; then + # Deduce the name of the old-style object file. + func_lo2o "$file" + staticobj=$func_lo2o_result + func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?' + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile=$destdir/$destname + else + func_basename "$file" + destfile=$func_basename_result + destfile=$destdir/$destfile + fi + + # If the file is missing, and there is a .exe on the end, strip it + # because it is most likely a libtool script we actually want to + # install + stripped_ext= + case $file in + *.exe) + if test ! -f "$file"; then + func_stripname '' '.exe' "$file" + file=$func_stripname_result + stripped_ext=.exe + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin* | *mingw*) + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + wrapper=$func_ltwrapper_scriptname_result + else + func_stripname '' '.exe' "$file" + wrapper=$func_stripname_result + fi + ;; + *) + wrapper=$file + ;; + esac + if func_ltwrapper_script_p "$wrapper"; then + notinst_deplibs= + relink_command= + + func_source "$wrapper" + + # Check the variables that should have been set. + test -z "$generated_by_libtool_version" && \ + func_fatal_error "invalid libtool wrapper script '$wrapper'" + + finalize=: + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + func_source "$lib" + fi + libfile=$libdir/`$ECHO "$lib" | $SED 's%^.*/%%g'` + if test -n "$libdir" && test ! -f "$libfile"; then + func_warning "'$lib' has not been installed in '$libdir'" + finalize=false + fi + done + + relink_command= + func_source "$wrapper" + + outputname= + if test no = "$fast_install" && test -n "$relink_command"; then + $opt_dry_run || { + if $finalize; then + tmpdir=`func_mktempdir` + func_basename "$file$stripped_ext" + file=$func_basename_result + outputname=$tmpdir/$file + # Replace the output file specification. + relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'` + + $opt_quiet || { + func_quote_for_expand "$relink_command" + eval "func_echo $func_quote_for_expand_result" + } + if eval "$relink_command"; then : + else + func_error "error: relink '$file' with the above command before installing it" + $opt_dry_run || ${RM}r "$tmpdir" + continue + fi + file=$outputname + else + func_warning "cannot relink '$file'" + fi + } + else + # Install the binary that we compiled earlier. + file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyway + case $install_prog,$host in + */usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + func_stripname '' '.exe' "$destfile" + destfile=$func_stripname_result + ;; + esac + ;; + esac + func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?' + $opt_dry_run || if test -n "$outputname"; then + ${RM}r "$tmpdir" + fi + ;; + esac + done + + for file in $staticlibs; do + func_basename "$file" + name=$func_basename_result + + # Set up the ranlib parameters. + oldlib=$destdir/$name + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + + func_show_eval "$install_prog \$file \$oldlib" 'exit $?' + + if test -n "$stripme" && test -n "$old_striplib"; then + func_show_eval "$old_striplib $tool_oldlib" 'exit $?' + fi + + # Do each command in the postinstall commands. + func_execute_cmds "$old_postinstall_cmds" 'exit $?' + done + + test -n "$future_libdirs" && \ + func_warning "remember to run '$progname --finish$future_libdirs'" + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + $opt_dry_run && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL "$progpath" $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi +} + +test install = "$opt_mode" && func_mode_install ${1+"$@"} + + +# func_generate_dlsyms outputname originator pic_p +# Extract symbols from dlprefiles and create ${outputname}S.o with +# a dlpreopen symbol table. +func_generate_dlsyms () +{ + $debug_cmd + + my_outputname=$1 + my_originator=$2 + my_pic_p=${3-false} + my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` + my_dlsyms= + + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + my_dlsyms=${my_outputname}S.c + else + func_error "not configured to extract global symbols from dlpreopened files" + fi + fi + + if test -n "$my_dlsyms"; then + case $my_dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist=$output_objdir/$my_outputname.nm + + func_show_eval "$RM $nlist ${nlist}S ${nlist}T" + + # Parse the name list into a source file. + func_verbose "creating $output_objdir/$my_dlsyms" + + $opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\ +/* $my_dlsyms - symbol resolution table for '$my_outputname' dlsym emulation. */ +/* Generated by $PROGRAM (GNU $PACKAGE) $VERSION */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +#if defined __GNUC__ && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4)) +#pragma GCC diagnostic ignored \"-Wstrict-prototypes\" +#endif + +/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests. */ +#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE +/* DATA imports from DLLs on WIN32 can't be const, because runtime + relocations are performed -- see ld's documentation on pseudo-relocs. */ +# define LT_DLSYM_CONST +#elif defined __osf__ +/* This system does not cope well with relocations in const data. */ +# define LT_DLSYM_CONST +#else +# define LT_DLSYM_CONST const +#endif + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* External symbol declarations for the compiler. */\ +" + + if test yes = "$dlself"; then + func_verbose "generating symbol list for '$output'" + + $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP` + for progfile in $progfiles; do + func_to_tool_file "$progfile" func_convert_file_msys_to_w32 + func_verbose "extracting global C symbols from '$func_to_tool_file_result'" + $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $opt_dry_run || { + eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + if test -n "$export_symbols_regex"; then + $opt_dry_run || { + eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + } + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols=$output_objdir/$outputname.exp + $opt_dry_run || { + $RM $export_symbols + eval "$SED -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + } + else + $opt_dry_run || { + eval "$SED -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + eval '$MV "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* | *cegcc* ) + eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + } + fi + fi + + for dlprefile in $dlprefiles; do + func_verbose "extracting global C symbols from '$dlprefile'" + func_basename "$dlprefile" + name=$func_basename_result + case $host in + *cygwin* | *mingw* | *cegcc* ) + # if an import library, we need to obtain dlname + if func_win32_import_lib_p "$dlprefile"; then + func_tr_sh "$dlprefile" + eval "curr_lafile=\$libfile_$func_tr_sh_result" + dlprefile_dlbasename= + if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then + # Use subshell, to avoid clobbering current variable values + dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"` + if test -n "$dlprefile_dlname"; then + func_basename "$dlprefile_dlname" + dlprefile_dlbasename=$func_basename_result + else + # no lafile. user explicitly requested -dlpreopen . + $sharedlib_from_linklib_cmd "$dlprefile" + dlprefile_dlbasename=$sharedlib_from_linklib_result + fi + fi + $opt_dry_run || { + if test -n "$dlprefile_dlbasename"; then + eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"' + else + func_warning "Could not compute DLL name from $name" + eval '$ECHO ": $name " >> "$nlist"' + fi + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe | + $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'" + } + else # not an import lib + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + fi + ;; + *) + $opt_dry_run || { + eval '$ECHO ": $name " >> "$nlist"' + func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32 + eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'" + } + ;; + esac + done + + $opt_dry_run || { + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $MV "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if $GREP -v "^: " < "$nlist" | + if sort -k 3 /dev/null 2>&1; then + sort -k 3 + else + sort +2 + fi | + uniq > "$nlist"S; then + : + else + $GREP -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$my_dlsyms" + fi + + func_show_eval '$RM "${nlist}I"' + if test -n "$global_symbol_to_import"; then + eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' + fi + + echo >> "$output_objdir/$my_dlsyms" "\ + +/* The mapping between symbol names and symbols. */ +typedef struct { + const char *name; + void *address; +} lt_dlsymlist; +extern LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[];\ +" + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ +static void lt_syminit(void) +{ + LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; + for (; symbol->name; ++symbol) + {" + $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" + echo >> "$output_objdir/$my_dlsyms" "\ + } +}" + fi + echo >> "$output_objdir/$my_dlsyms" "\ +LT_DLSYM_CONST lt_dlsymlist +lt_${my_prefix}_LTX_preloaded_symbols[] = +{ {\"$my_originator\", (void *) 0}," + + if test -s "$nlist"I; then + echo >> "$output_objdir/$my_dlsyms" "\ + {\"@INIT@\", (void *) <_syminit}," + fi + + case $need_lib_prefix in + no) + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + *) + eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms" + ;; + esac + echo >> "$output_objdir/$my_dlsyms" "\ + {0, (void *) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_${my_prefix}_LTX_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + } # !$opt_dry_run + + pic_flag_for_symtable= + case "$compile_command " in + *" -static "*) ;; + *) + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;; + *-*-hpux*) + pic_flag_for_symtable=" $pic_flag" ;; + *) + $my_pic_p && pic_flag_for_symtable=" $pic_flag" + ;; + esac + ;; + esac + symtab_cflags= + for arg in $LTCFLAGS; do + case $arg in + -pie | -fpie | -fPIE) ;; + *) func_append symtab_cflags " $arg" ;; + esac + done + + # Now compile the dynamic symbol file. + func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?' + + # Clean up the generated files. + func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T" "${nlist}I"' + + # Transform the symbol file into the correct name. + symfileobj=$output_objdir/${my_outputname}S.$objext + case $host in + *cygwin* | *mingw* | *cegcc* ) + if test -f "$output_objdir/$my_outputname.def"; then + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"` + else + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + fi + ;; + *) + compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"` + ;; + esac + ;; + *) + func_fatal_error "unknown suffix for '$my_dlsyms'" + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"` + finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"` + fi +} + +# func_cygming_gnu_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is a GNU/binutils-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_gnu_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'` + test -n "$func_cygming_gnu_implib_tmp" +} + +# func_cygming_ms_implib_p ARG +# This predicate returns with zero status (TRUE) if +# ARG is an MS-style import library. Returns +# with nonzero status (FALSE) otherwise. +func_cygming_ms_implib_p () +{ + $debug_cmd + + func_to_tool_file "$1" func_convert_file_msys_to_w32 + func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'` + test -n "$func_cygming_ms_implib_tmp" +} + +# func_win32_libid arg +# return the library type of file 'arg' +# +# Need a lot of goo to handle *both* DLLs and import libs +# Has to be a shell function in order to 'eat' the argument +# that is supplied when $file_magic_command is called. +# Despite the name, also deal with 64 bit binaries. +func_win32_libid () +{ + $debug_cmd + + win32_libid_type=unknown + win32_fileres=`file -L $1 2>/dev/null` + case $win32_fileres in + *ar\ archive\ import\ library*) # definitely import + win32_libid_type="x86 archive import" + ;; + *ar\ archive*) # could be an import, or static + # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD. + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | + $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then + case $nm_interface in + "MS dumpbin") + if func_cygming_ms_implib_p "$1" || + func_cygming_gnu_implib_p "$1" + then + win32_nmres=import + else + win32_nmres= + fi + ;; + *) + func_to_tool_file "$1" func_convert_file_msys_to_w32 + win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" | + $SED -n -e ' + 1,100{ + / I /{ + s|.*|import| + p + q + } + }'` + ;; + esac + case $win32_nmres in + import*) win32_libid_type="x86 archive import";; + *) win32_libid_type="x86 archive static";; + esac + fi + ;; + *DLL*) + win32_libid_type="x86 DLL" + ;; + *executable*) # but shell scripts are "executable" too... + case $win32_fileres in + *MS\ Windows\ PE\ Intel*) + win32_libid_type="x86 DLL" + ;; + esac + ;; + esac + $ECHO "$win32_libid_type" +} + +# func_cygming_dll_for_implib ARG +# +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib () +{ + $debug_cmd + + sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"` +} + +# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs +# +# The is the core of a fallback implementation of a +# platform-specific function to extract the name of the +# DLL associated with the specified import library LIBNAME. +# +# SECTION_NAME is either .idata$6 or .idata$7, depending +# on the platform and compiler that created the implib. +# +# Echos the name of the DLL associated with the +# specified import library. +func_cygming_dll_for_implib_fallback_core () +{ + $debug_cmd + + match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"` + $OBJDUMP -s --section "$1" "$2" 2>/dev/null | + $SED '/^Contents of section '"$match_literal"':/{ + # Place marker at beginning of archive member dllname section + s/.*/====MARK====/ + p + d + } + # These lines can sometimes be longer than 43 characters, but + # are always uninteresting + /:[ ]*file format pe[i]\{,1\}-/d + /^In archive [^:]*:/d + # Ensure marker is printed + /^====MARK====/p + # Remove all lines with less than 43 characters + /^.\{43\}/!d + # From remaining lines, remove first 43 characters + s/^.\{43\}//' | + $SED -n ' + # Join marker and all lines until next marker into a single line + /^====MARK====/ b para + H + $ b para + b + :para + x + s/\n//g + # Remove the marker + s/^====MARK====// + # Remove trailing dots and whitespace + s/[\. \t]*$// + # Print + /./p' | + # we now have a list, one entry per line, of the stringified + # contents of the appropriate section of all members of the + # archive that possess that section. Heuristic: eliminate + # all those that have a first or second character that is + # a '.' (that is, objdump's representation of an unprintable + # character.) This should work for all archives with less than + # 0x302f exports -- but will fail for DLLs whose name actually + # begins with a literal '.' or a single character followed by + # a '.'. + # + # Of those that remain, print the first one. + $SED -e '/^\./d;/^.\./d;q' +} + +# func_cygming_dll_for_implib_fallback ARG +# Platform-specific function to extract the +# name of the DLL associated with the specified +# import library ARG. +# +# This fallback implementation is for use when $DLLTOOL +# does not support the --identify-strict option. +# Invoked by eval'ing the libtool variable +# $sharedlib_from_linklib_cmd +# Result is available in the variable +# $sharedlib_from_linklib_result +func_cygming_dll_for_implib_fallback () +{ + $debug_cmd + + if func_cygming_gnu_implib_p "$1"; then + # binutils import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"` + elif func_cygming_ms_implib_p "$1"; then + # ms-generated import library + sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"` + else + # unknown + sharedlib_from_linklib_result= + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + $debug_cmd + + f_ex_an_ar_dir=$1; shift + f_ex_an_ar_oldlib=$1 + if test yes = "$lock_old_archive_extraction"; then + lockfile=$f_ex_an_ar_oldlib.lock + until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do + func_echo "Waiting for $lockfile to be removed" + sleep 2 + done + fi + func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \ + 'stat=$?; rm -f "$lockfile"; exit $stat' + if test yes = "$lock_old_archive_extraction"; then + $opt_dry_run || rm -f "$lockfile" + fi + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" + fi +} + + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + $debug_cmd + + my_gentop=$1; shift + my_oldlibs=${1+"$@"} + my_oldobjs= + my_xlib= + my_xabs= + my_xdir= + + for my_xlib in $my_oldlibs; do + # Extract the objects. + case $my_xlib in + [\\/]* | [A-Za-z]:[\\/]*) my_xabs=$my_xlib ;; + *) my_xabs=`pwd`"/$my_xlib" ;; + esac + func_basename "$my_xlib" + my_xlib=$func_basename_result + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + func_arith $extracted_serial + 1 + extracted_serial=$func_arith_result + my_xlib_u=lt$extracted_serial-$my_xlib ;; + *) break ;; + esac + done + extracted_archives="$extracted_archives $my_xlib_u" + my_xdir=$my_gentop/$my_xlib_u + + func_mkdir_p "$my_xdir" + + case $host in + *-darwin*) + func_verbose "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + $opt_dry_run || { + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + func_basename "$darwin_archive" + darwin_base_archive=$func_basename_result + darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true` + if test -n "$darwin_arches"; then + darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + func_verbose "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches; do + func_mkdir_p "unfat-$$/$darwin_base_archive-$darwin_arch" + $LIPO -thin $darwin_arch -output "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" "$darwin_archive" + cd "unfat-$$/$darwin_base_archive-$darwin_arch" + func_extract_an_archive "`pwd`" "$darwin_base_archive" + cd "$darwin_curdir" + $RM "unfat-$$/$darwin_base_archive-$darwin_arch/$darwin_base_archive" + done # $darwin_arches + ## Okay now we've a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$sed_basename" | sort -u` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP` + $LIPO -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + $RM -rf unfat-$$ + cd "$darwin_orig_dir" + else + cd $darwin_orig_dir + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + } # !$opt_dry_run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP` + done + + func_extract_archives_result=$my_oldobjs +} + + +# func_emit_wrapper [arg=no] +# +# Emit a libtool wrapper script on stdout. +# Don't directly open a file because we may want to +# incorporate the script contents within a cygwin/mingw +# wrapper executable. Must ONLY be called from within +# func_mode_link because it depends on a number of variables +# set therein. +# +# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR +# variable will take. If 'yes', then the emitted script +# will assume that the directory where it is stored is +# the $objdir directory. This is a cygwin/mingw-specific +# behavior. +func_emit_wrapper () +{ + func_emit_wrapper_arg1=${1-no} + + $ECHO "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible +if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in *posix*) set -o posix;; esac +fi +BIN_SH=xpg4; export BIN_SH # for Tru64 +DUALCASE=1; export DUALCASE # for MKS sh + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variables: + generated_by_libtool_version='$macro_version' + notinst_deplibs='$notinst_deplibs' +else + # When we are sourced in execute mode, \$file and \$ECHO are already set. + if test \"\$libtool_execute_magic\" != \"$magic\"; then + file=\"\$0\"" + + qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"` + $ECHO "\ + +# A function that is used when there is no print builtin or printf. +func_fallback_echo () +{ + eval 'cat <<_LTECHO_EOF +\$1 +_LTECHO_EOF' +} + ECHO=\"$qECHO\" + fi + +# Very basic option parsing. These options are (a) specific to +# the libtool wrapper, (b) are identical between the wrapper +# /script/ and the wrapper /executable/ that is used only on +# windows platforms, and (c) all begin with the string "--lt-" +# (application programs are unlikely to have options that match +# this pattern). +# +# There are only two supported options: --lt-debug and +# --lt-dump-script. There is, deliberately, no --lt-help. +# +# The first argument to this parsing function should be the +# script's $0 value, followed by "$@". +lt_option_debug= +func_parse_lt_options () +{ + lt_script_arg0=\$0 + shift + for lt_opt + do + case \"\$lt_opt\" in + --lt-debug) lt_option_debug=1 ;; + --lt-dump-script) + lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\` + test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=. + lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\` + cat \"\$lt_dump_D/\$lt_dump_F\" + exit 0 + ;; + --lt-*) + \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2 + exit 1 + ;; + esac + done + + # Print the debug banner immediately: + if test -n \"\$lt_option_debug\"; then + echo \"$outputname:$output:\$LINENO: libtool wrapper (GNU $PACKAGE) $VERSION\" 1>&2 + fi +} + +# Used when --lt-debug. Prints its arguments to stdout +# (redirection is the responsibility of the caller) +func_lt_dump_args () +{ + lt_dump_args_N=1; + for lt_arg + do + \$ECHO \"$outputname:$output:\$LINENO: newargv[\$lt_dump_args_N]: \$lt_arg\" + lt_dump_args_N=\`expr \$lt_dump_args_N + 1\` + done +} + +# Core function for launching the target application +func_exec_program_core () +{ +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2* | *-cegcc*) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir\\\\\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $ECHO "\ + if test -n \"\$lt_option_debug\"; then + \$ECHO \"$outputname:$output:\$LINENO: newargv[0]: \$progdir/\$program\" 1>&2 + func_lt_dump_args \${1+\"\$@\"} 1>&2 + fi + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $ECHO "\ + \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2 + exit 1 +} + +# A function to encapsulate launching the target application +# Strips options in the --lt-* namespace from \$@ and +# launches target application with the remaining arguments. +func_exec_program () +{ + case \" \$* \" in + *\\ --lt-*) + for lt_wr_arg + do + case \$lt_wr_arg in + --lt-*) ;; + *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; + esac + shift + done ;; + esac + func_exec_program_core \${1+\"\$@\"} +} + + # Parse options + func_parse_lt_options \"\$0\" \${1+\"\$@\"} + + # Find the directory that this script lives in. + thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\` + done + + # Usually 'no', except on cygwin/mingw when embedded into + # the cwrapper. + WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1 + if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then + # special case for '.' + if test \"\$thisdir\" = \".\"; then + thisdir=\`pwd\` + fi + # remove .libs from thisdir + case \"\$thisdir\" in + *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;; + $objdir ) thisdir=. ;; + esac + fi + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test yes = "$fast_install"; then + $ECHO "\ + program=lt-'$outputname'$exeext + progdir=\"\$thisdir/$objdir\" + + if test ! -f \"\$progdir/\$program\" || + { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | $SED 1q\`; \\ + test \"X\$file\" != \"X\$progdir/\$program\"; }; then + + file=\"\$\$-\$program\" + + if test ! -d \"\$progdir\"; then + $MKDIR \"\$progdir\" + else + $RM \"\$progdir/\$file\" + fi" + + $ECHO "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if relink_command_output=\`eval \$relink_command 2>&1\`; then : + else + \$ECHO \"\$relink_command_output\" >&2 + $RM \"\$progdir/\$file\" + exit 1 + fi + fi + + $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $RM \"\$progdir/\$program\"; + $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $RM \"\$progdir/\$file\" + fi" + else + $ECHO "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $ECHO "\ + + if test -f \"\$progdir/\$program\"; then" + + # fixup the dll searchpath if we need to. + # + # Fix the DLL searchpath if we need to. Do this before prepending + # to shlibpath, because on Windows, both are PATH and uninstalled + # libraries must come first. + if test -n "$dllsearchpath"; then + $ECHO "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + # Export our shlibpath_var if we have one. + if test yes = "$shlibpath_overrides_runpath" && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $ECHO "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\` + + export $shlibpath_var +" + fi + + $ECHO "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. + func_exec_program \${1+\"\$@\"} + fi + else + # The program doesn't exist. + \$ECHO \"\$0: error: '\$progdir/\$program' does not exist\" 1>&2 + \$ECHO \"This script is just a wrapper for \$program.\" 1>&2 + \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" +} + + +# func_emit_cwrapperexe_src +# emit the source code for a wrapper executable on stdout +# Must ONLY be called from within func_mode_link because +# it depends on a number of variable set therein. +func_emit_cwrapperexe_src () +{ + cat < +#include +#ifdef _MSC_VER +# include +# include +# include +#else +# include +# include +# ifdef __CYGWIN__ +# include +# endif +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) + +/* declarations of non-ANSI functions */ +#if defined __MINGW32__ +# ifdef __STRICT_ANSI__ +int _putenv (const char *); +# endif +#elif defined __CYGWIN__ +# ifdef __STRICT_ANSI__ +char *realpath (const char *, char *); +int putenv (char *); +int setenv (const char *, const char *, int); +# endif +/* #elif defined other_platform || defined ... */ +#endif + +/* portability defines, excluding path handling macros */ +#if defined _MSC_VER +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +# define S_IXUSR _S_IEXEC +#elif defined __MINGW32__ +# define setmode _setmode +# define stat _stat +# define chmod _chmod +# define getcwd _getcwd +# define putenv _putenv +#elif defined __CYGWIN__ +# define HAVE_SETENV +# define FOPEN_WB "wb" +/* #elif defined other platforms ... */ +#endif + +#if defined PATH_MAX +# define LT_PATHMAX PATH_MAX +#elif defined MAXPATHLEN +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#ifndef S_IXOTH +# define S_IXOTH 0 +#endif +#ifndef S_IXGRP +# define S_IXGRP 0 +#endif + +/* path handling portability macros */ +#ifndef DIR_SEPARATOR +# define DIR_SEPARATOR '/' +# define PATH_SEPARATOR ':' +#endif + +#if defined _WIN32 || defined __MSDOS__ || defined __DJGPP__ || \ + defined __OS2__ +# define HAVE_DOS_BASED_FILE_SYSTEM +# define FOPEN_WB "wb" +# ifndef DIR_SEPARATOR_2 +# define DIR_SEPARATOR_2 '\\' +# endif +# ifndef PATH_SEPARATOR_2 +# define PATH_SEPARATOR_2 ';' +# endif +#endif + +#ifndef DIR_SEPARATOR_2 +# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) +#else /* DIR_SEPARATOR_2 */ +# define IS_DIR_SEPARATOR(ch) \ + (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) +#endif /* DIR_SEPARATOR_2 */ + +#ifndef PATH_SEPARATOR_2 +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR) +#else /* PATH_SEPARATOR_2 */ +# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2) +#endif /* PATH_SEPARATOR_2 */ + +#ifndef FOPEN_WB +# define FOPEN_WB "w" +#endif +#ifndef _O_BINARY +# define _O_BINARY 0 +#endif + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free (stale); stale = 0; } \ +} while (0) + +#if defined LT_DEBUGWRAPPER +static int lt_debug = 1; +#else +static int lt_debug = 0; +#endif + +const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */ + +void *xmalloc (size_t num); +char *xstrdup (const char *string); +const char *base_name (const char *name); +char *find_executable (const char *wrapper); +char *chase_symlinks (const char *pathspec); +int make_executable (const char *path); +int check_executable (const char *path); +char *strendzap (char *str, const char *pat); +void lt_debugprintf (const char *file, int line, const char *fmt, ...); +void lt_fatal (const char *file, int line, const char *message, ...); +static const char *nonnull (const char *s); +static const char *nonempty (const char *s); +void lt_setenv (const char *name, const char *value); +char *lt_extend_str (const char *orig_value, const char *add, int to_end); +void lt_update_exe_path (const char *name, const char *value); +void lt_update_lib_path (const char *name, const char *value); +char **prepare_spawn (char **argv); +void lt_dump_script (FILE *f); +EOF + + cat <= 0) + && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))) + return 1; + else + return 0; +} + +int +make_executable (const char *path) +{ + int rval = 0; + struct stat st; + + lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n", + nonempty (path)); + if ((!path) || (!*path)) + return 0; + + if (stat (path, &st) >= 0) + { + rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR); + } + return rval; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise + Does not chase symlinks, even on platforms that support them. +*/ +char * +find_executable (const char *wrapper) +{ + int has_slash = 0; + const char *p; + const char *p_next; + /* static buffer for getcwd */ + char tmp[LT_PATHMAX + 1]; + size_t tmp_len; + char *concat_name; + + lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n", + nonempty (wrapper)); + + if ((wrapper == NULL) || (*wrapper == '\0')) + return NULL; + + /* Absolute path? */ +#if defined HAVE_DOS_BASED_FILE_SYSTEM + if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':') + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + else + { +#endif + if (IS_DIR_SEPARATOR (wrapper[0])) + { + concat_name = xstrdup (wrapper); + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } +#if defined HAVE_DOS_BASED_FILE_SYSTEM + } +#endif + + for (p = wrapper; *p; p++) + if (*p == '/') + { + has_slash = 1; + break; + } + if (!has_slash) + { + /* no slashes; search PATH */ + const char *path = getenv ("PATH"); + if (path != NULL) + { + for (p = path; *p; p = p_next) + { + const char *q; + size_t p_len; + for (q = p; *q; q++) + if (IS_PATH_SEPARATOR (*q)) + break; + p_len = (size_t) (q - p); + p_next = (*q == '\0' ? q : q + 1); + if (p_len == 0) + { + /* empty path: current directory */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = + XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + } + else + { + concat_name = + XMALLOC (char, p_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, p, p_len); + concat_name[p_len] = '/'; + strcpy (concat_name + p_len + 1, wrapper); + } + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + } + } + /* not found in PATH; assume curdir */ + } + /* Relative path | not found in path: prepend cwd */ + if (getcwd (tmp, LT_PATHMAX) == NULL) + lt_fatal (__FILE__, __LINE__, "getcwd failed: %s", + nonnull (strerror (errno))); + tmp_len = strlen (tmp); + concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1); + memcpy (concat_name, tmp, tmp_len); + concat_name[tmp_len] = '/'; + strcpy (concat_name + tmp_len + 1, wrapper); + + if (check_executable (concat_name)) + return concat_name; + XFREE (concat_name); + return NULL; +} + +char * +chase_symlinks (const char *pathspec) +{ +#ifndef S_ISLNK + return xstrdup (pathspec); +#else + char buf[LT_PATHMAX]; + struct stat s; + char *tmp_pathspec = xstrdup (pathspec); + char *p; + int has_symlinks = 0; + while (strlen (tmp_pathspec) && !has_symlinks) + { + lt_debugprintf (__FILE__, __LINE__, + "checking path component for symlinks: %s\n", + tmp_pathspec); + if (lstat (tmp_pathspec, &s) == 0) + { + if (S_ISLNK (s.st_mode) != 0) + { + has_symlinks = 1; + break; + } + + /* search backwards for last DIR_SEPARATOR */ + p = tmp_pathspec + strlen (tmp_pathspec) - 1; + while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + p--; + if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p))) + { + /* no more DIR_SEPARATORS left */ + break; + } + *p = '\0'; + } + else + { + lt_fatal (__FILE__, __LINE__, + "error accessing file \"%s\": %s", + tmp_pathspec, nonnull (strerror (errno))); + } + } + XFREE (tmp_pathspec); + + if (!has_symlinks) + { + return xstrdup (pathspec); + } + + tmp_pathspec = realpath (pathspec, buf); + if (tmp_pathspec == 0) + { + lt_fatal (__FILE__, __LINE__, + "could not follow symlinks for %s", pathspec); + } + return xstrdup (tmp_pathspec); +#endif +} + +char * +strendzap (char *str, const char *pat) +{ + size_t len, patlen; + + assert (str != NULL); + assert (pat != NULL); + + len = strlen (str); + patlen = strlen (pat); + + if (patlen <= len) + { + str += len - patlen; + if (STREQ (str, pat)) + *str = '\0'; + } + return str; +} + +void +lt_debugprintf (const char *file, int line, const char *fmt, ...) +{ + va_list args; + if (lt_debug) + { + (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line); + va_start (args, fmt); + (void) vfprintf (stderr, fmt, args); + va_end (args); + } +} + +static void +lt_error_core (int exit_status, const char *file, + int line, const char *mode, + const char *message, va_list ap) +{ + fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *file, int line, const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap); + va_end (ap); +} + +static const char * +nonnull (const char *s) +{ + return s ? s : "(null)"; +} + +static const char * +nonempty (const char *s) +{ + return (s && !*s) ? "(empty)" : nonnull (s); +} + +void +lt_setenv (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_setenv) setting '%s' to '%s'\n", + nonnull (name), nonnull (value)); + { +#ifdef HAVE_SETENV + /* always make a copy, for consistency with !HAVE_SETENV */ + char *str = xstrdup (value); + setenv (name, str, 1); +#else + size_t len = strlen (name) + 1 + strlen (value) + 1; + char *str = XMALLOC (char, len); + sprintf (str, "%s=%s", name, value); + if (putenv (str) != EXIT_SUCCESS) + { + XFREE (str); + } +#endif + } +} + +char * +lt_extend_str (const char *orig_value, const char *add, int to_end) +{ + char *new_value; + if (orig_value && *orig_value) + { + size_t orig_value_len = strlen (orig_value); + size_t add_len = strlen (add); + new_value = XMALLOC (char, add_len + orig_value_len + 1); + if (to_end) + { + strcpy (new_value, orig_value); + strcpy (new_value + orig_value_len, add); + } + else + { + strcpy (new_value, add); + strcpy (new_value + add_len, orig_value); + } + } + else + { + new_value = xstrdup (add); + } + return new_value; +} + +void +lt_update_exe_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_exe_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + /* some systems can't cope with a ':'-terminated path #' */ + size_t len = strlen (new_value); + while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) + { + new_value[--len] = '\0'; + } + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +void +lt_update_lib_path (const char *name, const char *value) +{ + lt_debugprintf (__FILE__, __LINE__, + "(lt_update_lib_path) modifying '%s' by prepending '%s'\n", + nonnull (name), nonnull (value)); + + if (name && *name && value && *value) + { + char *new_value = lt_extend_str (getenv (name), value, 0); + lt_setenv (name, new_value); + XFREE (new_value); + } +} + +EOF + case $host_os in + mingw*) + cat <<"EOF" + +/* Prepares an argument vector before calling spawn(). + Note that spawn() does not by itself call the command interpreter + (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") : + ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&v); + v.dwPlatformId == VER_PLATFORM_WIN32_NT; + }) ? "cmd.exe" : "command.com"). + Instead it simply concatenates the arguments, separated by ' ', and calls + CreateProcess(). We must quote the arguments since Win32 CreateProcess() + interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a + special way: + - Space and tab are interpreted as delimiters. They are not treated as + delimiters if they are surrounded by double quotes: "...". + - Unescaped double quotes are removed from the input. Their only effect is + that within double quotes, space and tab are treated like normal + characters. + - Backslashes not followed by double quotes are not special. + - But 2*n+1 backslashes followed by a double quote become + n backslashes followed by a double quote (n >= 0): + \" -> " + \\\" -> \" + \\\\\" -> \\" + */ +#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" +char ** +prepare_spawn (char **argv) +{ + size_t argc; + char **new_argv; + size_t i; + + /* Count number of arguments. */ + for (argc = 0; argv[argc] != NULL; argc++) + ; + + /* Allocate new argument vector. */ + new_argv = XMALLOC (char *, argc + 1); + + /* Put quoted arguments into the new argument vector. */ + for (i = 0; i < argc; i++) + { + const char *string = argv[i]; + + if (string[0] == '\0') + new_argv[i] = xstrdup ("\"\""); + else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL) + { + int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL); + size_t length; + unsigned int backslashes; + const char *s; + char *quoted_string; + char *p; + + length = 0; + backslashes = 0; + if (quote_around) + length++; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + length += backslashes + 1; + length++; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + length += backslashes + 1; + + quoted_string = XMALLOC (char, length + 1); + + p = quoted_string; + backslashes = 0; + if (quote_around) + *p++ = '"'; + for (s = string; *s != '\0'; s++) + { + char c = *s; + if (c == '"') + { + unsigned int j; + for (j = backslashes + 1; j > 0; j--) + *p++ = '\\'; + } + *p++ = c; + if (c == '\\') + backslashes++; + else + backslashes = 0; + } + if (quote_around) + { + unsigned int j; + for (j = backslashes; j > 0; j--) + *p++ = '\\'; + *p++ = '"'; + } + *p = '\0'; + + new_argv[i] = quoted_string; + } + else + new_argv[i] = (char *) string; + } + new_argv[argc] = NULL; + + return new_argv; +} +EOF + ;; + esac + + cat <<"EOF" +void lt_dump_script (FILE* f) +{ +EOF + func_emit_wrapper yes | + $SED -n -e ' +s/^\(.\{79\}\)\(..*\)/\1\ +\2/ +h +s/\([\\"]\)/\\\1/g +s/$/\\n/ +s/\([^\n]*\).*/ fputs ("\1", f);/p +g +D' + cat <<"EOF" +} +EOF +} +# end: func_emit_cwrapperexe_src + +# func_win32_import_lib_p ARG +# True if ARG is an import lib, as indicated by $file_magic_cmd +func_win32_import_lib_p () +{ + $debug_cmd + + case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in + *import*) : ;; + *) false ;; + esac +} + +# func_suncc_cstd_abi +# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! +# Several compiler flags select an ABI that is incompatible with the +# Cstd library. Avoid specifying it if any are in CXXFLAGS. +func_suncc_cstd_abi () +{ + $debug_cmd + + case " $compile_command " in + *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) + suncc_use_cstd_abi=no + ;; + *) + suncc_use_cstd_abi=yes + ;; + esac +} + +# func_mode_link arg... +func_mode_link () +{ + $debug_cmd + + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # what system we are compiling for in order to pass an extra + # flag for every libtool invocation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll that has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args=$nonopt + base_compile="$nonopt $@" + compile_command=$nonopt + finalize_command=$nonopt + + compile_rpath= + finalize_rpath= + compile_shlibpath= + finalize_shlibpath= + convenience= + old_convenience= + deplibs= + old_deplibs= + compiler_flags= + linker_flags= + dllsearchpath= + lib_search_path=`pwd` + inst_prefix_dir= + new_inherited_linker_flags= + + avoid_version=no + bindir= + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + os2dllname= + non_pic_objects= + precious_files_regex= + prefer_static_libs=no + preload=false + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + vinfo_number=no + weak_libs= + single_module=$wl-single_module + func_infer_tag $base_compile + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -shared) + test yes != "$build_libtool_libs" \ + && func_fatal_configuration "cannot build a shared library" + build_old_libs=no + break + ;; + -all-static | -static | -static-libtool-libs) + case $arg in + -all-static) + if test yes = "$build_libtool_libs" && test -z "$link_static_flag"; then + func_warning "complete static linking is impossible in this configuration" + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + -static) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=built + ;; + -static-libtool-libs) + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + prefer_static_libs=yes + ;; + esac + build_libtool_libs=no + build_old_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test "$#" -gt 0; do + arg=$1 + shift + func_quote_for_eval "$arg" + qarg=$func_quote_for_eval_unquoted_result + func_append libtool_args " $func_quote_for_eval_result" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + func_append compile_command " @OUTPUT@" + func_append finalize_command " @OUTPUT@" + ;; + esac + + case $prev in + bindir) + bindir=$arg + prev= + continue + ;; + dlfiles|dlprefiles) + $preload || { + # Add the symbol object into the linking commands. + func_append compile_command " @SYMFILE@" + func_append finalize_command " @SYMFILE@" + preload=: + } + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test no = "$dlself"; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test dlprefiles = "$prev"; then + dlself=yes + elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test dlfiles = "$prev"; then + func_append dlfiles " $arg" + else + func_append dlprefiles " $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols=$arg + test -f "$arg" \ + || func_fatal_error "symbol file '$arg' does not exist" + prev= + continue + ;; + expsyms_regex) + export_symbols_regex=$arg + prev= + continue + ;; + framework) + case $host in + *-*-darwin*) + case "$deplibs " in + *" $qarg.ltframework "*) ;; + *) func_append deplibs " $qarg.ltframework" # this is fixed later + ;; + esac + ;; + esac + prev= + continue + ;; + inst_prefix) + inst_prefix_dir=$arg + prev= + continue + ;; + mllvm) + # Clang does not use LLVM to link, so we can simply discard any + # '-mllvm $arg' options when doing the link step. + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat "$save_arg"` + do +# func_append moreargs " $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + if test none != "$pic_object"; then + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + fi + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + done + else + func_fatal_error "link input file '$arg' does not exist" + fi + arg=$save_arg + prev= + continue + ;; + os2dllname) + os2dllname=$arg + prev= + continue + ;; + precious_regex) + precious_files_regex=$arg + prev= + continue + ;; + release) + release=-$arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + if test rpath = "$prev"; then + case "$rpath " in + *" $arg "*) ;; + *) func_append rpath " $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) func_append xrpath " $arg" ;; + esac + fi + prev= + continue + ;; + shrext) + shrext_cmds=$arg + prev= + continue + ;; + weak) + func_append weak_libs " $arg" + prev= + continue + ;; + xcclinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xcompiler) + func_append compiler_flags " $qarg" + prev= + func_append compile_command " $qarg" + func_append finalize_command " $qarg" + continue + ;; + xlinker) + func_append linker_flags " $qarg" + func_append compiler_flags " $wl$qarg" + prev= + func_append compile_command " $wl$qarg" + func_append finalize_command " $wl$qarg" + continue + ;; + *) + eval "$prev=\"\$arg\"" + prev= + continue + ;; + esac + fi # test -n "$prev" + + prevarg=$arg + + case $arg in + -all-static) + if test -n "$link_static_flag"; then + # See comment for -static flag below, for more details. + func_append compile_command " $link_static_flag" + func_append finalize_command " $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + func_fatal_error "'-allow-undefined' must not be used because it is the default" + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -bindir) + prev=bindir + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + func_fatal_error "more than one -exported-symbols argument is not allowed" + fi + if test X-export-symbols = "X$arg"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework) + prev=framework + continue + ;; + + -inst-prefix-dir) + prev=inst_prefix + continue + ;; + + # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:* + # so, if we see these flags be careful not to treat them like -L + -L[A-Z][A-Z]*:*) + case $with_gcc/$host in + no/*-*-irix* | /*-*-irix*) + func_append compile_command " $arg" + func_append finalize_command " $arg" + ;; + esac + continue + ;; + + -L*) + func_stripname "-L" '' "$arg" + if test -z "$func_stripname_result"; then + if test "$#" -gt 0; then + func_fatal_error "require no space between '-L' and '$1'" + else + func_fatal_error "need path for '-L' option" + fi + fi + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + test -z "$absdir" && \ + func_fatal_error "cannot determine absolute directory name of '$dir'" + dir=$absdir + ;; + esac + case "$deplibs " in + *" -L$dir "* | *" $arg "*) + # Will only happen for absolute or sysroot arguments + ;; + *) + # Preserve sysroot, but never include relative directories + case $dir in + [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;; + *) func_append deplibs " -L$dir" ;; + esac + func_append lib_search_path " $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + ::) dllsearchpath=$dir;; + *) func_append dllsearchpath ":$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test X-lc = "X$arg" || test X-lm = "X$arg"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-os2*) + # These systems don't actually have a C library (as such) + test X-lc = "X$arg" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc due to us having libc/libc_r. + test X-lc = "X$arg" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + func_append deplibs " System.ltframework" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test X-lc = "X$arg" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test X-lc = "X$arg" && continue + ;; + esac + elif test X-lc_r = "X$arg"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + func_append deplibs " $arg" + continue + ;; + + -mllvm) + prev=mllvm + continue + ;; + + -module) + module=yes + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + # Darwin uses the -arch flag to determine output architecture. + -model|-arch|-isysroot|--sysroot) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + func_append compiler_flags " $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case "$new_inherited_linker_flags " in + *" $arg "*) ;; + * ) func_append new_inherited_linker_flags " $arg" ;; + esac + continue + ;; + + -multi_module) + single_module=$wl-multi_module + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + func_warning "'-no-install' is ignored for $host" + func_warning "assuming '-no-fast-install' instead" + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -os2dllname) + prev=os2dllname + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + func_stripname '-R' '' "$arg" + dir=$func_stripname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + =*) + func_stripname '=' '' "$dir" + dir=$lt_sysroot$func_stripname_result + ;; + *) + func_fatal_error "only absolute run-paths are allowed" + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + continue + ;; + + -shared) + # The effects of -shared are defined in a previous loop. + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -static | -static-libtool-libs) + # The effects of -static are defined in a previous loop. + # We used to do the same as -all-static on platforms that + # didn't have a PIC flag, but the assumption that the effects + # would be equivalent was wrong. It would break on at least + # Digital Unix and AIX. + continue + ;; + + -thread-safe) + thread_safe=yes + continue + ;; + + -version-info) + prev=vinfo + continue + ;; + + -version-number) + prev=vinfo + vinfo_number=yes + continue + ;; + + -weak) + prev=weak + continue + ;; + + -Wc,*) + func_stripname '-Wc,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $func_quote_for_eval_result" + func_append compiler_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Wl,*) + func_stripname '-Wl,' '' "$arg" + args=$func_stripname_result + arg= + save_ifs=$IFS; IFS=, + for flag in $args; do + IFS=$save_ifs + func_quote_for_eval "$flag" + func_append arg " $wl$func_quote_for_eval_result" + func_append compiler_flags " $wl$func_quote_for_eval_result" + func_append linker_flags " $func_quote_for_eval_result" + done + IFS=$save_ifs + func_stripname ' ' '' "$arg" + arg=$func_stripname_result + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # -msg_* for osf cc + -msg_*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + # Flags to be passed through unchanged, with rationale: + # -64, -mips[0-9] enable 64-bit mode for the SGI compiler + # -r[0-9][0-9]* specify processor for the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler + # +DA*, +DD* enable 64-bit mode for the HP compiler + # -q* compiler args for the IBM compiler + # -m*, -t[45]*, -txscale* architecture-specific flags for GCC + # -F/path path to uninstalled frameworks, gcc on darwin + # -p, -pg, --coverage, -fprofile-* profiling flags for GCC + # -fstack-protector* stack protector flags for GCC + # @file GCC response files + # -tp=* Portland pgcc target processor selection + # --sysroot=* for sysroot support + # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization + # -stdlib=* select c++ std lib with clang + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \ + -O*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + func_append compile_command " $arg" + func_append finalize_command " $arg" + func_append compiler_flags " $arg" + continue + ;; + + -Z*) + if test os2 = "`expr $host : '.*\(os2\)'`"; then + # OS/2 uses -Zxxx to specify OS/2-specific options + compiler_flags="$compiler_flags $arg" + func_append compile_command " $arg" + func_append finalize_command " $arg" + case $arg in + -Zlinker | -Zstack) + prev=xcompiler + ;; + esac + continue + else + # Otherwise treat like 'Some other compiler flag' below + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + fi + ;; + + # Some other compiler flag. + -* | +*) + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + + *.$objext) + # A standard object. + func_append objs " $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if func_lalib_unsafe_p "$arg"; then + pic_object= + non_pic_object= + + # Read the .lo file + func_source "$arg" + + if test -z "$pic_object" || + test -z "$non_pic_object" || + test none = "$pic_object" && + test none = "$non_pic_object"; then + func_fatal_error "cannot find name of object for '$arg'" + fi + + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + test none = "$pic_object" || { + # Prepend the subdirectory the object is found in. + pic_object=$xdir$pic_object + + if test dlfiles = "$prev"; then + if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; then + func_append dlfiles " $pic_object" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + # CHECK ME: I think I busted this. -Ossama + if test dlprefiles = "$prev"; then + # Preload the old-style object. + func_append dlprefiles " $pic_object" + prev= + fi + + # A PIC object. + func_append libobjs " $pic_object" + arg=$pic_object + } + + # Non-PIC object. + if test none != "$non_pic_object"; then + # Prepend the subdirectory the object is found in. + non_pic_object=$xdir$non_pic_object + + # A standard non-PIC object + func_append non_pic_objects " $non_pic_object" + if test -z "$pic_object" || test none = "$pic_object"; then + arg=$non_pic_object + fi + else + # If the PIC object exists, use it instead. + # $xdir was prepended to $pic_object above. + non_pic_object=$pic_object + func_append non_pic_objects " $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if $opt_dry_run; then + # Extract subdirectory from the argument. + func_dirname "$arg" "/" "" + xdir=$func_dirname_result + + func_lo2o "$arg" + pic_object=$xdir$objdir/$func_lo2o_result + non_pic_object=$xdir$func_lo2o_result + func_append libobjs " $pic_object" + func_append non_pic_objects " $non_pic_object" + else + func_fatal_error "'$arg' is not a valid libtool object" + fi + fi + ;; + + *.$libext) + # An archive. + func_append deplibs " $arg" + func_append old_deplibs " $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + func_resolve_sysroot "$arg" + if test dlfiles = "$prev"; then + # This library was specified with -dlopen. + func_append dlfiles " $func_resolve_sysroot_result" + prev= + elif test dlprefiles = "$prev"; then + # The library was specified with -dlpreopen. + func_append dlprefiles " $func_resolve_sysroot_result" + prev= + else + func_append deplibs " $func_resolve_sysroot_result" + fi + continue + ;; + + # Some other compiler argument. + *) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + func_quote_for_eval "$arg" + arg=$func_quote_for_eval_result + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + done # argument parsing loop + + test -n "$prev" && \ + func_fatal_help "the '$prevarg' option requires an argument" + + if test yes = "$export_dynamic" && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + func_append compile_command " $arg" + func_append finalize_command " $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + func_basename "$output" + outputname=$func_basename_result + libobjs_save=$libobjs + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$ECHO \"\$$shlibpath_var\" \| \$SED \'s/:/ /g\'\` + else + shlib_search_path= + fi + eval sys_lib_search_path=\"$sys_lib_search_path_spec\" + eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\" + + # Definition is injected by LT_CONFIG during libtool generation. + func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" + + func_dirname "$output" "/" "" + output_objdir=$func_dirname_result$objdir + func_to_tool_file "$output_objdir/" + tool_output_objdir=$func_to_tool_file_result + # Create the object directory. + func_mkdir_p "$output_objdir" + + # Determine the type of output + case $output in + "") + func_fatal_help "you must specify an output file" + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + specialdeplibs= + + libs= + # Find all interdependent deplibs by searching for libraries + # that are linked more than once (e.g. -la -lb -la) + for deplib in $deplibs; do + if $opt_preserve_dup_deps; then + case "$libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append libs " $deplib" + done + + if test lib = "$linkmode"; then + libs="$predeps $libs $compiler_lib_search_path $postdeps" + + # Compute libraries that are listed more than once in $predeps + # $postdeps and mark them as special (i.e., whose duplicates are + # not to be eliminated). + pre_post_deps= + if $opt_duplicate_compiler_generated_deps; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;; + esac + func_append pre_post_deps " $pre_post_dep" + done + fi + pre_post_deps= + fi + + deplibs= + newdependency_libs= + newlib_search_path= + need_relink=no # whether we're linking any uninstalled libtool libraries + notinst_deplibs= # not-installed libtool libraries + notinst_path= # paths that contain not-installed libtool libraries + + case $linkmode in + lib) + passes="conv dlpreopen link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + func_fatal_help "libraries can '-dlopen' only libtool libraries: $file" + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=false + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + + for pass in $passes; do + # The preopen pass in lib mode reverses $deplibs; put it back here + # so that -L comes before libs that need it for instance... + if test lib,link = "$linkmode,$pass"; then + ## FIXME: Find the place where the list is rebuilt in the wrong + ## order, and fix it there properly + tmp_deplibs= + for deplib in $deplibs; do + tmp_deplibs="$deplib $tmp_deplibs" + done + deplibs=$tmp_deplibs + fi + + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass"; then + libs=$deplibs + deplibs= + fi + if test prog = "$linkmode"; then + case $pass in + dlopen) libs=$dlfiles ;; + dlpreopen) libs=$dlprefiles ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test lib,dlpreopen = "$linkmode,$pass"; then + # Collect and forward deplibs of preopened libtool libs + for lib in $dlprefiles; do + # Ignore non-libtool-libs + dependency_libs= + func_resolve_sysroot "$lib" + case $lib in + *.la) func_source "$func_resolve_sysroot_result" ;; + esac + + # Collect preopened libtool deplibs, except any this library + # has declared as weak libs + for deplib in $dependency_libs; do + func_basename "$deplib" + deplib_base=$func_basename_result + case " $weak_libs " in + *" $deplib_base "*) ;; + *) func_append deplibs " $deplib" ;; + esac + done + done + libs=$dlprefiles + fi + if test dlopen = "$pass"; then + # Collect dlpreopened libraries + save_deplibs=$deplibs + deplibs= + fi + + for deplib in $libs; do + lib= + found=false + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ + |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append compiler_flags " $deplib" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -l*) + if test lib != "$linkmode" && test prog != "$linkmode"; then + func_warning "'-l' is ignored for archives/objects" + continue + fi + func_stripname '-l' '' "$deplib" + name=$func_stripname_result + if test lib = "$linkmode"; then + searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path" + else + searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path" + fi + for searchdir in $searchdirs; do + for search_ext in .la $std_shrext .so .a; do + # Search the libtool library + lib=$searchdir/lib$name$search_ext + if test -f "$lib"; then + if test .la = "$search_ext"; then + found=: + else + found=false + fi + break 2 + fi + done + done + if $found; then + # deplib is a libtool library + # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib, + # We need to do some special things here, and not later. + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $deplib "*) + if func_lalib_p "$lib"; then + library_names= + old_library= + func_source "$lib" + for l in $old_library $library_names; do + ll=$l + done + if test "X$ll" = "X$old_library"; then # only static version available + found=false + func_dirname "$lib" "" "." + ladir=$func_dirname_result + lib=$ladir/$old_library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + else + # deplib doesn't seem to be a libtool library + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + *.ltframework) + if test prog,link = "$linkmode,$pass"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + if test lib = "$linkmode"; then + case "$new_inherited_linker_flags " in + *" $deplib "*) ;; + * ) func_append new_inherited_linker_flags " $deplib" ;; + esac + fi + fi + continue + ;; + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test conv = "$pass" && continue + newdependency_libs="$deplib $newdependency_libs" + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + prog) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + if test scan = "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + *) + func_warning "'-L' is ignored for archives/objects" + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test link = "$pass"; then + func_stripname '-R' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + dir=$func_resolve_sysroot_result + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) func_append xrpath " $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) + func_resolve_sysroot "$deplib" + lib=$func_resolve_sysroot_result + ;; + *.$libext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + # Linking convenience modules into shared libraries is allowed, + # but linking other static libraries is non-portable. + case " $dlpreconveniencelibs " in + *" $deplib "*) ;; + *) + valid_a_lib=false + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=: + fi + ;; + pass_all) + valid_a_lib=: + ;; + esac + if $valid_a_lib; then + echo + $ECHO "*** Warning: Linking the shared library $output against the" + $ECHO "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + else + echo + $ECHO "*** Warning: Trying to link with static lib archive $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because the file extensions .$libext of this argument makes me believe" + echo "*** that it is just a static archive that I should not use here." + fi + ;; + esac + continue + ;; + prog) + if test link != "$pass"; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test conv = "$pass"; then + deplibs="$deplib $deplibs" + elif test prog = "$linkmode"; then + if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + func_append newdlprefiles " $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + func_append newdlfiles " $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=: + continue + ;; + esac # case $deplib + + $found || test -f "$lib" \ + || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" + + # Check to see that this really is a libtool archive. + func_lalib_unsafe_p "$lib" \ + || func_fatal_error "'$lib' is not a valid libtool archive" + + func_dirname "$lib" "" "." + ladir=$func_dirname_result + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + inherited_linker_flags= + # If the library was installed with an old release of libtool, + # it will not redefine variables installed, or shouldnotlink + installed=yes + shouldnotlink=no + avoidtemprpath= + + + # Read the .la file + func_source "$lib" + + # Convert "-framework foo" to "foo.ltframework" + if test -n "$inherited_linker_flags"; then + tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'` + for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do + case " $new_inherited_linker_flags " in + *" $tmp_inherited_linker_flag "*) ;; + *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";; + esac + done + fi + dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + if test lib,link = "$linkmode,$pass" || + test prog,scan = "$linkmode,$pass" || + { test prog != "$linkmode" && test lib != "$linkmode"; }; then + test -n "$dlopen" && func_append dlfiles " $dlopen" + test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" + fi + + if test conv = "$pass"; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + # It is a libtool convenience library, so add in its objects. + func_append convenience " $ladir/$objdir/$old_library" + func_append old_convenience " $ladir/$objdir/$old_library" + elif test prog != "$linkmode" && test lib != "$linkmode"; then + func_fatal_error "'$lib' is not a convenience library" + fi + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + if test -n "$old_library" && + { test yes = "$prefer_static_libs" || + test built,no = "$prefer_static_libs,$installed"; }; then + linklib=$old_library + else + for l in $old_library $library_names; do + linklib=$l + done + fi + if test -z "$linklib"; then + func_fatal_error "cannot find name of link library for '$lib'" + fi + + # This library was specified with -dlopen. + if test dlopen = "$pass"; then + test -z "$libdir" \ + && func_fatal_error "cannot -dlopen a convenience library: '$lib'" + if test -z "$dlname" || + test yes != "$dlopen_support" || + test no = "$build_libtool_libs" + then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. We also need to preload any + # dependent libraries so libltdl's deplib preloader doesn't + # bomb out in the load deplibs phase. + func_append dlprefiles " $lib $dependency_libs" + else + func_append newdlfiles " $lib" + fi + continue + fi # $pass = dlopen + + # We need an absolute path. + case $ladir in + [\\/]* | [A-Za-z]:[\\/]*) abs_ladir=$ladir ;; + *) + abs_ladir=`cd "$ladir" && pwd` + if test -z "$abs_ladir"; then + func_warning "cannot determine absolute directory name of '$ladir'" + func_warning "passing it literally to the linker, although it might fail" + abs_ladir=$ladir + fi + ;; + esac + func_basename "$lib" + laname=$func_basename_result + + # Find the relevant object directory and library name. + if test yes = "$installed"; then + if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + func_warning "library '$lib' was moved." + dir=$ladir + absdir=$abs_ladir + libdir=$abs_ladir + else + dir=$lt_sysroot$libdir + absdir=$lt_sysroot$libdir + fi + test yes = "$hardcode_automatic" && avoidtemprpath=yes + else + if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then + dir=$ladir + absdir=$abs_ladir + # Remove this search path later + func_append notinst_path " $abs_ladir" + else + dir=$ladir/$objdir + absdir=$abs_ladir/$objdir + # Remove this search path later + func_append notinst_path " $abs_ladir" + fi + fi # $installed = yes + func_stripname 'lib' '.la' "$laname" + name=$func_stripname_result + + # This library was specified with -dlpreopen. + if test dlpreopen = "$pass"; then + if test -z "$libdir" && test prog = "$linkmode"; then + func_fatal_error "only libraries may -dlpreopen a convenience library: '$lib'" + fi + case $host in + # special handling for platforms with PE-DLLs. + *cygwin* | *mingw* | *cegcc* ) + # Linker will automatically link against shared library if both + # static and shared are present. Therefore, ensure we extract + # symbols from the import library if a shared library is present + # (otherwise, the dlopen module name will be incorrect). We do + # this by putting the import library name into $newdlprefiles. + # We recover the dlopen module name by 'saving' the la file + # name in a special purpose variable, and (later) extracting the + # dlname from the la file. + if test -n "$dlname"; then + func_tr_sh "$dir/$linklib" + eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname" + func_append newdlprefiles " $dir/$linklib" + else + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + fi + ;; + * ) + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + func_append newdlprefiles " $dir/$old_library" + # Keep a list of preopened convenience libraries to check + # that they are being used correctly in the link pass. + test -z "$libdir" && \ + func_append dlpreconveniencelibs " $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + func_append newdlprefiles " $dir/$dlname" + else + func_append newdlprefiles " $dir/$linklib" + fi + ;; + esac + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test lib = "$linkmode"; then + deplibs="$dir/$old_library $deplibs" + elif test prog,link = "$linkmode,$pass"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" # used for prog,scan pass + fi + continue + fi + + + if test prog = "$linkmode" && test link != "$pass"; then + func_append newlib_search_path " $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=false + if test no != "$link_all_deplibs" || test -z "$library_names" || + test no = "$build_libtool_libs"; then + linkalldeplibs=: + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result" + func_append newlib_search_path " $func_resolve_sysroot_result" + ;; + esac + # Need to link against all dependency_libs? + if $linkalldeplibs; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $deplib "*) func_append specialdeplibs " $deplib" ;; + esac + fi + func_append tmp_libs " $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test prog,link = "$linkmode,$pass"; then + if test -n "$library_names" && + { { test no = "$prefer_static_libs" || + test built,yes = "$prefer_static_libs,$installed"; } || + test -z "$old_library"; }; then + # We need to hardcode the library path + if test -n "$shlibpath_var" && test -z "$avoidtemprpath"; then + # Make sure the rpath contains only unique directories. + case $temp_rpath: in + *"$absdir:"*) ;; + *) func_append temp_rpath "$absdir:" ;; + esac + fi + + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if $alldeplibs && + { test pass_all = "$deplibs_check_method" || + { test yes = "$build_libtool_libs" && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + fi + + link_static=no # Whether the deplib will be linked statically + use_static_libs=$prefer_static_libs + if test built = "$use_static_libs" && test yes = "$installed"; then + use_static_libs=no + fi + if test -n "$library_names" && + { test no = "$use_static_libs" || test -z "$old_library"; }; then + case $host in + *cygwin* | *mingw* | *cegcc* | *os2*) + # No point in relinking DLLs because paths are not encoded + func_append notinst_deplibs " $lib" + need_relink=no + ;; + *) + if test no = "$installed"; then + func_append notinst_deplibs " $lib" + need_relink=yes + fi + ;; + esac + # This is a shared library + + # Warn about portability, can't link against -module's on some + # systems (darwin). Don't bleat about dlopened modules though! + dlopenmodule= + for dlpremoduletest in $dlprefiles; do + if test "X$dlpremoduletest" = "X$lib"; then + dlopenmodule=$dlpremoduletest + break + fi + done + if test -z "$dlopenmodule" && test yes = "$shouldnotlink" && test link = "$pass"; then + echo + if test prog = "$linkmode"; then + $ECHO "*** Warning: Linking the executable $output against the loadable module" + else + $ECHO "*** Warning: Linking the shared library $output against the loadable module" + fi + $ECHO "*** $linklib is not portable!" + fi + if test lib = "$linkmode" && + test yes = "$hardcode_into_libs"; then + # Hardcode the library path. + # Skip directories that are in the system default run-time + # search path. + case " $sys_lib_dlsearch_path " in + *" $absdir "*) ;; + *) + case "$compile_rpath " in + *" $absdir "*) ;; + *) func_append compile_rpath " $absdir" ;; + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + shift + realname=$1 + shift + libname=`eval "\\$ECHO \"$libname_spec\""` + # use dlname if we got it. it's perfectly good, no? + if test -n "$dlname"; then + soname=$dlname + elif test -n "$soname_spec"; then + # bleh windows + case $host in + *cygwin* | mingw* | *cegcc* | *os2*) + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + esac + eval soname=\"$soname_spec\" + else + soname=$realname + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot=$soname + func_basename "$soroot" + soname=$func_basename_result + func_stripname 'lib' '.dll' "$soname" + newlib=libimp-$func_stripname_result.a + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + func_verbose "extracting exported symbol list from '$soname'" + func_execute_cmds "$extract_expsyms_cmds" 'exit $?' + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + func_verbose "generating import library for '$soname'" + func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?' + fi + # make sure the library variables are pointing to the new library + dir=$output_objdir + linklib=$newlib + fi # test -n "$old_archive_from_expsyms_cmds" + + if test prog = "$linkmode" || test relink != "$opt_mode"; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test no = "$hardcode_direct"; then + add=$dir/$linklib + case $host in + *-*-sco3.2v5.0.[024]*) add_dir=-L$dir ;; + *-*-sysv4*uw2*) add_dir=-L$dir ;; + *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \ + *-*-unixware7*) add_dir=-L$dir ;; + *-*-darwin* ) + # if the lib is a (non-dlopened) module then we cannot + # link against it, someone is ignoring the earlier warnings + if /usr/bin/file -L $add 2> /dev/null | + $GREP ": [^:]* bundle" >/dev/null; then + if test "X$dlopenmodule" != "X$lib"; then + $ECHO "*** Warning: lib $linklib is a module, not a shared library" + if test -z "$old_library"; then + echo + echo "*** And there doesn't seem to be a static archive available" + echo "*** The link will probably fail, sorry" + else + add=$dir/$old_library + fi + elif test -n "$old_library"; then + add=$dir/$old_library + fi + fi + esac + elif test no = "$hardcode_minus_L"; then + case $host in + *-*-sunos*) add_shlibpath=$dir ;; + esac + add_dir=-L$dir + add=-l$name + elif test no = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + relink) + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$dir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$absdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + add_shlibpath=$dir + add=-l$name + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test yes != "$lib_linked"; then + func_fatal_configuration "unsupported hardcode properties" + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) func_append compile_shlibpath "$add_shlibpath:" ;; + esac + fi + if test prog = "$linkmode"; then + test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs" + test -n "$add" && compile_deplibs="$add $compile_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + if test yes != "$hardcode_direct" && + test yes != "$hardcode_minus_L" && + test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + fi + fi + fi + + if test prog = "$linkmode" || test relink = "$opt_mode"; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test yes = "$hardcode_direct" && + test no = "$hardcode_direct_absolute"; then + add=$libdir/$linklib + elif test yes = "$hardcode_minus_L"; then + add_dir=-L$libdir + add=-l$name + elif test yes = "$hardcode_shlibpath_var"; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) func_append finalize_shlibpath "$libdir:" ;; + esac + add=-l$name + elif test yes = "$hardcode_automatic"; then + if test -n "$inst_prefix_dir" && + test -f "$inst_prefix_dir$libdir/$linklib"; then + add=$inst_prefix_dir$libdir/$linklib + else + add=$libdir/$linklib + fi + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir=-L$libdir + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + func_append add_dir " -L$inst_prefix_dir$libdir" + ;; + esac + fi + add=-l$name + fi + + if test prog = "$linkmode"; then + test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs" + test -n "$add" && finalize_deplibs="$add $finalize_deplibs" + else + test -n "$add_dir" && deplibs="$add_dir $deplibs" + test -n "$add" && deplibs="$add $deplibs" + fi + fi + elif test prog = "$linkmode"; then + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test unsupported != "$hardcode_direct"; then + test -n "$old_library" && linklib=$old_library + compile_deplibs="$dir/$linklib $compile_deplibs" + finalize_deplibs="$dir/$linklib $finalize_deplibs" + else + compile_deplibs="-l$name -L$dir $compile_deplibs" + finalize_deplibs="-l$name -L$dir $finalize_deplibs" + fi + elif test yes = "$build_libtool_libs"; then + # Not a shared library + if test pass_all != "$deplibs_check_method"; then + # We're trying link a shared library against a static one + # but the system doesn't support it. + + # Just print a warning and add the library to dependency_libs so + # that the program can be linked against the static library. + echo + $ECHO "*** Warning: This system cannot link to static lib archive $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test yes = "$module"; then + echo "*** But as you try to build a module library, libtool will still create " + echo "*** a static module, that should work as long as the dlopening application" + echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test lib = "$linkmode"; then + if test -n "$dependency_libs" && + { test yes != "$hardcode_into_libs" || + test yes = "$build_old_libs" || + test yes = "$link_static"; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) func_stripname '-R' '' "$libdir" + temp_xrpath=$func_stripname_result + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) func_append xrpath " $temp_xrpath";; + esac;; + *) func_append temp_deplibs " $libdir";; + esac + done + dependency_libs=$temp_deplibs + fi + + func_append newlib_search_path " $absdir" + # Link against this library + test no = "$link_static" && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + case $deplib in + -L*) func_stripname '-L' '' "$deplib" + func_resolve_sysroot "$func_stripname_result";; + *) func_resolve_sysroot "$deplib" ;; + esac + if $opt_preserve_dup_deps; then + case "$tmp_libs " in + *" $func_resolve_sysroot_result "*) + func_append specialdeplibs " $func_resolve_sysroot_result" ;; + esac + fi + func_append tmp_libs " $func_resolve_sysroot_result" + done + + if test no != "$link_all_deplibs"; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + path= + case $deplib in + -L*) path=$deplib ;; + *.la) + func_resolve_sysroot "$deplib" + deplib=$func_resolve_sysroot_result + func_dirname "$deplib" "" "." + dir=$func_dirname_result + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir=$dir ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + func_warning "cannot determine absolute directory name of '$dir'" + absdir=$dir + fi + ;; + esac + if $GREP "^installed=no" $deplib > /dev/null; then + case $host in + *-*-darwin*) + depdepl= + eval deplibrary_names=`$SED -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names"; then + for tmp in $deplibrary_names; do + depdepl=$tmp + done + if test -f "$absdir/$objdir/$depdepl"; then + depdepl=$absdir/$objdir/$depdepl + darwin_install_name=`$OTOOL -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + if test -z "$darwin_install_name"; then + darwin_install_name=`$OTOOL64 -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'` + fi + func_append compiler_flags " $wl-dylib_file $wl$darwin_install_name:$depdepl" + func_append linker_flags " -dylib_file $darwin_install_name:$depdepl" + path= + fi + fi + ;; + *) + path=-L$absdir/$objdir + ;; + esac + else + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + test "$absdir" != "$libdir" && \ + func_warning "'$deplib' seems to be moved" + + path=-L$absdir + fi + ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test link = "$pass"; then + if test prog = "$linkmode"; then + compile_deplibs="$new_inherited_linker_flags $compile_deplibs" + finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs" + else + compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + fi + fi + dependency_libs=$newdependency_libs + if test dlpreopen = "$pass"; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test dlopen != "$pass"; then + test conv = "$pass" || { + # Make sure lib_search_path contains only unique directories. + lib_search_path= + for dir in $newlib_search_path; do + case "$lib_search_path " in + *" $dir "*) ;; + *) func_append lib_search_path " $dir" ;; + esac + done + newlib_search_path= + } + + if test prog,link = "$linkmode,$pass"; then + vars="compile_deplibs finalize_deplibs" + else + vars=deplibs + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # Pragmatically, this seems to cause very few problems in + # practice: + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + -R*) ;; + *) + # And here is the reason: when a library appears more + # than once as an explicit dependence of a library, or + # is implicitly linked in more than once by the + # compiler, it is considered special, and multiple + # occurrences thereof are not removed. Compare this + # with having the same library being listed as a + # dependency of multiple other libraries: in this case, + # we know (pedantically, we assume) the library does not + # need to be listed more than once, so we keep only the + # last copy. This is not always right, but it is rare + # enough that we require users that really mean to play + # such unportable linking tricks to link the library + # using -Wl,-lname, so that libtool does not consider it + # for duplicate removal. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) func_append tmp_libs " $deplib" ;; + esac + ;; + *) func_append tmp_libs " $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + + # Add Sun CC postdeps if required: + test CXX = "$tagname" && { + case $host_os in + linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C++ 5.9 + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + + solaris*) + func_cc_basename "$CC" + case $func_cc_basename_result in + CC* | sunCC*) + func_suncc_cstd_abi + + if test no != "$suncc_use_cstd_abi"; then + func_append postdeps ' -library=Cstd -library=Crun' + fi + ;; + esac + ;; + esac + } + + # Last step: remove runtime libs from dependency_libs + # (they stay in deplibs) + tmp_libs= + for i in $dependency_libs; do + case " $predeps $postdeps $compiler_lib_search_path " in + *" $i "*) + i= + ;; + esac + if test -n "$i"; then + func_append tmp_libs " $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test prog = "$linkmode"; then + dlfiles=$newdlfiles + fi + if test prog = "$linkmode" || test lib = "$linkmode"; then + dlprefiles=$newdlprefiles + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for archives" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for archives" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for archives" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for archives" + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for archives" + + test -n "$release" && \ + func_warning "'-release' is ignored for archives" + + test -n "$export_symbols$export_symbols_regex" && \ + func_warning "'-export-symbols' is ignored for archives" + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs=$output + func_append objs "$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form 'libNAME.la'. + case $outputname in + lib*) + func_stripname 'lib' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + test no = "$module" \ + && func_fatal_help "libtool library '$output' must begin with 'lib'" + + if test no != "$need_lib_prefix"; then + # Add the "lib" prefix for modules if required + func_stripname '' '.la' "$outputname" + name=$func_stripname_result + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + func_stripname '' '.la' "$outputname" + libname=$func_stripname_result + fi + ;; + esac + + if test -n "$objs"; then + if test pass_all != "$deplibs_check_method"; then + func_fatal_error "cannot build libtool library '$output' from non-libtool objects on this host:$objs" + else + echo + $ECHO "*** Warning: Linking the shared library $output against the non-libtool" + $ECHO "*** objects $objs is not portable!" + func_append libobjs " $objs" + fi + fi + + test no = "$dlself" \ + || func_warning "'-dlopen self' is ignored for libtool libraries" + + set dummy $rpath + shift + test 1 -lt "$#" \ + && func_warning "ignoring multiple '-rpath's for a libtool library" + + install_libdir=$1 + + oldlibs= + if test -z "$rpath"; then + if test yes = "$build_libtool_libs"; then + # Building a libtool convenience library. + # Some compilers have problems with a '.al' extension so + # convenience libraries should have the same extension an + # archive normally would. + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + test -n "$vinfo" && \ + func_warning "'-version-info/-version-number' is ignored for convenience libraries" + + test -n "$release" && \ + func_warning "'-release' is ignored for convenience libraries" + else + + # Parse the version information argument. + save_ifs=$IFS; IFS=: + set dummy $vinfo 0 0 0 + shift + IFS=$save_ifs + + test -n "$7" && \ + func_fatal_help "too many parameters to '-version-info'" + + # convert absolute version numbers to libtool ages + # this retains compatibility with .la files and attempts + # to make the code below a bit more comprehensible + + case $vinfo_number in + yes) + number_major=$1 + number_minor=$2 + number_revision=$3 + # + # There are really only two kinds -- those that + # use the current revision as the major version + # and those that subtract age and use age as + # a minor version. But, then there is irix + # that has an extra 1 added just for fun + # + case $version_type in + # correct linux to gnu/linux during the next big refactor + darwin|freebsd-elf|linux|osf|windows|none) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_revision + ;; + freebsd-aout|qnx|sunos) + current=$number_major + revision=$number_minor + age=0 + ;; + irix|nonstopux) + func_arith $number_major + $number_minor + current=$func_arith_result + age=$number_minor + revision=$number_minor + lt_irix_increment=no + ;; + esac + ;; + no) + current=$1 + revision=$2 + age=$3 + ;; + esac + + # Check that each of the things are valid numbers. + case $current in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "CURRENT '$current' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $revision in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "REVISION '$revision' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + case $age in + 0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;; + *) + func_error "AGE '$age' must be a nonnegative integer" + func_fatal_error "'$vinfo' is not valid version information" + ;; + esac + + if test "$age" -gt "$current"; then + func_error "AGE '$age' is greater than the current interface number '$current'" + func_fatal_error "'$vinfo' is not valid version information" + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + # Darwin ld doesn't like 0 for these options... + func_arith $current + 1 + minor_current=$func_arith_result + xlcverstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + # On Darwin other compilers + case $CC in + nagfor*) + verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" + ;; + *) + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + esac + ;; + + freebsd-aout) + major=.$current + versuffix=.$current.$revision + ;; + + freebsd-elf) + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + irix | nonstopux) + if test no = "$lt_irix_increment"; then + func_arith $current - $age + else + func_arith $current - $age + 1 + fi + major=$func_arith_result + + case $version_type in + nonstopux) verstring_prefix=nonstopux ;; + *) verstring_prefix=sgi ;; + esac + verstring=$verstring_prefix$major.$revision + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test 0 -ne "$loop"; do + func_arith $revision - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring_prefix$major.$iface:$verstring + done + + # Before this point, $major must not contain '.'. + major=.$major + versuffix=$major.$revision + ;; + + linux) # correct to gnu/linux during the next big refactor + func_arith $current - $age + major=.$func_arith_result + versuffix=$major.$age.$revision + ;; + + osf) + func_arith $current - $age + major=.$func_arith_result + versuffix=.$current.$age.$revision + verstring=$current.$age.$revision + + # Add in all the interfaces that we are compatible with. + loop=$age + while test 0 -ne "$loop"; do + func_arith $current - $loop + iface=$func_arith_result + func_arith $loop - 1 + loop=$func_arith_result + verstring=$verstring:$iface.0 + done + + # Make executables depend on our current version. + func_append verstring ":$current.0" + ;; + + qnx) + major=.$current + versuffix=.$current + ;; + + sco) + major=.$current + versuffix=.$current + ;; + + sunos) + major=.$current + versuffix=.$current.$revision + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 file systems. + func_arith $current - $age + major=$func_arith_result + versuffix=-$major + ;; + + *) + func_fatal_configuration "unknown library version type '$version_type'" + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + case $version_type in + darwin) + # we can't check for "0.0" in archive_cmds due to quoting + # problems, so we reset it completely + verstring= + ;; + *) + verstring=0.0 + ;; + esac + if test no = "$need_version"; then + versuffix= + else + versuffix=.0.0 + fi + fi + + # Remove version info from name if versioning should be avoided + if test yes,no = "$avoid_version,$need_version"; then + major= + versuffix= + verstring= + fi + + # Check to see if the archive will have undefined symbols. + if test yes = "$allow_undefined"; then + if test unsupported = "$allow_undefined_flag"; then + if test yes = "$build_old_libs"; then + func_warning "undefined symbols not allowed in $host shared libraries; building static only" + build_libtool_libs=no + else + func_fatal_error "can't build $host shared library unless -no-undefined is specified" + fi + fi + else + # Don't allow undefined symbols. + allow_undefined_flag=$no_undefined_flag + fi + + fi + + func_generate_dlsyms "$libname" "$libname" : + func_append libobjs " $symfileobj" + test " " = "$libobjs" && libobjs= + + if test relink != "$opt_mode"; then + # Remove our outputs, but don't remove object files since they + # may have been created when compiling PIC objects. + removelist= + tempremovelist=`$ECHO "$output_objdir/*"` + for p in $tempremovelist; do + case $p in + *.$objext | *.gcno) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/$libname$release.*) + if test -n "$precious_files_regex"; then + if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + func_append removelist " $p" + ;; + *) ;; + esac + done + test -n "$removelist" && \ + func_show_eval "${RM}r \$removelist" + fi + + # Now set the variables for building old libraries. + if test yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; then + func_append oldlibs " $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; $lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"` + # deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"` + # dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"` + #done + + if test -n "$xrpath"; then + # If the user specified any rpath flags, then add them. + temp_xrpath= + for libdir in $xrpath; do + func_replace_sysroot "$libdir" + func_append temp_xrpath " -R$func_replace_sysroot_result" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + if test yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; then + dependency_libs="$temp_xrpath $dependency_libs" + fi + fi + + # Make sure dlfiles contains only unique files that won't be dlpreopened + old_dlfiles=$dlfiles + dlfiles= + for lib in $old_dlfiles; do + case " $dlprefiles $dlfiles " in + *" $lib "*) ;; + *) func_append dlfiles " $lib" ;; + esac + done + + # Make sure dlprefiles contains only unique files + old_dlprefiles=$dlprefiles + dlprefiles= + for lib in $old_dlprefiles; do + case "$dlprefiles " in + *" $lib "*) ;; + *) func_append dlprefiles " $lib" ;; + esac + done + + if test yes = "$build_libtool_libs"; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + func_append deplibs " System.ltframework" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test yes = "$build_libtool_need_lc"; then + func_append deplibs " -lc" + fi + ;; + esac + fi + + # Transform deplibs into only deplibs that can be linked in shared. + name_save=$name + libname_save=$libname + release_save=$release + versuffix_save=$versuffix + major_save=$major + # I'm not sure if I'm treating the release correctly. I think + # release should show up in the -l (ie -lgmp5) so we don't want to + # add it in twice. Is that correct? + release= + versuffix= + major= + newdeplibs= + droppeddeps=no + case $deplibs_check_method in + pass_all) + # Don't check for shared/static. Everything works. + # This might be a little naive. We might want to check + # whether the library exists or not. But this is on + # osf3 & osf4 and I'm not really sure... Just + # implementing what was already the behavior. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $opt_dry_run || $RM conftest.c + cat > conftest.c </dev/null` + $nocaseglob + else + potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null` + fi + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null | + $GREP " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib=$potent_lib + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | $SED 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib=$potliblink;; + *) potlib=`$ECHO "$potlib" | $SED 's|[^/]*$||'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null | + $SED -e 10q | + $EGREP "$file_magic_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for file magic test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a file magic. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method; shift + match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"` + for a_deplib in $deplibs; do + case $a_deplib in + -l*) + func_stripname -l '' "$a_deplib" + name=$func_stripname_result + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + case " $predeps $postdeps " in + *" $a_deplib "*) + func_append newdeplibs " $a_deplib" + a_deplib= + ;; + esac + fi + if test -n "$a_deplib"; then + libname=`eval "\\$ECHO \"$libname_spec\""` + for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do + potential_libs=`ls $i/$libname[.-]* 2>/dev/null` + for potent_lib in $potential_libs; do + potlib=$potent_lib # see symlink-check above in file_magic test + if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \ + $EGREP "$match_pattern_regex" > /dev/null; then + func_append newdeplibs " $a_deplib" + a_deplib= + break 2 + fi + done + done + fi + if test -n "$a_deplib"; then + droppeddeps=yes + echo + $ECHO "*** Warning: linker path does not have real file for library $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have" + echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib"; then + $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $ECHO "*** with $libname and none of the candidates passed a file format test" + $ECHO "*** using a regex pattern. Last file checked: $potlib" + fi + fi + ;; + *) + # Add a -L argument. + func_append newdeplibs " $a_deplib" + ;; + esac + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs= + tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'` + if test yes = "$allow_libtool_libs_with_static_runtimes"; then + for i in $predeps $postdeps; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s|$i||"` + done + fi + case $tmp_deplibs in + *[!\ \ ]*) + echo + if test none = "$deplibs_check_method"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + ;; + esac + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library with the System framework + newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + if test yes = "$droppeddeps"; then + if test yes = "$module"; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + $ECHO "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using 'nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** 'nm' from GNU binutils and a full rebuild may help." + fi + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test no = "$allow_undefined"; then + echo + echo "*** Since this library must not contain undefined symbols," + echo "*** because either the platform does not support them or" + echo "*** it was explicitly requested with -no-undefined," + echo "*** libtool will only create a static version of it." + if test no = "$build_old_libs"; then + oldlibs=$output_objdir/$libname.$libext + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + fi + fi + # Done checking deplibs! + deplibs=$newdeplibs + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + case $host in + *-*-darwin*) + newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + deplibs=$new_libs + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test yes = "$build_libtool_libs"; then + # Remove $wl instances when linking with ld. + # FIXME: should test the right _cmds variable. + case $archive_cmds in + *\$LD\ *) wl= ;; + esac + if test yes = "$hardcode_into_libs"; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath=$finalize_rpath + test relink = "$opt_mode" || rpath=$compile_rpath$rpath + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + func_replace_sysroot "$libdir" + libdir=$func_replace_sysroot_result + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append dep_rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval "dep_rpath=\"$hardcode_libdir_flag_spec\"" + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var" + fi + test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs" + fi + + shlibpath=$finalize_shlibpath + test relink = "$opt_mode" || shlibpath=$compile_shlibpath$shlibpath + if test -n "$shlibpath"; then + eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var" + fi + + # Get the real and link names of the library. + eval shared_ext=\"$shrext_cmds\" + eval library_names=\"$library_names_spec\" + set dummy $library_names + shift + realname=$1 + shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname=$realname + fi + if test -z "$dlname"; then + dlname=$soname + fi + + lib=$output_objdir/$realname + linknames= + for link + do + func_append linknames " $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP` + test "X$libobjs" = "X " && libobjs= + + delfiles= + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp" + export_symbols=$output_objdir/$libname.uexp + func_append delfiles " $export_symbols" + fi + + orig_export_symbols= + case $host_os in + cygwin* | mingw* | cegcc*) + if test -n "$export_symbols" && test -z "$export_symbols_regex"; then + # exporting using user supplied symfile + func_dll_def_p "$export_symbols" || { + # and it's NOT already a .def file. Must figure out + # which of the given symbols are data symbols and tag + # them as such. So, trigger use of export_symbols_cmds. + # export_symbols gets reassigned inside the "prepare + # the list of exported symbols" if statement, so the + # include_expsyms logic still works. + orig_export_symbols=$export_symbols + export_symbols= + always_export_symbols=yes + } + fi + ;; + esac + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test yes = "$always_export_symbols" || test -n "$export_symbols_regex"; then + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + cmds=$export_symbols_cmds + save_ifs=$IFS; IFS='~' + for cmd1 in $cmds; do + IFS=$save_ifs + # Take the normal branch if the nm_file_list_spec branch + # doesn't work or if tool conversion is not needed. + case $nm_file_list_spec~$to_tool_file_cmd in + *~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*) + try_normal_branch=yes + eval cmd=\"$cmd1\" + func_len " $cmd" + len=$func_len_result + ;; + *) + try_normal_branch=no + ;; + esac + if test yes = "$try_normal_branch" \ + && { test "$len" -lt "$max_cmd_len" \ + || test "$max_cmd_len" -le -1; } + then + func_show_eval "$cmd" 'exit $?' + skipped_export=false + elif test -n "$nm_file_list_spec"; then + func_basename "$output" + output_la=$func_basename_result + save_libobjs=$libobjs + save_output=$output + output=$output_objdir/$output_la.nm + func_to_tool_file "$output" + libobjs=$nm_file_list_spec$func_to_tool_file_result + func_append delfiles " $output" + func_verbose "creating $NM input file list: $output" + for obj in $save_libobjs; do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > "$output" + eval cmd=\"$cmd1\" + func_show_eval "$cmd" 'exit $?' + output=$save_output + libobjs=$save_libobjs + skipped_export=false + else + # The command line is too long to execute in one step. + func_verbose "using reloadable object file for export list..." + skipped_export=: + # Break out early, otherwise skipped_export may be + # set to false by a later but shorter cmd. + break + fi + done + IFS=$save_ifs + if test -n "$export_symbols_regex" && test : != "$skipped_export"; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test : != "$skipped_export" && test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + func_append tmp_deplibs " $test_deplib" + ;; + esac + done + deplibs=$tmp_deplibs + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec" && + test yes = "$compiler_needs_object" && + test -z "$libobjs"; then + # extract the archives, so we have objects to list. + # TODO: could optimize this to just extract one archive. + whole_archive_flag_spec= + fi + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + else + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + fi + + if test yes = "$thread_safe" && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + func_append linker_flags " $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + eval test_cmds=\"$module_expsym_cmds\" + cmds=$module_expsym_cmds + else + eval test_cmds=\"$module_cmds\" + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval test_cmds=\"$archive_expsym_cmds\" + cmds=$archive_expsym_cmds + else + eval test_cmds=\"$archive_cmds\" + cmds=$archive_cmds + fi + fi + + if test : != "$skipped_export" && + func_len " $test_cmds" && + len=$func_len_result && + test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise + # or, if using GNU ld and skipped_export is not :, use a linker + # script. + + # Save the value of $output and $libobjs because we want to + # use them later. If we have whole_archive_flag_spec, we + # want to use save_libobjs as it was before + # whole_archive_flag_spec was expanded, because we can't + # assume the linker understands whole_archive_flag_spec. + # This may have to be revisited, in case too many + # convenience libraries get linked in and end up exceeding + # the spec. + if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + fi + save_output=$output + func_basename "$output" + output_la=$func_basename_result + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + last_robj= + k=1 + + if test -n "$save_libobjs" && test : != "$skipped_export" && test yes = "$with_gnu_ld"; then + output=$output_objdir/$output_la.lnkscript + func_verbose "creating GNU ld script: $output" + echo 'INPUT (' > $output + for obj in $save_libobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + echo ')' >> $output + func_append delfiles " $output" + func_to_tool_file "$output" + output=$func_to_tool_file_result + elif test -n "$save_libobjs" && test : != "$skipped_export" && test -n "$file_list_spec"; then + output=$output_objdir/$output_la.lnk + func_verbose "creating linker input file list: $output" + : > $output + set x $save_libobjs + shift + firstobj= + if test yes = "$compiler_needs_object"; then + firstobj="$1 " + shift + fi + for obj + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" >> $output + done + func_append delfiles " $output" + func_to_tool_file "$output" + output=$firstobj\"$file_list_spec$func_to_tool_file_result\" + else + if test -n "$save_libobjs"; then + func_verbose "creating reloadable object files..." + output=$output_objdir/$output_la-$k.$objext + eval test_cmds=\"$reload_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + if test -z "$objlist" || + test "$len" -lt "$max_cmd_len"; then + func_append objlist " $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test 1 -eq "$k"; then + # The first file doesn't have a previous command to add. + reload_objs=$objlist + eval concat_cmds=\"$reload_cmds\" + else + # All subsequent reloadable object files will link in + # the last one created. + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\" + fi + last_robj=$output_objdir/$output_la-$k.$objext + func_arith $k + 1 + k=$func_arith_result + output=$output_objdir/$output_la-$k.$objext + objlist=" $obj" + func_len " $last_robj" + func_arith $len0 + $func_len_result + len=$func_arith_result + fi + done + # Handle the remaining objects by creating one last + # reloadable object file. All subsequent reloadable object + # files will link in the last one created. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + reload_objs="$objlist $last_robj" + eval concat_cmds=\"\$concat_cmds$reload_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + func_append delfiles " $output" + + else + output= + fi + + ${skipped_export-false} && { + func_verbose "generating symbol list for '$libname.la'" + export_symbols=$output_objdir/$libname.exp + $opt_dry_run || $RM $export_symbols + libobjs=$output + # Append the command to create the export file. + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\" + if test -n "$last_robj"; then + eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\" + fi + } + + test -n "$save_libobjs" && + func_verbose "creating a temporary reloadable object file: $output" + + # Loop through the commands generated above and execute them. + save_ifs=$IFS; IFS='~' + for cmd in $concat_cmds; do + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + if test -n "$export_symbols_regex" && ${skipped_export-false}; then + func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + func_show_eval '$MV "${export_symbols}T" "$export_symbols"' + fi + fi + + ${skipped_export-false} && { + if test -n "$export_symbols" && test -n "$include_expsyms"; then + tmp_export_symbols=$export_symbols + test -n "$orig_export_symbols" && tmp_export_symbols=$orig_export_symbols + $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"' + fi + + if test -n "$orig_export_symbols"; then + # The given exports_symbols file has to be filtered, so filter it. + func_verbose "filter symbol list for '$libname.la' to tag DATA exports" + # FIXME: $output_objdir/$libname.filter potentially contains lots of + # 's' commands, which not all seds can handle. GNU sed should be fine + # though. Also, the filter scales superlinearly with the number of + # global variables. join(1) would be nice here, but unfortunately + # isn't a blessed tool. + $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter + func_append delfiles " $export_symbols $output_objdir/$libname.filter" + export_symbols=$output_objdir/$libname.def + $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols + fi + } + + libobjs=$output + # Restore the value of output. + output=$save_output + + if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + test "X$libobjs" = "X " && libobjs= + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test yes = "$module" && test -n "$module_cmds"; then + if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then + cmds=$module_expsym_cmds + else + cmds=$module_cmds + fi + else + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + cmds=$archive_expsym_cmds + else + cmds=$archive_cmds + fi + fi + fi + + if test -n "$delfiles"; then + # Append the command to remove temporary files to $cmds. + eval cmds=\"\$cmds~\$RM $delfiles\" + fi + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append libobjs " $func_extract_archives_result" + test "X$libobjs" = "X " && libobjs= + fi + + save_ifs=$IFS; IFS='~' + for cmd in $cmds; do + IFS=$sp$nl + eval cmd=\"$cmd\" + IFS=$save_ifs + $opt_quiet || { + func_quote_for_expand "$cmd" + eval "func_echo $func_quote_for_expand_result" + } + $opt_dry_run || eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + ( cd "$output_objdir" && \ + $RM "${realname}T" && \ + $MV "${realname}U" "$realname" ) + fi + + exit $lt_exit + } + done + IFS=$save_ifs + + # Restore the uninstalled library and exit + if test relink = "$opt_mode"; then + $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $? + + if test -n "$convenience"; then + if test -z "$whole_archive_flag_spec"; then + func_show_eval '${RM}r "$gentop"' + fi + fi + + exit $EXIT_SUCCESS + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?' + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test yes = "$module" || test yes = "$export_dynamic"; then + # On all known operating systems, these are identical. + dlname=$soname + fi + fi + ;; + + obj) + if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; then + func_warning "'-dlopen' is ignored for objects" + fi + + case " $deplibs" in + *\ -l* | *\ -L*) + func_warning "'-l' and '-L' are ignored for objects" ;; + esac + + test -n "$rpath" && \ + func_warning "'-rpath' is ignored for objects" + + test -n "$xrpath" && \ + func_warning "'-R' is ignored for objects" + + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for objects" + + test -n "$release" && \ + func_warning "'-release' is ignored for objects" + + case $output in + *.lo) + test -n "$objs$old_deplibs" && \ + func_fatal_error "cannot build library object '$output' from non-libtool objects" + + libobj=$output + func_lo2o "$libobj" + obj=$func_lo2o_result + ;; + *) + libobj= + obj=$output + ;; + esac + + # Delete the old objects. + $opt_dry_run || $RM $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # if reload_cmds runs $LD directly, get rid of -Wl from + # whole_archive_flag_spec and hope we can get by with turning comma + # into space. + case $reload_cmds in + *\$LD[\ \$]*) wl= ;; + esac + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` + reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags + else + gentop=$output_objdir/${obj}x + func_append generated " $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # If we're not building shared, we need to use non_pic_objs + test yes = "$build_libtool_libs" || libobjs=$non_pic_objects + + # Create the old-style object. + reload_objs=$objs$old_deplibs' '`$ECHO "$libobjs" | $SP2NL | $SED "/\.$libext$/d; /\.lib$/d; $lo2o" | $NL2SP`' '$reload_conv_objs + + output=$obj + func_execute_cmds "$reload_cmds" 'exit $?' + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + fi + + test yes = "$build_libtool_libs" || { + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $opt_dry_run || eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + } + + if test -n "$pic_flag" || test default != "$pic_mode"; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output=$libobj + func_execute_cmds "$reload_cmds" 'exit $?' + fi + + if test -n "$gentop"; then + func_show_eval '${RM}r "$gentop"' + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) func_stripname '' '.exe' "$output" + output=$func_stripname_result.exe;; + esac + test -n "$vinfo" && \ + func_warning "'-version-info' is ignored for programs" + + test -n "$release" && \ + func_warning "'-release' is ignored for programs" + + $preload \ + && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ + && func_warning "'LT_INIT([dlopen])' not used. Assuming no dlopen support." + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'` + ;; + esac + + case $host in + *-*-darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + # But is supposedly fixed on 10.4 or later (yay!). + if test CXX = "$tagname"; then + case ${MACOSX_DEPLOYMENT_TARGET-10.0} in + 10.[0123]) + func_append compile_command " $wl-bind_at_load" + func_append finalize_command " $wl-bind_at_load" + ;; + esac + fi + # Time to change all our "foo.ltframework" stuff back to "-framework foo" + compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'` + ;; + esac + + + # move library search paths that coincide with paths to not yet + # installed libraries to the beginning of the library search list + new_libs= + for path in $notinst_path; do + case " $new_libs " in + *" -L$path/$objdir "*) ;; + *) + case " $compile_deplibs " in + *" -L$path/$objdir "*) + func_append new_libs " -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) func_append new_libs " $deplib" ;; + esac + ;; + *) func_append new_libs " $deplib" ;; + esac + done + compile_deplibs=$new_libs + + + func_append compile_command " $compile_deplibs" + func_append finalize_command " $finalize_deplibs" + + if test -n "$rpath$xrpath"; then + # If the user specified any rpath flags, then add them. + for libdir in $rpath $xrpath; do + # This is the magic to use -rpath. + case "$finalize_rpath " in + *" $libdir "*) ;; + *) func_append finalize_rpath " $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) func_append perm_rpath " $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*) + testbindir=`$ECHO "$libdir" | $SED -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + ::) dllsearchpath=$libdir;; + *) func_append dllsearchpath ":$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + ::) dllsearchpath=$testbindir;; + *) func_append dllsearchpath ":$testbindir";; + esac + ;; + esac + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + compile_rpath=$rpath + + rpath= + hardcode_libdirs= + for libdir in $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs=$libdir + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + func_append hardcode_libdirs "$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + func_append rpath " $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) func_append finalize_perm_rpath " $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir=$hardcode_libdirs + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath=$rpath + + if test -n "$libobjs" && test yes = "$build_old_libs"; then + # Transform all the library objects into standard objects. + compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP` + fi + + func_generate_dlsyms "$outputname" "@PROGRAM@" false + + # template prelinking step + if test -n "$prelink_cmds"; then + func_execute_cmds "$prelink_cmds" 'exit $?' + fi + + wrappers_required=: + case $host in + *cegcc* | *mingw32ce*) + # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. + wrappers_required=false + ;; + *cygwin* | *mingw* ) + test yes = "$build_libtool_libs" || wrappers_required=false + ;; + *) + if test no = "$need_relink" || test yes != "$build_libtool_libs"; then + wrappers_required=false + fi + ;; + esac + $wrappers_required || { + # Replace the output file specification. + compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + link_command=$compile_command$compile_rpath + + # We have no uninstalled library dependencies, so finalize right now. + exit_status=0 + func_show_eval "$link_command" 'exit_status=$?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Delete the generated files. + if test -f "$output_objdir/${outputname}S.$objext"; then + func_show_eval '$RM "$output_objdir/${outputname}S.$objext"' + fi + + exit $exit_status + } + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + func_append rpath "$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + func_append rpath "$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test yes = "$no_install"; then + # We don't need to create a wrapper script. + link_command=$compile_var$compile_command$compile_rpath + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $opt_dry_run || $RM $output + # Link the executable and exit + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + exit $EXIT_SUCCESS + fi + + case $hardcode_action,$fast_install in + relink,*) + # Fast installation is not supported + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + + func_warning "this platform does not like uninstalled shared libraries" + func_warning "'$output' will be relinked during installation" + ;; + *,yes) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` + ;; + *,no) + link_command=$compile_var$compile_command$compile_rpath + relink_command=$finalize_var$finalize_command$finalize_rpath + ;; + *,needless) + link_command=$finalize_var$compile_command$finalize_rpath + relink_command= + ;; + esac + + # Replace the output file specification. + link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname + + func_show_eval "$link_command" 'exit $?' + + if test -n "$postlink_cmds"; then + func_to_tool_file "$output_objdir/$outputname" + postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'` + func_execute_cmds "$postlink_cmds" 'exit $?' + fi + + # Now create the wrapper script. + func_verbose "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + fi + + # Only actually do things if not in dry run mode. + $opt_dry_run || { + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) func_stripname '' '.exe' "$output" + output=$func_stripname_result ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + func_stripname '' '.exe' "$outputname" + outputname=$func_stripname_result ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + func_dirname_and_basename "$output" "" "." + output_name=$func_basename_result + output_path=$func_dirname_result + cwrappersource=$output_path/$objdir/lt-$output_name.c + cwrapper=$output_path/$output_name.exe + $RM $cwrappersource $cwrapper + trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15 + + func_emit_cwrapperexe_src > $cwrappersource + + # The wrapper executable is built using the $host compiler, + # because it contains $host paths and files. If cross- + # compiling, it, like the target executable, must be + # executed on the $host or under an emulation environment. + $opt_dry_run || { + $LTCC $LTCFLAGS -o $cwrapper $cwrappersource + $STRIP $cwrapper + } + + # Now, create the wrapper script for func_source use: + func_ltwrapper_scriptname $cwrapper + $RM $func_ltwrapper_scriptname_result + trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15 + $opt_dry_run || { + # note: this script will not be executed, so do not chmod. + if test "x$build" = "x$host"; then + $cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result + else + func_emit_wrapper no > $func_ltwrapper_scriptname_result + fi + } + ;; + * ) + $RM $output + trap "$RM $output; exit $EXIT_FAILURE" 1 2 15 + + func_emit_wrapper no > $output + chmod +x $output + ;; + esac + } + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + case $build_libtool_libs in + convenience) + oldobjs="$libobjs_save $symfileobj" + addlibs=$convenience + build_libtool_libs=no + ;; + module) + oldobjs=$libobjs_save + addlibs=$old_convenience + build_libtool_libs=no + ;; + *) + oldobjs="$old_deplibs $non_pic_objects" + $preload && test -f "$symfileobj" \ + && func_append oldobjs " $symfileobj" + addlibs=$old_convenience + ;; + esac + + if test -n "$addlibs"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $addlibs + func_append oldobjs " $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test yes = "$build_libtool_libs"; then + cmds=$old_archive_from_new_cmds + else + + # Add any objects from preloaded convenience libraries + if test -n "$dlprefiles"; then + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + + func_extract_archives $gentop $dlprefiles + func_append oldobjs " $func_extract_archives_result" + fi + + # POSIX demands no paths to be encoded in archives. We have + # to avoid creating archives with duplicate basenames if we + # might have to extract them afterwards, e.g., when creating a + # static archive out of a convenience library, or when linking + # the entirety of a libtool archive into another (currently + # not supported by libtool). + if (for obj in $oldobjs + do + func_basename "$obj" + $ECHO "$func_basename_result" + done | sort | sort -uc >/dev/null 2>&1); then + : + else + echo "copying selected object files to avoid basename conflicts..." + gentop=$output_objdir/${outputname}x + func_append generated " $gentop" + func_mkdir_p "$gentop" + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + func_basename "$obj" + objbase=$func_basename_result + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + func_arith $counter + 1 + counter=$func_arith_result + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + func_append oldobjs " $gentop/$newobj" + ;; + *) func_append oldobjs " $obj" ;; + esac + done + fi + func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 + tool_oldlib=$func_to_tool_file_result + eval cmds=\"$old_archive_cmds\" + + func_len " $cmds" + len=$func_len_result + if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + elif test -n "$archiver_list_spec"; then + func_verbose "using command file archive linking..." + for obj in $oldobjs + do + func_to_tool_file "$obj" + $ECHO "$func_to_tool_file_result" + done > $output_objdir/$libname.libcmd + func_to_tool_file "$output_objdir/$libname.libcmd" + oldobjs=" $archiver_list_spec$func_to_tool_file_result" + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + func_verbose "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_oldobjs=$oldobjs + oldobjs= + # Is there a better way of finding the last object in the list? + for obj in $save_oldobjs + do + last_oldobj=$obj + done + eval test_cmds=\"$old_archive_cmds\" + func_len " $test_cmds" + len0=$func_len_result + len=$len0 + for obj in $save_oldobjs + do + func_len " $obj" + func_arith $len + $func_len_result + len=$func_arith_result + func_append objlist " $obj" + if test "$len" -lt "$max_cmd_len"; then + : + else + # the above command should be used before it gets too long + oldobjs=$objlist + if test "$obj" = "$last_oldobj"; then + RANLIB=$save_RANLIB + fi + test -z "$concat_cmds" || concat_cmds=$concat_cmds~ + eval concat_cmds=\"\$concat_cmds$old_archive_cmds\" + objlist= + len=$len0 + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test -z "$oldobjs"; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + func_execute_cmds "$cmds" 'exit $?' + done + + test -n "$generated" && \ + func_show_eval "${RM}r$generated" + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test yes = "$build_old_libs" && old_library=$libname.$libext + func_verbose "creating $output" + + # Preserve any variables that may affect compiler behavior + for var in $variables_saved_for_relink; do + if eval test -z \"\${$var+set}\"; then + relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command" + elif eval var_value=\$$var; test -z "$var_value"; then + relink_command="$var=; export $var; $relink_command" + else + func_quote_for_eval "$var_value" + relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL \"$progpath\" $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"` + if test yes = "$hardcode_automatic"; then + relink_command= + fi + + # Only create the output if not a dry run. + $opt_dry_run || { + for installed in no yes; do + if test yes = "$installed"; then + if test -z "$install_libdir"; then + break + fi + output=$output_objdir/${outputname}i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + func_basename "$deplib" + name=$func_basename_result + func_resolve_sysroot "$deplib" + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` + test -z "$libdir" && \ + func_fatal_error "'$deplib' is not a valid libtool archive" + func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name" + ;; + -L*) + func_stripname -L '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -L$func_replace_sysroot_result" + ;; + -R*) + func_stripname -R '' "$deplib" + func_replace_sysroot "$func_stripname_result" + func_append newdependency_libs " -R$func_replace_sysroot_result" + ;; + *) func_append newdependency_libs " $deplib" ;; + esac + done + dependency_libs=$newdependency_libs + newdlfiles= + + for lib in $dlfiles; do + case $lib in + *.la) + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name" + ;; + *) func_append newdlfiles " $lib" ;; + esac + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + *.la) + # Only pass preopened files to the pseudo-archive (for + # eventual linking with the app. that links it) if we + # didn't already link the preopened objects directly into + # the library: + func_basename "$lib" + name=$func_basename_result + eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + test -z "$libdir" && \ + func_fatal_error "'$lib' is not a valid libtool archive" + func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name" + ;; + esac + done + dlprefiles=$newdlprefiles + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlfiles " $abs" + done + dlfiles=$newdlfiles + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs=$lib ;; + *) abs=`pwd`"/$lib" ;; + esac + func_append newdlprefiles " $abs" + done + dlprefiles=$newdlprefiles + fi + $RM $output + # place dlname in correct position for cygwin + # In fact, it would be nice if we could use this code for all target + # systems that can't hard-code library paths into their executables + # and that have no shared library path variable independent of PATH, + # but it turns out we can't easily determine that from inspecting + # libtool variables, so we have to hard-code the OSs to which it + # applies here; at the moment, that means platforms that use the PE + # object format with DLL files. See the long comment at the top of + # tests/bindir.at for full details. + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) + # If a -bindir argument was supplied, place the dll there. + if test -n "$bindir"; then + func_relative_path "$install_libdir" "$bindir" + tdlname=$func_relative_path_result/$dlname + else + # Otherwise fall back on heuristic. + tdlname=../bin/$dlname + fi + ;; + esac + $ECHO > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM (GNU $PACKAGE) $VERSION +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='$new_inherited_linker_flags' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Names of additional weak libraries provided by this library +weak_library_names='$weak_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Should we warn about portability when linking against -modules? +shouldnotlink=$module + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test no,yes = "$installed,$need_relink"; then + $ECHO >> $output "\ +relink_command=\"$relink_command\"" + fi + done + } + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?' + ;; + esac + exit $EXIT_SUCCESS +} + +if test link = "$opt_mode" || test relink = "$opt_mode"; then + func_mode_link ${1+"$@"} +fi + + +# func_mode_uninstall arg... +func_mode_uninstall () +{ + $debug_cmd + + RM=$nonopt + files= + rmforce=false + exit_status=0 + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic=$magic + + for arg + do + case $arg in + -f) func_append RM " $arg"; rmforce=: ;; + -*) func_append RM " $arg" ;; + *) func_append files " $arg" ;; + esac + done + + test -z "$RM" && \ + func_fatal_help "you must specify an RM program" + + rmdirs= + + for file in $files; do + func_dirname "$file" "" "." + dir=$func_dirname_result + if test . = "$dir"; then + odir=$objdir + else + odir=$dir/$objdir + fi + func_basename "$file" + name=$func_basename_result + test uninstall = "$opt_mode" && odir=$dir + + # Remember odir for removal later, being careful to avoid duplicates + if test clean = "$opt_mode"; then + case " $rmdirs " in + *" $odir "*) ;; + *) func_append rmdirs " $odir" ;; + esac + fi + + # Don't error if the file doesn't exist and rm -f was used. + if { test -L "$file"; } >/dev/null 2>&1 || + { test -h "$file"; } >/dev/null 2>&1 || + test -f "$file"; then + : + elif test -d "$file"; then + exit_status=1 + continue + elif $rmforce; then + continue + fi + + rmfiles=$file + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if func_lalib_p "$file"; then + func_source $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + func_append rmfiles " $odir/$n" + done + test -n "$old_library" && func_append rmfiles " $odir/$old_library" + + case $opt_mode in + clean) + case " $library_names " in + *" $dlname "*) ;; + *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;; + esac + test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + func_execute_cmds "$postuninstall_cmds" '$rmforce || exit_status=1' + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + func_execute_cmds "$old_postuninstall_cmds" '$rmforce || exit_status=1' + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if func_lalib_p "$file"; then + + # Read the .lo file + func_source $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" && test none != "$pic_object"; then + func_append rmfiles " $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" && test none != "$non_pic_object"; then + func_append rmfiles " $dir/$non_pic_object" + fi + fi + ;; + + *) + if test clean = "$opt_mode"; then + noexename=$name + case $file in + *.exe) + func_stripname '' '.exe' "$file" + file=$func_stripname_result + func_stripname '' '.exe' "$name" + noexename=$func_stripname_result + # $file with .exe has already been added to rmfiles, + # add $file without .exe + func_append rmfiles " $file" + ;; + esac + # Do a test to see if this is a libtool program. + if func_ltwrapper_p "$file"; then + if func_ltwrapper_executable_p "$file"; then + func_ltwrapper_scriptname "$file" + relink_command= + func_source $func_ltwrapper_scriptname_result + func_append rmfiles " $func_ltwrapper_scriptname_result" + else + relink_command= + func_source $dir/$noexename + fi + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + func_append rmfiles " $odir/$name $odir/${name}S.$objext" + if test yes = "$fast_install" && test -n "$relink_command"; then + func_append rmfiles " $odir/lt-$name" + fi + if test "X$noexename" != "X$name"; then + func_append rmfiles " $odir/lt-$noexename.c" + fi + fi + fi + ;; + esac + func_show_eval "$RM $rmfiles" 'exit_status=1' + done + + # Try to remove the $objdir's in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + func_show_eval "rmdir $dir >/dev/null 2>&1" + fi + done + + exit $exit_status +} + +if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then + func_mode_uninstall ${1+"$@"} +fi + +test -z "$opt_mode" && { + help=$generic_help + func_fatal_help "you must specify a MODE" +} + +test -z "$exec_cmd" && \ + func_fatal_help "invalid operation mode '$opt_mode'" + +if test -n "$exec_cmd"; then + eval exec "$exec_cmd" + exit $EXIT_FAILURE +fi + +exit $exit_status + + +# The TAGs below are defined such that we never get into a situation +# where we disable both kinds of libraries. Given conflicting +# choices, we go for a static library, that is the most portable, +# since we can't tell whether shared libraries were disabled because +# the user asked for that or because the platform doesn't support +# them. This is particularly important on AIX, because we don't +# support having both static and shared libraries enabled at the same +# time on that platform, so we default to a shared-only configuration. +# If a disable-shared tag is given, we'll fallback to a static-only +# configuration. But we'll never go from static-only to shared-only. + +# ### BEGIN LIBTOOL TAG CONFIG: disable-shared +build_libtool_libs=no +build_old_libs=yes +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/src/m4/ax_boost_base.m4 b/build-aux/m4/ax_boost_base.m4 similarity index 100% rename from src/m4/ax_boost_base.m4 rename to build-aux/m4/ax_boost_base.m4 diff --git a/src/m4/ax_boost_chrono.m4 b/build-aux/m4/ax_boost_chrono.m4 similarity index 100% rename from src/m4/ax_boost_chrono.m4 rename to build-aux/m4/ax_boost_chrono.m4 diff --git a/src/m4/ax_boost_filesystem.m4 b/build-aux/m4/ax_boost_filesystem.m4 similarity index 100% rename from src/m4/ax_boost_filesystem.m4 rename to build-aux/m4/ax_boost_filesystem.m4 diff --git a/src/m4/ax_boost_program_options.m4 b/build-aux/m4/ax_boost_program_options.m4 similarity index 100% rename from src/m4/ax_boost_program_options.m4 rename to build-aux/m4/ax_boost_program_options.m4 diff --git a/src/m4/ax_boost_system.m4 b/build-aux/m4/ax_boost_system.m4 similarity index 100% rename from src/m4/ax_boost_system.m4 rename to build-aux/m4/ax_boost_system.m4 diff --git a/src/m4/ax_boost_thread.m4 b/build-aux/m4/ax_boost_thread.m4 similarity index 100% rename from src/m4/ax_boost_thread.m4 rename to build-aux/m4/ax_boost_thread.m4 diff --git a/src/m4/ax_boost_unit_test_framework.m4 b/build-aux/m4/ax_boost_unit_test_framework.m4 similarity index 100% rename from src/m4/ax_boost_unit_test_framework.m4 rename to build-aux/m4/ax_boost_unit_test_framework.m4 diff --git a/build-aux/m4/ax_check_compile_flag.m4 b/build-aux/m4/ax_check_compile_flag.m4 new file mode 100644 index 00000000..f2c0263b --- /dev/null +++ b/build-aux/m4/ax_check_compile_flag.m4 @@ -0,0 +1,466 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional]) +# +# DESCRIPTION +# +# Check for baseline language coverage in the compiler for the specified +# version of the C++ standard. If necessary, add switches to CXX and +# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard) +# or '14' (for the C++14 standard). +# +# The second argument, if specified, indicates whether you insist on an +# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. +# -std=c++11). If neither is specified, you get whatever works, with +# preference for an extended mode. +# +# The third argument, if specified 'mandatory' or if left unspecified, +# indicates that baseline support for the specified C++ standard is +# required and that the macro should error out if no mode with that +# support is found. If specified 'optional', then configuration proceeds +# regardless, after defining HAVE_CXX${VERSION} if and only if a +# supporting mode is found. +# +# LICENSE +# +# Copyright (c) 2008 Benjamin Kosnik +# Copyright (c) 2012 Zack Weinberg +# Copyright (c) 2013 Roy Stogner +# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov +# Copyright (c) 2015 Paul Norman +# Copyright (c) 2015 Moritz Klammler +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 4 + +dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro +dnl (serial version number 13). + +AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl + m4_if([$1], [11], [], + [$1], [14], [], + [$1], [17], [m4_fatal([support for C++17 not yet implemented in AX_CXX_COMPILE_STDCXX])], + [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl + m4_if([$2], [], [], + [$2], [ext], [], + [$2], [noext], [], + [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl + m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true], + [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], + [$3], [optional], [ax_cxx_compile_cxx$1_required=false], + [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) + m4_if([$4], [], [ax_cxx_compile_cxx$1_try_default=true], + [$4], [default], [ax_cxx_compile_cxx$1_try_default=true], + [$4], [nodefault], [ax_cxx_compile_cxx$1_try_default=false], + [m4_fatal([invalid fourth argument `$4' to AX_CXX_COMPILE_STDCXX])]) + AC_LANG_PUSH([C++])dnl + ac_success=no + m4_if([$4], [nodefault], [], [dnl + AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, + ax_cv_cxx_compile_cxx$1, + [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [ax_cv_cxx_compile_cxx$1=yes], + [ax_cv_cxx_compile_cxx$1=no])]) + if test x$ax_cv_cxx_compile_cxx$1 = xyes; then + ac_success=yes + fi]) + m4_if([$2], [noext], [], [dnl + if test x$ac_success = xno; then + for switch in -std=gnu++$1 -std=gnu++0x; do + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) + AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, + $cachevar, + [ac_save_CXX="$CXX" + CXX="$CXX $switch" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [eval $cachevar=yes], + [eval $cachevar=no]) + CXX="$ac_save_CXX"]) + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + fi]) + m4_if([$2], [ext], [], [dnl + if test x$ac_success = xno; then + dnl HP's aCC needs +std=c++11 according to: + dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf + dnl Cray's crayCC needs "-h std=c++11" + for switch in -std=c++$1 -std=c++0x +std=c++$1 "-h std=c++$1"; do + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) + AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, + $cachevar, + [ac_save_CXX="$CXX" + CXX="$CXX $switch" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [eval $cachevar=yes], + [eval $cachevar=no]) + CXX="$ac_save_CXX"]) + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + fi]) + AC_LANG_POP([C++]) + if test x$ax_cxx_compile_cxx$1_required = xtrue; then + if test x$ac_success = xno; then + AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) + fi + fi + if test x$ac_success = xno; then + HAVE_CXX$1=0 + AC_MSG_NOTICE([No compiler with C++$1 support was found]) + else + HAVE_CXX$1=1 + AC_DEFINE(HAVE_CXX$1,1, + [define if the compiler supports basic C++$1 syntax]) + fi + AC_SUBST(HAVE_CXX$1) +]) + + +dnl Test body for checking C++11 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 +) + + +dnl Test body for checking C++14 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 +) + + +dnl Tests for new features in C++11 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ +// If the compiler admits that it is not ready for C++11, why torture it? +// Hopefully, this will speed up the test. +#ifndef __cplusplus +#error "This is not a C++ compiler" +#elif __cplusplus < 201103L +#error "This is not a C++11 compiler" +#else +namespace cxx11 +{ + namespace test_static_assert + { + template + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + } + namespace test_final_override + { + struct Base + { + virtual void f() {} + }; + struct Derived : public Base + { + virtual void f() override {} + }; + } + namespace test_double_right_angle_brackets + { + template < typename T > + struct check {}; + typedef check single_type; + typedef check> double_type; + typedef check>> triple_type; + typedef check>>> quadruple_type; + } + namespace test_decltype + { + int + f() + { + int a = 1; + decltype(a) b = 2; + return a + b; + } + } + namespace test_type_deduction + { + template < typename T1, typename T2 > + struct is_same + { + static const bool value = false; + }; + template < typename T > + struct is_same + { + static const bool value = true; + }; + template < typename T1, typename T2 > + auto + add(T1 a1, T2 a2) -> decltype(a1 + a2) + { + return a1 + a2; + } + int + test(const int c, volatile int v) + { + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == false, ""); + auto ac = c; + auto av = v; + auto sumi = ac + av + 'x'; + auto sumf = ac + av + 1.0; + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == true, ""); + return (sumf > 0.0) ? sumi : add(c, v); + } + } + namespace test_noexcept + { + int f() { return 0; } + int g() noexcept { return 0; } + static_assert(noexcept(f()) == false, ""); + static_assert(noexcept(g()) == true, ""); + } + namespace test_constexpr + { + template < typename CharT > + unsigned long constexpr + strlen_c_r(const CharT *const s, const unsigned long acc) noexcept + { + return *s ? strlen_c_r(s + 1, acc + 1) : acc; + } + template < typename CharT > + unsigned long constexpr + strlen_c(const CharT *const s) noexcept + { + return strlen_c_r(s, 0UL); + } + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("1") == 1UL, ""); + static_assert(strlen_c("example") == 7UL, ""); + static_assert(strlen_c("another\0example") == 7UL, ""); + } + namespace test_rvalue_references + { + template < int N > + struct answer + { + static constexpr int value = N; + }; + answer<1> f(int&) { return answer<1>(); } + answer<2> f(const int&) { return answer<2>(); } + answer<3> f(int&&) { return answer<3>(); } + void + test() + { + int i = 0; + const int c = 0; + static_assert(decltype(f(i))::value == 1, ""); + static_assert(decltype(f(c))::value == 2, ""); + static_assert(decltype(f(0))::value == 3, ""); + } + } + namespace test_uniform_initialization + { + struct test + { + static const int zero {}; + static const int one {1}; + }; + static_assert(test::zero == 0, ""); + static_assert(test::one == 1, ""); + } + namespace test_lambdas + { + void + test1() + { + auto lambda1 = [](){}; + auto lambda2 = lambda1; + lambda1(); + lambda2(); + } + int + test2() + { + auto a = [](int i, int j){ return i + j; }(1, 2); + auto b = []() -> int { return '0'; }(); + auto c = [=](){ return a + b; }(); + auto d = [&](){ return c; }(); + auto e = [a, &b](int x) mutable { + const auto identity = [](int y){ return y; }; + for (auto i = 0; i < a; ++i) + a += b--; + return x + identity(a + b); + }(0); + return a + b + c + d + e; + } + int + test3() + { + const auto nullary = [](){ return 0; }; + const auto unary = [](int x){ return x; }; + using nullary_t = decltype(nullary); + using unary_t = decltype(unary); + const auto higher1st = [](nullary_t f){ return f(); }; + const auto higher2nd = [unary](nullary_t f1){ + return [unary, f1](unary_t f2){ return f2(unary(f1())); }; + }; + return higher1st(nullary) + higher2nd(nullary)(unary); + } + } + namespace test_variadic_templates + { + template + struct sum; + template + struct sum + { + static constexpr auto value = N0 + sum::value; + }; + template <> + struct sum<> + { + static constexpr auto value = 0; + }; + static_assert(sum<>::value == 0, ""); + static_assert(sum<1>::value == 1, ""); + static_assert(sum<23>::value == 23, ""); + static_assert(sum<1, 2>::value == 3, ""); + static_assert(sum<5, 5, 11>::value == 21, ""); + static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); + } + // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae + // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function + // because of this. + namespace test_template_alias_sfinae + { + struct foo {}; + template + using member = typename T::member_type; + template + void func(...) {} + template + void func(member*) {} + void test(); + void test() { func(0); } + } +} // namespace cxx11 +#endif // __cplusplus >= 201103L +]]) + + +dnl Tests for new features in C++14 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ +// If the compiler admits that it is not ready for C++14, why torture it? +// Hopefully, this will speed up the test. +#ifndef __cplusplus +#error "This is not a C++ compiler" +#elif __cplusplus < 201402L +#error "This is not a C++14 compiler" +#else +namespace cxx14 +{ + namespace test_polymorphic_lambdas + { + int + test() + { + const auto lambda = [](auto&&... args){ + const auto istiny = [](auto x){ + return (sizeof(x) == 1UL) ? 1 : 0; + }; + const int aretiny[] = { istiny(args)... }; + return aretiny[0]; + }; + return lambda(1, 1L, 1.0f, '1'); + } + } + namespace test_binary_literals + { + constexpr auto ivii = 0b0000000000101010; + static_assert(ivii == 42, "wrong value"); + } + namespace test_generalized_constexpr + { + template < typename CharT > + constexpr unsigned long + strlen_c(const CharT *const s) noexcept + { + auto length = 0UL; + for (auto p = s; *p; ++p) + ++length; + return length; + } + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("x") == 1UL, ""); + static_assert(strlen_c("test") == 4UL, ""); + static_assert(strlen_c("another\0test") == 7UL, ""); + } + namespace test_lambda_init_capture + { + int + test() + { + auto x = 0; + const auto lambda1 = [a = x](int b){ return a + b; }; + const auto lambda2 = [a = lambda1(x)](){ return a; }; + return lambda2(); + } + } + namespace test_digit_seperators + { + constexpr auto ten_million = 100'000'000; + static_assert(ten_million == 100000000, ""); + } + namespace test_return_type_deduction + { + auto f(int& x) { return x; } + decltype(auto) g(int& x) { return x; } + template < typename T1, typename T2 > + struct is_same + { + static constexpr auto value = false; + }; + template < typename T > + struct is_same + { + static constexpr auto value = true; + }; + int + test() + { + auto x = 0; + static_assert(is_same::value, ""); + static_assert(is_same::value, ""); + return x; + } + } +} // namespace cxx14 +#endif // __cplusplus >= 201402L +]]) \ No newline at end of file diff --git a/src/m4/ax_check_link_flag.m4 b/build-aux/m4/ax_check_link_flag.m4 similarity index 100% rename from src/m4/ax_check_link_flag.m4 rename to build-aux/m4/ax_check_link_flag.m4 diff --git a/src/m4/ax_check_preproc_flag.m4 b/build-aux/m4/ax_check_preproc_flag.m4 similarity index 100% rename from src/m4/ax_check_preproc_flag.m4 rename to build-aux/m4/ax_check_preproc_flag.m4 diff --git a/src/m4/ax_check_compile_flag.m4 b/build-aux/m4/ax_cxx_compile_stdcxx.m4 similarity index 100% rename from src/m4/ax_check_compile_flag.m4 rename to build-aux/m4/ax_cxx_compile_stdcxx.m4 diff --git a/src/m4/ax_pthread.m4 b/build-aux/m4/ax_pthread.m4 similarity index 100% rename from src/m4/ax_pthread.m4 rename to build-aux/m4/ax_pthread.m4 diff --git a/src/m4/bitcoin_find_bdb48.m4 b/build-aux/m4/bitcoin_find_bdb48.m4 similarity index 81% rename from src/m4/bitcoin_find_bdb48.m4 rename to build-aux/m4/bitcoin_find_bdb48.m4 index d48ab718..89eb866b 100644 --- a/src/m4/bitcoin_find_bdb48.m4 +++ b/build-aux/m4/bitcoin_find_bdb48.m4 @@ -12,29 +12,29 @@ AC_DEFUN([BITCOIN_FIND_BDB48],[ done for searchpath in $bdbdirlist ''; do test -n "${searchpath}" && searchpath="${searchpath}/" - AC_TRY_COMPILE([ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include <${searchpath}db_cxx.h> - ],[ + ]],[[ #if !((DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 8) || DB_VERSION_MAJOR > 4) #error "failed to find bdb 4.8+" #endif - ],[ + ]])],[ if test "x$bdbpath" = "xX"; then bdbpath="${searchpath}" fi ],[ continue ]) - AC_TRY_COMPILE([ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include <${searchpath}db_cxx.h> - ],[ + ]],[[ #if !(DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR == 8) #error "failed to find bdb 4.8" #endif - ],[ + ]])],[ bdb48path="${searchpath}" break - ]) + ],[]) done if test "x$bdbpath" = "xX"; then AC_MSG_RESULT([no]) @@ -44,7 +44,7 @@ AC_DEFUN([BITCOIN_FIND_BDB48],[ AC_ARG_WITH([incompatible-bdb],[AS_HELP_STRING([--with-incompatible-bdb], [allow using a bdb version other than 4.8])],[ AC_MSG_WARN([Found Berkeley DB other than 4.8; wallets opened by this build will not be portable!]) ],[ - AC_MSG_ERROR([Found Berkeley DB other than 4.8, required for portable wallets (--with-incompatible-bdb to ignore)]) + AC_MSG_ERROR([Found Berkeley DB other than 4.8, required for portable wallets (--with-incompatible-bdb to ignore or --disable-wallet to disable wallet functionality)]) ]) else BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdb48path}],db_cxx) @@ -60,7 +60,7 @@ AC_DEFUN([BITCOIN_FIND_BDB48],[ ]) done if test "x$BDB_LIBS" = "x"; then - AC_MSG_ERROR(libdb_cxx missing) + AC_MSG_ERROR([libdb_cxx missing, Bitcoin Core requires this library for wallet functionality (--disable-wallet to disable wallet functionality)]) fi AC_SUBST(BDB_LIBS) ]) \ No newline at end of file diff --git a/src/m4/bitcoin_qt.m4 b/build-aux/m4/bitcoin_qt.m4 similarity index 68% rename from src/m4/bitcoin_qt.m4 rename to build-aux/m4/bitcoin_qt.m4 index 27615675..0a4c047c 100644 --- a/src/m4/bitcoin_qt.m4 +++ b/build-aux/m4/bitcoin_qt.m4 @@ -48,8 +48,8 @@ dnl CAUTION: Do not use this inside of a conditional. AC_DEFUN([BITCOIN_QT_INIT],[ dnl enable qt support AC_ARG_WITH([gui], - [AS_HELP_STRING([--with-gui], - [with GUI (no|qt4|qt5|auto. default is auto, qt4 tried first.)])], + [AS_HELP_STRING([--with-gui@<:@=no|qt4|qt5|auto@:>@], + [build bitcoin-qt GUI (default=auto, qt4 tried first)])], [ bitcoin_qt_want_version=$withval if test x$bitcoin_qt_want_version = xyes; then @@ -58,15 +58,17 @@ AC_DEFUN([BITCOIN_QT_INIT],[ fi ], [bitcoin_qt_want_version=auto]) - AC_ARG_WITH([qt-incdir],[AS_HELP_STRING([--with-gui-incdir=INC_DIR],[specify qt include path (overridden by pkgconfig)])], [qt_include_path=$withval], []) - AC_ARG_WITH([qt-libdir],[AS_HELP_STRING([--with-gui-libdir=LIB_DIR],[specify qt lib path (overridden by pkgconfig)])], [qt_lib_path=$withval], []) - AC_ARG_WITH([qt-plugindir],[AS_HELP_STRING([--with-gui-plugindir=PLUGIN_DIR],[specify qt plugin path (overridden by pkgconfig)])], [qt_plugin_path=$withval], []) - AC_ARG_WITH([qt-bindir],[AS_HELP_STRING([--with-gui-bindir=BIN_DIR],[specify qt bin path])], [qt_bin_path=$withval], []) + AC_ARG_WITH([qt-incdir],[AS_HELP_STRING([--with-qt-incdir=INC_DIR],[specify qt include path (overridden by pkgconfig)])], [qt_include_path=$withval], []) + AC_ARG_WITH([qt-libdir],[AS_HELP_STRING([--with-qt-libdir=LIB_DIR],[specify qt lib path (overridden by pkgconfig)])], [qt_lib_path=$withval], []) + AC_ARG_WITH([qt-plugindir],[AS_HELP_STRING([--with-qt-plugindir=PLUGIN_DIR],[specify qt plugin path (overridden by pkgconfig)])], [qt_plugin_path=$withval], []) + AC_ARG_WITH([qt-translationdir],[AS_HELP_STRING([--with-qt-translationdir=PLUGIN_DIR],[specify qt translation path (overridden by pkgconfig)])], [qt_translation_path=$withval], []) + AC_ARG_WITH([qt-bindir],[AS_HELP_STRING([--with-qt-bindir=BIN_DIR],[specify qt bin path])], [qt_bin_path=$withval], []) AC_ARG_WITH([qtdbus], [AS_HELP_STRING([--with-qtdbus], [enable DBus support (default is yes if qt is enabled and QtDBus is found)])], [use_dbus=$withval], [use_dbus=auto]) + AC_SUBST(QT_TRANSLATION_DIR,$qt_translation_path) ]) dnl Find the appropriate version of Qt libraries and includes. @@ -78,23 +80,83 @@ dnl Outputs: Sets variables for all qt-related tools. dnl Outputs: bitcoin_enable_qt, bitcoin_enable_qt_dbus, bitcoin_enable_qt_test AC_DEFUN([BITCOIN_QT_CONFIGURE],[ use_pkgconfig=$1 - if test x$use_pkgconfig == x; then + if test x$use_pkgconfig = x; then use_pkgconfig=yes fi if test x$use_pkgconfig = xyes; then - if test x$PKG_CONFIG == x; then - AC_MSG_ERROR(pkg-config not found.) - fi BITCOIN_QT_CHECK([_BITCOIN_QT_FIND_LIBS_WITH_PKGCONFIG([$2])]) else BITCOIN_QT_CHECK([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG]) fi + dnl This is ugly and complicated. Yuck. Works as follows: + dnl We can't discern whether Qt4 builds are static or not. For Qt5, we can + dnl check a header to find out. When Qt is built statically, some plugins must + dnl be linked into the final binary as well. These plugins have changed between + dnl Qt4 and Qt5. With Qt5, languages moved into core and the WindowsIntegration + dnl plugin was added. Since we can't tell if Qt4 is static or not, it is + dnl assumed for windows builds. + dnl _BITCOIN_QT_CHECK_STATIC_PLUGINS does a quick link-check and appends the + dnl results to QT_LIBS. + BITCOIN_QT_CHECK([ + TEMP_CPPFLAGS=$CPPFLAGS + CPPFLAGS=$QT_INCLUDES + if test x$bitcoin_qt_got_major_vers = x5; then + _BITCOIN_QT_IS_STATIC + if test x$bitcoin_cv_static_qt = xyes; then + AC_DEFINE(QT_STATICPLUGIN, 1, [Define this symbol if qt plugins are static]) + if test x$qt_plugin_path != x; then + QT_LIBS="$QT_LIBS -L$qt_plugin_path/accessible" + QT_LIBS="$QT_LIBS -L$qt_plugin_path/platforms" + fi + if test x$use_pkgconfig = xyes; then + PKG_CHECK_MODULES([QTPLATFORM], [Qt5PlatformSupport], [QT_LIBS="$QTPLATFORM_LIBS $QT_LIBS"]) + fi + _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(AccessibleFactory)], [-lqtaccessiblewidgets]) + if test x$TARGET_OS = xwindows; then + _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)],[-lqwindows]) + AC_DEFINE(QT_QPA_PLATFORM_WINDOWS, 1, [Define this symbol if the qt platform is windows]) + elif test x$TARGET_OS = xlinux; then + PKG_CHECK_MODULES([X11XCB], [x11-xcb], [QT_LIBS="$X11XCB_LIBS $QT_LIBS"]) + _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QXcbIntegrationPlugin)],[-lqxcb -lxcb-static]) + AC_DEFINE(QT_QPA_PLATFORM_XCB, 1, [Define this symbol if the qt platform is xcb]) + elif test x$TARGET_OS = xdarwin; then + if test x$use_pkgconfig = xyes; then + PKG_CHECK_MODULES([QTPRINT], [Qt5PrintSupport], [QT_LIBS="$QTPRINT_LIBS $QT_LIBS"]) + fi + AX_CHECK_LINK_FLAG([[-framework IOKit]],[QT_LIBS="$QT_LIBS -framework IOKit"],[AC_MSG_ERROR(could not iokit framework)]) + _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin)],[-lqcocoa]) + AC_DEFINE(QT_QPA_PLATFORM_COCOA, 1, [Define this symbol if the qt platform is cocoa]) + fi + fi + else + if test x$TARGET_OS = xwindows; then + AC_DEFINE(QT_STATICPLUGIN, 1, [Define this symbol if qt plugins are static]) + if test x$qt_plugin_path != x; then + QT_LIBS="$QT_LIBS -L$qt_plugin_path/accessible" + QT_LIBS="$QT_LIBS -L$qt_plugin_path/codecs" + fi + _BITCOIN_QT_CHECK_STATIC_PLUGINS([ + Q_IMPORT_PLUGIN(qcncodecs) + Q_IMPORT_PLUGIN(qjpcodecs) + Q_IMPORT_PLUGIN(qtwcodecs) + Q_IMPORT_PLUGIN(qkrcodecs) + Q_IMPORT_PLUGIN(AccessibleFactory)], + [-lqcncodecs -lqjpcodecs -lqtwcodecs -lqkrcodecs -lqtaccessiblewidgets]) + fi + fi + CPPFLAGS=$TEMP_CPPFLAGS + ]) + if test x$use_pkgconfig$qt_bin_path = xyes; then + if test x$bitcoin_qt_got_major_vers = x5; then + qt_bin_path="`$PKG_CONFIG --variable=host_bins Qt5Core 2>/dev/null`" + fi + 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([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([LRELEASE], [lrelease-qt${bitcoin_qt_got_major_vers} lrelease${bitcoin_qt_got_major_vers} lrelease], $qt_bin_path) BITCOIN_QT_PATH_PROGS([LUPDATE], [lupdate-qt${bitcoin_qt_got_major_vers} lupdate${bitcoin_qt_got_major_vers} lupdate],$qt_bin_path, yes) - MOC_DEFS='-DHAVE_CONFIG_H -I$(top_srcdir)/src' + MOC_DEFS='-DHAVE_CONFIG_H -I$(srcdir)' case $host in *darwin*) BITCOIN_QT_CHECK([ @@ -103,23 +165,27 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[ AX_CHECK_LINK_FLAG([[$base_frameworks]],[QT_LIBS="$QT_LIBS $base_frameworks"],[AC_MSG_ERROR(could not find base frameworks)]) ]) ;; + *mingw*) + BITCOIN_QT_CHECK([ + AX_CHECK_LINK_FLAG([[-mwindows]],[QT_LDFLAGS="$QT_LDFLAGS -mwindows"],[AC_MSG_WARN(-mwindows linker support not detected)]) + ]) esac dnl enable qt support - AC_MSG_CHECKING(if GUI should be enabled) + AC_MSG_CHECKING(whether to build Bitcoin Core GUI) BITCOIN_QT_CHECK([ bitcoin_enable_qt=yes bitcoin_enable_qt_test=yes if test x$have_qt_test = xno; then bitcoin_enable_qt_test=no fi - bitcoin_enable_qt_dbus=yes - if test x$have_qt_dbus = xno; then - bitcoin_enable_qt_dbus=no - if test x$use_dbus = xyes; then - AC_MSG_ERROR("libQtDBus not found. Install libQtDBus or remove --with-qtdbus.") - fi + bitcoin_enable_qt_dbus=no + if test x$use_dbus != xno && test x$have_qt_dbus = xyes; then + bitcoin_enable_qt_dbus=yes + fi + if test x$use_dbus = xyes && test x$have_qt_dbus = xno; then + AC_MSG_ERROR("libQtDBus not found. Install libQtDBus or remove --with-qtdbus.") fi - if test x$LUPDATE == x; then + if test x$LUPDATE = x; then AC_MSG_WARN("lupdate is required to update qt translations") fi ],[ @@ -128,6 +194,7 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[ AC_MSG_RESULT([$bitcoin_enable_qt (Qt${bitcoin_qt_got_major_vers})]) AC_SUBST(QT_INCLUDES) AC_SUBST(QT_LIBS) + AC_SUBST(QT_LDFLAGS) AC_SUBST(QT_DBUS_INCLUDES) AC_SUBST(QT_DBUS_LIBS) AC_SUBST(QT_TEST_INCLUDES) @@ -145,17 +212,17 @@ dnl Requires: INCLUDES must be populated as necessary. dnl Output: bitcoin_cv_qt5=yes|no AC_DEFUN([_BITCOIN_QT_CHECK_QT5],[ AC_CACHE_CHECK(for Qt 5, bitcoin_cv_qt5,[ - AC_TRY_COMPILE( - [#include ], - [ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM( + [[#include ]], + [[ #if QT_VERSION < 0x050000 choke me #else return 0; #endif - ], - bitcoin_cv_qt5=yes, - bitcoin_cv_qt5=no) + ]])], + [bitcoin_cv_qt5=yes], + [bitcoin_cv_qt5=no]) ])]) dnl Internal. Check if the linked version of Qt was built as static libs. @@ -165,15 +232,15 @@ dnl Output: bitcoin_cv_static_qt=yes|no dnl Output: Defines QT_STATICPLUGIN if plugins are static. AC_DEFUN([_BITCOIN_QT_IS_STATIC],[ AC_CACHE_CHECK(for static Qt, bitcoin_cv_static_qt,[ - AC_TRY_COMPILE( - [#include ], - [ + AC_COMPILE_IFELSE([AC_LANG_PROGRAM( + [[#include ]], + [[ #if defined(QT_STATIC) return 0; #else choke me #endif - ], + ]])], [bitcoin_cv_static_qt=yes], [bitcoin_cv_static_qt=no]) ]) @@ -191,13 +258,13 @@ AC_DEFUN([_BITCOIN_QT_CHECK_STATIC_PLUGINS],[ AC_MSG_CHECKING(for static Qt plugins: $2) CHECK_STATIC_PLUGINS_TEMP_LIBS="$LIBS" LIBS="$2 $QT_LIBS $LIBS" - AC_TRY_LINK([ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #define QT_STATICPLUGIN #include - $1], - [return 0;], + $1]], + [[return 0;]])], [AC_MSG_RESULT(yes); QT_LIBS="$2 $QT_LIBS"], - [AC_MSG_RESULT(no)]; BITCOIN_QT_FAIL(Could not resolve: $2)) + [AC_MSG_RESULT(no); BITCOIN_QT_FAIL(Could not resolve: $2)]) LIBS="$CHECK_STATIC_PLUGINS_TEMP_LIBS" ]) @@ -212,10 +279,10 @@ dnl Outputs: have_qt_test and have_qt_dbus are set (if applicable) to yes|no. AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITH_PKGCONFIG],[ m4_ifdef([PKG_CHECK_MODULES],[ auto_priority_version=$1 - if test x$auto_priority_version == x; then + if test x$auto_priority_version = x; then auto_priority_version=qt5 fi - if test x$bitcoin_qt_want_version == xqt5 || ( test x$bitcoin_qt_want_version == xauto && test x$auto_priority_version == xqt5 ); then + if test x$bitcoin_qt_want_version = xqt5 || ( test x$bitcoin_qt_want_version = xauto && test x$auto_priority_version = xqt5 ); then QT_LIB_PREFIX=Qt5 bitcoin_qt_got_major_vers=5 else @@ -225,13 +292,13 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITH_PKGCONFIG],[ qt5_modules="Qt5Core Qt5Gui Qt5Network Qt5Widgets" qt4_modules="QtCore QtGui QtNetwork" BITCOIN_QT_CHECK([ - if test x$bitcoin_qt_want_version == xqt5 || ( test x$bitcoin_qt_want_version == xauto && test x$auto_priority_version == xqt5 ); then + if test x$bitcoin_qt_want_version = xqt5 || ( test x$bitcoin_qt_want_version = xauto && test x$auto_priority_version = xqt5 ); then PKG_CHECK_MODULES([QT], [$qt5_modules], [QT_INCLUDES="$QT_CFLAGS"; have_qt=yes],[have_qt=no]) - elif test x$bitcoin_qt_want_version == xqt4 || ( test x$bitcoin_qt_want_version == xauto && test x$auto_priority_version == xqt4 ); then + elif test x$bitcoin_qt_want_version = xqt4 || ( test x$bitcoin_qt_want_version = xauto && test x$auto_priority_version = xqt4 ); then PKG_CHECK_MODULES([QT], [$qt4_modules], [QT_INCLUDES="$QT_CFLAGS"; have_qt=yes], [have_qt=no]) fi 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 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 @@ -276,7 +343,7 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[ if test x$bitcoin_qt_want_version = xauto; then _BITCOIN_QT_CHECK_QT5 fi - if test x$bitcoin_cv_qt5 == xyes || test x$bitcoin_qt_want_version = xqt5; then + if test x$bitcoin_cv_qt5 = xyes || test x$bitcoin_qt_want_version = xqt5; then QT_LIB_PREFIX=Qt5 bitcoin_qt_got_major_vers=5 else @@ -289,58 +356,22 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[ if test x$qt_lib_path != x; then LIBS="$LIBS -L$qt_lib_path" fi - if test x$qt_plugin_path != x; then - LIBS="$LIBS -L$qt_plugin_path/accessible" - if test x$bitcoin_qt_got_major_vers == x5; then - LIBS="$LIBS -L$qt_plugin_path/platforms" - else - LIBS="$LIBS -L$qt_plugin_path/codecs" - fi - fi - if test x$TARGET_OS == xwindows; then + if test x$TARGET_OS = xwindows; then AC_CHECK_LIB([imm32], [main],, BITCOIN_QT_FAIL(libimm32 not found)) fi ]) - BITCOIN_QT_CHECK(AC_CHECK_LIB([z] ,[main],,BITCOIN_QT_FAIL(zlib not found))) - BITCOIN_QT_CHECK(AC_CHECK_LIB([png] ,[main],,BITCOIN_QT_FAIL(png not found))) + BITCOIN_QT_CHECK(AC_CHECK_LIB([z] ,[main],,AC_MSG_WARN([zlib not found. Assuming qt has it built-in]))) + BITCOIN_QT_CHECK(AC_CHECK_LIB([png] ,[main],,AC_MSG_WARN([libpng not found. Assuming qt has it built-in]))) + BITCOIN_QT_CHECK(AC_CHECK_LIB([jpeg] ,[main],,AC_MSG_WARN([libjpeg not found. Assuming qt has it built-in]))) + BITCOIN_QT_CHECK(AC_CHECK_LIB([pcre16] ,[main],,AC_MSG_WARN([libpcre16 not found. Assuming qt has it built-in]))) BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Core] ,[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXCore not found))) BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Gui] ,[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXGui not found))) BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Network],[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXNetwork not found))) - if test x$bitcoin_qt_got_major_vers == x5; then + if test x$bitcoin_qt_got_major_vers = x5; then BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Widgets],[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXWidgets not found))) fi QT_LIBS="$LIBS" LIBS="$TEMP_LIBS" - dnl This is ugly and complicated. Yuck. Works as follows: - dnl We can't discern whether Qt4 builds are static or not. For Qt5, we can - dnl check a header to find out. When Qt is built statically, some plugins must - dnl be linked into the final binary as well. These plugins have changed between - dnl Qt4 and Qt5. With Qt5, languages moved into core and the WindowsIntegration - dnl plugin was added. Since we can't tell if Qt4 is static or not, it is - dnl assumed for all non-pkg-config builds. - dnl _BITCOIN_QT_CHECK_STATIC_PLUGINS does a quick link-check and appends the - dnl results to QT_LIBS. - BITCOIN_QT_CHECK([ - if test x$bitcoin_qt_got_major_vers == x5; then - _BITCOIN_QT_IS_STATIC - if test x$bitcoin_cv_static_qt == xyes; then - AC_DEFINE(QT_STATICPLUGIN, 1, [Define this symbol if qt plugins are static]) - _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(AccessibleFactory)], [-lqtaccessiblewidgets]) - if test x$TARGET_OS == xwindows; then - _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)],[-lqwindows]) - fi - fi - else - AC_DEFINE(QT_STATICPLUGIN, 1, [Define this symbol if qt plugins are static]) - _BITCOIN_QT_CHECK_STATIC_PLUGINS([ - Q_IMPORT_PLUGIN(qcncodecs) - Q_IMPORT_PLUGIN(qjpcodecs) - Q_IMPORT_PLUGIN(qtwcodecs) - Q_IMPORT_PLUGIN(qkrcodecs) - Q_IMPORT_PLUGIN(AccessibleFactory)], - [-lqcncodecs -lqjpcodecs -lqtwcodecs -lqkrcodecs -lqtaccessiblewidgets]) - fi - ]) BITCOIN_QT_CHECK([ LIBS= if test x$qt_lib_path != x; then diff --git a/src/m4/bitcoin_subdir_to_include.m4 b/build-aux/m4/bitcoin_subdir_to_include.m4 similarity index 54% rename from src/m4/bitcoin_subdir_to_include.m4 rename to build-aux/m4/bitcoin_subdir_to_include.m4 index 2b46ffb7..66f106c7 100644 --- a/src/m4/bitcoin_subdir_to_include.m4 +++ b/build-aux/m4/bitcoin_subdir_to_include.m4 @@ -5,8 +5,10 @@ AC_DEFUN([BITCOIN_SUBDIR_TO_INCLUDE],[ AC_MSG_RESULT([default]) else echo "#include <$2$3.h>" >conftest.cpp - newinclpath=`${CXXCPP} -M conftest.cpp 2>/dev/null | [ tr -d '\\n\\r\\\\' | sed -e 's/^.*[[:space:]:]\(\/[^[:space:]]*\)]$3[\.h[[:space:]].*$/\1/' -e t -e d`] + newinclpath=`${CXXCPP} ${CPPFLAGS} -M conftest.cpp 2>/dev/null | [ tr -d '\\n\\r\\\\' | sed -e 's/^.*[[:space:]:]\(\/[^[:space:]]*\)]$3[\.h[[:space:]].*$/\1/' -e t -e d`] AC_MSG_RESULT([${newinclpath}]) - eval "$1=\"\$$1\"' -I${newinclpath}'" + if test "x${newinclpath}" != "x"; then + eval "$1=\"\$$1\"' -I${newinclpath}'" + fi fi -]) \ No newline at end of file +]) diff --git a/src/m4/libtool.m4 b/build-aux/m4/libtool.m4 similarity index 100% rename from src/m4/libtool.m4 rename to build-aux/m4/libtool.m4 diff --git a/src/m4/ltoptions.m4 b/build-aux/m4/ltoptions.m4 similarity index 100% rename from src/m4/ltoptions.m4 rename to build-aux/m4/ltoptions.m4 diff --git a/src/m4/ltsugar.m4 b/build-aux/m4/ltsugar.m4 similarity index 100% rename from src/m4/ltsugar.m4 rename to build-aux/m4/ltsugar.m4 diff --git a/src/m4/ltversion.m4 b/build-aux/m4/ltversion.m4 similarity index 100% rename from src/m4/ltversion.m4 rename to build-aux/m4/ltversion.m4 diff --git a/src/m4/lt~obsolete.m4 b/build-aux/m4/lt~obsolete.m4 similarity index 100% rename from src/m4/lt~obsolete.m4 rename to build-aux/m4/lt~obsolete.m4 diff --git a/build-aux/missing b/build-aux/missing new file mode 100755 index 00000000..8d0eaad2 --- /dev/null +++ b/build-aux/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 1996-2020 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=https://www.perl.org/ +flex_URL=https://github.com/westes/flex +gnu_software_URL=https://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/build-aux/test-driver b/build-aux/test-driver new file mode 100755 index 00000000..89dba1e0 --- /dev/null +++ b/build-aux/test-driver @@ -0,0 +1,148 @@ +#! /bin/sh +# test-driver - basic testsuite driver script. + +scriptversion=2018-03-07.03; # UTC + +# Copyright (C) 2011-2020 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +# Make unconditional expansion of undefined variables an error. This +# helps a lot in preventing typo-related bugs. +set -u + +usage_error () +{ + echo "$0: $*" >&2 + print_usage >&2 + exit 2 +} + +print_usage () +{ + cat <$log_file 2>&1 +estatus=$? + +if test $enable_hard_errors = no && test $estatus -eq 99; then + tweaked_estatus=1 +else + tweaked_estatus=$estatus +fi + +case $tweaked_estatus:$expect_failure in + 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; + 0:*) col=$grn res=PASS recheck=no gcopy=no;; + 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; + 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; + *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; + *:*) col=$red res=FAIL recheck=yes gcopy=yes;; +esac + +# Report the test outcome and exit status in the logs, so that one can +# know whether the test passed or failed simply by looking at the '.log' +# file, without the need of also peaking into the corresponding '.trs' +# file (automake bug#11814). +echo "$res $test_name (exit status: $estatus)" >>$log_file + +# Report outcome to console. +echo "${col}${res}${std}: $test_name" + +# Register the test result, and other relevant metadata. +echo ":test-result: $res" > $trs_file +echo ":global-test-result: $res" >> $trs_file +echo ":recheck: $recheck" >> $trs_file +echo ":copy-in-global-log: $gcopy" >> $trs_file + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/configure.ac b/configure.ac index d65ad905..035ce326 100644 --- a/configure.ac +++ b/configure.ac @@ -7,8 +7,10 @@ define(_CLIENT_VERSION_BUILD, 4) define(_CLIENT_VERSION_IS_RELEASE, true) define(_COPYRIGHT_YEAR, 2014) AC_INIT([Bitcoin Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[info@bitcoin.org],[bitcoin]) -AC_CONFIG_AUX_DIR([src/build-aux]) -AC_CONFIG_MACRO_DIR([src/m4]) +AC_CONFIG_SRCDIR([src/main.cpp]) +AC_CONFIG_HEADERS([src/config/bitcoin-config.h]) +AC_CONFIG_AUX_DIR([build-aux]) +AC_CONFIG_MACRO_DIR([build-aux/m4]) LT_INIT([disable-shared]) AC_CANONICAL_HOST AH_TOP([#ifndef BITCOIN_CONFIG_H]) @@ -44,6 +46,30 @@ AM_MAINTAINER_MODE([enable]) dnl make the compilation flags quiet unless V=1 is used m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) +dnl Checks for programs. +AC_PROG_CXX +AC_PROG_CC +AC_PROG_CPP +AC_PROG_CXXCPP +AC_PROG_INSTALL +AC_PROG_OBJC +AC_PROG_LN_S +m4_ifdef([AC_PROG_OBJCXX],[AC_PROG_OBJCXX]) +AC_PROG_MKDIR_P +AC_PROG_SED +AC_PATH_TOOL(AR, ar) +AC_PATH_TOOL(RANLIB, ranlib) +AC_PATH_TOOL(STRIP, strip) +AC_PATH_TOOL(GCOV, gcov) +AC_PATH_PROG(LCOV, lcov) +AC_PATH_PROG(JAVA, java) +AC_PATH_PROG(GENHTML, genhtml) +AC_PATH_PROG([GIT], [git]) +AC_PATH_PROG(CCACHE,ccache) +AC_PATH_PROG(XGETTEXT,xgettext) +AC_PATH_PROG(HEXDUMP,hexdump) +PKG_PROG_PKG_CONFIG + # Enable wallet AC_ARG_ENABLE([wallet], [AS_HELP_STRING([--enable-wallet], @@ -90,9 +116,15 @@ AC_ARG_ENABLE([hardening], [use_hardening=$enableval], [use_hardening=yes]) +AC_ARG_ENABLE([reduce-exports], + [AS_HELP_STRING([--enable-reduce-exports], + [attempt to reduce exported symbols in the resulting executables (default is yes)])], + [use_reduce_exports=$enableval], + [use_reduce_exports=auto]) + AC_ARG_ENABLE([ccache], [AS_HELP_STRING([--enable-ccache], - [enable building with ccache (default is yes if ccache is found)])], + [use ccache for building (default is yes if ccache is found)])], [use_ccache=$enableval], [use_ccache=auto]) @@ -110,34 +142,6 @@ AC_ARG_ENABLE([glibc-back-compat], AC_ARG_WITH([protoc-bindir],[AS_HELP_STRING([--with-protoc-bindir=BIN_DIR],[specify protoc bin path])], [protoc_bin_path=$withval], []) - -AC_CONFIG_SRCDIR([src]) -AC_CONFIG_HEADERS([src/config/bitcoin-config.h]) - -dnl Checks for programs. -AC_PROG_CXX -AC_PROG_CC -AC_PROG_CPP -AC_PROG_CXXCPP -AC_PROG_INSTALL -AC_PROG_OBJC -AC_PROG_LN_S -m4_ifdef([AC_PROG_OBJCXX],[AC_PROG_OBJCXX]) -AC_PROG_MKDIR_P -AC_PROG_SED -AC_PATH_TOOL(AR, ar) -AC_PATH_TOOL(RANLIB, ranlib) -AC_PATH_TOOL(STRIP, strip) -AC_PATH_TOOL(GCOV, gcov) -AC_PATH_PROG(LCOV, lcov) -AC_PATH_PROG(JAVA, java) -AC_PATH_PROG(GENHTML, genhtml) -AC_PATH_PROG([GIT], [git]) -AC_PATH_PROG(CCACHE,ccache) -AC_PATH_PROG(XGETTEXT,xgettext) -AC_PATH_PROG(HEXDUMP,hexdump) -PKG_PROG_PKG_CONFIG - # Enable debug AC_ARG_ENABLE([debug], [AS_HELP_STRING([--enable-debug], @@ -155,11 +159,9 @@ if test "x$enable_debug" = xyes; then fi fi - ## TODO: Remove these hard-coded paths and flags. They are here for the sake of ## compatibility with the legacy buildsystem. ## -CXXFLAGS="$CXXFLAGS -Wall -Wextra -Wformat -Wformat-security -Wno-unused-parameter" if test "x$CXXFLAGS_overridden" = "xno"; then CXXFLAGS="$CXXFLAGS -Wall -Wextra -Wformat -Wformat-security -Wno-unused-parameter" fi @@ -195,10 +197,13 @@ case $host in AC_CHECK_LIB([iphlpapi], [main],, AC_MSG_ERROR(lib missing)) AC_CHECK_LIB([crypt32], [main],, AC_MSG_ERROR(lib missing)) - AX_CHECK_LINK_FLAG([[-static]],[LDFLAGS="$LDFLAGS -static"]) AX_CHECK_LINK_FLAG([[-static-libgcc]],[LDFLAGS="$LDFLAGS -static-libgcc"]) AX_CHECK_LINK_FLAG([[-static-libstdc++]],[LDFLAGS="$LDFLAGS -static-libstdc++"]) + # -static is interpreted by libtool, where it has a different meaning. + # In libtool-speak, it's -all-static. + AX_CHECK_LINK_FLAG([[-static]],[LDFLAGS="$LDFLAGS -static"; LIBTOOL_LDFLAGS="$LIBTOOL_LDFLAGS -all-static"]) + AC_PATH_PROG([MAKENSIS], [makensis], none) if test x$MAKENSIS = xnone; then AC_MSG_WARN("makensis not found. Cannot create installer.") @@ -235,7 +240,7 @@ case $host in AC_CHECK_PROG([BREW],brew, brew) if test x$BREW = xbrew; then - dnl These Homebrew packages may be bottled, meaning that they won't be found + dnl These Homebrew packages may be keg-only, meaning that they won't be found dnl in expected paths because they may conflict with system files. Ask dnl Homebrew where each one is located, then adjust paths accordingly. dnl It's safe to add these paths even if the functionality is disabled by @@ -269,10 +274,11 @@ case $host in fi CPPFLAGS="$CPPFLAGS -DMAC_OSX" - TESTDEFS="-DBOOST_TEST_DYN_LINK" + ;; + *linux*) + TARGET_OS=linux ;; *) - TESTDEFS="-DBOOST_TEST_DYN_LINK" ;; esac @@ -315,7 +321,6 @@ AC_C_BIGENDIAN([AC_MSG_ERROR("Big Endian not supported")]) dnl Check for pthread compile/link requirements AX_PTHREAD -INCLUDES="$INCLUDES $PTHREAD_CFLAGS" # The following macro will add the necessary defines to bitcoin-config.h, but # they also need to be passed down to any subprojects. Pull the results out of @@ -343,15 +348,21 @@ if test x$use_glibc_compat != xno; then #__fdelt_chk's params and return type have changed from long unsigned int to long int. # See which one is present here. AC_MSG_CHECKING(__fdelt_chk type) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#define __USE_FORTIFY_LEVEL 2 + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#ifdef _FORTIFY_SOURCE + #undef _FORTIFY_SOURCE + #endif + #define _FORTIFY_SOURCE 2 #include - extern "C" long unsigned int __fdelt_warn(long unsigned int);]], [[]])],[ fdelt_type="long unsigned int"],[ fdelt_type="long int"]) + extern "C" long unsigned int __fdelt_warn(long unsigned int);]],[[]])], + [ fdelt_type="long unsigned int"], + [ fdelt_type="long int"]) AC_MSG_RESULT($fdelt_type) AC_DEFINE_UNQUOTED(FDELT_TYPE, $fdelt_type,[parameter and return value type for __fdelt_chk]) fi if test x$use_hardening != xno; then + AX_CHECK_COMPILE_FLAG([-Wstack-protector],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wstack-protector"]) AX_CHECK_COMPILE_FLAG([-fstack-protector-all],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fstack-protector-all"]) AX_CHECK_PREPROC_FLAG([-D_FORTIFY_SOURCE=2],[ @@ -383,7 +394,7 @@ if test x$TARGET_OS = xdarwin; then AX_CHECK_LINK_FLAG([[-Wl,-dead_strip]], [LDFLAGS="$LDFLAGS -Wl,-dead_strip"]) fi -AC_CHECK_HEADERS([endian.h stdio.h stdlib.h unistd.h strings.h sys/types.h sys/stat.h sys/select.h]) +AC_CHECK_HEADERS([endian.h stdio.h stdlib.h unistd.h strings.h sys/types.h sys/stat.h sys/select.h sys/prctl.h]) AC_SEARCH_LIBS([getaddrinfo_a], [anl], [AC_DEFINE(HAVE_GETADDRINFO_A, 1, [Define this symbol if you have getaddrinfo_a])]) AC_SEARCH_LIBS([inet_pton], [nsl resolv], [AC_DEFINE(HAVE_INET_PTON, 1, [Define this symbol if you have inet_pton])]) @@ -394,8 +405,43 @@ AC_CHECK_DECLS([le32toh, le64toh, htole32, htole64, be32toh, be64toh, htobe32, h dnl Check for MSG_NOSIGNAL AC_MSG_CHECKING(for MSG_NOSIGNAL) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ int f = MSG_NOSIGNAL; ]])],[ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_MSG_NOSIGNAL, 1,[Define this symbol if you have MSG_NOSIGNAL]) ],[ AC_MSG_RESULT(no) -]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ int f = MSG_NOSIGNAL; ]])], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_MSG_NOSIGNAL, 1,[Define this symbol if you have MSG_NOSIGNAL]) ], + [ AC_MSG_RESULT(no)] +) + +AC_SEARCH_LIBS([clock_gettime],[rt]) + +AC_MSG_CHECKING([for visibility attribute]) +AC_LINK_IFELSE([AC_LANG_SOURCE([ + int foo_def( void ) __attribute__((visibility("default"))); + int main(){} + ])], + [ + AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE,1,[Define if the visibility attribute is supported.]) + AC_MSG_RESULT(yes) + ], + [ + AC_MSG_RESULT(no) + if test x$use_reduce_exports = xyes; then + AC_MSG_ERROR([Cannot find a working visibility attribute. Use --disable-reduced-exports.]) + fi + AC_MSG_WARN([Cannot find a working visibility attribute. Disabling reduced exports.]) + use_reduce_exports=no + ] +) + +if test x$use_reduce_exports != xno; then + AX_CHECK_COMPILE_FLAG([-fvisibility=hidden],[RE_CXXFLAGS="-fvisibility=hidden"], + [ + if test x$use_reduce_exports = xyes; then + AC_MSG_ERROR([Cannot set default symbol visibility. Use --disable-reduced-exports.]) + fi + AC_MSG_WARN([Cannot set default symbol visibility. Disabling reduced exports.]) + use_reduce_exports=no + ]) +fi LEVELDB_CPPFLAGS= LIBLEVELDB= @@ -427,6 +473,40 @@ AX_BOOST_PROGRAM_OPTIONS AX_BOOST_THREAD AX_BOOST_CHRONO + +if test x$use_reduce_exports != xno; then + AC_MSG_CHECKING([for working boost reduced exports]) + TEMP_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS" + AC_PREPROC_IFELSE([AC_LANG_PROGRAM([[ + @%:@include + ]], [[ + #if BOOST_VERSION >= 104900 + // Everything is okay + #else + # error Boost version is too old + #endif + ]])],[ + AC_MSG_RESULT(yes) + ],[: + if test x$use_reduce_exports = xauto; then + use_reduce_exports=no + else + if test x$use_reduce_exports = xyes; then + AC_MSG_ERROR([boost versions < 1.49 are known to be broken with reduced exports. Use --disable-reduced-exports.]) + fi + fi + AC_MSG_RESULT(no) + AC_MSG_WARN([boost versions < 1.49 are known to have symbol visibility issues. Disabling reduced exports.]) + ]) + CPPFLAGS="$TEMP_CPPFLAGS" +fi + +if test x$use_reduce_exports != xno; then + CXXFLAGS="$CXXFLAGS $RE_CXXFLAGS" + AX_CHECK_LINK_FLAG([[-Wl,--exclude-libs,ALL]], [RELDFLAGS="-Wl,--exclude-libs,ALL"]) +fi + if test x$use_tests = xyes; then if test x$HEXDUMP = x; then @@ -455,7 +535,6 @@ if test x$use_tests = xyes; then fi BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRAM_OPTIONS_LIB $BOOST_THREAD_LIB" -BOOST_INCLUDES="$BOOST_CPPFLAGS" 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 @@ -464,60 +543,62 @@ dnl after 1.56. dnl If neither is available, abort. dnl If sleep_for is used, boost_chrono becomes a requirement. if test x$ax_cv_boost_chrono = xyes; then -dnl Allow passing extra needed dependency libraries for boost-chrono from static gitian build -BOOST_CHRONO_LIB="$BOOST_CHRONO_LIB $BOOST_CHRONO_EXTRALIBS" - TEMP_LIBS="$LIBS" -LIBS="$LIBS $BOOST_LIBS $BOOST_CHRONO_LIB" +LIBS="$BOOST_LIBS $BOOST_CHRONO_LIB $LIBS" TEMP_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include #include - ]], [[ + ]],[[ #if BOOST_VERSION >= 105000 && (!defined(BOOST_HAS_NANOSLEEP) || BOOST_VERSION >= 105200) boost::this_thread::sleep_for(boost::chrono::milliseconds(0)); #else choke me #endif - ]])],[boost_sleep=yes; BOOST_LIBS="$BOOST_LIBS $BOOST_CHRONO_LIB"; - AC_DEFINE(HAVE_WORKING_BOOST_SLEEP_FOR, 1, [Define this symbol if boost sleep_for works])],[boost_sleep=no]) + ]])], + [boost_sleep=yes; BOOST_LIBS="$BOOST_LIBS $BOOST_CHRONO_LIB"; + AC_DEFINE(HAVE_WORKING_BOOST_SLEEP_FOR, 1, [Define this symbol if boost sleep_for works])], + [boost_sleep=no]) LIBS="$TEMP_LIBS" CPPFLAGS="$TEMP_CPPFLAGS" fi if test x$boost_sleep != xyes; then TEMP_LIBS="$LIBS" +LIBS="$BOOST_LIBS $LIBS" TEMP_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include #include #include - ]], [[ + ]],[[ #if BOOST_VERSION <= 105600 boost::this_thread::sleep(boost::posix_time::milliseconds(0)); #else choke me #endif - ]])],[boost_sleep=yes; AC_DEFINE(HAVE_WORKING_BOOST_SLEEP, 1, [Define this symbol if boost sleep works])],[boost_sleep=no]) + ]])], + [boost_sleep=yes; AC_DEFINE(HAVE_WORKING_BOOST_SLEEP, 1, [Define this symbol if boost sleep works])], + [boost_sleep=no]) LIBS="$TEMP_LIBS" CPPFLAGS="$TEMP_CPPFLAGS" fi if test x$boost_sleep != xyes; then - AC_MSG_ERROR(No working boost sleep implementation found. If on ubuntu 13.10 with libboost1.54-all-dev remove libboost.1.54-all-dev and use libboost1.53-all-dev) + AC_MSG_ERROR(No working boost sleep implementation found.) fi -AC_ARG_WITH([cli], - [AS_HELP_STRING([--with-cli], - [with CLI (default is yes)])], - [build_bitcoin_cli=$withval], - [build_bitcoin_cli=yes]) +AC_ARG_WITH([utils], + [AS_HELP_STRING([--with-utils], + [build bitcoin-cli bitcoin-tx (default=yes)])], + [build_bitcoin_utils=$withval], + [build_bitcoin_utils=yes]) AC_ARG_WITH([daemon], [AS_HELP_STRING([--with-daemon], - [with daemon (default is yes)])], + [build bitcoind daemon (default=yes)])], [build_bitcoind=$withval], [build_bitcoind=yes]) @@ -525,7 +606,7 @@ BITCOIN_QT_INIT if test x$use_pkgconfig = xyes; then - if test x$PKG_CONFIG == x; then + if test x"$PKG_CONFIG" == "x"; then AC_MSG_ERROR(pkg-config not found.) fi @@ -533,8 +614,8 @@ if test x$use_pkgconfig = xyes; then m4_ifdef( [PKG_CHECK_MODULES], [ - PKG_CHECK_MODULES([SSL], [libssl], [INCLUDES="$INCLUDES $SSL_CFLAGS"; LIBS="$LIBS $SSL_LIBS"], [AC_MSG_ERROR(openssl not found.)]) - PKG_CHECK_MODULES([CRYPTO], [libcrypto], [INCLUDES="$INCLUDES $CRYPTO_CFLAGS"; LIBS="$LIBS $CRYPTO_LIBS"], [AC_MSG_ERROR(libcrypto not found.)]) + PKG_CHECK_MODULES([SSL], [libssl],, [AC_MSG_ERROR(openssl not found.)]) + PKG_CHECK_MODULES([CRYPTO], [libcrypto],,[AC_MSG_ERROR(libcrypto not found.)]) BITCOIN_QT_CHECK([PKG_CHECK_MODULES([PROTOBUF], [protobuf], [have_protobuf=yes], [BITCOIN_QT_FAIL(libprotobuf not found)])]) if test x$use_qr != xno; then BITCOIN_QT_CHECK([PKG_CHECK_MODULES([QR], [libqrencode], [have_qrencode=yes], [have_qrencode=no])]) @@ -543,10 +624,10 @@ if test x$use_pkgconfig = xyes; then ) else AC_CHECK_HEADER([openssl/crypto.h],,AC_MSG_ERROR(libcrypto headers missing)) - AC_CHECK_LIB([crypto], [main],, AC_MSG_ERROR(libcrypto missing)) + AC_CHECK_LIB([crypto], [main],CRYPTO_LIBS=-lcrypto, AC_MSG_ERROR(libcrypto missing)) AC_CHECK_HEADER([openssl/ssl.h],, AC_MSG_ERROR(libssl headers missing),) - AC_CHECK_LIB([ssl], [main],, AC_MSG_ERROR(libssl missing)) + AC_CHECK_LIB([ssl], [main],SSL_LIBS=-lssl, AC_MSG_ERROR(libssl missing)) BITCOIN_QT_CHECK(AC_CHECK_LIB([protobuf] ,[main],,BITCOIN_QT_FAIL(libprotobuf not found))) if test x$use_qr != xno; then @@ -557,13 +638,13 @@ fi BITCOIN_QT_PATH_PROGS([PROTOC], [protoc],$protoc_bin_path) -AC_MSG_CHECKING([if bitcoind should be enabled]) +AC_MSG_CHECKING([whether to build bitcoind]) AM_CONDITIONAL([BUILD_BITCOIND], [test x$build_bitcoind = xyes]) AC_MSG_RESULT($build_bitcoind) -AC_MSG_CHECKING([if bitcoin-cli should be enabled]) -AM_CONDITIONAL([BUILD_BITCOIN_CLI], [test x$build_bitcoin_cli = xyes]) -AC_MSG_RESULT($build_bitcoin_cli) +AC_MSG_CHECKING([whether to build utils (bitcoin-cli bitcoin-tx)]) +AM_CONDITIONAL([BUILD_BITCOIN_UTILS], [test x$build_bitcoin_utils = xyes]) +AC_MSG_RESULT($build_bitcoin_utils) dnl sets $bitcoin_enable_qt, $bitcoin_enable_qt_test, $bitcoin_enable_qt_dbus BITCOIN_QT_CONFIGURE([$use_pkgconfig], [qt4]) @@ -571,12 +652,11 @@ BITCOIN_QT_CONFIGURE([$use_pkgconfig], [qt4]) AC_LANG_POP if test "x$use_ccache" != "xno"; then - AC_MSG_CHECKING(if ccache should be enabled) + AC_MSG_CHECKING(if ccache should be used) if test x$CCACHE = x; then if test "x$use_ccache" = "xyes"; then AC_MSG_ERROR([ccache not found.]); else - AC_MSG_NOTICE([ccache not found. Falling back to default CC]) use_ccache=no fi else @@ -586,6 +666,9 @@ if test "x$use_ccache" != "xno"; then fi AC_MSG_RESULT($use_ccache) fi +if test "x$use_ccache" = "xyes"; then + AX_CHECK_PREPROC_FLAG([-Qunused-arguments],[CPPFLAGS="-Qunused-arguments $CPPFLAGS"]) +fi dnl enable wallet AC_MSG_CHECKING([if wallet should be enabled]) @@ -598,16 +681,16 @@ else fi dnl enable upnp support -AC_MSG_CHECKING([if upnp should be enabled]) +AC_MSG_CHECKING([whether to build with support for UPnP]) if test x$have_miniupnpc = xno; then if test x$use_upnp = xyes; then - AC_MSG_ERROR("upnp requested but cannot be built. use --without-miniupnpc") + AC_MSG_ERROR("UPnP requested but cannot be built. use --without-miniupnpc") fi AC_MSG_RESULT(no) else if test x$use_upnp != xno; then AC_MSG_RESULT(yes) - AC_MSG_CHECKING([if upnp should be on by default]) + AC_MSG_CHECKING([whether to build with UPnP enabled by default]) use_upnp=yes upnp_setting=0 if test x$use_upnp_default != xno; then @@ -615,9 +698,9 @@ else upnp_setting=1 fi AC_MSG_RESULT($use_upnp_default) - AC_DEFINE_UNQUOTED([USE_UPNP],[$upnp_setting],[Define to 1 for upnp runtime support]) + AC_DEFINE_UNQUOTED([USE_UPNP],[$upnp_setting],[UPnP support not compiled if undefined, otherwise value (0 or 1) determines default state]) if test x$TARGET_OS = xwindows; then - CPPFLAGS="$CPPFLAGS -DSTATICLIB" + MINIUPNPC_CPPFLAGS="-DSTATICLIB -DMINIUPNP_STATICLIB" fi else AC_MSG_RESULT(no) @@ -628,14 +711,14 @@ dnl these are only used when qt is enabled if test x$bitcoin_enable_qt != xno; then BUILD_QT=qt dnl enable dbus support - AC_MSG_CHECKING([if dbus should be enabled]) + AC_MSG_CHECKING([whether to build GUI with support for D-Bus]) if test x$bitcoin_enable_qt_dbus != xno; then AC_DEFINE([USE_DBUS],[1],[Define if dbus support should be compiled in]) fi AC_MSG_RESULT($bitcoin_enable_qt_dbus) dnl enable qr support - AC_MSG_CHECKING([if qr should be enabled]) + AC_MSG_CHECKING([whether to build GUI with support for QR codes]) if test x$have_qrencode = xno; then if test x$use_qr == xyes; then AC_MSG_ERROR("QR support requested but cannot be built. use --without-qrencode") @@ -655,23 +738,32 @@ if test x$bitcoin_enable_qt != xno; then AC_MSG_WARN("xgettext is required to update qt translations") fi - if test x$use_tests = xyes; then + AC_MSG_CHECKING([whether to build test_bitcoin-qt]) + if test x$use_tests$bitcoin_enable_qt_test = xyesyes; then + AC_MSG_RESULT([yes]) BUILD_TEST_QT="test" - if test x$bitcoin_enable_qt_test != xyes; then - AC_MSG_ERROR("Qt Test lib not found. Use --disable-tests or --without-gui.") - fi - fi - if test x$enable_wallet == xno; then - AC_MSG_ERROR([Cannot currently build Qt GUI with wallet disabled. Use --without-qt.]) + else + AC_MSG_RESULT([no]) fi fi +AC_MSG_CHECKING([whether to build test_bitcoin]) if test x$use_tests = xyes; then + AC_MSG_RESULT([yes]) BUILD_TEST="test" +else + AC_MSG_RESULT([no]) +fi + +AC_MSG_CHECKING([whether to reduce exports]) +if test x$use_reduce_exports != xno; then + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no]) fi -if test "x$use_tests$build_bitcoind$use_qt" = "xnonono"; then - AC_MSG_ERROR([No targets! Please specify at least one of: --enable-cli --enable-daemon --enable-gui or --enable-tests]) +if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests = xnononono; then + AC_MSG_ERROR([No targets! Please specify at least one of: --with-utils --with-daemon --with-gui or --enable-tests]) fi AM_CONDITIONAL([TARGET_DARWIN], [test x$TARGET_OS = xdarwin]) @@ -686,6 +778,7 @@ 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_REORG_TESTS],[test x$use_comparison_tool_reorg_test != xno]) AM_CONDITIONAL([GLIBC_BACK_COMPAT],[test x$use_glibc_compat = xyes]) +AM_CONDITIONAL([USE_LIBSECP256K1],[test x$use_libsecp256k1 = xyes]) AC_DEFINE(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR, [Major version]) AC_DEFINE(CLIENT_VERSION_MINOR, _CLIENT_VERSION_MINOR, [Minor version]) @@ -701,16 +794,29 @@ AC_SUBST(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE) AC_SUBST(COPYRIGHT_YEAR, _COPYRIGHT_YEAR) +AC_SUBST(RELDFLAGS) +AC_SUBST(LIBTOOL_LDFLAGS) AC_SUBST(USE_UPNP) AC_SUBST(USE_QRCODE) -AC_SUBST(INCLUDES) AC_SUBST(BOOST_LIBS) AC_SUBST(TESTDEFS) AC_SUBST(LEVELDB_TARGET_FLAGS) AC_SUBST(BUILD_TEST) AC_SUBST(BUILD_QT) AC_SUBST(BUILD_TEST_QT) -AC_CONFIG_FILES([Makefile src/Makefile share/setup.nsi share/qt/Info.plist]) +AC_SUBST(MINIUPNPC_CPPFLAGS) +AC_CONFIG_FILES([Makefile src/Makefile share/setup.nsi share/qt/Info.plist src/test/buildenv.py]) AC_CONFIG_FILES([qa/pull-tester/run-bitcoind-for-test.sh],[chmod +x qa/pull-tester/run-bitcoind-for-test.sh]) AC_CONFIG_FILES([qa/pull-tester/build-tests.sh],[chmod +x qa/pull-tester/build-tests.sh]) AC_OUTPUT + +dnl Taken from https://wiki.debian.org/RpathIssue +case $host in + *-*-linux-gnu) + AC_MSG_RESULT([Fixing libtool for -rpath problems.]) + sed < libtool > libtool-2 \ + 's/^hardcode_libdir_flag_spec.*$'/'hardcode_libdir_flag_spec=" -D__LIBTOOL_IS_A_FOOL__ "/' + mv libtool-2 libtool + chmod 755 libtool + ;; +esac diff --git a/src/MakeFile.am b/src/MakeFile.am index 7e9ac977..8c5a7e2e 100644 --- a/src/MakeFile.am +++ b/src/MakeFile.am @@ -1,5 +1,9 @@ -AM_CPPFLAGS = $(INCLUDES) -AM_LDFLAGS = $(PTHREAD_CFLAGS) +AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS) + +if USE_LIBSECP256K1 +secp256k1/libsecp256k1.la: $(wildcard secp256k1/src/*) $(wildcard secp256k1/include/*) + @$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F) +endif if EMBEDDED_LEVELDB LEVELDB_CPPFLAGS += -I$(srcdir)/leveldb/include @@ -17,12 +21,28 @@ $(LIBLEVELDB) $(LIBMEMENV): endif BITCOIN_CONFIG_INCLUDES=-I$(builddir)/config -BITCOIN_INCLUDES=-I$(builddir) -I$(builddir)/obj $(BITCOIN_CONFIG_INCLUDES) $(BOOST_CPPFLAGS) $(LEVELDB_CPPFLAGS) +BITCOIN_INCLUDES=-I$(builddir) -I$(builddir)/obj $(BOOST_CPPFLAGS) $(LEVELDB_CPPFLAGS) $(CRYPTO_CFLAGS) $(SSL_CFLAGS) + +if USE_LIBSECP256K1 +BITCOIN_INCLUDES += -I$(srcdir)/secp256k1/include +endif + +LIBBITCOIN_SERVER=libbitcoin_server.a +LIBBITCOIN_WALLET=libbitcoin_wallet.a +LIBBITCOIN_COMMON=libbitcoin_common.a +LIBBITCOIN_CLI=libbitcoin_cli.a +LIBBITCOIN_UTIL=libbitcoin_util.a +LIBBITCOIN_CRYPTO=crypto/libbitcoin_crypto.a +LIBBITCOIN_UNIVALUE=univalue/libbitcoin_univalue.a +LIBBITCOINQT=qt/libbitcoinqt.a noinst_LIBRARIES = \ libbitcoin_server.a \ libbitcoin_common.a \ - libbitcoin_cli.a + libbitcoin_cli.a \ + libbitcoin_util.a \ + univalue/libbitcoin_univalue.a \ + crypto/libbitcoin_crypto.a if ENABLE_WALLET BITCOIN_INCLUDES += $(BDB_CPPFLAGS) noinst_LIBRARIES += libbitcoin_wallet.a @@ -35,8 +55,8 @@ if BUILD_BITCOIND bin_PROGRAMS += bitcoind endif -if BUILD_BITCOIN_CLI - bin_PROGRAMS += bitcoin-cli +if BUILD_BITCOIN_UTILS + bin_PROGRAMS += bitcoin-cli bitcoin-tx endif .PHONY: FORCE @@ -48,6 +68,8 @@ BITCOIN_CORE_H = \ base58.h \ bloom.h \ chainparams.h \ + chainparamsbase.h \ + chainparamsseeds.h \ checkpoints.h \ checkqueue.h \ clientversion.h \ @@ -55,6 +77,7 @@ BITCOIN_CORE_H = \ coins.h \ compat.h \ core.h \ + core_io.h \ crypter.h \ db.h \ hash.h \ @@ -69,18 +92,17 @@ BITCOIN_CORE_H = \ netbase.h \ net.h \ noui.h \ + pow.h \ protocol.h \ + random.h \ rpcclient.h \ rpcprotocol.h \ rpcserver.h \ script.h \ serialize.h \ - crypto/common.h \ - crypto/sha2.h \ - crypto/sha1.h \ - crypto/ripemd160.h \ sync.h \ threadsafety.h \ + timedata.h \ tinyformat.h \ txdb.h \ txmempool.h \ @@ -107,33 +129,36 @@ obj/build.h: FORCE @$(MKDIR_P) $(builddir)/obj @$(top_srcdir)/share/genbuild.sh $(abs_top_builddir)/src/obj/build.h \ $(abs_top_srcdir) -libbitcoin_common_a-version.$(OBJEXT): obj/build.h +libbitcoin_util_a-version.$(OBJEXT): obj/build.h -libbitcoin_server_a_CPPFLAGS = $(BITCOIN_INCLUDES) +# server: shared between bitcoind and bitcoin-qt +libbitcoin_server_a_CPPFLAGS = $(BITCOIN_INCLUDES) $(MINIUPNPC_CPPFLAGS) libbitcoin_server_a_SOURCES = \ addrman.cpp \ alert.cpp \ bloom.cpp \ checkpoints.cpp \ - coins.cpp \ init.cpp \ - keystore.cpp \ leveldbwrapper.cpp \ main.cpp \ miner.cpp \ net.cpp \ noui.cpp \ + pow.cpp \ rpcblockchain.cpp \ rpcmining.cpp \ rpcmisc.cpp \ rpcnet.cpp \ rpcrawtransaction.cpp \ rpcserver.cpp \ + timedata.cpp \ txdb.cpp \ txmempool.cpp \ $(JSON_H) \ $(BITCOIN_CORE_H) +# wallet: shared between bitcoind and bitcoin-qt, but only linked +# when wallet enabled libbitcoin_wallet_a_CPPFLAGS = $(BITCOIN_INCLUDES) libbitcoin_wallet_a_SOURCES = \ db.cpp \ @@ -144,46 +169,85 @@ libbitcoin_wallet_a_SOURCES = \ walletdb.cpp \ $(BITCOIN_CORE_H) +# crypto primitives library +crypto_libbitcoin_crypto_a_CPPFLAGS = $(BITCOIN_CONFIG_INCLUDES) +crypto_libbitcoin_crypto_a_SOURCES = \ + crypto/sha1.cpp \ + crypto/sha2.cpp \ + crypto/ripemd160.cpp \ + crypto/common.h \ + crypto/sha2.h \ + crypto/sha1.h \ + crypto/ripemd160.h + +# univalue JSON library +univalue_libbitcoin_univalue_a_SOURCES = \ + univalue/univalue.cpp \ + univalue/univalue_read.cpp \ + univalue/univalue_write.cpp \ + univalue/univalue.h + +# common: shared between bitcoind, and bitcoin-qt and non-server tools libbitcoin_common_a_CPPFLAGS = $(BITCOIN_INCLUDES) libbitcoin_common_a_SOURCES = \ - base58.cpp \ allocators.cpp \ + base58.cpp \ chainparams.cpp \ + coins.cpp \ core.cpp \ + core_read.cpp \ + core_write.cpp \ hash.cpp \ key.cpp \ + keystore.cpp \ netbase.cpp \ protocol.cpp \ - rpcprotocol.cpp \ script.cpp \ - crypto/sha1.cpp \ - crypto/sha2.cpp \ - crypto/ripemd160.cpp \ + $(BITCOIN_CORE_H) + +# util: shared between all executables. +# This library *must* be included to make sure that the glibc +# backward-compatibility objects and their sanity checks are linked. +libbitcoin_util_a_CPPFLAGS = $(BITCOIN_INCLUDES) +libbitcoin_util_a_SOURCES = \ + compat/glibc_sanity.cpp \ + compat/glibcxx_sanity.cpp \ + chainparamsbase.cpp \ + random.cpp \ + rpcprotocol.cpp \ sync.cpp \ + uint256.cpp \ util.cpp \ version.cpp \ - compat/glibc_sanity.cpp \ - compat/glibcxx_sanity.cpp \ $(BITCOIN_CORE_H) if GLIBC_BACK_COMPAT -libbitcoin_common_a_SOURCES += compat/glibc_compat.cpp -libbitcoin_common_a_SOURCES += compat/glibcxx_compat.cpp +libbitcoin_util_a_SOURCES += compat/glibc_compat.cpp +libbitcoin_util_a_SOURCES += compat/glibcxx_compat.cpp endif +# cli: shared between bitcoin-cli and bitcoin-qt libbitcoin_cli_a_SOURCES = \ rpcclient.cpp \ $(BITCOIN_CORE_H) -nodist_libbitcoin_common_a_SOURCES = $(srcdir)/obj/build.h +nodist_libbitcoin_util_a_SOURCES = $(srcdir)/obj/build.h # # bitcoind binary # bitcoind_LDADD = \ - libbitcoin_server.a \ - libbitcoin_common.a \ + $(LIBBITCOIN_SERVER) \ + $(LIBBITCOIN_COMMON) \ + $(LIBBITCOIN_UNIVALUE) \ + $(LIBBITCOIN_UTIL) \ + $(LIBBITCOIN_CRYPTO) \ $(LIBLEVELDB) \ $(LIBMEMENV) + +if USE_LIBSECP256K1 + bitcoind_LDADD += secp256k1/libsecp256k1.la +endif + if ENABLE_WALLET bitcoind_LDADD += libbitcoin_wallet.a endif @@ -194,18 +258,48 @@ if TARGET_WINDOWS bitcoind_SOURCES += bitcoind-res.rc endif -bitcoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) +bitcoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) bitcoind_CPPFLAGS = $(BITCOIN_INCLUDES) +bitcoind_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) # bitcoin-cli binary # bitcoin_cli_LDADD = \ - libbitcoin_cli.a \ - libbitcoin_common.a \ - $(BOOST_LIBS) -bitcoin_cli_SOURCES = bitcoin-cli.cpp + $(LIBBITCOIN_CLI) \ + $(LIBBITCOIN_COMMON) \ + $(LIBBITCOIN_UTIL) \ + $(LIBBITCOIN_CRYPTO) \ + $(BOOST_LIBS) \ + $(SSL_LIBS) \ + $(CRYPTO_LIBS) + +bitcoin_cli_SOURCES = \ + bitcoin-cli.cpp + +if USE_LIBSECP256K1 + bitcoin_cli_LDADD += secp256k1/libsecp256k1.la +endif bitcoin_cli_CPPFLAGS = $(BITCOIN_INCLUDES) # +# bitcoin-tx binary # +bitcoin_tx_LDADD = \ + $(LIBBITCOIN_UNIVALUE) \ + $(LIBBITCOIN_COMMON) \ + $(LIBBITCOIN_UTIL) \ + $(LIBBITCOIN_CRYPTO) + +if USE_LIBSECP256K1 + bitcoin_tx_LDADD += secp256k1/libsecp256k1.la +endif + + bitcoin_tx_LDADD += $(BOOST_LIBS) \ + $(SSL_LIBS) \ + $(CRYPTO_LIBS) +bitcoin_tx_SOURCES = bitcoin-tx.cpp +bitcoin_tx_CPPFLAGS = $(BITCOIN_INCLUDES) +# +bitcoin_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) + if TARGET_WINDOWS bitcoin_cli_SOURCES += bitcoin-cli-res.rc endif @@ -214,10 +308,11 @@ CLEANFILES = leveldb/libleveldb.a leveldb/libmemenv.a *.gcda *.gcno DISTCLEANFILES = obj/build.h -EXTRA_DIST = leveldb +EXTRA_DIST = leveldb secp256k1 clean-local: -$(MAKE) -C leveldb clean + -$(MAKE) -C secp256k1 clean 2>/dev/null rm -f leveldb/*/*.gcno leveldb/helpers/memenv/*.gcno -rm -f config.h @@ -233,12 +328,6 @@ clean-local: @test -f $(PROTOC) $(AM_V_GEN) $(PROTOC) --cpp_out=$(@D) --proto_path=$(abspath $( forms/ui_foo.h QT_FORMS_H=$(join $(dir $(QT_FORMS_UI)),$(addprefix ui_, $(notdir $(QT_FORMS_UI:.ui=.h)))) @@ -341,8 +343,9 @@ $(QT_MOC): $(PROTOBUF_H) $(QT_MOC_CPP): $(PROTOBUF_H) # bitcoin-qt binary # -qt_bitcoin_qt_CPPFLAGS = $(AM_CPPFLAGS) $(QT_INCLUDES) \ - -I$(top_srcdir)/src/qt/forms +qt_bitcoin_qt_CPPFLAGS = $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \ + $(QT_INCLUDES) $(PROTOBUF_CFLAGS) $(QR_CFLAGS) + qt_bitcoin_qt_SOURCES = qt/bitcoin.cpp if TARGET_DARWIN qt_bitcoin_qt_SOURCES += $(BITCOIN_MM) @@ -354,28 +357,36 @@ qt_bitcoin_qt_LDADD = qt/libbitcoinqt.a $(LIBBITCOIN_SERVER) if ENABLE_WALLET qt_bitcoin_qt_LDADD += $(LIBBITCOIN_WALLET) endif -qt_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBLEVELDB) $(LIBMEMENV) \ - $(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) -qt_bitcoin_qt_LDFLAGS = $(QT_LDFLAGS) +qt_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBBITCOIN_UNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \ + $(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) +if USE_LIBSECP256K1 + qt_bitcoin_qt_LDADD += secp256k1/libsecp256k1.la +endif +qt_bitcoin_qt_LDFLAGS = $(AM_LDFLAGS) $(QT_LDFLAGS) #locale/foo.ts -> locale/foo.qm QT_QM=$(QT_TS:.ts=.qm) .SECONDARY: $(QT_QM) -qt/bitcoinstrings.cpp: $(libbitcoin_server_a_SOURCES) $(libbitcoin_common_a_SOURCES) $(libbitcoin_cli_a_SOURCES) +qt/bitcoinstrings.cpp: $(libbitcoin_server_a_SOURCES) $(libbitcoin_wallet_a_SOURCES) @test -n $(XGETTEXT) || echo "xgettext is required for updating translations" - @cd $(top_srcdir); XGETTEXT=$(XGETTEXT) share/qt/extract_strings_qt.py + $(AM_V_GEN) cd $(srcdir); XGETTEXT=$(XGETTEXT) ../share/qt/extract_strings_qt.py $^ translate: qt/bitcoinstrings.cpp $(QT_FORMS_UI) $(QT_FORMS_UI) $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(BITCOIN_MM) @test -n $(LUPDATE) || echo "lupdate is required for updating translations" - @QT_SELECT=$(QT_SELECT) $(LUPDATE) $^ -locations relative -no-obsolete -ts qt/locale/bitcoin_en.ts + $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(LUPDATE) $^ -locations relative -no-obsolete -ts qt/locale/bitcoin_en.ts + +$(QT_QRC_LOCALE_CPP): $(QT_QRC_LOCALE) $(QT_QM) + @test -f $(RCC) + @test -f $(@D)/$( $@ -$(QT_QRC_CPP): $(QT_QRC) $(QT_QM) $(QT_FORMS_H) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) $(PROTOBUF_H) - @cd $(abs_srcdir); test -f $(RCC) && QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin -o $(abs_builddir)/$@ $< || \ - echo error: could not build $@ - $(SED) -e '/^\*\*.*Created:/d' $@ > $@.n && mv $@{.n,} - $(SED) -e '/^\*\*.*by:/d' $@ > $@.n && mv $@{.n,} +$(QT_QRC_CPP): $(QT_QRC) $(QT_FORMS_H) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) $(PROTOBUF_H) + @test -f $(RCC) + $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin $< | \ + $(SED) -e '/^\*\*.*Created:/d' -e '/^\*\*.*by:/d' > $@ CLEAN_QT = $(nodist_qt_libbitcoinqt_a_SOURCES) $(QT_QM) $(QT_FORMS_H) qt/*.gcda qt/*.gcno @@ -384,4 +395,22 @@ CLEANFILES += $(CLEAN_QT) bitcoin_qt_clean: FORCE rm -f $(CLEAN_QT) $(qt_libbitcoinqt_a_OBJECTS) $(qt_bitcoin_qt_OBJECTS) qt/bitcoin-qt$(EXEEXT) $(LIBBITCOINQT) -bitcoin_qt : qt/bitcoin-qt$(EXEEXT) \ No newline at end of file +bitcoin_qt : qt/bitcoin-qt$(EXEEXT) + +ui_%.h: %.ui + @test -f $(UIC) + @$(MKDIR_P) $(@D) + $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(UIC) -o $@ $< || (echo "Error creating $@"; false) + +%.moc: %.cpp + $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(MOC) $(QT_INCLUDES) $(MOC_DEFS) $< | \ + $(SED) -e '/^\*\*.*Created:/d' -e '/^\*\*.*by:/d' > $@ + +moc_%.cpp: %.h + $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(MOC) $(QT_INCLUDES) $(MOC_DEFS) $< | \ + $(SED) -e '/^\*\*.*Created:/d' -e '/^\*\*.*by:/d' > $@ + +%.qm: %.ts + @test -f $(LRELEASE) + @$(MKDIR_P) $(@D) + $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(LRELEASE) -silent $< -qm $@ \ No newline at end of file diff --git a/src/Makefile.qttest.include b/src/Makefile.qttest.include index d0f085bf..777cc23b 100644 --- a/src/Makefile.qttest.include +++ b/src/Makefile.qttest.include @@ -1,8 +1,3 @@ -AM_CPPFLAGS += -I$(top_srcdir)/src \ - -I$(top_srcdir)/src/qt \ - -I$(top_builddir)/src/qt \ - $(PROTOBUF_CFLAGS) \ - $(QR_CFLAGS) bin_PROGRAMS += qt/test/test_bitcoin-qt TESTS += qt/test/test_bitcoin-qt @@ -17,7 +12,8 @@ TEST_QT_H = \ qt/test/paymentrequestdata.h \ qt/test/paymentservertests.h -qt_test_test_bitcoin_qt_CPPFLAGS = $(AM_CPPFLAGS) $(QT_INCLUDES) $(QT_TEST_INCLUDES) +qt_test_test_bitcoin_qt_CPPFLAGS = $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \ + $(QT_INCLUDES) $(QT_TEST_INCLUDES) qt_test_test_bitcoin_qt_SOURCES = \ qt/test/test_main.cpp \ @@ -34,10 +30,13 @@ qt_test_test_bitcoin_qt_LDADD = $(LIBBITCOINQT) $(LIBBITCOIN_SERVER) if ENABLE_WALLET qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_WALLET) endif -qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBLEVELDB) \ +qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBBITCOIN_UNIVALUE) $(LIBLEVELDB) \ $(LIBMEMENV) $(BOOST_LIBS) $(QT_DBUS_LIBS) $(QT_TEST_LIBS) $(QT_LIBS) \ - $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) -qt_test_test_bitcoin_qt_LDFLAGS = $(QT_LDFLAGS) + $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) +if USE_LIBSECP256K1 + qt_test_test_bitcoin_qt_LDADD += secp256k1/libsecp256k1.la +endif +qt_test_test_bitcoin_qt_LDFLAGS = $(AM_LDFLAGS) $(QT_LDFLAGS) CLEAN_BITCOIN_QT_TEST = $(TEST_QT_MOC_CPP) qt/test/*.gcda qt/test/*.gcno diff --git a/src/Makefile.test.include b/src/Makefile.test.include index b4f52dc3..d87cd2d3 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -1,5 +1,3 @@ -AM_CPPFLAGS += -I$(top_builddir)/src/test/ - TESTS += test/test_bitcoin bin_PROGRAMS += test/test_bitcoin TEST_SRCDIR = test @@ -33,8 +31,10 @@ BITCOIN_TESTS =\ test/checkblock_tests.cpp \ test/Checkpoints_tests.cpp \ test/compress_tests.cpp \ + test/crypto_tests.cpp \ test/DoS_tests.cpp \ test/getarg_tests.cpp \ + test/hash_tests.cpp \ test/key_tests.cpp \ test/main_tests.cpp \ test/miner_tests.cpp \ @@ -47,6 +47,7 @@ BITCOIN_TESTS =\ test/script_tests.cpp \ test/serialize_tests.cpp \ test/sigopcount_tests.cpp \ + test/skiplist_tests.cpp \ test/test_bitcoin.cpp \ test/transaction_tests.cpp \ test/uint256_tests.cpp \ @@ -62,13 +63,18 @@ BITCOIN_TESTS += \ endif test_test_bitcoin_SOURCES = $(BITCOIN_TESTS) $(JSON_TEST_FILES) $(RAW_TEST_FILES) -test_test_bitcoin_CPPFLAGS = $(AM_CPPFLAGS) $(TESTDEFS) -test_test_bitcoin_LDADD = $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBLEVELDB) $(LIBMEMENV) \ +test_test_bitcoin_CPPFLAGS = $(BITCOIN_INCLUDES) -I$(builddir)/test/ $(TESTDEFS) +test_test_bitcoin_LDADD = $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBBITCOIN_UNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \ $(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) if ENABLE_WALLET test_test_bitcoin_LDADD += $(LIBBITCOIN_WALLET) endif -test_test_bitcoin_LDADD += $(BDB_LIBS) + +if USE_LIBSECP256K1 + test_test_bitcoin_LDADD += secp256k1/libsecp256k1.la +endif + +test_test_bitcoin_LDADD += $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) nodist_test_test_bitcoin_SOURCES = $(GENERATED_TEST_FILES) @@ -84,4 +90,20 @@ bitcoin_test_check: $(TEST_BINARY) FORCE $(MAKE) check-TESTS TESTS=$^ bitcoin_test_clean : FORCE - rm -f $(CLEAN_BITCOIN_TEST) $(test_test_bitcoin_OBJECTS) $(TEST_BINARY) \ No newline at end of file + rm -f $(CLEAN_BITCOIN_TEST) $(test_test_bitcoin_OBJECTS) $(TEST_BINARY) + +%.json.h: %.json + @$(MKDIR_P) $(@D) + @echo "namespace json_tests{" > $@ + @echo "static unsigned const char $(*F)[] = {" >> $@ + @$(HEXDUMP) -v -e '8/1 "0x%02x, "' -e '"\n"' $< | $(SED) -e 's/0x ,//g' >> $@ + @echo "};};" >> $@ + @echo "Generated $@" + +%.raw.h: %.raw + @$(MKDIR_P) $(@D) + @echo "namespace alert_tests{" > $@ + @echo "static unsigned const char $(*F)[] = {" >> $@ + @$(HEXDUMP) -v -e '8/1 "0x%02x, "' -e '"\n"' $< | $(SED) -e 's/0x ,//g' >> $@ + @echo "};};" >> $@ + @echo "Generated $@" \ No newline at end of file diff --git a/src/bignum.h b/src/bignum.h index 3d85192e..72c542e1 100644 --- a/src/bignum.h +++ b/src/bignum.h @@ -459,7 +459,7 @@ class CBigNum CBigNum ret; if (!BN_mod_mul(ret.bn, bn, b.bn, m.bn, pctx)) throw bignum_error("CBigNum::mul_mod : BN_mod_mul failed"); - + return ret; } diff --git a/src/compat/.deps/libbitcoin_util_a-glibc_compat.Po b/src/compat/.deps/libbitcoin_util_a-glibc_compat.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/src/compat/.deps/libbitcoin_util_a-glibc_compat.Po @@ -0,0 +1 @@ +# dummy diff --git a/src/compat/.deps/libbitcoin_util_a-glibc_sanity.Po b/src/compat/.deps/libbitcoin_util_a-glibc_sanity.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/src/compat/.deps/libbitcoin_util_a-glibc_sanity.Po @@ -0,0 +1 @@ +# dummy diff --git a/src/compat/.deps/libbitcoin_util_a-glibcxx_compat.Po b/src/compat/.deps/libbitcoin_util_a-glibcxx_compat.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/src/compat/.deps/libbitcoin_util_a-glibcxx_compat.Po @@ -0,0 +1 @@ +# dummy diff --git a/src/compat/.deps/libbitcoin_util_a-glibcxx_sanity.Po b/src/compat/.deps/libbitcoin_util_a-glibcxx_sanity.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/src/compat/.deps/libbitcoin_util_a-glibcxx_sanity.Po @@ -0,0 +1 @@ +# dummy diff --git a/src/config/bitcoin-config.h b/src/config/bitcoin-config.h index e5079bf7..9e5dd13b 100644 --- a/src/config/bitcoin-config.h +++ b/src/config/bitcoin-config.h @@ -116,9 +116,6 @@ /* Define to 1 if you have the `crypt32' library (-lcrypt32). */ /* #undef HAVE_LIBCRYPT32 */ -/* Define to 1 if you have the `crypto' library (-lcrypto). */ -/* #undef HAVE_LIBCRYPTO */ - /* Define to 1 if you have the `gdi32' library (-lgdi32). */ /* #undef HAVE_LIBGDI32 */ @@ -128,6 +125,9 @@ /* Define to 1 if you have the `iphlpapi' library (-liphlpapi). */ /* #undef HAVE_LIBIPHLPAPI */ +/* Define to 1 if you have the `jpeg ' library (-ljpeg ). */ +/* #undef HAVE_LIBJPEG_ */ + /* Define to 1 if you have the `kernel32' library (-lkernel32). */ /* #undef HAVE_LIBKERNEL32 */ @@ -146,6 +146,9 @@ /* Define to 1 if you have the `oleaut32' library (-loleaut32). */ /* #undef HAVE_LIBOLEAUT32 */ +/* Define to 1 if you have the `pcre16 ' library (-lpcre16 ). */ +/* #undef HAVE_LIBPCRE16_ */ + /* Define to 1 if you have the `png ' library (-lpng ). */ /* #undef HAVE_LIBPNG_ */ @@ -164,9 +167,6 @@ /* Define to 1 if you have the `shlwapi' library (-lshlwapi). */ /* #undef HAVE_LIBSHLWAPI */ -/* Define to 1 if you have the `ssl' library (-lssl). */ -/* #undef HAVE_LIBSSL */ - /* Define to 1 if you have the `user32' library (-luser32). */ /* #undef HAVE_LIBUSER32 */ @@ -227,6 +227,9 @@ /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_PRCTL_H */ + /* Define to 1 if you have the header file. */ #define HAVE_SYS_SELECT_H 1 @@ -239,6 +242,9 @@ /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 +/* Define if the visibility attribute is supported. */ +#define HAVE_VISIBILITY_ATTRIBUTE 1 + /* Define this symbol if boost sleep works */ /* #undef HAVE_WORKING_BOOST_SLEEP */ @@ -270,6 +276,15 @@ your system. */ /* #undef PTHREAD_CREATE_JOINABLE */ +/* Define this symbol if the qt platform is cocoa */ +/* #undef QT_QPA_PLATFORM_COCOA */ + +/* Define this symbol if the qt platform is windows */ +/* #undef QT_QPA_PLATFORM_WINDOWS */ + +/* Define this symbol if the qt platform is xcb */ +/* #undef QT_QPA_PLATFORM_XCB */ + /* Define this symbol if qt plugins are static */ /* #undef QT_STATICPLUGIN */ @@ -280,12 +295,13 @@ /* #undef STRERROR_R_CHAR_P */ /* Define if dbus support should be compiled in */ -/* #undef USE_DBUS */ +#define USE_DBUS 1 /* Define if QR support should be compiled in */ -/* #undef USE_QRCODE */ +#define USE_QRCODE 1 -/* Define to 1 for upnp runtime support */ +/* UPnP support not compiled if undefined, otherwise value (0 or 1) determines + default state */ #define USE_UPNP 0 /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most diff --git a/src/config/bitcoin-config.h.in b/src/config/bitcoin-config.h.in index e10fa27a..6db9bd7d 100644 --- a/src/config/bitcoin-config.h.in +++ b/src/config/bitcoin-config.h.in @@ -115,9 +115,6 @@ /* Define to 1 if you have the `crypt32' library (-lcrypt32). */ #undef HAVE_LIBCRYPT32 -/* Define to 1 if you have the `crypto' library (-lcrypto). */ -#undef HAVE_LIBCRYPTO - /* Define to 1 if you have the `gdi32' library (-lgdi32). */ #undef HAVE_LIBGDI32 @@ -127,6 +124,9 @@ /* Define to 1 if you have the `iphlpapi' library (-liphlpapi). */ #undef HAVE_LIBIPHLPAPI +/* Define to 1 if you have the `jpeg ' library (-ljpeg ). */ +#undef HAVE_LIBJPEG_ + /* Define to 1 if you have the `kernel32' library (-lkernel32). */ #undef HAVE_LIBKERNEL32 @@ -145,6 +145,9 @@ /* Define to 1 if you have the `oleaut32' library (-loleaut32). */ #undef HAVE_LIBOLEAUT32 +/* Define to 1 if you have the `pcre16 ' library (-lpcre16 ). */ +#undef HAVE_LIBPCRE16_ + /* Define to 1 if you have the `png ' library (-lpng ). */ #undef HAVE_LIBPNG_ @@ -163,9 +166,6 @@ /* Define to 1 if you have the `shlwapi' library (-lshlwapi). */ #undef HAVE_LIBSHLWAPI -/* Define to 1 if you have the `ssl' library (-lssl). */ -#undef HAVE_LIBSSL - /* Define to 1 if you have the `user32' library (-luser32). */ #undef HAVE_LIBUSER32 @@ -226,6 +226,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PRCTL_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H @@ -238,6 +241,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H +/* Define if the visibility attribute is supported. */ +#undef HAVE_VISIBILITY_ATTRIBUTE + /* Define this symbol if boost sleep works */ #undef HAVE_WORKING_BOOST_SLEEP @@ -269,6 +275,15 @@ your system. */ #undef PTHREAD_CREATE_JOINABLE +/* Define this symbol if the qt platform is cocoa */ +#undef QT_QPA_PLATFORM_COCOA + +/* Define this symbol if the qt platform is windows */ +#undef QT_QPA_PLATFORM_WINDOWS + +/* Define this symbol if the qt platform is xcb */ +#undef QT_QPA_PLATFORM_XCB + /* Define this symbol if qt plugins are static */ #undef QT_STATICPLUGIN @@ -284,7 +299,8 @@ /* Define if QR support should be compiled in */ #undef USE_QRCODE -/* Define to 1 for upnp runtime support */ +/* UPnP support not compiled if undefined, otherwise value (0 or 1) determines + default state */ #undef USE_UPNP /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most diff --git a/src/config/dash-config.h.in b/src/config/dash-config.h.in new file mode 100644 index 00000000..3d627b3f --- /dev/null +++ b/src/config/dash-config.h.in @@ -0,0 +1,373 @@ +/* src/config/dash-config.h.in. Generated from configure.ac by autoheader. */ + +#ifndef DASH_CONFIG_H + +#define DASH_CONFIG_H + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* Version Build */ +#undef CLIENT_VERSION_BUILD + +/* Version is release */ +#undef CLIENT_VERSION_IS_RELEASE + +/* Major version */ +#undef CLIENT_VERSION_MAJOR + +/* Minor version */ +#undef CLIENT_VERSION_MINOR + +/* Build revision */ +#undef CLIENT_VERSION_REVISION + +/* Version is release */ +#undef COPYRIGHT_YEAR + +/* Define to 1 to enable wallet functions */ +#undef ENABLE_WALLET + +/* Define to 1 to enable ZMQ functions */ +#undef ENABLE_ZMQ + +/* parameter and return value type for __fdelt_chk */ +#undef FDELT_TYPE + +/* define if the Boost library is available */ +#undef HAVE_BOOST + +/* define if the Boost::Chrono library is available */ +#undef HAVE_BOOST_CHRONO + +/* define if the Boost::Filesystem library is available */ +#undef HAVE_BOOST_FILESYSTEM + +/* define if the Boost::PROGRAM_OPTIONS library is available */ +#undef HAVE_BOOST_PROGRAM_OPTIONS + +/* define if the Boost::System library is available */ +#undef HAVE_BOOST_SYSTEM + +/* define if the Boost::Thread library is available */ +#undef HAVE_BOOST_THREAD + +/* define if the Boost::Unit_Test_Framework library is available */ +#undef HAVE_BOOST_UNIT_TEST_FRAMEWORK + +/* Define to 1 if you have the header file. */ +#undef HAVE_BYTESWAP_H + +/* Define this symbol if the consensus lib has been built */ +#undef HAVE_CONSENSUS_LIB + +/* define if the compiler supports basic C++11 syntax */ +#undef HAVE_CXX11 + +/* Define to 1 if you have the declaration of `be16toh', and to 0 if you + don't. */ +#undef HAVE_DECL_BE16TOH + +/* Define to 1 if you have the declaration of `be32toh', and to 0 if you + don't. */ +#undef HAVE_DECL_BE32TOH + +/* Define to 1 if you have the declaration of `be64toh', and to 0 if you + don't. */ +#undef HAVE_DECL_BE64TOH + +/* Define to 1 if you have the declaration of `bswap_16', and to 0 if you + don't. */ +#undef HAVE_DECL_BSWAP_16 + +/* Define to 1 if you have the declaration of `bswap_32', and to 0 if you + don't. */ +#undef HAVE_DECL_BSWAP_32 + +/* Define to 1 if you have the declaration of `bswap_64', and to 0 if you + don't. */ +#undef HAVE_DECL_BSWAP_64 + +/* Define to 1 if you have the declaration of `htobe16', and to 0 if you + don't. */ +#undef HAVE_DECL_HTOBE16 + +/* Define to 1 if you have the declaration of `htobe32', and to 0 if you + don't. */ +#undef HAVE_DECL_HTOBE32 + +/* Define to 1 if you have the declaration of `htobe64', and to 0 if you + don't. */ +#undef HAVE_DECL_HTOBE64 + +/* Define to 1 if you have the declaration of `htole16', and to 0 if you + don't. */ +#undef HAVE_DECL_HTOLE16 + +/* Define to 1 if you have the declaration of `htole32', and to 0 if you + don't. */ +#undef HAVE_DECL_HTOLE32 + +/* Define to 1 if you have the declaration of `htole64', and to 0 if you + don't. */ +#undef HAVE_DECL_HTOLE64 + +/* Define to 1 if you have the declaration of `le16toh', and to 0 if you + don't. */ +#undef HAVE_DECL_LE16TOH + +/* Define to 1 if you have the declaration of `le32toh', and to 0 if you + don't. */ +#undef HAVE_DECL_LE32TOH + +/* Define to 1 if you have the declaration of `le64toh', and to 0 if you + don't. */ +#undef HAVE_DECL_LE64TOH + +/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you + don't. */ +#undef HAVE_DECL_STRERROR_R + +/* Define to 1 if you have the declaration of `strnlen', and to 0 if you + don't. */ +#undef HAVE_DECL_STRNLEN + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ENDIAN_H + +/* Define this symbol if you have getaddrinfo_a */ +#undef HAVE_GETADDRINFO_A + +/* Define this symbol if you have inet_pton */ +#undef HAVE_INET_PTON + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `advapi32' library (-ladvapi32). */ +#undef HAVE_LIBADVAPI32 + +/* Define to 1 if you have the `comctl32' library (-lcomctl32). */ +#undef HAVE_LIBCOMCTL32 + +/* Define to 1 if you have the `comdlg32' library (-lcomdlg32). */ +#undef HAVE_LIBCOMDLG32 + +/* Define to 1 if you have the `crypt32' library (-lcrypt32). */ +#undef HAVE_LIBCRYPT32 + +/* Define to 1 if you have the `gdi32' library (-lgdi32). */ +#undef HAVE_LIBGDI32 + +/* Define to 1 if you have the `imm32' library (-limm32). */ +#undef HAVE_LIBIMM32 + +/* Define to 1 if you have the `iphlpapi' library (-liphlpapi). */ +#undef HAVE_LIBIPHLPAPI + +/* Define to 1 if you have the `jpeg ' library (-ljpeg ). */ +#undef HAVE_LIBJPEG_ + +/* Define to 1 if you have the `kernel32' library (-lkernel32). */ +#undef HAVE_LIBKERNEL32 + +/* Define to 1 if you have the `mingwthrd' library (-lmingwthrd). */ +#undef HAVE_LIBMINGWTHRD + +/* Define to 1 if you have the `mswsock' library (-lmswsock). */ +#undef HAVE_LIBMSWSOCK + +/* Define to 1 if you have the `ole32' library (-lole32). */ +#undef HAVE_LIBOLE32 + +/* Define to 1 if you have the `oleaut32' library (-loleaut32). */ +#undef HAVE_LIBOLEAUT32 + +/* Define to 1 if you have the `pcre16 ' library (-lpcre16 ). */ +#undef HAVE_LIBPCRE16_ + +/* Define to 1 if you have the `png ' library (-lpng ). */ +#undef HAVE_LIBPNG_ + +/* Define to 1 if you have the `rpcrt4' library (-lrpcrt4). */ +#undef HAVE_LIBRPCRT4 + +/* Define to 1 if you have the `rt' library (-lrt). */ +#undef HAVE_LIBRT + +/* Define to 1 if you have the `shell32' library (-lshell32). */ +#undef HAVE_LIBSHELL32 + +/* Define to 1 if you have the `shlwapi' library (-lshlwapi). */ +#undef HAVE_LIBSHLWAPI + +/* Define to 1 if you have the `ssp' library (-lssp). */ +#undef HAVE_LIBSSP + +/* Define to 1 if you have the `user32' library (-luser32). */ +#undef HAVE_LIBUSER32 + +/* Define to 1 if you have the `uuid' library (-luuid). */ +#undef HAVE_LIBUUID + +/* Define to 1 if you have the `winmm' library (-lwinmm). */ +#undef HAVE_LIBWINMM + +/* Define to 1 if you have the `winspool' library (-lwinspool). */ +#undef HAVE_LIBWINSPOOL + +/* Define to 1 if you have the `ws2_32' library (-lws2_32). */ +#undef HAVE_LIBWS2_32 + +/* Define to 1 if you have the `z ' library (-lz ). */ +#undef HAVE_LIBZ_ + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MINIUPNPC_MINIUPNPC_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MINIUPNPC_MINIWGET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MINIUPNPC_UPNPCOMMANDS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MINIUPNPC_UPNPERRORS_H + +/* Define this symbol if you have MSG_NOSIGNAL */ +#undef HAVE_MSG_NOSIGNAL + +/* Define if you have POSIX threads libraries and header files. */ +#undef HAVE_PTHREAD + +/* Have PTHREAD_PRIO_INHERIT. */ +#undef HAVE_PTHREAD_PRIO_INHERIT + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strerror_r' function. */ +#undef HAVE_STRERROR_R + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_ENDIAN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PRCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SELECT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define if the visibility attribute is supported. */ +#undef HAVE_VISIBILITY_ATTRIBUTE + +/* Define this symbol if boost sleep works */ +#undef HAVE_WORKING_BOOST_SLEEP + +/* Define this symbol if boost sleep_for works */ +#undef HAVE_WORKING_BOOST_SLEEP_FOR + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#undef LT_OBJDIR + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +#undef PTHREAD_CREATE_JOINABLE + +/* Define this symbol if the qt platform is cocoa */ +#undef QT_QPA_PLATFORM_COCOA + +/* Define this symbol if the qt platform is windows */ +#undef QT_QPA_PLATFORM_WINDOWS + +/* Define this symbol if the qt platform is xcb */ +#undef QT_QPA_PLATFORM_XCB + +/* Define this symbol if qt plugins are static */ +#undef QT_STATICPLUGIN + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 if strerror_r returns char *. */ +#undef STRERROR_R_CHAR_P + +/* Define if dbus support should be compiled in */ +#undef USE_DBUS + +/* Define if QR support should be compiled in */ +#undef USE_QRCODE + +/* UPnP support not compiled if undefined, otherwise value (0 or 1) determines + default state */ +#undef USE_UPNP + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif + +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +# define _DARWIN_USE_64_BIT_INODE 1 +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +#undef _FILE_OFFSET_BITS + +/* Define for large files, on AIX-style hosts. */ +#undef _LARGE_FILES + +#endif //DASH_CONFIG_H diff --git a/src/config/ohmcoin-config.h.in b/src/config/ohmcoin-config.h.in new file mode 100644 index 00000000..4a0083f5 --- /dev/null +++ b/src/config/ohmcoin-config.h.in @@ -0,0 +1,361 @@ +/* src/config/ohmcoin-config.h.in. Generated from configure.ac by autoheader. */ + +#ifndef OHMC_CONFIG_H + +#define OHMC_CONFIG_H + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* Version Build */ +#undef CLIENT_VERSION_BUILD + +/* Version is release */ +#undef CLIENT_VERSION_IS_RELEASE + +/* Major version */ +#undef CLIENT_VERSION_MAJOR + +/* Minor version */ +#undef CLIENT_VERSION_MINOR + +/* Build revision */ +#undef CLIENT_VERSION_REVISION + +/* Version is release */ +#undef COPYRIGHT_YEAR + +/* Define to 1 to enable wallet functions */ +#undef ENABLE_WALLET + +/* Define to 1 to enable ZMQ functions */ +#undef ENABLE_ZMQ + +/* parameter and return value type for __fdelt_chk */ +#undef FDELT_TYPE + +/* define if the Boost library is available */ +#undef HAVE_BOOST + +/* define if the Boost::Chrono library is available */ +#undef HAVE_BOOST_CHRONO + +/* define if the Boost::Filesystem library is available */ +#undef HAVE_BOOST_FILESYSTEM + +/* define if the Boost::PROGRAM_OPTIONS library is available */ +#undef HAVE_BOOST_PROGRAM_OPTIONS + +/* define if the Boost::System library is available */ +#undef HAVE_BOOST_SYSTEM + +/* define if the Boost::Thread library is available */ +#undef HAVE_BOOST_THREAD + +/* define if the Boost::Unit_Test_Framework library is available */ +#undef HAVE_BOOST_UNIT_TEST_FRAMEWORK + +/* Define this symbol if the consensus lib has been built */ +#undef HAVE_CONSENSUS_LIB + +/* define if the compiler supports basic C++11 syntax */ +#undef HAVE_CXX11 + +/* Define to 1 if you have the declaration of `be32toh', and to 0 if you + don't. */ +#undef HAVE_DECL_BE32TOH + +/* Define to 1 if you have the declaration of `be64toh', and to 0 if you + don't. */ +#undef HAVE_DECL_BE64TOH + +/* Define to 1 if you have the declaration of `daemon', and to 0 if you don't. + */ +#undef HAVE_DECL_DAEMON + +/* Define to 1 if you have the declaration of `htobe32', and to 0 if you + don't. */ +#undef HAVE_DECL_HTOBE32 + +/* Define to 1 if you have the declaration of `htobe64', and to 0 if you + don't. */ +#undef HAVE_DECL_HTOBE64 + +/* Define to 1 if you have the declaration of `htole32', and to 0 if you + don't. */ +#undef HAVE_DECL_HTOLE32 + +/* Define to 1 if you have the declaration of `htole64', and to 0 if you + don't. */ +#undef HAVE_DECL_HTOLE64 + +/* Define to 1 if you have the declaration of `le32toh', and to 0 if you + don't. */ +#undef HAVE_DECL_LE32TOH + +/* Define to 1 if you have the declaration of `le64toh', and to 0 if you + don't. */ +#undef HAVE_DECL_LE64TOH + +/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you + don't. */ +#undef HAVE_DECL_STRERROR_R + +/* Define to 1 if you have the declaration of `strnlen', and to 0 if you + don't. */ +#undef HAVE_DECL_STRNLEN + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ENDIAN_H + +/* Define this symbol if you have getaddrinfo_a */ +#undef HAVE_GETADDRINFO_A + +/* Define this symbol if you have inet_pton */ +#undef HAVE_INET_PTON + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `advapi32' library (-ladvapi32). */ +#undef HAVE_LIBADVAPI32 + +/* Define to 1 if you have the `comctl32' library (-lcomctl32). */ +#undef HAVE_LIBCOMCTL32 + +/* Define to 1 if you have the `comdlg32' library (-lcomdlg32). */ +#undef HAVE_LIBCOMDLG32 + +/* Define to 1 if you have the `crypt32' library (-lcrypt32). */ +#undef HAVE_LIBCRYPT32 + +/* Define to 1 if you have the `crypto' library (-lcrypto). */ +#undef HAVE_LIBCRYPTO + +/* Define to 1 if you have the `gdi32' library (-lgdi32). */ +#undef HAVE_LIBGDI32 + +/* Define to 1 if you have the `imm32' library (-limm32). */ +#undef HAVE_LIBIMM32 + +/* Define to 1 if you have the `iphlpapi' library (-liphlpapi). */ +#undef HAVE_LIBIPHLPAPI + +/* Define to 1 if you have the `jpeg ' library (-ljpeg ). */ +#undef HAVE_LIBJPEG_ + +/* Define to 1 if you have the `kernel32' library (-lkernel32). */ +#undef HAVE_LIBKERNEL32 + +/* Define to 1 if you have the `mingwthrd' library (-lmingwthrd). */ +#undef HAVE_LIBMINGWTHRD + +/* Define to 1 if you have the `mswsock' library (-lmswsock). */ +#undef HAVE_LIBMSWSOCK + +/* Define to 1 if you have the `ole32' library (-lole32). */ +#undef HAVE_LIBOLE32 + +/* Define to 1 if you have the `oleaut32' library (-loleaut32). */ +#undef HAVE_LIBOLEAUT32 + +/* Define to 1 if you have the `pcre16 ' library (-lpcre16 ). */ +#undef HAVE_LIBPCRE16_ + +/* Define to 1 if you have the `png ' library (-lpng ). */ +#undef HAVE_LIBPNG_ + +/* Define to 1 if you have the `rpcrt4' library (-lrpcrt4). */ +#undef HAVE_LIBRPCRT4 + +/* Define to 1 if you have the `rt' library (-lrt). */ +#undef HAVE_LIBRT + +/* Define to 1 if you have the `shell32' library (-lshell32). */ +#undef HAVE_LIBSHELL32 + +/* Define to 1 if you have the `shlwapi' library (-lshlwapi). */ +#undef HAVE_LIBSHLWAPI + +/* Define to 1 if you have the `ssp' library (-lssp). */ +#undef HAVE_LIBSSP + +/* Define to 1 if you have the `user32' library (-luser32). */ +#undef HAVE_LIBUSER32 + +/* Define to 1 if you have the `uuid' library (-luuid). */ +#undef HAVE_LIBUUID + +/* Define to 1 if you have the `winmm' library (-lwinmm). */ +#undef HAVE_LIBWINMM + +/* Define to 1 if you have the `winspool' library (-lwinspool). */ +#undef HAVE_LIBWINSPOOL + +/* Define to 1 if you have the `ws2_32' library (-lws2_32). */ +#undef HAVE_LIBWS2_32 + +/* Define to 1 if you have the `z ' library (-lz ). */ +#undef HAVE_LIBZ_ + +/* Define this symbol if you have malloc_info */ +#undef HAVE_MALLOC_INFO + +/* Define this symbol if you have mallopt with M_ARENA_MAX */ +#undef HAVE_MALLOPT_ARENA_MAX + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MINIUPNPC_MINIUPNPC_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MINIUPNPC_MINIWGET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MINIUPNPC_UPNPCOMMANDS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MINIUPNPC_UPNPERRORS_H + +/* Define this symbol if you have MSG_DONTWAIT */ +#undef HAVE_MSG_DONTWAIT + +/* Define this symbol if you have MSG_NOSIGNAL */ +#undef HAVE_MSG_NOSIGNAL + +/* Define if you have POSIX threads libraries and header files. */ +#undef HAVE_PTHREAD + +/* Have PTHREAD_PRIO_INHERIT. */ +#undef HAVE_PTHREAD_PRIO_INHERIT + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strerror_r' function. */ +#undef HAVE_STRERROR_R + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PRCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SELECT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define if thread_local is supported. */ +#undef HAVE_THREAD_LOCAL + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define if the visibility attribute is supported. */ +#undef HAVE_VISIBILITY_ATTRIBUTE + +/* Define this symbol if boost sleep works */ +#undef HAVE_WORKING_BOOST_SLEEP + +/* Define this symbol if boost sleep_for works */ +#undef HAVE_WORKING_BOOST_SLEEP_FOR + +/* Define to the sub-directory where libtool stores uninstalled libraries. */ +#undef LT_OBJDIR + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to necessary symbol if this constant uses a non-standard name on + your system. */ +#undef PTHREAD_CREATE_JOINABLE + +/* Define this symbol if the qt platform is cocoa */ +#undef QT_QPA_PLATFORM_COCOA + +/* Define this symbol if the qt platform is windows */ +#undef QT_QPA_PLATFORM_WINDOWS + +/* Define this symbol if the qt platform is xcb */ +#undef QT_QPA_PLATFORM_XCB + +/* Define this symbol if qt plugins are static */ +#undef QT_STATICPLUGIN + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 if strerror_r returns char *. */ +#undef STRERROR_R_CHAR_P + +/* Define this symbol if coverage is enabled */ +#undef USE_COVERAGE + +/* Define if dbus support should be compiled in */ +#undef USE_DBUS + +/* Define if QR support should be compiled in */ +#undef USE_QRCODE + +/* UPnP support not compiled if undefined, otherwise value (0 or 1) determines + default state */ +#undef USE_UPNP + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif + +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +# define _DARWIN_USE_64_BIT_INODE 1 +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +#undef _FILE_OFFSET_BITS + +/* Define for large files, on AIX-style hosts. */ +#undef _LARGE_FILES + +#endif //OHMC_CONFIG_H diff --git a/src/crypto/.deps/libbitcoin_crypto_a-ripemd160.Po b/src/crypto/.deps/libbitcoin_crypto_a-ripemd160.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/src/crypto/.deps/libbitcoin_crypto_a-ripemd160.Po @@ -0,0 +1 @@ +# dummy diff --git a/src/crypto/.deps/libbitcoin_crypto_a-sha1.Po b/src/crypto/.deps/libbitcoin_crypto_a-sha1.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/src/crypto/.deps/libbitcoin_crypto_a-sha1.Po @@ -0,0 +1 @@ +# dummy diff --git a/src/crypto/.deps/libbitcoin_crypto_a-sha2.Po b/src/crypto/.deps/libbitcoin_crypto_a-sha2.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/src/crypto/.deps/libbitcoin_crypto_a-sha2.Po @@ -0,0 +1 @@ +# dummy diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index 48dcfd2c..91661e03 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -40,6 +40,16 @@ Q_IMPORT_PLUGIN(qtwcodecs) Q_IMPORT_PLUGIN(qkrcodecs) Q_IMPORT_PLUGIN(qtaccessiblewidgets) #endif +Q_IMPORT_PLUGIN(AccessibleFactory) +#if defined(QT_QPA_PLATFORM_XCB) +Q_IMPORT_PLUGIN(QXcbIntegrationPlugin); +#elif defined(QT_QPA_PLATFORM_WINDOWS) +Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin); +#elif defined(QT_QPA_PLATFORM_COCOA) +Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin); +#endif +#endif +#endif // Need a global reference for the notifications to find the GUI static DigitalNoteGUI *guiref; diff --git a/src/test/bctest.py b/src/test/bctest.py new file mode 100644 index 00000000..3b08e11e --- /dev/null +++ b/src/test/bctest.py @@ -0,0 +1,53 @@ +# Copyright 2014 BitPay, Inc. +# Distributed under the MIT/X11 software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +import subprocess +import os +import json +import sys + +def bctest(testDir, testObj, exeext): + + execprog = testObj['exec'] + exeext + execargs = testObj['args'] + execrun = [execprog] + execargs + stdinCfg = None + inputData = None + if "input" in testObj: + filename = testDir + "/" + testObj['input'] + inputData = open(filename).read() + stdinCfg = subprocess.PIPE + + outputFn = None + outputData = None + if "output_cmp" in testObj: + outputFn = testObj['output_cmp'] + outputData = open(testDir + "/" + outputFn).read() + proc = subprocess.Popen(execrun, stdin=stdinCfg, stdout=subprocess.PIPE, stderr=subprocess.PIPE,universal_newlines=True) + try: + outs = proc.communicate(input=inputData) + except OSError: + print("OSError, Failed to execute " + execprog) + sys.exit(1) + + if outputData and (outs[0] != outputData): + print("Output data mismatch for " + outputFn) + sys.exit(1) + + wantRC = 0 + if "return_code" in testObj: + wantRC = testObj['return_code'] + if proc.returncode != wantRC: + print("Return code mismatch for " + outputFn) + sys.exit(1) + +def bctester(testDir, input_basename, buildenv): + input_filename = testDir + "/" + input_basename + raw_data = open(input_filename).read() + input_data = json.loads(raw_data) + + for testObj in input_data: + bctest(testDir, testObj, buildenv.exeext) + + sys.exit(0) \ No newline at end of file diff --git a/src/test/bitcoin-util-test.py b/src/test/bitcoin-util-test.py new file mode 100644 index 00000000..ca47d756 --- /dev/null +++ b/src/test/bitcoin-util-test.py @@ -0,0 +1,12 @@ +#!/usr/bin/python +# Copyright 2014 BitPay, Inc. +# Distributed under the MIT/X11 software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +import os +import bctest +import buildenv + +if __name__ == '__main__': + bctest.bctester(os.environ["srcdir"] + "/test/data", + "bitcoin-util-test.json",buildenv) \ No newline at end of file diff --git a/src/test/buildenv.py b/src/test/buildenv.py new file mode 100644 index 00000000..a2cb8f38 --- /dev/null +++ b/src/test/buildenv.py @@ -0,0 +1,2 @@ +#!/usr/bin/python +exeext="" diff --git a/src/test/buildenv.py.in b/src/test/buildenv.py.in new file mode 100644 index 00000000..4a678b59 --- /dev/null +++ b/src/test/buildenv.py.in @@ -0,0 +1,2 @@ +#!/usr/bin/python +exeext="@EXEEXT@" \ No newline at end of file diff --git a/src/test/data/bitcoin-util-test.json b/src/test/data/bitcoin-util-test.json new file mode 100644 index 00000000..32b389d7 --- /dev/null +++ b/src/test/data/bitcoin-util-test.json @@ -0,0 +1,50 @@ +[ + { "exec": "././bitcoin-tx", + "args": ["-create"], + "output_cmp": "blanktx.hex" + }, + { "exec": "./bitcoin-tx", + "args": ["-"], + "input": "blanktx.hex", + "output_cmp": "blanktx.hex" + }, + { "exec": "./bitcoin-tx", + "args": ["-", "delin=1"], + "input": "tx394b54bb.hex", + "output_cmp": "tt-delin1-out.hex" + }, + { "exec": "./bitcoin-tx", + "args": ["-", "delin=31"], + "input": "tx394b54bb.hex", + "return_code": 1 + }, + { "exec": "./bitcoin-tx", + "args": ["-", "delout=1"], + "input": "tx394b54bb.hex", + "output_cmp": "tt-delout1-out.hex" + }, + { "exec": "./bitcoin-tx", + "args": ["-", "delout=2"], + "input": "tx394b54bb.hex", + "return_code": 1 + }, + { "exec": "./bitcoin-tx", + "args": ["-", "locktime=317000"], + "input": "tx394b54bb.hex", + "output_cmp": "tt-locktime317000-out.hex" + }, + { "exec": "./bitcoin-tx", + "args": + ["-create", + "in=5897de6bd6027a475eadd57019d4e6872c396d0716c4875a5f1a6fcfdf385c1f:0", + "in=bf829c6bcf84579331337659d31f89dfd138f7f7785802d5501c92333145ca7c:18", + "in=22a6f904655d53ae2ff70e701a0bbd90aa3975c0f40bfc6cc996a9049e31cdfc:1", + "outaddr=0.18:13tuJJDR2RgArmgfv6JScSdreahzgc4T6o", + "outaddr=4:1P8yWvZW8jVihP1bzHeqfE4aoXNX8AVa46"], + "output_cmp": "txcreate1.hex" + }, + { "exec": "./bitcoin-tx", + "args": ["-create", "outscript=0:"], + "output_cmp": "txcreate2.hex" + } +] \ No newline at end of file diff --git a/src/univalue/.deps/univalue.Po b/src/univalue/.deps/univalue.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/src/univalue/.deps/univalue.Po @@ -0,0 +1 @@ +# dummy diff --git a/src/univalue/.deps/univalue_read.Po b/src/univalue/.deps/univalue_read.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/src/univalue/.deps/univalue_read.Po @@ -0,0 +1 @@ +# dummy diff --git a/src/univalue/.deps/univalue_write.Po b/src/univalue/.deps/univalue_write.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/src/univalue/.deps/univalue_write.Po @@ -0,0 +1 @@ +# dummy diff --git a/src/util.cpp b/src/util.cpp index fe5e56b1..d59ddc5f 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -3,6 +3,10 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#if defined(HAVE_CONFIG_H) +#include "config/bitcoin-config.h" +#endif + #include "util.h" #include "chainparams.h" @@ -15,9 +19,12 @@ #include - #include +#ifdef HAVE_SYS_PRCTL_H +#include +#endif + #include // for to_lower() #include #include // for startswith() and endswith() From 9f12457778b9b22493e128199deb9f3a54acfec1 Mon Sep 17 00:00:00 2001 From: 2a5A1Ghu1 <13294167+2a5A1Ghu1@users.noreply.github.com> Date: Sun, 8 Nov 2020 18:18:31 -0800 Subject: [PATCH 06/35] [BUILD] Add Depends Crosscompile This is from the latest Dash upstream and may not work until the rest of the build system is updated. --- configure.ac | 2 +- depends/.gitignore | 10 + depends/README.md | 75 + depends/builders/darwin.mk | 22 + depends/builders/default.mk | 20 + depends/builders/linux.mk | 2 + depends/config.guess | 1466 ++++++++++++++++ depends/config.site.in | 98 ++ depends/config.sub | 1836 +++++++++++++++++++++ depends/description.md | 53 + depends/funcs.mk | 247 +++ depends/hosts/darwin.mk | 17 + depends/hosts/default.mk | 30 + depends/hosts/linux.mk | 31 + depends/hosts/mingw32.mk | 10 + depends/packages.md | 147 ++ depends/packages/backtrace.mk | 21 + depends/packages/bdb.mk | 31 + depends/packages/boost.mk | 41 + depends/packages/chia_bls.mk | 51 + depends/packages/dbus.mk | 23 + depends/packages/expat.mk | 21 + depends/packages/fontconfig.mk | 28 + depends/packages/freetype.mk | 22 + depends/packages/gmp.mk | 23 + depends/packages/libICE.mk | 23 + depends/packages/libSM.mk | 23 + depends/packages/libX11.mk | 23 + depends/packages/libXau.mk | 23 + depends/packages/libXext.mk | 22 + depends/packages/libevent.mk | 30 + depends/packages/libxcb.mk | 35 + depends/packages/miniupnpc.mk | 28 + depends/packages/native_biplist.mk | 20 + depends/packages/native_cctools.mk | 65 + depends/packages/native_cdrkit.mk | 26 + depends/packages/native_ds_store.mk | 16 + depends/packages/native_libdmg-hfsplus.mk | 22 + depends/packages/native_mac_alias.mk | 20 + depends/packages/native_protobuf.mk | 25 + depends/packages/openssl.mk | 81 + depends/packages/packages.mk | 20 + depends/packages/protobuf.mk | 29 + depends/packages/qrencode.mk | 22 + depends/packages/qt.mk | 192 +++ depends/packages/xcb_proto.mk | 27 + depends/packages/xextproto.mk | 21 + depends/packages/xproto.mk | 21 + depends/packages/xtrans.mk | 22 + depends/packages/zeromq.mk | 34 + depends/packages/zlib.mk | 27 + depends/patches/qt/mac-qmake.conf | 25 + 52 files changed, 5248 insertions(+), 1 deletion(-) create mode 100644 depends/.gitignore create mode 100644 depends/README.md create mode 100644 depends/builders/darwin.mk create mode 100644 depends/builders/default.mk create mode 100644 depends/builders/linux.mk create mode 100755 depends/config.guess create mode 100644 depends/config.site.in create mode 100755 depends/config.sub create mode 100644 depends/description.md create mode 100644 depends/funcs.mk create mode 100644 depends/hosts/darwin.mk create mode 100644 depends/hosts/default.mk create mode 100644 depends/hosts/linux.mk create mode 100644 depends/hosts/mingw32.mk create mode 100644 depends/packages.md create mode 100644 depends/packages/backtrace.mk create mode 100644 depends/packages/bdb.mk create mode 100644 depends/packages/boost.mk create mode 100644 depends/packages/chia_bls.mk create mode 100644 depends/packages/dbus.mk create mode 100644 depends/packages/expat.mk create mode 100644 depends/packages/fontconfig.mk create mode 100644 depends/packages/freetype.mk create mode 100644 depends/packages/gmp.mk create mode 100644 depends/packages/libICE.mk create mode 100644 depends/packages/libSM.mk create mode 100644 depends/packages/libX11.mk create mode 100644 depends/packages/libXau.mk create mode 100644 depends/packages/libXext.mk create mode 100644 depends/packages/libevent.mk create mode 100644 depends/packages/libxcb.mk create mode 100644 depends/packages/miniupnpc.mk create mode 100644 depends/packages/native_biplist.mk create mode 100644 depends/packages/native_cctools.mk create mode 100644 depends/packages/native_cdrkit.mk create mode 100644 depends/packages/native_ds_store.mk create mode 100644 depends/packages/native_libdmg-hfsplus.mk create mode 100644 depends/packages/native_mac_alias.mk create mode 100644 depends/packages/native_protobuf.mk create mode 100644 depends/packages/openssl.mk create mode 100644 depends/packages/packages.mk create mode 100644 depends/packages/protobuf.mk create mode 100644 depends/packages/qrencode.mk create mode 100644 depends/packages/qt.mk create mode 100644 depends/packages/xcb_proto.mk create mode 100644 depends/packages/xextproto.mk create mode 100644 depends/packages/xproto.mk create mode 100644 depends/packages/xtrans.mk create mode 100644 depends/packages/zeromq.mk create mode 100644 depends/packages/zlib.mk create mode 100644 depends/patches/qt/mac-qmake.conf diff --git a/configure.ac b/configure.ac index 035ce326..efea195a 100644 --- a/configure.ac +++ b/configure.ac @@ -519,7 +519,7 @@ if test x$use_tests = xyes; then dnl Determine if -DBOOST_TEST_DYN_LINK is needed AC_MSG_CHECKING([for dynamic linked boost test]) TEMP_LIBS="$LIBS" - LIBS="$LIBS $BOOST_UNIT_TEST_FRAMEWORK_LIB" + LIBS="$LIBS $BOOST_LDFLAGS $BOOST_UNIT_TEST_FRAMEWORK_LIB" TEMP_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" AC_LINK_IFELSE([AC_LANG_SOURCE([ diff --git a/depends/.gitignore b/depends/.gitignore new file mode 100644 index 00000000..3cb4b9ac --- /dev/null +++ b/depends/.gitignore @@ -0,0 +1,10 @@ +SDKs/ +work/ +built/ +sources/ +config.site +x86_64* +i686* +mips* +arm* +aarch64* diff --git a/depends/README.md b/depends/README.md new file mode 100644 index 00000000..dc4121a6 --- /dev/null +++ b/depends/README.md @@ -0,0 +1,75 @@ +### Usage + +To build dependencies for the current arch+OS: + + make + +To build for another arch/OS: + + make HOST=host-platform-triplet + +For example: + + make HOST=x86_64-w64-mingw32 -j4 + +A prefix will be generated that's suitable for plugging into Dash's +configure. In the above example, a dir named x86_64-w64-mingw32 will be +created. To use it for Dash: + + ./configure --prefix=`pwd`/depends/x86_64-w64-mingw32 + +Common `host-platform-triplets` for cross compilation are: + +- `i686-w64-mingw32` for Win32 +- `x86_64-w64-mingw32` for Win64 +- `x86_64-apple-darwin11` for MacOSX +- `arm-linux-gnueabihf` for Linux ARM 32 bit +- `aarch64-linux-gnu` for Linux ARM 64 bit + +No other options are needed, the paths are automatically configured. + +Install the required dependencies: Ubuntu & Debian +-------------------------------------------------- + +For macOS cross compilation: + + sudo apt-get install curl librsvg2-bin libtiff-tools bsdmainutils cmake imagemagick libcap-dev libz-dev libbz2-dev python-setuptools + +For Win32/Win64 cross compilation: + +- see [build-windows.md](../doc/build-windows.md#cross-compilation-for-ubuntu-and-windows-subsystem-for-linux) + +For linux (including i386, ARM) cross compilation: + + sudo apt-get install curl g++-aarch64-linux-gnu g++-4.8-aarch64-linux-gnu gcc-4.8-aarch64-linux-gnu binutils-aarch64-linux-gnu g++-arm-linux-gnueabihf g++-4.8-arm-linux-gnueabihf gcc-4.8-arm-linux-gnueabihf binutils-arm-linux-gnueabihf g++-4.8-multilib gcc-4.8-multilib binutils-gold bsdmainutils + + +Dependency Options: +The following can be set when running make: make FOO=bar + + SOURCES_PATH: downloaded sources will be placed here + BASE_CACHE: built packages will be placed here + SDK_PATH: Path where sdk's can be found (used by OSX) + FALLBACK_DOWNLOAD_PATH: If a source file can't be fetched, try here before giving up + NO_QT: Don't download/build/cache qt and its dependencies + 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 + 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 +options will be passed to Dash Core's configure. In this case, `--disable-wallet`. + +Additional targets: + + download: run 'make download' to fetch all sources without building them + download-osx: run 'make download-osx' to fetch all sources needed for osx builds + download-win: run 'make download-win' to fetch all sources needed for win builds + download-linux: run 'make download-linux' to fetch all sources needed for linux builds + +### Other documentation + +- [description.md](description.md): General description of the depends system +- [packages.md](packages.md): Steps for adding packages + diff --git a/depends/builders/darwin.mk b/depends/builders/darwin.mk new file mode 100644 index 00000000..dae2aca2 --- /dev/null +++ b/depends/builders/darwin.mk @@ -0,0 +1,22 @@ +build_darwin_CC: = $(shell xcrun -f clang) +build_darwin_CXX: = $(shell xcrun -f clang++) +build_darwin_AR: = $(shell xcrun -f ar) +build_darwin_RANLIB: = $(shell xcrun -f ranlib) +build_darwin_STRIP: = $(shell xcrun -f strip) +build_darwin_OTOOL: = $(shell xcrun -f otool) +build_darwin_NM: = $(shell xcrun -f nm) +build_darwin_INSTALL_NAME_TOOL:=$(shell xcrun -f install_name_tool) +build_darwin_SHA256SUM = shasum -a 256 +build_darwin_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) -o + +#darwin host on darwin builder. overrides darwin host preferences. +darwin_CC=$(shell xcrun -f clang) -mmacosx-version-min=$(OSX_MIN_VERSION) --sysroot $(shell xcrun --show-sdk-path) +darwin_CXX:=$(shell xcrun -f clang++) -mmacosx-version-min=$(OSX_MIN_VERSION) -stdlib=libc++ -fvisibility=hidden --sysroot $(shell xcrun --show-sdk-path) +darwin_AR:=$(shell xcrun -f ar) +darwin_RANLIB:=$(shell xcrun -f ranlib) +darwin_STRIP:=$(shell xcrun -f strip) +darwin_LIBTOOL:=$(shell xcrun -f libtool) +darwin_OTOOL:=$(shell xcrun -f otool) +darwin_NM:=$(shell xcrun -f nm) +darwin_INSTALL_NAME_TOOL:=$(shell xcrun -f install_name_tool) +darwin_native_toolchain= diff --git a/depends/builders/default.mk b/depends/builders/default.mk new file mode 100644 index 00000000..f097db65 --- /dev/null +++ b/depends/builders/default.mk @@ -0,0 +1,20 @@ +default_build_CC = gcc +default_build_CXX = g++ +default_build_AR = ar +default_build_RANLIB = ranlib +default_build_STRIP = strip +default_build_NM = nm +default_build_OTOOL = otool +default_build_INSTALL_NAME_TOOL = install_name_tool + +define add_build_tool_func +build_$(build_os)_$1 ?= $$(default_build_$1) +build_$(build_arch)_$(build_os)_$1 ?= $$(build_$(build_os)_$1) +build_$1=$$(build_$(build_arch)_$(build_os)_$1) +endef +$(foreach var,CC CXX AR RANLIB NM STRIP SHA256SUM DOWNLOAD OTOOL INSTALL_NAME_TOOL,$(eval $(call add_build_tool_func,$(var)))) +define add_build_flags_func +build_$(build_arch)_$(build_os)_$1 += $(build_$(build_os)_$1) +build_$1=$$(build_$(build_arch)_$(build_os)_$1) +endef +$(foreach flags, CFLAGS CXXFLAGS LDFLAGS, $(eval $(call add_build_flags_func,$(flags)))) diff --git a/depends/builders/linux.mk b/depends/builders/linux.mk new file mode 100644 index 00000000..9af0d066 --- /dev/null +++ b/depends/builders/linux.mk @@ -0,0 +1,2 @@ +build_linux_SHA256SUM = sha256sum +build_linux_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) -o diff --git a/depends/config.guess b/depends/config.guess new file mode 100755 index 00000000..69ed3e57 --- /dev/null +++ b/depends/config.guess @@ -0,0 +1,1466 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2017 Free Software Foundation, Inc. + +timestamp='2017-03-05' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2017 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "${UNAME_SYSTEM}" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + eval $set_cc_for_build + cat <<-EOF > $dummy.c + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + LIBC=gnu + #endif + EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + /sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || \ + echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` + machine=${arch}${endian}-unknown + ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case "${UNAME_MACHINE_ARCH}" in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "${UNAME_MACHINE_ARCH}" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}${abi}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:Sortix:*:*) + echo ${UNAME_MACHINE}-unknown-sortix + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = x && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/lslpp ] ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = hppa2.0w ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case ${UNAME_PROCESSOR} in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW64*:*) + echo ${UNAME_MACHINE}-pc-mingw64 + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + *:MSYS*:*) + echo ${UNAME_MACHINE}-pc-msys + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + aarch64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi + else + echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + cris:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + crisv32:Linux:*:*) + echo ${UNAME_MACHINE}-axis-linux-${LIBC} + exit ;; + e2k:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + frv:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + hexagon:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:Linux:*:*) + echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + k1om:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } + ;; + mips64el:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-${LIBC} + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-${LIBC} + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-${LIBC} + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; + PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; + *) echo hppa-unknown-linux-${LIBC} ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-${LIBC} + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-${LIBC} + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-${LIBC} + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-${LIBC} + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux-${LIBC} + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + tile*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-${LIBC} + exit ;; + x86_64:Linux:*:*) + echo ${UNAME_MACHINE}-pc-linux-${LIBC} + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-${LIBC} + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + eval $set_cc_for_build + if test "$UNAME_PROCESSOR" = unknown ; then + UNAME_PROCESSOR=powerpc + fi + if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # Avoid executing cc on OS X 10.9, as it ships with a stub + # that puts up a graphical alert prompting to install + # developer tools. Any system running Mac OS X 10.7 or + # later (Darwin 11 and later) is required to have a 64-bit + # processor. This is not true of the ARM version of Darwin + # that Apple uses in portable devices. + UNAME_PROCESSOR=x86_64 + fi + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-?:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk${UNAME_RELEASE} + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + NSX-?:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE} | sed -e 's/ .*$//'` + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo ${UNAME_MACHINE}-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; +esac + +cat >&2 </dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/depends/config.site.in b/depends/config.site.in new file mode 100644 index 00000000..370c9ee7 --- /dev/null +++ b/depends/config.site.in @@ -0,0 +1,98 @@ +depends_prefix="`dirname ${ac_site_file}`/.." + +cross_compiling=maybe +host_alias=@HOST@ +ac_tool_prefix=${host_alias}- + +if test -z $with_boost; then + with_boost=$depends_prefix +fi +if test -z $with_qt_plugindir; then + with_qt_plugindir=$depends_prefix/plugins +fi +if test -z $with_qt_translationdir; then + with_qt_translationdir=$depends_prefix/translations +fi +if test -z $with_qt_bindir; then + with_qt_bindir=$depends_prefix/native/bin +fi +if test -z $with_protoc_bindir; then + with_protoc_bindir=$depends_prefix/native/bin +fi + + +if test -z $enable_wallet && test -n "@no_wallet@"; then + enable_wallet=no +fi + +if test -z $with_miniupnpc && test -n "@no_upnp@"; then + with_miniupnpc=no +fi + +if test -z $with_gui && test -n "@no_qt@"; then + with_gui=no +fi + +if test x@host_os@ = xdarwin; then + BREW=no + PORT=no +fi + +if test x@host_os@ = xmingw32; then + if test -z $with_qt_incdir; then + with_qt_incdir=$depends_prefix/include + fi + if test -z $with_qt_libdir; then + with_qt_libdir=$depends_prefix/lib + fi +fi + +PATH=$depends_prefix/native/bin:$PATH +PKG_CONFIG="`which pkg-config` --static" + +# These two need to remain exported because pkg-config does not see them +# otherwise. That means they must be unexported at the end of configure.ac to +# avoid ruining the cache. Sigh. + +export PKG_CONFIG_LIBDIR=$depends_prefix/lib/pkgconfig +export PKG_CONFIG_PATH=$depends_prefix/share/pkgconfig + +CPPFLAGS="-I$depends_prefix/include/ $CPPFLAGS" +LDFLAGS="-L$depends_prefix/lib $LDFLAGS" + +CC="@CC@" +CXX="@CXX@" +OBJC="${CC}" +PYTHONPATH=$depends_prefix/native/lib/python/dist-packages:$PYTHONPATH + +if test -n "@AR@"; then + AR=@AR@ + ac_cv_path_ac_pt_AR=${AR} +fi + +if test -n "@RANLIB@"; then + RANLIB=@RANLIB@ + ac_cv_path_ac_pt_RANLIB=${RANLIB} +fi + +if test -n "@NM@"; then + NM=@NM@ + ac_cv_path_ac_pt_NM=${NM} +fi + +if test -n "@debug@"; then + enable_reduce_exports=no +fi + +if test -n "@CFLAGS@"; then + CFLAGS="@CFLAGS@ $CFLAGS" +fi +if test -n "@CXXFLAGS@"; then + CXXFLAGS="@CXXFLAGS@ $CXXFLAGS" +fi +if test -n "@CPPFLAGS@"; then + CPPFLAGS="@CPPFLAGS@ $CPPFLAGS" +fi +if test -n "@LDFLAGS@"; then + LDFLAGS="@LDFLAGS@ $LDFLAGS" +fi diff --git a/depends/config.sub b/depends/config.sub new file mode 100755 index 00000000..40ea5dfe --- /dev/null +++ b/depends/config.sub @@ -0,0 +1,1836 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2017 Free Software Foundation, Inc. + +timestamp='2017-04-02' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2017 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ + kopensolaris*-gnu* | cloudabi*-eabi* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + android-linux) + os=-linux-android + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze*) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*178) + os=-lynxos178 + ;; + -lynx*5) + os=-lynxos5 + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | aarch64 | aarch64_be \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arceb \ + | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ + | avr | avr32 \ + | ba \ + | be32 | be64 \ + | bfin \ + | c4x | c8051 | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | epiphany \ + | fido | fr30 | frv | ft32 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia16 | ia64 \ + | ip2k | iq2000 \ + | k1om \ + | le32 | le64 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | microblazeel | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa32r6 | mipsisa32r6el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64r6 | mipsisa64r6el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipsr5900 | mipsr5900el \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nds32 | nds32le | nds32be \ + | nios | nios2 | nios2eb | nios2el \ + | ns16k | ns32k \ + | open8 | or1k | or1knd | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pru \ + | pyramid \ + | riscv32 | riscv64 \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu \ + | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ + | visium \ + | wasm32 \ + | we32k \ + | x86 | xc16x | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + leon|leon[3-9]) + basic_machine=sparc-$basic_machine + ;; + m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + strongarm | thumb | xscale) + basic_machine=arm-unknown + ;; + xgate) + basic_machine=$basic_machine-unknown + os=-none + ;; + xscaleeb) + basic_machine=armeb-unknown + ;; + + xscaleel) + basic_machine=armel-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | aarch64-* | aarch64_be-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | ba-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | e2k-* | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ + | ip2k-* | iq2000-* \ + | k1om-* \ + | le32-* | le64-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ + | microblaze-* | microblazeel-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa32r6-* | mipsisa32r6el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64r6-* | mipsisa64r6el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipsr5900-* | mipsr5900el-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nds32-* | nds32le-* | nds32be-* \ + | nios-* | nios2-* | nios2eb-* | nios2el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | open8-* \ + | or1k*-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ + | pru-* \ + | pyramid-* \ + | riscv32-* | riscv64-* \ + | rl78-* | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \ + | tahoe-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile*-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ + | vax-* \ + | visium-* \ + | wasm32-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + asmjs) + basic_machine=asmjs-unknown + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16 | cr16-*) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + e500v[12]) + basic_machine=powerpc-unknown + os=$os"spe" + ;; + e500v[12]-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + os=$os"spe" + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + leon-*|leon[3-9]-*) + basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze*) + basic_machine=microblaze-xilinx + ;; + mingw64) + basic_machine=x86_64-pc + os=-mingw64 + ;; + mingw32) + basic_machine=i686-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + moxiebox) + basic_machine=moxie-unknown + os=-moxiebox + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + msys) + basic_machine=i686-pc + os=-msys + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + nacl) + basic_machine=le32-unknown + os=-nacl + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + neo-tandem) + basic_machine=neo-tandem + ;; + nse-tandem) + basic_machine=nse-tandem + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + nsx-tandem) + basic_machine=nsx-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc | ppcbe) basic_machine=powerpc-unknown + ;; + ppc-* | ppcbe-*) + basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + os=-rdos + ;; + rdos32) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + strongarm-* | thumb-*) + basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tile*) + basic_machine=$basic_machine-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + wasm32) + basic_machine=wasm32-unknown + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + xscale-* | xscalee[bl]-*) + basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* | -plan9* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* | -cloudabi* | -sortix* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* | -glidix* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ + | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -ios) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + c8051-*) + os=-elf + ;; + hexagon-*) + os=-elf + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + pru-*) + os=-elf + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/depends/description.md b/depends/description.md new file mode 100644 index 00000000..74f9ef3f --- /dev/null +++ b/depends/description.md @@ -0,0 +1,53 @@ +This is a system of building and caching dependencies necessary for building Bitcoin. +There are several features that make it different from most similar systems: + +### It is designed to be builder and host agnostic + +In theory, binaries for any target OS/architecture can be created, from a +builder running any OS/architecture. In practice, build-side tools must be +specified when the defaults don't fit, and packages must be amended to work +on new hosts. For now, a build architecture of x86_64 is assumed, either on +Linux or OSX. + +### No reliance on timestamps + +File presence is used to determine what needs to be built. This makes the +results distributable and easily digestable by automated builders. + +### Each build only has its specified dependencies available at build-time. + +For each build, the sysroot is wiped and the (recursive) dependencies are +installed. This makes each build deterministic, since there will never be any +unknown files available to cause side-effects. + +### Each package is cached and only rebuilt as needed. + +Before building, a unique build-id is generated for each package. This id +consists of a hash of all files used to build the package (Makefiles, packages, +etc), and as well as a hash of the same data for each recursive dependency. If +any portion of a package's build recipe changes, it will be rebuilt as well as +any other package that depends on it. If any of the main makefiles (Makefile, +funcs.mk, etc) are changed, all packages will be rebuilt. After building, the +results are cached into a tarball that can be re-used and distributed. + +### Package build results are (relatively) deterministic. + +Each package is configured and patched so that it will yield the same +build-results with each consequent build, within a reasonable set of +constraints. Some things like timestamp insertion are unavoidable, and are +beyond the scope of this system. Additionally, the toolchain itself must be +capable of deterministic results. When revisions are properly bumped, a cached +build should represent an exact single payload. + +### Sources are fetched and verified automatically + +Each package must define its source location and checksum. The build will fail +if the fetched source does not match. Sources may be pre-seeded and/or cached +as desired. + +### Self-cleaning + +Build and staging dirs are wiped after use, and any previous version of a +cached result is removed following a successful build. Automated builders +should be able to build each revision and store the results with no further +intervention. diff --git a/depends/funcs.mk b/depends/funcs.mk new file mode 100644 index 00000000..5c05a4e7 --- /dev/null +++ b/depends/funcs.mk @@ -0,0 +1,247 @@ +define int_vars +#Set defaults for vars which may be overridden per-package +$(1)_cc=$($($(1)_type)_CC) +$(1)_cxx=$($($(1)_type)_CXX) +$(1)_objc=$($($(1)_type)_OBJC) +$(1)_objcxx=$($($(1)_type)_OBJCXX) +$(1)_ar=$($($(1)_type)_AR) +$(1)_ranlib=$($($(1)_type)_RANLIB) +$(1)_libtool=$($($(1)_type)_LIBTOOL) +$(1)_nm=$($($(1)_type)_NM) +$(1)_cflags=$($($(1)_type)_CFLAGS) $($($(1)_type)_$(release_type)_CFLAGS) +$(1)_cxxflags=$($($(1)_type)_CXXFLAGS) $($($(1)_type)_$(release_type)_CXXFLAGS) +$(1)_ldflags=$($($(1)_type)_LDFLAGS) $($($(1)_type)_$(release_type)_LDFLAGS) -L$($($(1)_type)_prefix)/lib +$(1)_cppflags=$($($(1)_type)_CPPFLAGS) $($($(1)_type)_$(release_type)_CPPFLAGS) -I$($($(1)_type)_prefix)/include +$(1)_recipe_hash:= +endef + +define int_get_all_dependencies +$(sort $(foreach dep,$(2),$(2) $(call int_get_all_dependencies,$(1),$($(dep)_dependencies)))) +endef + +define fetch_file_inner + ( mkdir -p $$($(1)_download_dir) && echo Fetching $(3) from $(2) && \ + $(build_DOWNLOAD) "$$($(1)_download_dir)/$(4).temp" "$(2)/$(3)" && \ + echo "$(5) $$($(1)_download_dir)/$(4).temp" > $$($(1)_download_dir)/.$(4).hash && \ + $(build_SHA256SUM) -c $$($(1)_download_dir)/.$(4).hash && \ + mv $$($(1)_download_dir)/$(4).temp $$($(1)_source_dir)/$(4) && \ + rm -rf $$($(1)_download_dir) ) +endef + +define fetch_file + ( test -f $$($(1)_source_dir)/$(4) || \ + ( $(call fetch_file_inner,$(1),$(2),$(3),$(4),$(5)) || \ + (sleep 5 && $(call fetch_file_inner,$(1),$(2),$(3),$(4),$(5))) || \ + (sleep 10 && $(call fetch_file_inner,$(1),$(2),$(3),$(4),$(5))) || \ + $(call fetch_file_inner,$(1),$(FALLBACK_DOWNLOAD_PATH),$(3),$(4),$(5)))) +endef + +define int_get_build_recipe_hash +$(eval $(1)_all_file_checksums:=$(shell $(build_SHA256SUM) $(meta_depends) packages/$(1).mk $(addprefix $(PATCHES_PATH)/$(1)/,$($(1)_patches)) | cut -d" " -f1)) +$(eval $(1)_recipe_hash:=$(shell echo -n "$($(1)_all_file_checksums)" | $(build_SHA256SUM) | cut -d" " -f1)) +endef + +define int_get_build_id +$(eval $(1)_dependencies += $($(1)_$(host_arch)_$(host_os)_dependencies) $($(1)_$(host_os)_dependencies)) +$(eval $(1)_all_dependencies:=$(call int_get_all_dependencies,$(1),$($($(1)_type)_native_toolchain) $($(1)_dependencies))) +$(foreach dep,$($(1)_all_dependencies),$(eval $(1)_build_id_deps+=$(dep)-$($(dep)_version)-$($(dep)_recipe_hash))) +$(eval $(1)_build_id_long:=$(1)-$($(1)_version)-$($(1)_recipe_hash)-$(release_type) $($(1)_build_id_deps) $($($(1)_type)_id_string)) +$(eval $(1)_build_id:=$(shell echo -n "$($(1)_build_id_long)" | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH))) +final_build_id_long+=$($(package)_build_id_long) + +#compute package-specific paths +$(1)_build_subdir?=. +$(1)_download_file?=$($(1)_file_name) +$(1)_source_dir:=$(SOURCES_PATH) +$(1)_source:=$$($(1)_source_dir)/$($(1)_file_name) +$(1)_staging_dir=$(base_staging_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id) +$(1)_staging_prefix_dir:=$$($(1)_staging_dir)$($($(1)_type)_prefix) +$(1)_extract_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id) +$(1)_download_dir:=$(base_download_dir)/$(1)-$($(1)_version) +$(1)_build_dir:=$$($(1)_extract_dir)/$$($(1)_build_subdir) +$(1)_cached_checksum:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz.hash +$(1)_patch_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id)/.patches-$($(1)_build_id) +$(1)_prefixbin:=$($($(1)_type)_prefix)/bin/ +$(1)_cached:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz +$(1)_all_sources=$($(1)_file_name) $($(1)_extra_sources) + +#stamps +$(1)_fetched=$(SOURCES_PATH)/download-stamps/.stamp_fetched-$(1)-$($(1)_file_name).hash +$(1)_extracted=$$($(1)_extract_dir)/.stamp_extracted +$(1)_preprocessed=$$($(1)_extract_dir)/.stamp_preprocessed +$(1)_cleaned=$$($(1)_extract_dir)/.stamp_cleaned +$(1)_built=$$($(1)_build_dir)/.stamp_built +$(1)_configured=$$($(1)_build_dir)/.stamp_configured +$(1)_staged=$$($(1)_staging_dir)/.stamp_staged +$(1)_postprocessed=$$($(1)_staging_prefix_dir)/.stamp_postprocessed +$(1)_download_path_fixed=$(subst :,\:,$$($(1)_download_path)) + + +#default commands +$(1)_fetch_cmds ?= $(call fetch_file,$(1),$(subst \:,:,$$($(1)_download_path_fixed)),$$($(1)_download_file),$($(1)_file_name),$($(1)_sha256_hash)) +$(1)_extract_cmds ?= mkdir -p $$($(1)_extract_dir) && echo "$$($(1)_sha256_hash) $$($(1)_source)" > $$($(1)_extract_dir)/.$$($(1)_file_name).hash && $(build_SHA256SUM) -c $$($(1)_extract_dir)/.$$($(1)_file_name).hash && tar --strip-components=1 -xf $$($(1)_source) +$(1)_preprocess_cmds ?= +$(1)_build_cmds ?= +$(1)_config_cmds ?= +$(1)_stage_cmds ?= +$(1)_set_vars ?= + + +all_sources+=$$($(1)_fetched) +endef +#$(foreach dep_target,$($(1)_all_dependencies),$(eval $(1)_dependency_targets=$($(dep_target)_cached))) + + +define int_config_attach_build_config +$(eval $(call $(1)_set_vars,$(1))) +$(1)_cflags+=$($(1)_cflags_$(release_type)) +$(1)_cflags+=$($(1)_cflags_$(host_arch)) $($(1)_cflags_$(host_arch)_$(release_type)) +$(1)_cflags+=$($(1)_cflags_$(host_os)) $($(1)_cflags_$(host_os)_$(release_type)) +$(1)_cflags+=$($(1)_cflags_$(host_arch)_$(host_os)) $($(1)_cflags_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_cxxflags+=$($(1)_cxxflags_$(release_type)) +$(1)_cxxflags+=$($(1)_cxxflags_$(host_arch)) $($(1)_cxxflags_$(host_arch)_$(release_type)) +$(1)_cxxflags+=$($(1)_cxxflags_$(host_os)) $($(1)_cxxflags_$(host_os)_$(release_type)) +$(1)_cxxflags+=$($(1)_cxxflags_$(host_arch)_$(host_os)) $($(1)_cxxflags_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_cppflags+=$($(1)_cppflags_$(release_type)) +$(1)_cppflags+=$($(1)_cppflags_$(host_arch)) $($(1)_cppflags_$(host_arch)_$(release_type)) +$(1)_cppflags+=$($(1)_cppflags_$(host_os)) $($(1)_cppflags_$(host_os)_$(release_type)) +$(1)_cppflags+=$($(1)_cppflags_$(host_arch)_$(host_os)) $($(1)_cppflags_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_ldflags+=$($(1)_ldflags_$(release_type)) +$(1)_ldflags+=$($(1)_ldflags_$(host_arch)) $($(1)_ldflags_$(host_arch)_$(release_type)) +$(1)_ldflags+=$($(1)_ldflags_$(host_os)) $($(1)_ldflags_$(host_os)_$(release_type)) +$(1)_ldflags+=$($(1)_ldflags_$(host_arch)_$(host_os)) $($(1)_ldflags_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_build_opts+=$$($(1)_build_opts_$(release_type)) +$(1)_build_opts+=$$($(1)_build_opts_$(host_arch)) $$($(1)_build_opts_$(host_arch)_$(release_type)) +$(1)_build_opts+=$$($(1)_build_opts_$(host_os)) $$($(1)_build_opts_$(host_os)_$(release_type)) +$(1)_build_opts+=$$($(1)_build_opts_$(host_arch)_$(host_os)) $$($(1)_build_opts_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_config_opts+=$$($(1)_config_opts_$(release_type)) +$(1)_config_opts+=$$($(1)_config_opts_$(host_arch)) $$($(1)_config_opts_$(host_arch)_$(release_type)) +$(1)_config_opts+=$$($(1)_config_opts_$(host_os)) $$($(1)_config_opts_$(host_os)_$(release_type)) +$(1)_config_opts+=$$($(1)_config_opts_$(host_arch)_$(host_os)) $$($(1)_config_opts_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_config_env+=$$($(1)_config_env_$(release_type)) +$(1)_config_env+=$($(1)_config_env_$(host_arch)) $($(1)_config_env_$(host_arch)_$(release_type)) +$(1)_config_env+=$($(1)_config_env_$(host_os)) $($(1)_config_env_$(host_os)_$(release_type)) +$(1)_config_env+=$($(1)_config_env_$(host_arch)_$(host_os)) $($(1)_config_env_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_config_env+=PKG_CONFIG_LIBDIR=$($($(1)_type)_prefix)/lib/pkgconfig +$(1)_config_env+=PKG_CONFIG_PATH=$($($(1)_type)_prefix)/share/pkgconfig +$(1)_config_env+=PATH=$(build_prefix)/bin:$(PATH) +$(1)_build_env+=PATH=$(build_prefix)/bin:$(PATH) +$(1)_stage_env+=PATH=$(build_prefix)/bin:$(PATH) +$(1)_autoconf=./configure --host=$($($(1)_type)_host) --disable-dependency-tracking --prefix=$($($(1)_type)_prefix) $$($(1)_config_opts) CC="$$($(1)_cc)" CXX="$$($(1)_cxx)" + +ifneq ($($(1)_nm),) +$(1)_autoconf += NM="$$($(1)_nm)" +endif +ifneq ($($(1)_ranlib),) +$(1)_autoconf += RANLIB="$$($(1)_ranlib)" +endif +ifneq ($($(1)_ar),) +$(1)_autoconf += AR="$$($(1)_ar)" +endif +ifneq ($($(1)_cflags),) +$(1)_autoconf += CFLAGS="$$($(1)_cflags)" +endif +ifneq ($($(1)_cxxflags),) +$(1)_autoconf += CXXFLAGS="$$($(1)_cxxflags)" +endif +ifneq ($($(1)_cppflags),) +$(1)_autoconf += CPPFLAGS="$$($(1)_cppflags)" +endif +ifneq ($($(1)_ldflags),) +$(1)_autoconf += LDFLAGS="$$($(1)_ldflags)" +endif +endef + +define int_add_cmds +$($(1)_fetched): + $(AT)mkdir -p $$(@D) $(SOURCES_PATH) + $(AT)rm -f $$@ + $(AT)touch $$@ + $(AT)cd $$(@D); $(call $(1)_fetch_cmds,$(1)) + $(AT)cd $($(1)_source_dir); $(foreach source,$($(1)_all_sources),$(build_SHA256SUM) $(source) >> $$(@);) + $(AT)touch $$@ +$($(1)_extracted): | $($(1)_fetched) + $(AT)echo Extracting $(1)... + $(AT)mkdir -p $$(@D) + $(AT)cd $$(@D); $(call $(1)_extract_cmds,$(1)) + $(AT)touch $$@ +$($(1)_preprocessed): | $($(1)_dependencies) $($(1)_extracted) + $(AT)echo Preprocessing $(1)... + $(AT)mkdir -p $$(@D) $($(1)_patch_dir) + $(AT)$(foreach patch,$($(1)_patches),cd $(PATCHES_PATH)/$(1); cp $(patch) $($(1)_patch_dir) ;) + $(AT)cd $$(@D); $(call $(1)_preprocess_cmds, $(1)) + $(AT)touch $$@ +$($(1)_configured): | $($(1)_preprocessed) + $(AT)echo Configuring $(1)... + $(AT)rm -rf $(host_prefix); mkdir -p $(host_prefix)/lib; cd $(host_prefix); $(foreach package,$($(1)_all_dependencies), tar xf $($(package)_cached); ) + $(AT)mkdir -p $$(@D) + $(AT)+cd $$(@D); $($(1)_config_env) $(call $(1)_config_cmds, $(1)) + $(AT)touch $$@ +$($(1)_built): | $($(1)_configured) + $(AT)echo Building $(1)... + $(AT)mkdir -p $$(@D) + $(AT)+cd $$(@D); $($(1)_build_env) $(call $(1)_build_cmds, $(1)) + $(AT)touch $$@ +$($(1)_staged): | $($(1)_built) + $(AT)echo Staging $(1)... + $(AT)mkdir -p $($(1)_staging_dir)/$(host_prefix) + $(AT)cd $($(1)_build_dir); $($(1)_stage_env) $(call $(1)_stage_cmds, $(1)) + $(AT)rm -rf $($(1)_extract_dir) + $(AT)touch $$@ +$($(1)_postprocessed): | $($(1)_staged) + $(AT)echo Postprocessing $(1)... + $(AT)cd $($(1)_staging_prefix_dir); $(call $(1)_postprocess_cmds) + $(AT)touch $$@ +$($(1)_cached): | $($(1)_dependencies) $($(1)_postprocessed) + $(AT)echo Caching $(1)... + $(AT)cd $$($(1)_staging_dir)/$(host_prefix); find . | sort | tar --no-recursion -czf $$($(1)_staging_dir)/$$(@F) -T - + $(AT)mkdir -p $$(@D) + $(AT)rm -rf $$(@D) && mkdir -p $$(@D) + $(AT)mv $$($(1)_staging_dir)/$$(@F) $$(@) + $(AT)rm -rf $($(1)_staging_dir) +$($(1)_cached_checksum): $($(1)_cached) + $(AT)cd $$(@D); $(build_SHA256SUM) $$( $$(@) + +.PHONY: $(1) +$(1): | $($(1)_cached_checksum) +.SECONDARY: $($(1)_cached) $($(1)_postprocessed) $($(1)_staged) $($(1)_built) $($(1)_configured) $($(1)_preprocessed) $($(1)_extracted) $($(1)_fetched) + +endef + +# These functions create the build targets for each package. They must be +# broken down into small steps so that each part is done for all packages +# before moving on to the next step. Otherwise, a package's info +# (build-id for example) would only be available to another package if it +# happened to be computed already. + +#set the type for host/build packages. +$(foreach native_package,$(native_packages),$(eval $(native_package)_type=build)) +$(foreach package,$(packages),$(eval $(package)_type=$(host_arch)_$(host_os))) + +#set overridable defaults +$(foreach package,$(all_packages),$(eval $(call int_vars,$(package)))) + +#include package files +$(foreach package,$(all_packages),$(eval include packages/$(package).mk)) + +#compute a hash of all files that comprise this package's build recipe +$(foreach package,$(all_packages),$(eval $(call int_get_build_recipe_hash,$(package)))) + +#generate a unique id for this package, incorporating its dependencies as well +$(foreach package,$(all_packages),$(eval $(call int_get_build_id,$(package)))) + +#compute final vars after reading package vars +$(foreach package,$(all_packages),$(eval $(call int_config_attach_build_config,$(package)))) + +#create build targets +$(foreach package,$(all_packages),$(eval $(call int_add_cmds,$(package)))) + +#special exception: if a toolchain package exists, all non-native packages depend on it +$(foreach package,$(packages),$(eval $($(package)_unpacked): |$($($(host_arch)_$(host_os)_native_toolchain)_cached) )) diff --git a/depends/hosts/darwin.mk b/depends/hosts/darwin.mk new file mode 100644 index 00000000..4e58bec7 --- /dev/null +++ b/depends/hosts/darwin.mk @@ -0,0 +1,17 @@ +OSX_MIN_VERSION=10.8 +OSX_SDK_VERSION=10.11 +OSX_SDK=$(SDK_PATH)/MacOSX$(OSX_SDK_VERSION).sdk +LD64_VERSION=253.9 +darwin_CC=clang -target $(host) -mmacosx-version-min=$(OSX_MIN_VERSION) --sysroot $(OSX_SDK) -mlinker-version=$(LD64_VERSION) +darwin_CXX=clang++ -target $(host) -mmacosx-version-min=$(OSX_MIN_VERSION) --sysroot $(OSX_SDK) -mlinker-version=$(LD64_VERSION) -stdlib=libc++ + +darwin_CFLAGS=-pipe +darwin_CXXFLAGS=$(darwin_CFLAGS) + +darwin_release_CFLAGS=-O2 +darwin_release_CXXFLAGS=$(darwin_release_CFLAGS) + +darwin_debug_CFLAGS=-O1 +darwin_debug_CXXFLAGS=$(darwin_debug_CFLAGS) + +darwin_native_toolchain=native_cctools diff --git a/depends/hosts/default.mk b/depends/hosts/default.mk new file mode 100644 index 00000000..144e5f88 --- /dev/null +++ b/depends/hosts/default.mk @@ -0,0 +1,30 @@ +ifneq ($(host),$(build)) +host_toolchain:=$(host)- +endif + +default_host_CC = $(host_toolchain)gcc +default_host_CXX = $(host_toolchain)g++ +default_host_AR = $(host_toolchain)ar +default_host_RANLIB = $(host_toolchain)ranlib +default_host_STRIP = $(host_toolchain)strip +default_host_LIBTOOL = $(host_toolchain)libtool +default_host_INSTALL_NAME_TOOL = $(host_toolchain)install_name_tool +default_host_OTOOL = $(host_toolchain)otool +default_host_NM = $(host_toolchain)nm + +define add_host_tool_func +$(host_os)_$1?=$$(default_host_$1) +$(host_arch)_$(host_os)_$1?=$$($(host_os)_$1) +$(host_arch)_$(host_os)_$(release_type)_$1?=$$($(host_os)_$1) +host_$1=$$($(host_arch)_$(host_os)_$1) +endef + +define add_host_flags_func +$(host_arch)_$(host_os)_$1 += $($(host_os)_$1) +$(host_arch)_$(host_os)_$(release_type)_$1 += $($(host_os)_$(release_type)_$1) +host_$1 = $$($(host_arch)_$(host_os)_$1) +host_$(release_type)_$1 = $$($(host_arch)_$(host_os)_$(release_type)_$1) +endef + +$(foreach tool,CC CXX AR RANLIB STRIP NM LIBTOOL OTOOL INSTALL_NAME_TOOL,$(eval $(call add_host_tool_func,$(tool)))) +$(foreach flags,CFLAGS CXXFLAGS CPPFLAGS LDFLAGS, $(eval $(call add_host_flags_func,$(flags)))) diff --git a/depends/hosts/linux.mk b/depends/hosts/linux.mk new file mode 100644 index 00000000..602206d6 --- /dev/null +++ b/depends/hosts/linux.mk @@ -0,0 +1,31 @@ +linux_CFLAGS=-pipe +linux_CXXFLAGS=$(linux_CFLAGS) -static-libstdc++ + +linux_release_CFLAGS=-O2 +linux_release_CXXFLAGS=$(linux_release_CFLAGS) + +linux_debug_CFLAGS=-O1 +linux_debug_CXXFLAGS=$(linux_debug_CFLAGS) + +linux_debug_CPPFLAGS=-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC + +ifeq (86,$(findstring 86,$(build_arch))) +i686_linux_CC=gcc -m32 +i686_linux_CXX=g++ -m32 +i686_linux_AR=ar +i686_linux_RANLIB=ranlib +i686_linux_NM=nm +i686_linux_STRIP=strip + +x86_64_linux_CC=gcc -m64 +x86_64_linux_CXX=g++ -m64 +x86_64_linux_AR=ar +x86_64_linux_RANLIB=ranlib +x86_64_linux_NM=nm +x86_64_linux_STRIP=strip +else +i686_linux_CC=$(default_host_CC) -m32 +i686_linux_CXX=$(default_host_CXX) -m32 +x86_64_linux_CC=$(default_host_CC) -m64 +x86_64_linux_CXX=$(default_host_CXX) -m64 +endif diff --git a/depends/hosts/mingw32.mk b/depends/hosts/mingw32.mk new file mode 100644 index 00000000..83fc501a --- /dev/null +++ b/depends/hosts/mingw32.mk @@ -0,0 +1,10 @@ +mingw32_CFLAGS=-pipe +mingw32_CXXFLAGS=$(mingw32_CFLAGS) -static-libstdc++ + +mingw32_release_CFLAGS=-O2 +mingw32_release_CXXFLAGS=$(mingw32_release_CFLAGS) + +mingw32_debug_CFLAGS=-O1 +mingw32_debug_CXXFLAGS=$(mingw32_debug_CFLAGS) + +mingw32_debug_CPPFLAGS=-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC diff --git a/depends/packages.md b/depends/packages.md new file mode 100644 index 00000000..7c803625 --- /dev/null +++ b/depends/packages.md @@ -0,0 +1,147 @@ +Each recipe consists of 3 main parts: defining identifiers, setting build +variables, and defining build commands. + +The package "mylib" will be used here as an example + +General tips: +- mylib_foo is written as $(package)_foo in order to make recipes more similar. + +## Identifiers +Each package is required to define at least these variables: + + $(package)_version: + Version of the upstream library or program. If there is no version, a + placeholder such as 1.0 can be used. + + $(package)_download_path: + Location of the upstream source, without the file-name. Usually http or + ftp. + + $(package)_file_name: + The upstream source filename available at the download path. + + $(package)_sha256_hash: + The sha256 hash of the upstream file + +These variables are optional: + + $(package)_build_subdir: + cd to this dir before running configure/build/stage commands. + + $(package)_download_file: + The file-name of the upstream source if it differs from how it should be + stored locally. This can be used to avoid storing file-names with strange + characters. + + $(package)_dependencies: + Names of any other packages that this one depends on. + + $(package)_patches: + Filenames of any patches needed to build the package + + $(package)_extra_sources: + Any extra files that will be fetched via $(package)_fetch_cmds. These are + specified so that they can be fetched and verified via 'make download'. + + +## Build Variables: +After defining the main identifiers, build variables may be added or customized +before running the build commands. They should be added to a function called +$(package)_set_vars. For example: + + define $(package)_set_vars + ... + endef + +Most variables can be prefixed with the host, architecture, or both, to make +the modifications specific to that case. For example: + + Universal: $(package)_cc=gcc + Linux only: $(package)_linux_cc=gcc + x86_64 only: $(package)_x86_64_cc = gcc + x86_64 linux only: $(package)_x86_64_linux_cc = gcc + +These variables may be set to override or append their default values. + + $(package)_cc + $(package)_cxx + $(package)_objc + $(package)_objcxx + $(package)_ar + $(package)_ranlib + $(package)_libtool + $(package)_nm + $(package)_cflags + $(package)_cxxflags + $(package)_ldflags + $(package)_cppflags + $(package)_config_env + $(package)_build_env + $(package)_stage_env + $(package)_build_opts + $(package)_config_opts + +The *_env variables are used to add environment variables to the respective +commands. + +Many variables respect a debug/release suffix as well, in order to use them for +only the appropriate build config. For example: + + $(package)_cflags_release = -O3 + $(package)_cflags_i686_debug = -g + $(package)_config_opts_release = --disable-debug + +These will be used in addition to the options that do not specify +debug/release. All builds are considered to be release unless DEBUG=1 is set by +the user. Other variables may be defined as needed. + +## Build commands: + + For each build, a unique build dir and staging dir are created. For example, + `work/build/mylib/1.0-1adac830f6e` and `work/staging/mylib/1.0-1adac830f6e`. + + The following build commands are available for each recipe: + + $(package)_fetch_cmds: + Runs from: build dir + Fetch the source file. If undefined, it will be fetched and verified + against its hash. + + $(package)_extract_cmds: + Runs from: build dir + Verify the source file against its hash and extract it. If undefined, the + source is assumed to be a tarball. + + $(package)_preprocess_cmds: + Runs from: build dir/$(package)_build_subdir + Preprocess the source as necessary. If undefined, does nothing. + + $(package)_config_cmds: + Runs from: build dir/$(package)_build_subdir + Configure the source. If undefined, does nothing. + + $(package)_build_cmds: + Runs from: build dir/$(package)_build_subdir + Build the source. If undefined, does nothing. + + $(package)_stage_cmds: + Runs from: build dir/$(package)_build_subdir + Stage the build results. If undefined, does nothing. + + The following variables are available for each recipe: + + $(1)_staging_dir: package's destination sysroot path + $(1)_staging_prefix_dir: prefix path inside of the package's staging dir + $(1)_extract_dir: path to the package's extracted sources + $(1)_build_dir: path where configure/build/stage commands will be run + $(1)_patch_dir: path where the package's patches (if any) are found + +Notes on build commands: + +For packages built with autotools, $($(package)_autoconf) can be used in the +configure step to (usually) correctly configure automatically. Any +$($(package)_config_opts) will be appended. + +Most autotools projects can be properly staged using: + + $(MAKE) DESTDIR=$($(package)_staging_dir) install diff --git a/depends/packages/backtrace.mk b/depends/packages/backtrace.mk new file mode 100644 index 00000000..c7e47c78 --- /dev/null +++ b/depends/packages/backtrace.mk @@ -0,0 +1,21 @@ +package=backtrace +$(package)_version=rust-snapshot-2018-05-22 +$(package)_download_path=https://github.com/rust-lang-nursery/libbacktrace/archive +$(package)_file_name=$($(package)_version).tar.gz +$(package)_sha256_hash=8da6daa0a582c9bbd1f2933501168b4c43664700f604f43e922e85b99e5049bc + +define $(package)_set_vars +$(package)_config_opts=--disable-shared --enable-host-shared --prefix=$(host_prefix) +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef diff --git a/depends/packages/bdb.mk b/depends/packages/bdb.mk new file mode 100644 index 00000000..6c9876c2 --- /dev/null +++ b/depends/packages/bdb.mk @@ -0,0 +1,31 @@ +package=bdb +$(package)_version=4.8.30 +$(package)_download_path=http://download.oracle.com/berkeley-db +$(package)_file_name=db-$($(package)_version).NC.tar.gz +$(package)_sha256_hash=12edc0df75bf9abd7f82f821795bcee50f42cb2e5f76a6a281b85732798364ef +$(package)_build_subdir=build_unix + +define $(package)_set_vars +$(package)_config_opts=--disable-shared --enable-cxx --disable-replication +$(package)_config_opts_mingw32=--enable-mingw +$(package)_config_opts_linux=--with-pic +$(package)_cxxflags=-std=c++11 +endef + +define $(package)_preprocess_cmds + sed -i.old 's/__atomic_compare_exchange/__atomic_compare_exchange_db/' dbinc/atomic.h && \ + sed -i.old 's/atomic_init/atomic_init_db/' dbinc/atomic.h mp/mp_region.c mp/mp_mvcc.c mp/mp_fget.c mutex/mut_method.c mutex/mut_tas.c && \ + cp -f $(BASEDIR)/config.guess $(BASEDIR)/config.sub dist +endef + +define $(package)_config_cmds + ../dist/$($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) libdb_cxx-4.8.a libdb-4.8.a +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install_lib install_include +endef diff --git a/depends/packages/boost.mk b/depends/packages/boost.mk new file mode 100644 index 00000000..bf773ccd --- /dev/null +++ b/depends/packages/boost.mk @@ -0,0 +1,41 @@ +package=boost +$(package)_version=1_64_0 +$(package)_download_path=https://dl.bintray.com/boostorg/release/1.64.0/source/ +$(package)_file_name=$(package)_$($(package)_version).tar.bz2 +$(package)_sha256_hash=7bcc5caace97baa948931d712ea5f37038dbb1c5d89b43ad4def4ed7cb683332 + +define $(package)_set_vars +$(package)_config_opts_release=variant=release +$(package)_config_opts_debug=variant=debug +$(package)_config_opts=--layout=tagged --build-type=complete --user-config=user-config.jam +$(package)_config_opts+=threading=multi link=static -sNO_BZIP2=1 -sNO_ZLIB=1 +$(package)_config_opts_linux=threadapi=pthread runtime-link=shared +$(package)_config_opts_darwin=--toolset=darwin-4.2.1 runtime-link=shared +$(package)_config_opts_mingw32=binary-format=pe target-os=windows threadapi=win32 runtime-link=static +$(package)_config_opts_x86_64_mingw32=address-model=64 +$(package)_config_opts_i686_mingw32=address-model=32 +$(package)_config_opts_i686_linux=address-model=32 architecture=x86 +$(package)_toolset_$(host_os)=gcc +$(package)_archiver_$(host_os)=$($(package)_ar) +$(package)_toolset_darwin=darwin +$(package)_archiver_darwin=$($(package)_libtool) +$(package)_config_libraries=chrono,filesystem,program_options,system,thread,test +$(package)_cxxflags=-std=c++11 -fvisibility=hidden +$(package)_cxxflags_linux=-fPIC +endef + +define $(package)_preprocess_cmds + echo "using $(boost_toolset_$(host_os)) : : $($(package)_cxx) : \"$($(package)_cxxflags) $($(package)_cppflags)\" \"$($(package)_ldflags)\" \"$(boost_archiver_$(host_os))\" \"$(host_STRIP)\" \"$(host_RANLIB)\" \"$(host_WINDRES)\" : ;" > user-config.jam +endef + +define $(package)_config_cmds + ./bootstrap.sh --without-icu --with-libraries=$(boost_config_libraries) +endef + +define $(package)_build_cmds + ./b2 -d2 -j2 -d1 --prefix=$($(package)_staging_prefix_dir) $($(package)_config_opts) stage +endef + +define $(package)_stage_cmds + ./b2 -d0 -j4 --prefix=$($(package)_staging_prefix_dir) $($(package)_config_opts) install +endef diff --git a/depends/packages/chia_bls.mk b/depends/packages/chia_bls.mk new file mode 100644 index 00000000..fa4e5998 --- /dev/null +++ b/depends/packages/chia_bls.mk @@ -0,0 +1,51 @@ +package=chia_bls +$(package)_version=v20181101 +# It's actually from https://github.com/Chia-Network/bls-signatures, but we have so many patches atm that it's forked +$(package)_download_path=https://github.com/codablock/bls-signatures/archive +$(package)_file_name=$($(package)_version).tar.gz +$(package)_sha256_hash=b3ec74a77a7b6795f84b05e051a0824ef8d9e05b04b2993f01040f35689aa87c +$(package)_dependencies=gmp +#$(package)_patches=...TODO (when we switch back to https://github.com/Chia-Network/bls-signatures) + +#define $(package)_preprocess_cmds +# for i in $($(package)_patches); do patch -N -p1 < $($(package)_patch_dir)/$$$$i; done +#endef + +define $(package)_set_vars + $(package)_config_opts=-DCMAKE_INSTALL_PREFIX=$($(package)_staging_dir)/$(host_prefix) + $(package)_config_opts+= -DCMAKE_PREFIX_PATH=$($(package)_staging_dir)/$(host_prefix) + $(package)_config_opts+= -DSTLIB=ON -DSHLIB=OFF -DSTBIN=ON + $(package)_config_opts_linux=-DOPSYS=LINUX -DCMAKE_SYSTEM_NAME=Linux + $(package)_config_opts_darwin=-DOPSYS=MACOSX -DCMAKE_SYSTEM_NAME=Darwin + $(package)_config_opts_mingw32=-DOPSYS=WINDOWS -DCMAKE_SYSTEM_NAME=Windows -DCMAKE_SHARED_LIBRARY_LINK_C_FLAGS="" -DCMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS="" + $(package)_config_opts_i686+= -DWSIZE=32 + $(package)_config_opts_x86_64+= -DWSIZE=64 + $(package)_config_opts_arm+= -DWSIZE=32 + $(package)_config_opts_armv7l+= -DWSIZE=32 + $(package)_config_opts_debug=-DDEBUG=ON -DCMAKE_BUILD_TYPE=Debug + + ifneq ($(darwin_native_toolchain),) + $(package)_config_opts_darwin+= -DCMAKE_AR="$(host_prefix)/native/bin/$($(package)_ar)" + $(package)_config_opts_darwin+= -DCMAKE_RANLIB="$(host_prefix)/native/bin/$($(package)_ranlib)" + endif +endef + +define $(package)_config_cmds + export CC="$($(package)_cc)" && \ + export CXX="$($(package)_cxx)" && \ + export CFLAGS="$($(package)_cflags) $($(package)_cppflags)" && \ + export CXXFLAGS="$($(package)_cxxflags) $($(package)_cppflags)" && \ + export LDFLAGS="$($(package)_ldflags)" && \ + mkdir -p build && cd build && \ + cmake ../ $($(package)_config_opts) +endef + +define $(package)_build_cmds + cd build && \ + $(MAKE) $($(package)_build_opts) +endef + +define $(package)_stage_cmds + cd build && \ + $(MAKE) install +endef diff --git a/depends/packages/dbus.mk b/depends/packages/dbus.mk new file mode 100644 index 00000000..bbe03754 --- /dev/null +++ b/depends/packages/dbus.mk @@ -0,0 +1,23 @@ +package=dbus +$(package)_version=1.10.18 +$(package)_download_path=https://dbus.freedesktop.org/releases/dbus +$(package)_file_name=$(package)-$($(package)_version).tar.gz +$(package)_sha256_hash=6049ddd5f3f3e2618f615f1faeda0a115104423a7996b7aa73e2f36e38cc514a +$(package)_dependencies=expat + +define $(package)_set_vars + $(package)_config_opts=--disable-tests --disable-doxygen-docs --disable-xml-docs --disable-static --without-x +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) -C dbus libdbus-1.la +endef + +define $(package)_stage_cmds + $(MAKE) -C dbus DESTDIR=$($(package)_staging_dir) install-libLTLIBRARIES install-dbusincludeHEADERS install-nodist_dbusarchincludeHEADERS && \ + $(MAKE) DESTDIR=$($(package)_staging_dir) install-pkgconfigDATA +endef diff --git a/depends/packages/expat.mk b/depends/packages/expat.mk new file mode 100644 index 00000000..7f484724 --- /dev/null +++ b/depends/packages/expat.mk @@ -0,0 +1,21 @@ +package=expat +$(package)_version=2.2.1 +$(package)_download_path=https://downloads.sourceforge.net/project/expat/expat/$($(package)_version) +$(package)_file_name=$(package)-$($(package)_version).tar.bz2 +$(package)_sha256_hash=1868cadae4c82a018e361e2b2091de103cd820aaacb0d6cfa49bd2cd83978885 + +define $(package)_set_vars +$(package)_config_opts=--disable-static +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef diff --git a/depends/packages/fontconfig.mk b/depends/packages/fontconfig.mk new file mode 100644 index 00000000..12695db4 --- /dev/null +++ b/depends/packages/fontconfig.mk @@ -0,0 +1,28 @@ +package=fontconfig +$(package)_version=2.12.1 +$(package)_download_path=http://www.freedesktop.org/software/fontconfig/release/ +$(package)_file_name=$(package)-$($(package)_version).tar.bz2 +$(package)_sha256_hash=b449a3e10c47e1d1c7a6ec6e2016cca73d3bd68fbbd4f0ae5cc6b573f7d6c7f3 +$(package)_dependencies=freetype expat + +define $(package)_set_vars + $(package)_config_opts=--disable-docs --disable-static +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +# 2.12.1 uses CHAR_WIDTH which is reserved and clashes with some glibc versions, but newer versions of fontconfig +# have broken makefiles which needlessly attempt to re-generate headers with gperf. +# Instead, change all uses of CHAR_WIDTH, and disable the rule that forces header re-generation. +# This can be removed once the upstream build is fixed. +define $(package)_build_cmds + sed -i 's/CHAR_WIDTH/CHARWIDTH/g' fontconfig/fontconfig.h src/fcobjshash.gperf src/fcobjs.h src/fcobjshash.h && \ + sed -i 's/fcobjshash.h: fcobjshash.gperf/fcobjshash.h:/' src/Makefile && \ + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef diff --git a/depends/packages/freetype.mk b/depends/packages/freetype.mk new file mode 100644 index 00000000..41e02e20 --- /dev/null +++ b/depends/packages/freetype.mk @@ -0,0 +1,22 @@ +package=freetype +$(package)_version=2.7.1 +$(package)_download_path=http://download.savannah.gnu.org/releases/$(package) +$(package)_file_name=$(package)-$($(package)_version).tar.bz2 +$(package)_sha256_hash=3a3bb2c4e15ffb433f2032f50a5b5a92558206822e22bfe8cbe339af4aa82f88 + +define $(package)_set_vars + $(package)_config_opts=--without-zlib --without-png --without-harfbuzz --without-bzip2 --disable-static + $(package)_config_opts_linux=--with-pic +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef diff --git a/depends/packages/gmp.mk b/depends/packages/gmp.mk new file mode 100644 index 00000000..ac685d76 --- /dev/null +++ b/depends/packages/gmp.mk @@ -0,0 +1,23 @@ +package=gmp +$(package)_version=6.1.2 +$(package)_download_path=https://gmplib.org/download/gmp +$(package)_file_name=gmp-$($(package)_version).tar.bz2 +$(package)_sha256_hash=5275bb04f4863a13516b2f39392ac5e272f5e1bb8057b18aec1c9b79d73d8fb2 + +define $(package)_set_vars +$(package)_config_opts+=--enable-cxx --enable-fat --with-pic --disable-shared +$(package)_cflags_armv7l_linux+=-march=armv7-a +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef + diff --git a/depends/packages/libICE.mk b/depends/packages/libICE.mk new file mode 100644 index 00000000..fc60323b --- /dev/null +++ b/depends/packages/libICE.mk @@ -0,0 +1,23 @@ +package=libICE +$(package)_version=1.0.9 +$(package)_download_path=http://xorg.freedesktop.org/releases/individual/lib/ +$(package)_file_name=$(package)-$($(package)_version).tar.bz2 +$(package)_sha256_hash=8f7032f2c1c64352b5423f6b48a8ebdc339cc63064af34d66a6c9aa79759e202 +$(package)_dependencies=xtrans xproto + +define $(package)_set_vars + $(package)_config_opts=--disable-static --disable-docs --disable-specs --without-xsltproc + $(package)_config_opts_linux=--with-pic +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef diff --git a/depends/packages/libSM.mk b/depends/packages/libSM.mk new file mode 100644 index 00000000..0f9307ca --- /dev/null +++ b/depends/packages/libSM.mk @@ -0,0 +1,23 @@ +package=libSM +$(package)_version=1.2.2 +$(package)_download_path=http://xorg.freedesktop.org/releases/individual/lib/ +$(package)_file_name=$(package)-$($(package)_version).tar.bz2 +$(package)_sha256_hash=0baca8c9f5d934450a70896c4ad38d06475521255ca63b717a6510fdb6e287bd +$(package)_dependencies=xtrans xproto libICE + +define $(package)_set_vars + $(package)_config_opts=--without-libuuid --without-xsltproc --disable-docs --disable-static + $(package)_config_opts_linux=--with-pic +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef diff --git a/depends/packages/libX11.mk b/depends/packages/libX11.mk new file mode 100644 index 00000000..178d592e --- /dev/null +++ b/depends/packages/libX11.mk @@ -0,0 +1,23 @@ +package=libX11 +$(package)_version=1.6.2 +$(package)_download_path=http://xorg.freedesktop.org/releases/individual/lib/ +$(package)_file_name=$(package)-$($(package)_version).tar.bz2 +$(package)_sha256_hash=2aa027e837231d2eeea90f3a4afe19948a6eb4c8b2bec0241eba7dbc8106bd16 +$(package)_dependencies=libxcb xtrans xextproto xproto + +define $(package)_set_vars +$(package)_config_opts=--disable-xkb --disable-static +$(package)_config_opts_linux=--with-pic +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef diff --git a/depends/packages/libXau.mk b/depends/packages/libXau.mk new file mode 100644 index 00000000..e87df2e4 --- /dev/null +++ b/depends/packages/libXau.mk @@ -0,0 +1,23 @@ +package=libXau +$(package)_version=1.0.8 +$(package)_download_path=http://xorg.freedesktop.org/releases/individual/lib/ +$(package)_file_name=$(package)-$($(package)_version).tar.bz2 +$(package)_sha256_hash=fdd477320aeb5cdd67272838722d6b7d544887dfe7de46e1e7cc0c27c2bea4f2 +$(package)_dependencies=xproto + +define $(package)_set_vars + $(package)_config_opts=--disable-shared + $(package)_config_opts_linux=--with-pic +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef diff --git a/depends/packages/libXext.mk b/depends/packages/libXext.mk new file mode 100644 index 00000000..4db83606 --- /dev/null +++ b/depends/packages/libXext.mk @@ -0,0 +1,22 @@ +package=libXext +$(package)_version=1.3.2 +$(package)_download_path=http://xorg.freedesktop.org/releases/individual/lib/ +$(package)_file_name=$(package)-$($(package)_version).tar.bz2 +$(package)_sha256_hash=f829075bc646cdc085fa25d98d5885d83b1759ceb355933127c257e8e50432e0 +$(package)_dependencies=xproto xextproto libX11 libXau + +define $(package)_set_vars + $(package)_config_opts=--disable-static +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef diff --git a/depends/packages/libevent.mk b/depends/packages/libevent.mk new file mode 100644 index 00000000..8464932a --- /dev/null +++ b/depends/packages/libevent.mk @@ -0,0 +1,30 @@ +package=libevent +$(package)_version=2.1.8 +$(package)_download_path=https://github.com/libevent/libevent/releases/download/release-$($(package)_version)-stable +$(package)_file_name=$(package)-$($(package)_version)-stable.tar.gz +$(package)_sha256_hash=965cc5a8bb46ce4199a47e9b2c9e1cae3b137e8356ffdad6d94d3b9069b71dc2 + +define $(package)_preprocess_cmds + ./autogen.sh +endef + +define $(package)_set_vars + $(package)_config_opts=--disable-shared --disable-openssl --disable-libevent-regress --disable-samples + $(package)_config_opts_release=--disable-debug-mode + $(package)_config_opts_linux=--with-pic +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef + +define $(package)_postprocess_cmds +endef diff --git a/depends/packages/libxcb.mk b/depends/packages/libxcb.mk new file mode 100644 index 00000000..28f2bd6f --- /dev/null +++ b/depends/packages/libxcb.mk @@ -0,0 +1,35 @@ +package=libxcb +$(package)_version=1.10 +$(package)_download_path=http://xcb.freedesktop.org/dist +$(package)_file_name=$(package)-$($(package)_version).tar.bz2 +$(package)_sha256_hash=98d9ab05b636dd088603b64229dd1ab2d2cc02ab807892e107d674f9c3f2d5b5 +$(package)_dependencies=xcb_proto libXau xproto + +define $(package)_set_vars +$(package)_config_opts=--disable-static +endef + +define $(package)_preprocess_cmds + sed "s/pthread-stubs//" -i configure +endef + +# Don't install xcb headers to the default path in order to work around a qt +# build issue: https://bugreports.qt.io/browse/QTBUG-34748 +# When using qt's internal libxcb, it may end up finding the real headers in +# depends staging. Use a non-default path to avoid that. + +define $(package)_config_cmds + $($(package)_autoconf) --includedir=$(host_prefix)/include/xcb-shared +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef + +define $(package)_postprocess_cmds + rm -rf share/man share/doc +endef diff --git a/depends/packages/miniupnpc.mk b/depends/packages/miniupnpc.mk new file mode 100644 index 00000000..679d24bf --- /dev/null +++ b/depends/packages/miniupnpc.mk @@ -0,0 +1,28 @@ +package=miniupnpc +$(package)_version=2.0.20170509 +$(package)_download_path=https://miniupnp.tuxfamily.org/files +$(package)_file_name=$(package)-$($(package)_version).tar.gz +$(package)_sha256_hash=d3c368627f5cdfb66d3ebd64ca39ba54d6ff14a61966dbecb8dd296b7039f16a + +define $(package)_set_vars +$(package)_build_opts=CC="$($(package)_cc)" +$(package)_build_opts_darwin=OS=Darwin LIBTOOL="$($(package)_libtool)" +$(package)_build_opts_mingw32=-f Makefile.mingw +$(package)_build_env+=CFLAGS="$($(package)_cflags) $($(package)_cppflags)" AR="$($(package)_ar)" +endef + +define $(package)_preprocess_cmds + mkdir dll && \ + sed -e 's|MINIUPNPC_VERSION_STRING \"version\"|MINIUPNPC_VERSION_STRING \"$($(package)_version)\"|' -e 's|OS/version|$(host)|' miniupnpcstrings.h.in > miniupnpcstrings.h && \ + sed -i.old "s|miniupnpcstrings.h: miniupnpcstrings.h.in wingenminiupnpcstrings|miniupnpcstrings.h: miniupnpcstrings.h.in|" Makefile.mingw +endef + +define $(package)_build_cmds + $(MAKE) libminiupnpc.a $($(package)_build_opts) +endef + +define $(package)_stage_cmds + mkdir -p $($(package)_staging_prefix_dir)/include/miniupnpc $($(package)_staging_prefix_dir)/lib &&\ + install *.h $($(package)_staging_prefix_dir)/include/miniupnpc &&\ + install libminiupnpc.a $($(package)_staging_prefix_dir)/lib +endef diff --git a/depends/packages/native_biplist.mk b/depends/packages/native_biplist.mk new file mode 100644 index 00000000..373490ae --- /dev/null +++ b/depends/packages/native_biplist.mk @@ -0,0 +1,20 @@ +package=native_biplist +$(package)_version=0.9 +$(package)_download_path=https://pypi.python.org/packages/source/b/biplist +$(package)_file_name=biplist-$($(package)_version).tar.gz +$(package)_sha256_hash=b57cadfd26e4754efdf89e9e37de87885f9b5c847b2615688ca04adfaf6ca604 +$(package)_install_libdir=$(build_prefix)/lib/python/dist-packages +$(package)_patches=sorted_list.patch + +define $(package)_preprocess_cmds + patch -p1 < $($(package)_patch_dir)/sorted_list.patch +endef + +define $(package)_build_cmds + python3 setup.py build +endef + +define $(package)_stage_cmds + mkdir -p $($(package)_install_libdir) && \ + python3 setup.py install --root=$($(package)_staging_dir) --prefix=$(build_prefix) --install-lib=$($(package)_install_libdir) +endef diff --git a/depends/packages/native_cctools.mk b/depends/packages/native_cctools.mk new file mode 100644 index 00000000..44d238cc --- /dev/null +++ b/depends/packages/native_cctools.mk @@ -0,0 +1,65 @@ +package=native_cctools +$(package)_version=807d6fd1be5d2224872e381870c0a75387fe05e6 +$(package)_download_path=https://github.com/theuni/cctools-port/archive +$(package)_file_name=$($(package)_version).tar.gz +$(package)_sha256_hash=a09c9ba4684670a0375e42d9d67e7f12c1f62581a27f28f7c825d6d7032ccc6a +$(package)_build_subdir=cctools +$(package)_clang_version=3.7.1 +$(package)_clang_download_path=http://llvm.org/releases/$($(package)_clang_version) +$(package)_clang_download_file=clang+llvm-$($(package)_clang_version)-x86_64-linux-gnu-ubuntu-14.04.tar.xz +$(package)_clang_file_name=clang-llvm-$($(package)_clang_version)-x86_64-linux-gnu-ubuntu-14.04.tar.xz +$(package)_clang_sha256_hash=99b28a6b48e793705228a390471991386daa33a9717cd9ca007fcdde69608fd9 +$(package)_extra_sources=$($(package)_clang_file_name) + +define $(package)_fetch_cmds +$(call fetch_file,$(package),$($(package)_download_path),$($(package)_download_file),$($(package)_file_name),$($(package)_sha256_hash)) && \ +$(call fetch_file,$(package),$($(package)_clang_download_path),$($(package)_clang_download_file),$($(package)_clang_file_name),$($(package)_clang_sha256_hash)) +endef + +define $(package)_extract_cmds + mkdir -p $($(package)_extract_dir) && \ + echo "$($(package)_sha256_hash) $($(package)_source)" > $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + echo "$($(package)_clang_sha256_hash) $($(package)_source_dir)/$($(package)_clang_file_name)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + $(build_SHA256SUM) -c $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + mkdir -p toolchain/bin toolchain/lib/clang/3.5/include && \ + tar --strip-components=1 -C toolchain -xf $($(package)_source_dir)/$($(package)_clang_file_name) && \ + rm -f toolchain/lib/libc++abi.so* && \ + echo "#!/bin/sh" > toolchain/bin/$(host)-dsymutil && \ + echo "exit 0" >> toolchain/bin/$(host)-dsymutil && \ + chmod +x toolchain/bin/$(host)-dsymutil && \ + tar --strip-components=1 -xf $($(package)_source) +endef + +define $(package)_set_vars +$(package)_config_opts=--target=$(host) --disable-lto-support +$(package)_ldflags+=-Wl,-rpath=\\$$$$$$$$\$$$$$$$$ORIGIN/../lib +$(package)_cc=$($(package)_extract_dir)/toolchain/bin/clang +$(package)_cxx=$($(package)_extract_dir)/toolchain/bin/clang++ +endef + +define $(package)_preprocess_cmds + cd $($(package)_build_subdir); ./autogen.sh && \ + sed -i.old "/define HAVE_PTHREADS/d" ld64/src/ld/InputFiles.h +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install && \ + cd $($(package)_extract_dir)/toolchain && \ + mkdir -p $($(package)_staging_prefix_dir)/lib/clang/$($(package)_clang_version)/include && \ + mkdir -p $($(package)_staging_prefix_dir)/bin $($(package)_staging_prefix_dir)/include && \ + cp bin/clang $($(package)_staging_prefix_dir)/bin/ &&\ + cp -P bin/clang++ $($(package)_staging_prefix_dir)/bin/ &&\ + cp lib/libLTO.so $($(package)_staging_prefix_dir)/lib/ && \ + cp -rf lib/clang/$($(package)_clang_version)/include/* $($(package)_staging_prefix_dir)/lib/clang/$($(package)_clang_version)/include/ && \ + cp bin/llvm-dsymutil $($(package)_staging_prefix_dir)/bin/$(host)-dsymutil && \ + if `test -d include/c++/`; then cp -rf include/c++/ $($(package)_staging_prefix_dir)/include/; fi && \ + if `test -d lib/c++/`; then cp -rf lib/c++/ $($(package)_staging_prefix_dir)/lib/; fi +endef diff --git a/depends/packages/native_cdrkit.mk b/depends/packages/native_cdrkit.mk new file mode 100644 index 00000000..cf694edb --- /dev/null +++ b/depends/packages/native_cdrkit.mk @@ -0,0 +1,26 @@ +package=native_cdrkit +$(package)_version=1.1.11 +$(package)_download_path=http://distro.ibiblio.org/fatdog/source/600/c +$(package)_file_name=cdrkit-$($(package)_version).tar.bz2 +$(package)_sha256_hash=b50d64c214a65b1a79afe3a964c691931a4233e2ba605d793eb85d0ac3652564 +$(package)_patches=cdrkit-deterministic.patch + +define $(package)_preprocess_cmds + patch -p1 < $($(package)_patch_dir)/cdrkit-deterministic.patch +endef + +define $(package)_config_cmds + cmake -DCMAKE_INSTALL_PREFIX=$(build_prefix) +endef + +define $(package)_build_cmds + $(MAKE) genisoimage +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) -C genisoimage install +endef + +define $(package)_postprocess_cmds + rm bin/isovfy bin/isoinfo bin/isodump bin/isodebug bin/devdump +endef diff --git a/depends/packages/native_ds_store.mk b/depends/packages/native_ds_store.mk new file mode 100644 index 00000000..9c635379 --- /dev/null +++ b/depends/packages/native_ds_store.mk @@ -0,0 +1,16 @@ +package=native_ds_store +$(package)_version=1.1.2 +$(package)_download_path=https://github.com/al45tair/ds_store/archive/ +$(package)_file_name=v$($(package)_version).tar.gz +$(package)_sha256_hash=3b3ecb7bf0a5157f5b6010bc3af7c141fb0ad3527084e63336220d22744bc20c +$(package)_install_libdir=$(build_prefix)/lib/python/dist-packages +$(package)_dependencies=native_biplist + +define $(package)_build_cmds + python3 setup.py build +endef + +define $(package)_stage_cmds + mkdir -p $($(package)_install_libdir) && \ + python3 setup.py install --root=$($(package)_staging_dir) --prefix=$(build_prefix) --install-lib=$($(package)_install_libdir) +endef diff --git a/depends/packages/native_libdmg-hfsplus.mk b/depends/packages/native_libdmg-hfsplus.mk new file mode 100644 index 00000000..a4ffb604 --- /dev/null +++ b/depends/packages/native_libdmg-hfsplus.mk @@ -0,0 +1,22 @@ +package=native_libdmg-hfsplus +$(package)_version=0.1 +$(package)_download_path=https://github.com/theuni/libdmg-hfsplus/archive +$(package)_file_name=libdmg-hfsplus-v$($(package)_version).tar.gz +$(package)_sha256_hash=6569a02eb31c2827080d7d59001869ea14484c281efab0ae7f2b86af5c3120b3 +$(package)_build_subdir=build + +define $(package)_preprocess_cmds + mkdir build +endef + +define $(package)_config_cmds + cmake -DCMAKE_INSTALL_PREFIX:PATH=$(build_prefix)/bin .. +endef + +define $(package)_build_cmds + $(MAKE) -C dmg +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) -C dmg install +endef diff --git a/depends/packages/native_mac_alias.mk b/depends/packages/native_mac_alias.mk new file mode 100644 index 00000000..dc3c8b73 --- /dev/null +++ b/depends/packages/native_mac_alias.mk @@ -0,0 +1,20 @@ +package=native_mac_alias +$(package)_version=2.0.6 +$(package)_download_path=https://github.com/al45tair/mac_alias/archive/ +$(package)_file_name=v$($(package)_version).tar.gz +$(package)_sha256_hash=78a3332d9a597eebf09ae652d38ad1e263b28db5c2e6dd725fad357b03b77371 +$(package)_install_libdir=$(build_prefix)/lib/python/dist-packages +$(package)_patches=python3.patch + +define $(package)_preprocess_cmds + patch -p1 < $($(package)_patch_dir)/python3.patch +endef + +define $(package)_build_cmds + python3 setup.py build +endef + +define $(package)_stage_cmds + mkdir -p $($(package)_install_libdir) && \ + python3 setup.py install --root=$($(package)_staging_dir) --prefix=$(build_prefix) --install-lib=$($(package)_install_libdir) +endef diff --git a/depends/packages/native_protobuf.mk b/depends/packages/native_protobuf.mk new file mode 100644 index 00000000..ce50b366 --- /dev/null +++ b/depends/packages/native_protobuf.mk @@ -0,0 +1,25 @@ +package=native_protobuf +$(package)_version=2.6.1 +$(package)_download_path=https://github.com/google/protobuf/releases/download/v$($(package)_version) +$(package)_file_name=protobuf-$($(package)_version).tar.bz2 +$(package)_sha256_hash=ee445612d544d885ae240ffbcbf9267faa9f593b7b101f21d58beceb92661910 + +define $(package)_set_vars +$(package)_config_opts=--disable-shared +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) -C src protoc +endef + +define $(package)_stage_cmds + $(MAKE) -C src DESTDIR=$($(package)_staging_dir) install-strip +endef + +define $(package)_postprocess_cmds + rm -rf lib include +endef diff --git a/depends/packages/openssl.mk b/depends/packages/openssl.mk new file mode 100644 index 00000000..99108dca --- /dev/null +++ b/depends/packages/openssl.mk @@ -0,0 +1,81 @@ +package=openssl +$(package)_version=1.0.1k +$(package)_download_path=https://www.openssl.org/source +$(package)_file_name=$(package)-$($(package)_version).tar.gz +$(package)_sha256_hash=8f9faeaebad088e772f4ef5e38252d472be4d878c6b3a2718c10a4fcebe7a41c +$(package)_patches=0001-Add-OpenSSL-termios-fix-for-musl-libc.patch + +define $(package)_set_vars +$(package)_config_env=AR="$($(package)_ar)" RANLIB="$($(package)_ranlib)" CC="$($(package)_cc)" +$(package)_config_opts=--prefix=$(host_prefix) --openssldir=$(host_prefix)/etc/openssl +$(package)_config_opts+=no-camellia +$(package)_config_opts+=no-capieng +$(package)_config_opts+=no-cast +$(package)_config_opts+=no-comp +$(package)_config_opts+=no-dso +$(package)_config_opts+=no-dtls1 +$(package)_config_opts+=no-ec_nistp_64_gcc_128 +$(package)_config_opts+=no-gost +$(package)_config_opts+=no-gmp +$(package)_config_opts+=no-heartbeats +$(package)_config_opts+=no-idea +$(package)_config_opts+=no-jpake +$(package)_config_opts+=no-krb5 +$(package)_config_opts+=no-libunbound +$(package)_config_opts+=no-md2 +$(package)_config_opts+=no-mdc2 +$(package)_config_opts+=no-rc4 +$(package)_config_opts+=no-rc5 +$(package)_config_opts+=no-rdrand +$(package)_config_opts+=no-rfc3779 +$(package)_config_opts+=no-rsax +$(package)_config_opts+=no-sctp +$(package)_config_opts+=no-seed +$(package)_config_opts+=no-sha0 +$(package)_config_opts+=no-shared +$(package)_config_opts+=no-ssl-trace +$(package)_config_opts+=no-ssl2 +$(package)_config_opts+=no-ssl3 +$(package)_config_opts+=no-static_engine +$(package)_config_opts+=no-store +$(package)_config_opts+=no-unit-test +$(package)_config_opts+=no-weak-ssl-ciphers +$(package)_config_opts+=no-whirlpool +$(package)_config_opts+=no-zlib +$(package)_config_opts+=no-zlib-dynamic +$(package)_config_opts+=$($(package)_cflags) $($(package)_cppflags) +$(package)_config_opts_linux=-fPIC -Wa,--noexecstack +$(package)_config_opts_x86_64_linux=linux-x86_64 +$(package)_config_opts_i686_linux=linux-generic32 +$(package)_config_opts_arm_linux=linux-generic32 +$(package)_config_opts_armv7l_linux=linux-generic32 +$(package)_config_opts_aarch64_linux=linux-generic64 +$(package)_config_opts_mipsel_linux=linux-generic32 +$(package)_config_opts_mips_linux=linux-generic32 +$(package)_config_opts_powerpc_linux=linux-generic32 +$(package)_config_opts_x86_64_darwin=darwin64-x86_64-cc +$(package)_config_opts_x86_64_mingw32=mingw64 +$(package)_config_opts_i686_mingw32=mingw +endef + +define $(package)_preprocess_cmds + patch -p1 < $($(package)_patch_dir)/0001-Add-OpenSSL-termios-fix-for-musl-libc.patch && \ + sed -i.old "/define DATE/d" util/mkbuildinf.pl && \ + sed -i.old "s|engines apps test|engines|" Makefile.org +endef + +define $(package)_config_cmds + ./Configure $($(package)_config_opts) +endef + +define $(package)_build_cmds + $(MAKE) -j1 build_libs libcrypto.pc libssl.pc openssl.pc +endef + +define $(package)_stage_cmds + $(MAKE) INSTALL_PREFIX=$($(package)_staging_dir) -j1 install_sw +endef + +define $(package)_postprocess_cmds + rm -rf share bin etc +endef diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk new file mode 100644 index 00000000..01e72b7d --- /dev/null +++ b/depends/packages/packages.mk @@ -0,0 +1,20 @@ +packages:=boost openssl libevent zeromq gmp chia_bls backtrace + +qt_native_packages = native_protobuf +qt_packages = qrencode protobuf zlib + +qt_x86_64_linux_packages:=qt expat dbus libxcb xcb_proto libXau xproto freetype fontconfig libX11 xextproto libXext xtrans +qt_i686_linux_packages:=$(qt_x86_64_linux_packages) + +qt_darwin_packages=qt +qt_mingw32_packages=qt + +wallet_packages=bdb + +upnp_packages=miniupnpc + +darwin_native_packages = native_biplist native_ds_store native_mac_alias + +ifneq ($(build_os),darwin) +darwin_native_packages += native_cctools native_cdrkit native_libdmg-hfsplus +endif diff --git a/depends/packages/protobuf.mk b/depends/packages/protobuf.mk new file mode 100644 index 00000000..54d3fd92 --- /dev/null +++ b/depends/packages/protobuf.mk @@ -0,0 +1,29 @@ +package=protobuf +$(package)_version=$(native_$(package)_version) +$(package)_download_path=$(native_$(package)_download_path) +$(package)_file_name=$(native_$(package)_file_name) +$(package)_sha256_hash=$(native_$(package)_sha256_hash) +$(package)_dependencies=native_$(package) +$(package)_cxxflags=-std=c++11 + +define $(package)_set_vars + $(package)_config_opts=--disable-shared --with-protoc=$(build_prefix)/bin/protoc + $(package)_config_opts_linux=--with-pic +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) -C src libprotobuf.la +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) -C src install-libLTLIBRARIES install-nobase_includeHEADERS &&\ + $(MAKE) DESTDIR=$($(package)_staging_dir) install-pkgconfigDATA +endef + +define $(package)_postprocess_cmds + rm lib/libprotoc.a +endef diff --git a/depends/packages/qrencode.mk b/depends/packages/qrencode.mk new file mode 100644 index 00000000..44fdf1c2 --- /dev/null +++ b/depends/packages/qrencode.mk @@ -0,0 +1,22 @@ +package=qrencode +$(package)_version=3.4.4 +$(package)_download_path=https://fukuchi.org/works/qrencode/ +$(package)_file_name=$(package)-$($(package)_version).tar.bz2 +$(package)_sha256_hash=efe5188b1ddbcbf98763b819b146be6a90481aac30cfc8d858ab78a19cde1fa5 + +define $(package)_set_vars +$(package)_config_opts=--disable-shared -without-tools --disable-sdltest +$(package)_config_opts_linux=--with-pic +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef diff --git a/depends/packages/qt.mk b/depends/packages/qt.mk new file mode 100644 index 00000000..bcfe8846 --- /dev/null +++ b/depends/packages/qt.mk @@ -0,0 +1,192 @@ +PACKAGE=qt +$(package)_version=5.7.1 +$(package)_download_path=https://download.qt.io/archive/qt/5.7/$($(package)_version)/submodules +$(package)_suffix=opensource-src-$($(package)_version).tar.gz +$(package)_file_name=qtbase-$($(package)_suffix) +$(package)_sha256_hash=95f83e532d23b3ddbde7973f380ecae1bac13230340557276f75f2e37984e410 +$(package)_dependencies=openssl zlib +$(package)_linux_dependencies=freetype fontconfig libxcb libX11 xproto libXext +$(package)_build_subdir=qtbase +$(package)_qt_libs=corelib network widgets gui plugins testlib +$(package)_patches=mac-qmake.conf mingw-uuidof.patch pidlist_absolute.patch fix-xcb-include-order.patch +$(package)_patches+=fix_qt_configure.patch fix_qt_pkgconfig.patch fix-cocoahelpers-macos.patch qfixed-coretext.patch +# NOTE: fix_qt_configure.patch is only needed for Qt 5.7, newer versions don't have this issue. +# Remove it after bumping $(package)_version to 5.8+. + +$(package)_qttranslations_file_name=qttranslations-$($(package)_suffix) +$(package)_qttranslations_sha256_hash=3a15aebd523c6d89fb97b2d3df866c94149653a26d27a00aac9b6d3020bc5a1d + + +$(package)_qttools_file_name=qttools-$($(package)_suffix) +$(package)_qttools_sha256_hash=22d67de915cb8cd93e16fdd38fa006224ad9170bd217c2be1e53045a8dd02f0f + +$(package)_extra_sources = $($(package)_qttranslations_file_name) +$(package)_extra_sources += $($(package)_qttools_file_name) + +define $(package)_set_vars +$(package)_config_opts_release = -release +$(package)_config_opts_debug = -debug +$(package)_config_opts += -bindir $(build_prefix)/bin +$(package)_config_opts += -c++std c++11 +$(package)_config_opts += -confirm-license +$(package)_config_opts += -dbus-runtime +$(package)_config_opts += -hostprefix $(build_prefix) +$(package)_config_opts += -no-alsa +$(package)_config_opts += -no-audio-backend +$(package)_config_opts += -no-cups +$(package)_config_opts += -no-egl +$(package)_config_opts += -no-eglfs +$(package)_config_opts += -no-feature-style-windowsmobile +$(package)_config_opts += -no-feature-style-windowsce +$(package)_config_opts += -no-freetype +$(package)_config_opts += -no-gif +$(package)_config_opts += -no-glib +$(package)_config_opts += -no-gstreamer +$(package)_config_opts += -no-icu +$(package)_config_opts += -no-iconv +$(package)_config_opts += -no-kms +$(package)_config_opts += -no-linuxfb +$(package)_config_opts += -no-libudev +$(package)_config_opts += -no-mitshm +$(package)_config_opts += -no-mtdev +$(package)_config_opts += -no-pulseaudio +$(package)_config_opts += -no-openvg +$(package)_config_opts += -no-reduce-relocations +$(package)_config_opts += -no-qml-debug +$(package)_config_opts += -no-sql-db2 +$(package)_config_opts += -no-sql-ibase +$(package)_config_opts += -no-sql-oci +$(package)_config_opts += -no-sql-tds +$(package)_config_opts += -no-sql-mysql +$(package)_config_opts += -no-sql-odbc +$(package)_config_opts += -no-sql-psql +$(package)_config_opts += -no-sql-sqlite +$(package)_config_opts += -no-sql-sqlite2 +$(package)_config_opts += -no-use-gold-linker +$(package)_config_opts += -no-xinput2 +$(package)_config_opts += -no-xrender +$(package)_config_opts += -nomake examples +$(package)_config_opts += -nomake tests +$(package)_config_opts += -opensource +$(package)_config_opts += -openssl-linked +$(package)_config_opts += -optimized-qmake +$(package)_config_opts += -pch +$(package)_config_opts += -pkg-config +$(package)_config_opts += -prefix $(host_prefix) +$(package)_config_opts += -qt-libpng +$(package)_config_opts += -qt-libjpeg +$(package)_config_opts += -qt-pcre +$(package)_config_opts += -qt-harfbuzz +$(package)_config_opts += -system-zlib +$(package)_config_opts += -reduce-exports +$(package)_config_opts += -static +$(package)_config_opts += -silent +$(package)_config_opts += -v +$(package)_config_opts += -no-feature-printer +$(package)_config_opts += -no-feature-printdialog + +ifneq ($(build_os),darwin) +$(package)_config_opts_darwin = -xplatform macx-clang-linux +$(package)_config_opts_darwin += -device-option MAC_SDK_PATH=$(OSX_SDK) +$(package)_config_opts_darwin += -device-option MAC_SDK_VERSION=$(OSX_SDK_VERSION) +$(package)_config_opts_darwin += -device-option CROSS_COMPILE="$(host)-" +$(package)_config_opts_darwin += -device-option MAC_MIN_VERSION=$(OSX_MIN_VERSION) +$(package)_config_opts_darwin += -device-option MAC_TARGET=$(host) +$(package)_config_opts_darwin += -device-option MAC_LD64_VERSION=$(LD64_VERSION) +endif + +$(package)_config_opts_linux = -qt-xkbcommon +$(package)_config_opts_linux += -qt-xcb +$(package)_config_opts_linux += -system-freetype +$(package)_config_opts_linux += -no-sm +$(package)_config_opts_linux += -fontconfig +$(package)_config_opts_linux += -no-opengl +$(package)_config_opts_arm_linux = -platform linux-g++ -xplatform $(host) +$(package)_config_opts_i686_linux = -xplatform linux-g++-32 +$(package)_config_opts_mingw32 = -no-opengl -xplatform win32-g++ -device-option CROSS_COMPILE="$(host)-" +$(package)_build_env = QT_RCC_TEST=1 +endef + +define $(package)_fetch_cmds +$(call fetch_file,$(package),$($(package)_download_path),$($(package)_download_file),$($(package)_file_name),$($(package)_sha256_hash)) && \ +$(call fetch_file,$(package),$($(package)_download_path),$($(package)_qttranslations_file_name),$($(package)_qttranslations_file_name),$($(package)_qttranslations_sha256_hash)) && \ +$(call fetch_file,$(package),$($(package)_download_path),$($(package)_qttools_file_name),$($(package)_qttools_file_name),$($(package)_qttools_sha256_hash)) +endef + +define $(package)_extract_cmds + mkdir -p $($(package)_extract_dir) && \ + echo "$($(package)_sha256_hash) $($(package)_source)" > $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + echo "$($(package)_qttranslations_sha256_hash) $($(package)_source_dir)/$($(package)_qttranslations_file_name)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + echo "$($(package)_qttools_sha256_hash) $($(package)_source_dir)/$($(package)_qttools_file_name)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + $(build_SHA256SUM) -c $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + mkdir qtbase && \ + tar --strip-components=1 -xf $($(package)_source) -C qtbase && \ + mkdir qttranslations && \ + tar --strip-components=1 -xf $($(package)_source_dir)/$($(package)_qttranslations_file_name) -C qttranslations && \ + mkdir qttools && \ + tar --strip-components=1 -xf $($(package)_source_dir)/$($(package)_qttools_file_name) -C qttools +endef + + +define $(package)_preprocess_cmds + sed -i.old "s|updateqm.commands = \$$$$\$$$$LRELEASE|updateqm.commands = $($(package)_extract_dir)/qttools/bin/lrelease|" qttranslations/translations/translations.pro && \ + sed -i.old "/updateqm.depends =/d" qttranslations/translations/translations.pro && \ + sed -i.old "s/src_plugins.depends = src_sql src_xml src_network/src_plugins.depends = src_xml src_network/" qtbase/src/src.pro && \ + sed -i.old "s|X11/extensions/XIproto.h|X11/X.h|" qtbase/src/plugins/platforms/xcb/qxcbxsettings.cpp && \ + sed -i.old 's/if \[ "$$$$XPLATFORM_MAC" = "yes" \]; then xspecvals=$$$$(macSDKify/if \[ "$$$$BUILD_ON_MAC" = "yes" \]; then xspecvals=$$$$(macSDKify/' qtbase/configure && \ + sed -i.old 's/CGEventCreateMouseEvent(0, kCGEventMouseMoved, pos, 0)/CGEventCreateMouseEvent(0, kCGEventMouseMoved, pos, kCGMouseButtonLeft)/' qtbase/src/plugins/platforms/cocoa/qcocoacursor.mm && \ + mkdir -p qtbase/mkspecs/macx-clang-linux &&\ + cp -f qtbase/mkspecs/macx-clang/Info.plist.lib qtbase/mkspecs/macx-clang-linux/ &&\ + cp -f qtbase/mkspecs/macx-clang/Info.plist.app qtbase/mkspecs/macx-clang-linux/ &&\ + cp -f qtbase/mkspecs/macx-clang/qplatformdefs.h qtbase/mkspecs/macx-clang-linux/ &&\ + cp -f $($(package)_patch_dir)/mac-qmake.conf qtbase/mkspecs/macx-clang-linux/qmake.conf && \ + patch -p1 < $($(package)_patch_dir)/mingw-uuidof.patch && \ + patch -p1 < $($(package)_patch_dir)/pidlist_absolute.patch && \ + patch -p1 < $($(package)_patch_dir)/fix-xcb-include-order.patch && \ + patch -p1 < $($(package)_patch_dir)/fix_qt_configure.patch && \ + patch -p1 < $($(package)_patch_dir)/fix_qt_pkgconfig.patch && \ + patch -p1 < $($(package)_patch_dir)/fix-cocoahelpers-macos.patch && \ + patch -p1 < $($(package)_patch_dir)/qfixed-coretext.patch && \ + echo "!host_build: QMAKE_CFLAGS += $($(package)_cflags) $($(package)_cppflags)" >> qtbase/mkspecs/common/gcc-base.conf && \ + echo "!host_build: QMAKE_CXXFLAGS += $($(package)_cxxflags) $($(package)_cppflags)" >> qtbase/mkspecs/common/gcc-base.conf && \ + echo "!host_build: QMAKE_LFLAGS += $($(package)_ldflags)" >> qtbase/mkspecs/common/gcc-base.conf && \ + sed -i.old "s|QMAKE_CFLAGS = |!host_build: QMAKE_CFLAGS = $($(package)_cflags) $($(package)_cppflags) |" qtbase/mkspecs/win32-g++/qmake.conf && \ + sed -i.old "s|QMAKE_LFLAGS = |!host_build: QMAKE_LFLAGS = $($(package)_ldflags) |" qtbase/mkspecs/win32-g++/qmake.conf && \ + sed -i.old "s|QMAKE_CXXFLAGS = |!host_build: QMAKE_CXXFLAGS = $($(package)_cxxflags) $($(package)_cppflags) |" qtbase/mkspecs/win32-g++/qmake.conf + +endef + +define $(package)_config_cmds + export PKG_CONFIG_LIBDIR=$(host_prefix)/lib/pkgconfig && \ + export PKG_CONFIG_PATH=$(host_prefix)/share/pkgconfig && \ + ./configure $($(package)_config_opts) && \ + echo "host_build: QT_CONFIG ~= s/system-zlib/zlib" >> mkspecs/qconfig.pri && \ + echo "CONFIG += force_bootstrap" >> mkspecs/qconfig.pri && \ + $(MAKE) sub-src-clean && \ + cd ../qttranslations && ../qtbase/bin/qmake qttranslations.pro -o Makefile && \ + cd translations && ../../qtbase/bin/qmake translations.pro -o Makefile && cd ../.. &&\ + cd qttools/src/linguist/lrelease/ && ../../../../qtbase/bin/qmake lrelease.pro -o Makefile && \ + cd ../lupdate/ && ../../../../qtbase/bin/qmake lupdate.pro -o Makefile && cd ../../../.. +endef + +define $(package)_build_cmds + $(MAKE) -C src $(addprefix sub-,$($(package)_qt_libs)) && \ + $(MAKE) -C ../qttools/src/linguist/lrelease && \ + $(MAKE) -C ../qttools/src/linguist/lupdate && \ + $(MAKE) -C ../qttranslations +endef + +define $(package)_stage_cmds + $(MAKE) -C src INSTALL_ROOT=$($(package)_staging_dir) $(addsuffix -install_subtargets,$(addprefix sub-,$($(package)_qt_libs))) && cd .. &&\ + $(MAKE) -C qttools/src/linguist/lrelease INSTALL_ROOT=$($(package)_staging_dir) install_target && \ + $(MAKE) -C qttools/src/linguist/lupdate INSTALL_ROOT=$($(package)_staging_dir) install_target && \ + $(MAKE) -C qttranslations INSTALL_ROOT=$($(package)_staging_dir) install_subtargets && \ + if `test -f qtbase/src/plugins/platforms/xcb/xcb-static/libxcb-static.a`; then \ + cp qtbase/src/plugins/platforms/xcb/xcb-static/libxcb-static.a $($(package)_staging_prefix_dir)/lib; \ + fi +endef + +define $(package)_postprocess_cmds + rm -rf native/mkspecs/ native/lib/ lib/cmake/ && \ + rm -f lib/lib*.la lib/*.prl plugins/*/*.prl +endef diff --git a/depends/packages/xcb_proto.mk b/depends/packages/xcb_proto.mk new file mode 100644 index 00000000..0c7c958d --- /dev/null +++ b/depends/packages/xcb_proto.mk @@ -0,0 +1,27 @@ +package=xcb_proto +$(package)_version=1.10 +$(package)_download_path=http://xcb.freedesktop.org/dist +$(package)_file_name=xcb-proto-$($(package)_version).tar.bz2 +$(package)_sha256_hash=7ef40ddd855b750bc597d2a435da21e55e502a0fefa85b274f2c922800baaf05 + +define $(package)_set_vars + $(package)_config_opts=--disable-shared + $(package)_config_opts_linux=--with-pic +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef + +define $(package)_postprocess_cmds + find -name "*.pyc" -delete && \ + find -name "*.pyo" -delete +endef diff --git a/depends/packages/xextproto.mk b/depends/packages/xextproto.mk new file mode 100644 index 00000000..98a11eb4 --- /dev/null +++ b/depends/packages/xextproto.mk @@ -0,0 +1,21 @@ +package=xextproto +$(package)_version=7.3.0 +$(package)_download_path=http://xorg.freedesktop.org/releases/individual/proto +$(package)_file_name=$(package)-$($(package)_version).tar.bz2 +$(package)_sha256_hash=f3f4b23ac8db9c3a9e0d8edb591713f3d70ef9c3b175970dd8823dfc92aa5bb0 + +define $(package)_set_vars +$(package)_config_opts=--disable-shared +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef diff --git a/depends/packages/xproto.mk b/depends/packages/xproto.mk new file mode 100644 index 00000000..50a90b26 --- /dev/null +++ b/depends/packages/xproto.mk @@ -0,0 +1,21 @@ +package=xproto +$(package)_version=7.0.26 +$(package)_download_path=http://xorg.freedesktop.org/releases/individual/proto +$(package)_file_name=$(package)-$($(package)_version).tar.bz2 +$(package)_sha256_hash=636162c1759805a5a0114a369dffdeccb8af8c859ef6e1445f26a4e6e046514f + +define $(package)_set_vars +$(package)_config_opts=--disable-shared +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef diff --git a/depends/packages/xtrans.mk b/depends/packages/xtrans.mk new file mode 100644 index 00000000..99eefa6d --- /dev/null +++ b/depends/packages/xtrans.mk @@ -0,0 +1,22 @@ +package=xtrans +$(package)_version=1.3.4 +$(package)_download_path=http://xorg.freedesktop.org/releases/individual/lib/ +$(package)_file_name=$(package)-$($(package)_version).tar.bz2 +$(package)_sha256_hash=054d4ee3efd52508c753e9f7bc655ef185a29bd2850dd9e2fc2ccc33544f583a +$(package)_dependencies= + +define $(package)_set_vars +$(package)_config_opts_linux=--with-pic --disable-static +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef diff --git a/depends/packages/zeromq.mk b/depends/packages/zeromq.mk new file mode 100644 index 00000000..3f97221e --- /dev/null +++ b/depends/packages/zeromq.mk @@ -0,0 +1,34 @@ +package=zeromq +$(package)_version=4.2.2 +$(package)_download_path=https://github.com/zeromq/libzmq/releases/download/v$($(package)_version)/ +$(package)_file_name=$(package)-$($(package)_version).tar.gz +$(package)_sha256_hash=5b23f4ca9ef545d5bd3af55d305765e3ee06b986263b31967435d285a3e6df6b +$(package)_patches=0001-fix-build-with-older-mingw64.patch + +define $(package)_set_vars + $(package)_config_opts=--without-docs --disable-shared --without-libsodium --disable-curve --disable-curve-keygen --disable-perf + $(package)_config_opts_linux=--with-pic + $(package)_cxxflags=-std=c++11 +endef + +define $(package)_preprocess_cmds + patch -p1 < $($(package)_patch_dir)/0001-fix-build-with-older-mingw64.patch && \ + ./autogen.sh +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) src/libzmq.la +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install-libLTLIBRARIES install-includeHEADERS install-pkgconfigDATA +endef + +define $(package)_postprocess_cmds + sed -i.old "s/ -lstdc++//" lib/pkgconfig/libzmq.pc && \ + rm -rf bin share +endef diff --git a/depends/packages/zlib.mk b/depends/packages/zlib.mk new file mode 100644 index 00000000..58949080 --- /dev/null +++ b/depends/packages/zlib.mk @@ -0,0 +1,27 @@ +package=zlib +$(package)_version=1.2.11 +$(package)_download_path=http://www.zlib.net +$(package)_file_name=$(package)-$($(package)_version).tar.gz +$(package)_sha256_hash=c3e5e9fdd5004dcb542feda5ee4f0ff0744628baf8ed2dd5d66f8ca1197cb1a1 + +define $(package)_set_vars +$(package)_build_opts= CC="$($(package)_cc)" +$(package)_build_opts+=CFLAGS="$($(package)_cflags) $($(package)_cppflags) -fPIC" +$(package)_build_opts+=RANLIB="$($(package)_ranlib)" +$(package)_build_opts+=AR="$($(package)_ar)" +$(package)_build_opts_darwin+=AR="$($(package)_libtool)" +$(package)_build_opts_darwin+=ARFLAGS="-o" +endef + +define $(package)_config_cmds + ./configure --static --prefix=$(host_prefix) +endef + +define $(package)_build_cmds + $(MAKE) $($(package)_build_opts) libz.a +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install $($(package)_build_opts) +endef + diff --git a/depends/patches/qt/mac-qmake.conf b/depends/patches/qt/mac-qmake.conf new file mode 100644 index 00000000..ca70d30b --- /dev/null +++ b/depends/patches/qt/mac-qmake.conf @@ -0,0 +1,25 @@ +MAKEFILE_GENERATOR = UNIX +CONFIG += app_bundle incremental global_init_link_order lib_version_first plugin_no_soname absolute_library_soname +QMAKE_INCREMENTAL_STYLE = sublib +include(../common/macx.conf) +include(../common/gcc-base-mac.conf) +include(../common/clang.conf) +include(../common/clang-mac.conf) +QMAKE_MAC_SDK_PATH=$${MAC_SDK_PATH} +QMAKE_XCODE_VERSION=4.3 +QMAKE_XCODE_DEVELOPER_PATH=/Developer +QMAKE_MACOSX_DEPLOYMENT_TARGET = $${MAC_MIN_VERSION} +QMAKE_MAC_SDK=macosx +QMAKE_MAC_SDK.macosx.Path = $${MAC_SDK_PATH} +QMAKE_MAC_SDK.macosx.platform_name = macosx +QMAKE_MAC_SDK.macosx.SDKVersion = $${MAC_SDK_VERSION} +QMAKE_MAC_SDK.macosx.PlatformPath = /phony +!host_build: QMAKE_CFLAGS += -target $${MAC_TARGET} +!host_build: QMAKE_OBJECTIVE_CFLAGS += $$QMAKE_CFLAGS +!host_build: QMAKE_CXXFLAGS += $$QMAKE_CFLAGS +!host_build: QMAKE_LFLAGS += -target $${MAC_TARGET} -mlinker-version=$${MAC_LD64_VERSION} +QMAKE_AR = $${CROSS_COMPILE}ar cq +QMAKE_RANLIB=$${CROSS_COMPILE}ranlib +QMAKE_LIBTOOL=$${CROSS_COMPILE}libtool +QMAKE_INSTALL_NAME_TOOL=$${CROSS_COMPILE}install_name_tool +load(qt_config) From 83e32711952dd4d097481fa5aeea0b28bbeb57ef Mon Sep 17 00:00:00 2001 From: 2a5A1Ghu1 <13294167+2a5A1Ghu1@users.noreply.github.com> Date: Sun, 8 Nov 2020 23:41:49 -0800 Subject: [PATCH 07/35] [BUILD] More Upstream Autotools These commits will break compiling due how far behind the current code is. A full rebase, update and rework of the current code will need to be synced up with upstream. I am stopping here dues to the complexity of continuing foward. What has been done will allow autotools building with qt5 and newer versions of boost. I stopped here on both bitcoin and dash "Add /opt/local/include/db48 only if it exists." https://github.com/bitcoin/bitcoin/commits/master?after=7e373294a5ae819099c39d9d03d1f5a311d63cfc+384&branch=master&path%5B%5D=configure.ac https://github.com/dashpay/dash/commits/master?before=b3c830686758886aa9d026a3c07ac119709cc20d+315&branch=master&path%5B%5D=configure.ac --- .gitignore | 8 +- Makefile.am | 7 +- build-aux/m4/ax_gcc_func_attribute.m4 | 216 ++++++++++++++ configure.ac | 218 +++++++++++--- libbitcoinconsensus.pc | 12 + libbitcoinconsensus.pc.in | 12 + libtool | 8 +- qa/pull-tester/build-tests.sh | 76 +++++ qa/pull-tester/rpc-tests.sh | 19 ++ qa/pull-tester/run-bitcoin-cli | 13 + qa/pull-tester/tests-config.sh.in | 15 + src/MakeFile.am | 133 +++++---- src/Makefile.qt.include | 16 +- src/Makefile.qttest.include | 9 +- src/Makefile.test.include | 34 ++- src/bloom.cpp | 188 ++++++++++++ src/bloom.h | 100 +++++++ src/config/bitcoin-config.h | 24 +- src/config/bitcoin-config.h.in | 24 +- src/core/.deps/libbitcoin_common_a-block.Po | 1 + .../.deps/libbitcoin_common_a-transaction.Po | 1 + src/core/transaction.cpp | 142 +++++++++ src/core/transaction.h | 276 ++++++++++++++++++ src/main.h | 1 - src/qt/locale/bitcoin_af_ZA.qm | Bin 11441 -> 0 bytes src/qt/locale/bitcoin_ar.qm | Bin 31225 -> 0 bytes src/qt/locale/bitcoin_be_BY.qm | Bin 19965 -> 0 bytes src/qt/locale/bitcoin_bg.qm | Bin 26590 -> 0 bytes src/qt/locale/bitcoin_bs.qm | Bin 635 -> 0 bytes src/qt/locale/bitcoin_ca.qm | Bin 6469 -> 0 bytes src/qt/locale/bitcoin_ca@valencia.qm | Bin 596 -> 0 bytes src/qt/locale/bitcoin_ca_ES.qm | Bin 89548 -> 0 bytes src/qt/locale/bitcoin_cs.qm | Bin 84478 -> 0 bytes src/qt/locale/bitcoin_cy.qm | Bin 9069 -> 0 bytes src/qt/locale/bitcoin_da.qm | Bin 85720 -> 0 bytes src/qt/locale/bitcoin_de.qm | Bin 81410 -> 0 bytes src/qt/locale/bitcoin_el_GR.qm | Bin 49279 -> 0 bytes src/qt/locale/bitcoin_en.qm | Bin 72948 -> 0 bytes src/qt/locale/bitcoin_eo.qm | Bin 50490 -> 0 bytes src/qt/locale/bitcoin_es.qm | Bin 90698 -> 0 bytes src/qt/locale/bitcoin_es_CL.qm | Bin 34504 -> 0 bytes src/qt/locale/bitcoin_es_DO.qm | Bin 53257 -> 0 bytes src/qt/locale/bitcoin_es_MX.qm | Bin 16741 -> 0 bytes src/qt/locale/bitcoin_es_UY.qm | Bin 10083 -> 0 bytes src/qt/locale/bitcoin_et.qm | Bin 45620 -> 0 bytes src/qt/locale/bitcoin_eu_ES.qm | Bin 15013 -> 0 bytes src/qt/locale/bitcoin_fa.qm | Bin 42742 -> 0 bytes src/qt/locale/bitcoin_fa_IR.qm | Bin 23755 -> 0 bytes src/qt/locale/bitcoin_fi.qm | Bin 94426 -> 0 bytes src/qt/locale/bitcoin_fr.qm | Bin 93876 -> 0 bytes src/qt/locale/bitcoin_fr_CA.qm | Bin 93416 -> 0 bytes src/qt/locale/bitcoin_gl.qm | Bin 58163 -> 0 bytes src/qt/locale/bitcoin_he.qm | Bin 43392 -> 0 bytes src/qt/locale/bitcoin_hi_IN.qm | Bin 16935 -> 0 bytes src/qt/locale/bitcoin_hr.qm | Bin 32617 -> 0 bytes src/qt/locale/bitcoin_hu.qm | Bin 42986 -> 0 bytes src/qt/locale/bitcoin_id_ID.qm | Bin 40293 -> 0 bytes src/qt/locale/bitcoin_it.qm | Bin 53332 -> 0 bytes src/qt/locale/bitcoin_ja.qm | Bin 65499 -> 0 bytes src/qt/locale/bitcoin_ka.qm | Bin 49852 -> 0 bytes src/qt/locale/bitcoin_kk_KZ.qm | Bin 2704 -> 0 bytes src/qt/locale/bitcoin_ko_KR.qm | Bin 34050 -> 0 bytes src/qt/locale/bitcoin_ky.qm | Bin 2896 -> 0 bytes src/qt/locale/bitcoin_la.qm | Bin 47010 -> 0 bytes src/qt/locale/bitcoin_lt.qm | Bin 34094 -> 0 bytes src/qt/locale/bitcoin_lv_LV.qm | Bin 30093 -> 0 bytes src/qt/locale/bitcoin_ms_MY.qm | Bin 1806 -> 0 bytes src/qt/locale/bitcoin_nb.qm | Bin 59751 -> 0 bytes src/qt/locale/bitcoin_nl.qm | Bin 88391 -> 0 bytes src/qt/locale/bitcoin_pam.qm | Bin 43900 -> 0 bytes src/qt/locale/bitcoin_pl.qm | Bin 53414 -> 0 bytes src/qt/locale/bitcoin_pt_BR.qm | Bin 58720 -> 0 bytes src/qt/locale/bitcoin_pt_PT.qm | Bin 52264 -> 0 bytes src/qt/locale/bitcoin_ro_RO.qm | Bin 88599 -> 0 bytes src/qt/locale/bitcoin_ru.qm | Bin 87624 -> 0 bytes src/qt/locale/bitcoin_sah.qm | Bin 179 -> 0 bytes src/qt/locale/bitcoin_sk.qm | Bin 99360 -> 0 bytes src/qt/locale/bitcoin_sl_SI.qm | Bin 86019 -> 0 bytes src/qt/locale/bitcoin_sq.qm | Bin 12051 -> 0 bytes src/qt/locale/bitcoin_sr.qm | Bin 18719 -> 0 bytes src/qt/locale/bitcoin_sv.qm | Bin 85134 -> 0 bytes src/qt/locale/bitcoin_th_TH.qm | Bin 2659 -> 0 bytes src/qt/locale/bitcoin_tr.qm | Bin 89034 -> 0 bytes src/qt/locale/bitcoin_uk.qm | Bin 45032 -> 0 bytes src/qt/locale/bitcoin_ur_PK.qm | Bin 3070 -> 0 bytes src/qt/locale/bitcoin_vi.qm | Bin 1847 -> 0 bytes src/qt/locale/bitcoin_vi_VN.qm | Bin 128 -> 0 bytes src/qt/locale/bitcoin_zh_CN.qm | Bin 66942 -> 0 bytes src/qt/locale/bitcoin_zh_TW.qm | Bin 39566 -> 0 bytes .../.deps/libbitcoin_common_a-interpreter.Po | 1 + .../.deps/libbitcoin_common_a-script.Po | 1 + .../.deps/libbitcoin_common_a-script_error.Po | 1 + src/script/.deps/libbitcoin_common_a-sign.Po | 1 + .../.deps/libbitcoin_common_a-standard.Po | 1 + .../.deps/libbitcoin_server_a-sigcache.Po | 1 + src/univalue/.deps/libbitcoin_univalue.Po | 1 + 96 files changed, 1414 insertions(+), 146 deletions(-) create mode 100644 build-aux/m4/ax_gcc_func_attribute.m4 create mode 100644 libbitcoinconsensus.pc create mode 100644 libbitcoinconsensus.pc.in create mode 100755 qa/pull-tester/build-tests.sh create mode 100644 qa/pull-tester/rpc-tests.sh create mode 100644 qa/pull-tester/run-bitcoin-cli create mode 100755 qa/pull-tester/tests-config.sh.in create mode 100755 src/bloom.cpp create mode 100755 src/bloom.h create mode 100644 src/core/.deps/libbitcoin_common_a-block.Po create mode 100644 src/core/.deps/libbitcoin_common_a-transaction.Po create mode 100644 src/core/transaction.cpp create mode 100644 src/core/transaction.h delete mode 100644 src/qt/locale/bitcoin_af_ZA.qm delete mode 100644 src/qt/locale/bitcoin_ar.qm delete mode 100644 src/qt/locale/bitcoin_be_BY.qm delete mode 100644 src/qt/locale/bitcoin_bg.qm delete mode 100644 src/qt/locale/bitcoin_bs.qm delete mode 100644 src/qt/locale/bitcoin_ca.qm delete mode 100644 src/qt/locale/bitcoin_ca@valencia.qm delete mode 100644 src/qt/locale/bitcoin_ca_ES.qm delete mode 100644 src/qt/locale/bitcoin_cs.qm delete mode 100644 src/qt/locale/bitcoin_cy.qm delete mode 100644 src/qt/locale/bitcoin_da.qm delete mode 100644 src/qt/locale/bitcoin_de.qm delete mode 100644 src/qt/locale/bitcoin_el_GR.qm delete mode 100644 src/qt/locale/bitcoin_en.qm delete mode 100644 src/qt/locale/bitcoin_eo.qm delete mode 100644 src/qt/locale/bitcoin_es.qm delete mode 100644 src/qt/locale/bitcoin_es_CL.qm delete mode 100644 src/qt/locale/bitcoin_es_DO.qm delete mode 100644 src/qt/locale/bitcoin_es_MX.qm delete mode 100644 src/qt/locale/bitcoin_es_UY.qm delete mode 100644 src/qt/locale/bitcoin_et.qm delete mode 100644 src/qt/locale/bitcoin_eu_ES.qm delete mode 100644 src/qt/locale/bitcoin_fa.qm delete mode 100644 src/qt/locale/bitcoin_fa_IR.qm delete mode 100644 src/qt/locale/bitcoin_fi.qm delete mode 100644 src/qt/locale/bitcoin_fr.qm delete mode 100644 src/qt/locale/bitcoin_fr_CA.qm delete mode 100644 src/qt/locale/bitcoin_gl.qm delete mode 100644 src/qt/locale/bitcoin_he.qm delete mode 100644 src/qt/locale/bitcoin_hi_IN.qm delete mode 100644 src/qt/locale/bitcoin_hr.qm delete mode 100644 src/qt/locale/bitcoin_hu.qm delete mode 100644 src/qt/locale/bitcoin_id_ID.qm delete mode 100644 src/qt/locale/bitcoin_it.qm delete mode 100644 src/qt/locale/bitcoin_ja.qm delete mode 100644 src/qt/locale/bitcoin_ka.qm delete mode 100644 src/qt/locale/bitcoin_kk_KZ.qm delete mode 100644 src/qt/locale/bitcoin_ko_KR.qm delete mode 100644 src/qt/locale/bitcoin_ky.qm delete mode 100644 src/qt/locale/bitcoin_la.qm delete mode 100644 src/qt/locale/bitcoin_lt.qm delete mode 100644 src/qt/locale/bitcoin_lv_LV.qm delete mode 100644 src/qt/locale/bitcoin_ms_MY.qm delete mode 100644 src/qt/locale/bitcoin_nb.qm delete mode 100644 src/qt/locale/bitcoin_nl.qm delete mode 100644 src/qt/locale/bitcoin_pam.qm delete mode 100644 src/qt/locale/bitcoin_pl.qm delete mode 100644 src/qt/locale/bitcoin_pt_BR.qm delete mode 100644 src/qt/locale/bitcoin_pt_PT.qm delete mode 100644 src/qt/locale/bitcoin_ro_RO.qm delete mode 100644 src/qt/locale/bitcoin_ru.qm delete mode 100644 src/qt/locale/bitcoin_sah.qm delete mode 100644 src/qt/locale/bitcoin_sk.qm delete mode 100644 src/qt/locale/bitcoin_sl_SI.qm delete mode 100644 src/qt/locale/bitcoin_sq.qm delete mode 100644 src/qt/locale/bitcoin_sr.qm delete mode 100644 src/qt/locale/bitcoin_sv.qm delete mode 100644 src/qt/locale/bitcoin_th_TH.qm delete mode 100644 src/qt/locale/bitcoin_tr.qm delete mode 100644 src/qt/locale/bitcoin_uk.qm delete mode 100644 src/qt/locale/bitcoin_ur_PK.qm delete mode 100644 src/qt/locale/bitcoin_vi.qm delete mode 100644 src/qt/locale/bitcoin_vi_VN.qm delete mode 100644 src/qt/locale/bitcoin_zh_CN.qm delete mode 100644 src/qt/locale/bitcoin_zh_TW.qm create mode 100644 src/script/.deps/libbitcoin_common_a-interpreter.Po create mode 100644 src/script/.deps/libbitcoin_common_a-script.Po create mode 100644 src/script/.deps/libbitcoin_common_a-script_error.Po create mode 100644 src/script/.deps/libbitcoin_common_a-sign.Po create mode 100644 src/script/.deps/libbitcoin_common_a-standard.Po create mode 100644 src/script/.deps/libbitcoin_server_a-sigcache.Po create mode 100644 src/univalue/.deps/libbitcoin_univalue.Po diff --git a/.gitignore b/.gitignore index ba57c4b0..1fce8dca 100644 --- a/.gitignore +++ b/.gitignore @@ -92,6 +92,10 @@ linux-coverage-build linux-build win32-build qa/pull-tester/run-bitcoind-for-test.sh -qa/pull-tester/build-tests.sh +qa/pull-tester/tests-config.sh +qa/pull-tester/cache/* +qa/pull-tester/test.*/* -!src/leveldb-*/Makefile \ No newline at end of file +!src/leveldb-*/Makefile + +/doc/doxygen/ \ No newline at end of file diff --git a/Makefile.am b/Makefile.am index b3fcec22..217fff0e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -4,6 +4,11 @@ SUBDIRS = src GZIP_ENV="-9n" +if BUILD_BITCOIN_LIBS +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libbitcoinconsensus.pc +endif + BITCOIND_BIN=$(top_builddir)/src/bitcoind$(EXEEXT) BITCOIN_QT_BIN=$(top_builddir)/src/qt/bitcoin-qt$(EXEEXT) BITCOIN_CLI_BIN=$(top_builddir)/src/bitcoin-cli$(EXEEXT) @@ -172,7 +177,7 @@ check-local: @qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool $(COMPARISON_TOOL_REORG_TESTS) 2>&1 endif -EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/pull-tester.sh qa/rpc-tests $(DIST_DOCS) $(WINDOWS_PACKAGING) $(OSX_PACKAGING) +EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/rpc-tests.sh qa/pull-tester/run-bitcoin-cli qa/rpc-tests $(DIST_DOCS) $(WINDOWS_PACKAGING) $(OSX_PACKAGING) CLEANFILES = $(OSX_DMG) $(BITCOIN_WIN_INSTALLER) diff --git a/build-aux/m4/ax_gcc_func_attribute.m4 b/build-aux/m4/ax_gcc_func_attribute.m4 new file mode 100644 index 00000000..9e4eaf7c --- /dev/null +++ b/build-aux/m4/ax_gcc_func_attribute.m4 @@ -0,0 +1,216 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_GCC_FUNC_ATTRIBUTE(ATTRIBUTE) +# +# DESCRIPTION +# +# This macro checks if the compiler supports one of GCC's function +# attributes; many other compilers also provide function attributes with +# the same syntax. Compiler warnings are used to detect supported +# attributes as unsupported ones are ignored by default so quieting +# warnings when using this macro will yield false positives. +# +# The ATTRIBUTE parameter holds the name of the attribute to be checked. +# +# If ATTRIBUTE is supported define HAVE_FUNC_ATTRIBUTE_. +# +# The macro caches its result in the ax_cv_have_func_attribute_ +# variable. +# +# The macro currently supports the following function attributes: +# +# alias +# aligned +# alloc_size +# always_inline +# artificial +# cold +# const +# constructor +# deprecated +# destructor +# dllexport +# dllimport +# error +# externally_visible +# flatten +# format +# format_arg +# gnu_inline +# hot +# ifunc +# leaf +# malloc +# noclone +# noinline +# nonnull +# noreturn +# nothrow +# optimize +# pure +# unused +# used +# visibility +# warning +# warn_unused_result +# weak +# weakref +# +# Unsuppored function attributes will be tested with a prototype returning +# an int and not accepting any arguments and the result of the check might +# be wrong or meaningless so use with care. +# +# LICENSE +# +# Copyright (c) 2013 Gabriele Svelto +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 2 + +AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [ + AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1]) + AC_CACHE_CHECK([for __attribute__(($1))], [ac_var], [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([ + m4_case([$1], + [alias], [ + int foo( void ) { return 0; } + int bar( void ) __attribute__(($1("foo"))); + ], + [aligned], [ + int foo( void ) __attribute__(($1(32))); + ], + [alloc_size], [ + void *foo(int a) __attribute__(($1(1))); + ], + [always_inline], [ + inline __attribute__(($1)) int foo( void ) { return 0; } + ], + [artificial], [ + inline __attribute__(($1)) int foo( void ) { return 0; } + ], + [cold], [ + int foo( void ) __attribute__(($1)); + ], + [const], [ + int foo( void ) __attribute__(($1)); + ], + [constructor], [ + int foo( void ) __attribute__(($1)); + ], + [deprecated], [ + int foo( void ) __attribute__(($1(""))); + ], + [destructor], [ + int foo( void ) __attribute__(($1)); + ], + [dllexport], [ + __attribute__(($1)) int foo( void ) { return 0; } + ], + [dllimport], [ + int foo( void ) __attribute__(($1)); + ], + [error], [ + int foo( void ) __attribute__(($1(""))); + ], + [externally_visible], [ + int foo( void ) __attribute__(($1)); + ], + [flatten], [ + int foo( void ) __attribute__(($1)); + ], + [format], [ + int foo(const char *p, ...) __attribute__(($1(printf, 1, 2))); + ], + [format_arg], [ + char *foo(const char *p) __attribute__(($1(1))); + ], + [gnu_inline], [ + inline __attribute__(($1)) int foo( void ) { return 0; } + ], + [hot], [ + int foo( void ) __attribute__(($1)); + ], + [ifunc], [ + int my_foo( void ) { return 0; } + static int (*resolve_foo(void))(void) { return my_foo; } + int foo( void ) __attribute__(($1("resolve_foo"))); + ], + [leaf], [ + __attribute__(($1)) int foo( void ) { return 0; } + ], + [malloc], [ + void *foo( void ) __attribute__(($1)); + ], + [noclone], [ + int foo( void ) __attribute__(($1)); + ], + [noinline], [ + __attribute__(($1)) int foo( void ) { return 0; } + ], + [nonnull], [ + int foo(char *p) __attribute__(($1(1))); + ], + [noreturn], [ + void foo( void ) __attribute__(($1)); + ], + [nothrow], [ + int foo( void ) __attribute__(($1)); + ], + [optimize], [ + __attribute__(($1(3))) int foo( void ) { return 0; } + ], + [pure], [ + int foo( void ) __attribute__(($1)); + ], + [unused], [ + int foo( void ) __attribute__(($1)); + ], + [used], [ + int foo( void ) __attribute__(($1)); + ], + [visibility], [ + int foo_def( void ) __attribute__(($1("default"))); + int foo_hid( void ) __attribute__(($1("hidden"))); + int foo_int( void ) __attribute__(($1("internal"))); + int foo_pro( void ) __attribute__(($1("protected"))); + ], + [warning], [ + int foo( void ) __attribute__(($1(""))); + ], + [warn_unused_result], [ + int foo( void ) __attribute__(($1)); + ], + [weak], [ + int foo( void ) __attribute__(($1)); + ], + [weakref], [ + static int foo( void ) { return 0; } + static int bar( void ) __attribute__(($1("foo"))); + ], + [ + m4_warn([syntax], [Unsupported attribute $1, the test may fail]) + int foo( void ) __attribute__(($1)); + ] + )], []) + ], + dnl GCC doesn't exit with an error if an unknown attribute is + dnl provided but only outputs a warning, so accept the attribute + dnl only if no warning were issued. + [AS_IF([test -s conftest.err], + [AS_VAR_SET([ac_var], [no])], + [AS_VAR_SET([ac_var], [yes])])], + [AS_VAR_SET([ac_var], [no])]) + ]) + AS_IF([test yes = AS_VAR_GET([ac_var])], + [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_FUNC_ATTRIBUTE_$1), 1, + [Define to 1 if the system has the `$1' function attribute])], []) + AS_VAR_POPDEF([ac_var]) +]) \ No newline at end of file diff --git a/configure.ac b/configure.ac index efea195a..1c445017 100644 --- a/configure.ac +++ b/configure.ac @@ -11,8 +11,21 @@ AC_CONFIG_SRCDIR([src/main.cpp]) AC_CONFIG_HEADERS([src/config/bitcoin-config.h]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIR([build-aux/m4]) -LT_INIT([disable-shared]) + AC_CANONICAL_HOST + +dnl By default, libtool for mingw refuses to link static libs into a dll for +dnl fear of mixing pic/non-pic objects, and import/export complications. Since +dnl we have those under control, re-enable that functionality. + +case $host in + *mingw*) + lt_cv_deplibs_check_method="pass_all" + ;; +esac + +LT_INIT([pic-only]) + AH_TOP([#ifndef BITCOIN_CONFIG_H]) AH_TOP([#define BITCOIN_CONFIG_H]) AH_BOTTOM([#endif //BITCOIN_CONFIG_H]) @@ -167,6 +180,24 @@ if test "x$CXXFLAGS_overridden" = "xno"; then fi CPPFLAGS="$CPPFLAGS -DBOOST_SPIRIT_THREADSAFE -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS" +AC_ARG_WITH([utils], + [AS_HELP_STRING([--with-utils], + [build bitcoin-cli bitcoin-tx (default=yes)])], + [build_bitcoin_utils=$withval], + [build_bitcoin_utils=yes]) + +AC_ARG_WITH([libs], + [AS_HELP_STRING([--with-libs], + [build libraries (default=yes)])], + [build_bitcoin_libs=$withval], + [build_bitcoin_libs=yes]) + +AC_ARG_WITH([daemon], + [AS_HELP_STRING([--with-daemon], + [build bitcoind daemon (default=yes)])], + [build_bitcoind=$withval], + [build_bitcoind=yes]) + AC_LANG_PUSH([C++]) use_pkgconfig=yes @@ -197,12 +228,9 @@ case $host in AC_CHECK_LIB([iphlpapi], [main],, AC_MSG_ERROR(lib missing)) AC_CHECK_LIB([crypt32], [main],, AC_MSG_ERROR(lib missing)) - AX_CHECK_LINK_FLAG([[-static-libgcc]],[LDFLAGS="$LDFLAGS -static-libgcc"]) - AX_CHECK_LINK_FLAG([[-static-libstdc++]],[LDFLAGS="$LDFLAGS -static-libstdc++"]) - # -static is interpreted by libtool, where it has a different meaning. # In libtool-speak, it's -all-static. - AX_CHECK_LINK_FLAG([[-static]],[LDFLAGS="$LDFLAGS -static"; LIBTOOL_LDFLAGS="$LIBTOOL_LDFLAGS -all-static"]) + AX_CHECK_LINK_FLAG([[-static]],[LIBTOOL_APP_LDFLAGS="$LIBTOOL_APP_LDFLAGS -all-static"]) AC_PATH_PROG([MAKENSIS], [makensis], none) if test x$MAKENSIS = xnone; then @@ -225,6 +253,15 @@ case $host in *) AC_MSG_ERROR("Could not determine win32/win64 for installer") ;; esac AC_SUBST(WINDOWS_BITS) + + dnl libtool insists upon adding -nostdlib and a list of objects/libs to link against. + dnl That breaks our ability to build dll's with static libgcc/libstdc++/libssp. Override + dnl its command here, with the predeps/postdeps removed, and -static inserted. Postdeps are + dnl also overridden to prevent their insertion later. + dnl This should only affect dll's. + archive_cmds_CXX="\$CC -shared \$libobjs \$deplibs \$compiler_flags -static -o \$output_objdir/\$soname \${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker \$lib" + postdeps_CXX= + ;; *darwin*) TARGET_OS=darwin @@ -250,14 +287,14 @@ case $host in bdb_prefix=`$BREW --prefix berkeley-db4 2>/dev/null` qt5_prefix=`$BREW --prefix qt5 2>/dev/null` if test x$openssl_prefix != x; then - export PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH" + PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH" fi if test x$bdb_prefix != x; then CPPFLAGS="$CPPFLAGS -I$bdb_prefix/include" LIBS="$LIBS -L$bdb_prefix/lib" fi if test x$qt5_prefix != x; then - export PKG_CONFIG_PATH="$qt5_prefix/lib/pkgconfig:$PKG_CONFIG_PATH" + PKG_CONFIG_PATH="$qt5_prefix/lib/pkgconfig:$PKG_CONFIG_PATH" fi fi else @@ -269,10 +306,17 @@ case $host in AC_PATH_TOOL([INSTALLNAMETOOL], [install_name_tool], install_name_tool) AC_PATH_TOOL([OTOOL], [otool], otool) AC_PATH_PROGS([GENISOIMAGE], [genisoimage mkisofs],genisoimage) + + 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 which may not exist in the path. Stripping the .a is not + dnl necessary, so just disable it. + old_striplib= ;; esac fi + AX_CHECK_LINK_FLAG([[-Wl,-headerpad_max_install_names]], [LDFLAGS="$LDFLAGS -Wl,-headerpad_max_install_names"]) CPPFLAGS="$CPPFLAGS -DMAC_OSX" ;; *linux*) @@ -287,7 +331,7 @@ if test x$use_comparison_tool != xno; then fi if test x$use_comparison_tool_reorg_tests != xno; then - if test x$use_comparison_tool == x; then + if test x$use_comparison_tool = x; then AC_MSG_ERROR("comparison tool reorg tests but comparison tool was not specified") fi AC_SUBST(COMPARISON_TOOL_REORG_TESTS, 1) @@ -295,20 +339,20 @@ else AC_SUBST(COMPARISON_TOOL_REORG_TESTS, 0) fi -if test x$use_lcov == xyes; then - if test x$LCOV == x; then +if test x$use_lcov = xyes; then + if test x$LCOV = x; then AC_MSG_ERROR("lcov testing requested but lcov not found") fi - if test x$GCOV == x; then + if test x$GCOV = x; then AC_MSG_ERROR("lcov testing requested but gcov not found") fi - if test x$JAVA == x; then + if test x$JAVA = x; then AC_MSG_ERROR("lcov testing requested but java 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") fi - if test x$use_comparison_tool == x; then + if test x$use_comparison_tool = x; then AC_MSG_ERROR("lcov testing requested but comparison tool was not specified") fi LCOV="$LCOV --gcov-tool=$GCOV" @@ -343,6 +387,10 @@ fi AX_CHECK_LINK_FLAG([[-Wl,--large-address-aware]], [LDFLAGS="$LDFLAGS -Wl,--large-address-aware"]) +AX_GCC_FUNC_ATTRIBUTE([visibility]) +AX_GCC_FUNC_ATTRIBUTE([dllexport]) +AX_GCC_FUNC_ATTRIBUTE([dllimport]) + if test x$use_glibc_compat != xno; then #__fdelt_chk's params and return type have changed from long unsigned int to long int. @@ -383,6 +431,12 @@ if test x$use_hardening != xno; then AX_CHECK_LINK_FLAG([[-pie]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -pie"]) fi + case $host in + *mingw*) + AC_CHECK_LIB([ssp], [main],, AC_MSG_ERROR(lib missing)) + ;; + esac + CXXFLAGS="$CXXFLAGS $HARDENED_CXXFLAGS" CPPFLAGS="$CPPFLAGS $HARDENED_CPPFLAGS" LDFLAGS="$LDFLAGS $HARDENED_LDFLAGS" @@ -460,11 +514,24 @@ dnl Check for libminiupnpc (optional) if test x$use_upnp != xno; then AC_CHECK_HEADERS( [miniupnpc/miniwget.h miniupnpc/miniupnpc.h miniupnpc/upnpcommands.h miniupnpc/upnperrors.h], - [AC_CHECK_LIB([miniupnpc], [main],, [have_miniupnpc=no])], + [AC_CHECK_LIB([miniupnpc], [main],[MINIUPNPC_LIBS=-lminiupnpc], [have_miniupnpc=no])], [have_miniupnpc=no] ) fi +BITCOIN_QT_INIT + +dnl sets $bitcoin_enable_qt, $bitcoin_enable_qt_test, $bitcoin_enable_qt_dbus +BITCOIN_QT_CONFIGURE([$use_pkgconfig], [qt4]) + +if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests = xnononono; then + use_boost=no +else + use_boost=yes +fi + +if test x$use_boost = xyes; then + dnl Check for boost libs AX_BOOST_BASE AX_BOOST_SYSTEM @@ -502,6 +569,10 @@ if test x$use_reduce_exports != xno; then CPPFLAGS="$TEMP_CPPFLAGS" fi +elif test x$use_reduce_exports = xauto; then + use_reduce_exports=yes +fi + if test x$use_reduce_exports != xno; then CXXFLAGS="$CXXFLAGS $RE_CXXFLAGS" AX_CHECK_LINK_FLAG([[-Wl,--exclude-libs,ALL]], [RELDFLAGS="-Wl,--exclude-libs,ALL"]) @@ -513,6 +584,7 @@ if test x$use_tests = xyes; then AC_MSG_ERROR(hexdump is required for tests) fi + if test x$use_boost = xyes; then AX_BOOST_UNIT_TEST_FRAMEWORK @@ -532,8 +604,11 @@ if test x$use_tests = xyes; then [AC_MSG_RESULT(no)]) LIBS="$TEMP_LIBS" CPPFLAGS="$TEMP_CPPFLAGS" + fi fi +if test x$use_boost = xyes; then + BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRAM_OPTIONS_LIB $BOOST_THREAD_LIB" dnl Boost >= 1.50 uses sleep_for rather than the now-deprecated sleep, however @@ -590,23 +665,11 @@ if test x$boost_sleep != xyes; then AC_MSG_ERROR(No working boost sleep implementation found.) fi -AC_ARG_WITH([utils], - [AS_HELP_STRING([--with-utils], - [build bitcoin-cli bitcoin-tx (default=yes)])], - [build_bitcoin_utils=$withval], - [build_bitcoin_utils=yes]) - -AC_ARG_WITH([daemon], - [AS_HELP_STRING([--with-daemon], - [build bitcoind daemon (default=yes)])], - [build_bitcoind=$withval], - [build_bitcoind=yes]) - -BITCOIN_QT_INIT +fi if test x$use_pkgconfig = xyes; then - if test x"$PKG_CONFIG" == "x"; then + if test x"$PKG_CONFIG" = "x"; then AC_MSG_ERROR(pkg-config not found.) fi @@ -629,13 +692,21 @@ else AC_CHECK_HEADER([openssl/ssl.h],, AC_MSG_ERROR(libssl headers missing),) AC_CHECK_LIB([ssl], [main],SSL_LIBS=-lssl, AC_MSG_ERROR(libssl missing)) - BITCOIN_QT_CHECK(AC_CHECK_LIB([protobuf] ,[main],,BITCOIN_QT_FAIL(libprotobuf not found))) + BITCOIN_QT_CHECK(AC_CHECK_LIB([protobuf] ,[main],[PROTOBUF_LIBS=-lprotobuf], BITCOIN_QT_FAIL(libprotobuf not found))) if test x$use_qr != xno; then - BITCOIN_QT_CHECK([AC_CHECK_LIB([qrencode], [main],, [have_qrencode=no])]) + BITCOIN_QT_CHECK([AC_CHECK_LIB([qrencode], [main],[QR_LIBS=-lqrencode], [have_qrencode=no])]) BITCOIN_QT_CHECK([AC_CHECK_HEADER([qrencode.h],, have_qrencode=no)]) fi fi +CFLAGS_TEMP="$CFLAGS" +LIBS_TEMP="$LIBS" +CFLAGS="$CFLAGS $SSL_CFLAGS $CRYPTO_CFLAGS" +LIBS="$LIBS $SSL_LIBS $CRYPTO_LIBS" +AC_CHECK_HEADER([openssl/ec.h],, AC_MSG_ERROR(OpenSSL ec header missing),) +CFLAGS="$CFLAGS_TEMP" +LIBS="$LIBS_TEMP" + BITCOIN_QT_PATH_PROGS([PROTOC], [protoc],$protoc_bin_path) AC_MSG_CHECKING([whether to build bitcoind]) @@ -646,8 +717,13 @@ AC_MSG_CHECKING([whether to build utils (bitcoin-cli bitcoin-tx)]) AM_CONDITIONAL([BUILD_BITCOIN_UTILS], [test x$build_bitcoin_utils = xyes]) AC_MSG_RESULT($build_bitcoin_utils) -dnl sets $bitcoin_enable_qt, $bitcoin_enable_qt_test, $bitcoin_enable_qt_dbus -BITCOIN_QT_CONFIGURE([$use_pkgconfig], [qt4]) +AC_MSG_CHECKING([whether to build libraries]) +AM_CONDITIONAL([BUILD_BITCOIN_LIBS], [test x$build_bitcoin_libs = xyes]) +if test x$build_bitcoin_libs = xyes; then + AC_DEFINE(HAVE_CONSENSUS_LIB, 1, [Define this symbol if the consensus lib has been built]) + AC_CONFIG_FILES([libbitcoinconsensus.pc:libbitcoinconsensus.pc.in]) +fi +AC_MSG_RESULT($build_bitcoin_libs) AC_LANG_POP @@ -720,7 +796,7 @@ if test x$bitcoin_enable_qt != xno; then dnl enable qr support AC_MSG_CHECKING([whether to build GUI with support for QR codes]) if test x$have_qrencode = xno; then - if test x$use_qr == xyes; then + if test x$use_qr = xyes; then AC_MSG_ERROR("QR support requested but cannot be built. use --without-qrencode") fi AC_MSG_RESULT(no) @@ -734,7 +810,7 @@ if test x$bitcoin_enable_qt != xno; then fi fi - if test x$XGETTEXT == x; then + if test x$XGETTEXT = x; then AC_MSG_WARN("xgettext is required to update qt translations") fi @@ -762,19 +838,19 @@ else AC_MSG_RESULT([no]) fi -if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests = xnononono; then - AC_MSG_ERROR([No targets! Please specify at least one of: --with-utils --with-daemon --with-gui or --enable-tests]) +if test x$build_bitcoin_utils$build_bitcoin_libs$build_bitcoind$bitcoin_enable_qt$use_tests = xnononono; then + AC_MSG_ERROR([No targets! Please specify at least one of: --with-utils --with-libs --with-daemon --with-gui or --enable-tests]) fi AM_CONDITIONAL([TARGET_DARWIN], [test x$TARGET_OS = xdarwin]) AM_CONDITIONAL([BUILD_DARWIN], [test x$BUILD_OS = xdarwin]) AM_CONDITIONAL([TARGET_WINDOWS], [test x$TARGET_OS = xwindows]) -AM_CONDITIONAL([ENABLE_WALLET],[test x$enable_wallet == xyes]) -AM_CONDITIONAL([ENABLE_TESTS],[test x$use_tests == xyes]) -AM_CONDITIONAL([ENABLE_QT],[test x$bitcoin_enable_qt == xyes]) +AM_CONDITIONAL([ENABLE_WALLET],[test x$enable_wallet = xyes]) +AM_CONDITIONAL([ENABLE_TESTS],[test x$use_tests = 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([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_REORG_TESTS],[test x$use_comparison_tool_reorg_test != xno]) AM_CONDITIONAL([GLIBC_BACK_COMPAT],[test x$use_glibc_compat = xyes]) @@ -793,9 +869,8 @@ AC_SUBST(CLIENT_VERSION_BUILD, _CLIENT_VERSION_BUILD) AC_SUBST(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE) AC_SUBST(COPYRIGHT_YEAR, _COPYRIGHT_YEAR) - AC_SUBST(RELDFLAGS) -AC_SUBST(LIBTOOL_LDFLAGS) +AC_SUBST(LIBTOOL_APP_LDFLAGS) AC_SUBST(USE_UPNP) AC_SUBST(USE_QRCODE) AC_SUBST(BOOST_LIBS) @@ -805,9 +880,37 @@ AC_SUBST(BUILD_TEST) AC_SUBST(BUILD_QT) AC_SUBST(BUILD_TEST_QT) AC_SUBST(MINIUPNPC_CPPFLAGS) +AC_SUBST(MINIUPNPC_LIBS) AC_CONFIG_FILES([Makefile src/Makefile share/setup.nsi share/qt/Info.plist src/test/buildenv.py]) AC_CONFIG_FILES([qa/pull-tester/run-bitcoind-for-test.sh],[chmod +x qa/pull-tester/run-bitcoind-for-test.sh]) -AC_CONFIG_FILES([qa/pull-tester/build-tests.sh],[chmod +x qa/pull-tester/build-tests.sh]) +AC_CONFIG_FILES([qa/pull-tester/tests-config.sh],[chmod +x qa/pull-tester/tests-config.sh]) + +dnl boost's m4 checks do something really nasty: they export these vars. As a +dnl result, they leak into secp256k1's configure and crazy things happen. +dnl Until this is fixed upstream and we've synced, we'll just un-export them. +CPPFLAGS_TEMP="$CPPFLAGS" +unset CPPFLAGS +CPPFLAGS="$CPPFLAGS_TEMP" + +LDFLAGS_TEMP="$LDFLAGS" +unset LDFLAGS +LDFLAGS="$LDFLAGS_TEMP" + +LIBS_TEMP="$LIBS" +unset LIBS +LIBS="$LIBS_TEMP" + +PKGCONFIG_PATH_TEMP="$PKG_CONFIG_PATH" +unset PKG_CONFIG_PATH +PKG_CONFIG_PATH="$PKGCONFIG_PATH_TEMP" + +PKGCONFIG_LIBDIR_TEMP="$PKG_CONFIG_LIBDIR" +unset PKG_CONFIG_LIBDIR +PKG_CONFIG_LIBDIR="$PKGCONFIG_LIBDIR_TEMP" + +ac_configure_args="${ac_configure_args} --disable-shared --with-pic" +AC_CONFIG_SUBDIRS([src/secp256k1]) + AC_OUTPUT dnl Taken from https://wiki.debian.org/RpathIssue @@ -820,3 +923,30 @@ case $host in chmod 755 libtool ;; esac + +echo +echo "Options used to compile and link:" +echo " with wallet = $enable_wallet" +echo " with gui / qt = $bitcoin_enable_qt" +if test x$bitcoin_enable_qt != xno; then + echo " with qr = $use_qr" +fi +echo " with zmq = $use_zmq" +echo " with test = $use_tests" +dnl echo " with bench = $use_bench" +echo " with upnp = $use_upnp" +echo " debug enabled = $enable_debug" +echo " werror = $enable_werror" +echo +echo " target os = $TARGET_OS" +echo " build os = $BUILD_OS" +echo +echo " CC = $CC" +echo " CFLAGS = $CFLAGS" +echo " CPPFLAGS = $CPPFLAGS" +echo " CXX = $CXX" +echo " CXXFLAGS = $CXXFLAGS" +echo " LDFLAGS = $LDFLAGS" +echo " ARFLAGS = $ARFLAGS" +echo + diff --git a/libbitcoinconsensus.pc b/libbitcoinconsensus.pc new file mode 100644 index 00000000..778cc445 --- /dev/null +++ b/libbitcoinconsensus.pc @@ -0,0 +1,12 @@ + +prefix=/usr/local +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +Name: Bitcoin Core consensus library +Description: Library for the Bitcoin consensus protocol. +Version: 1.0.3 +Libs: -L${libdir} -lbitcoinconsensus +Cflags: -I${includedir} +Requires.private: libcrypto diff --git a/libbitcoinconsensus.pc.in b/libbitcoinconsensus.pc.in new file mode 100644 index 00000000..e570d869 --- /dev/null +++ b/libbitcoinconsensus.pc.in @@ -0,0 +1,12 @@ + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: Bitcoin Core consensus library +Description: Library for the Bitcoin consensus protocol. +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lbitcoinconsensus +Cflags: -I${includedir} +Requires.private: libcrypto \ No newline at end of file diff --git a/libtool b/libtool index 729ff11a..0dee692c 100755 --- a/libtool +++ b/libtool @@ -41,15 +41,15 @@ available_tags='CXX ' macro_version=2.4.6 macro_revision=2.4.6 +# What type of objects to build. +pic_mode=yes + # Whether or not to build shared libraries. -build_libtool_libs=no +build_libtool_libs=yes # Whether or not to build static libraries. build_old_libs=yes -# What type of objects to build. -pic_mode=default - # Whether or not to optimize for fast installation. fast_install=needless diff --git a/qa/pull-tester/build-tests.sh b/qa/pull-tester/build-tests.sh new file mode 100755 index 00000000..c8eeddf9 --- /dev/null +++ b/qa/pull-tester/build-tests.sh @@ -0,0 +1,76 @@ +#!/bin/bash +# Param1: The prefix to mingw staging +# Param2: Path to java comparison tool +# Param3: Number of make jobs. Defaults to 1. + +# Exit immediately if anything fails: +set -e +set -o xtrace + +MINGWPREFIX=$1 +JAVA_COMPARISON_TOOL=$2 +RUN_LARGE_REORGS=$3 +JOBS=${4-1} +OUT_DIR=${5-} + +if [ $# -lt 2 ]; then + echo "Usage: $0 [mingw-prefix] [java-comparison-tool] " + exit 1 +fi + +DISTDIR=bitcoin-1.0.3 + +# Cross-compile for windows first (breaking the mingw/windows build is most common) +cd /Users/buddilla/Documents/GitHub/DigitalNoteXDN/DigitalNote-2 +make distdir +mv $DISTDIR win32-build +cd win32-build +./configure --disable-silent-rules --disable-ccache --prefix=$MINGWPREFIX --host=i586-mingw32msvc --with-qt-bindir=$MINGWPREFIX/host/bin --with-qt-plugindir=$MINGWPREFIX/plugins --with-qt-incdir=$MINGWPREFIX/include --with-boost=$MINGWPREFIX --with-protoc-bindir=$MINGWPREFIX/host/bin CPPFLAGS=-I$MINGWPREFIX/include LDFLAGS=-L$MINGWPREFIX/lib +make -j$JOBS + +# And compile for Linux: +cd /Users/buddilla/Documents/GitHub/DigitalNoteXDN/DigitalNote-2 +make distdir +mv $DISTDIR linux-build +cd linux-build +if [ $RUN_LARGE_REORGS = 1 ]; then + ./configure --disable-silent-rules --disable-ccache --with-comparison-tool="$JAVA_COMPARISON_TOOL" --enable-comparison-tool-reorg-tests +else + ./configure --disable-silent-rules --disable-ccache --with-comparison-tool="$JAVA_COMPARISON_TOOL" +fi +make -j$JOBS + +# link interesting binaries to parent out/ directory, if it exists. Do this before +# running unit tests (we want bad binaries to be easy to find) +if [ -d "$OUT_DIR" -a -w "$OUT_DIR" ]; then + set +e + # Windows: + cp /Users/buddilla/Documents/GitHub/DigitalNoteXDN/DigitalNote-2/win32-build/src/bitcoind.exe $OUT_DIR/bitcoind.exe + cp /Users/buddilla/Documents/GitHub/DigitalNoteXDN/DigitalNote-2/win32-build/src/test/test_bitcoin.exe $OUT_DIR/test_bitcoin.exe + cp /Users/buddilla/Documents/GitHub/DigitalNoteXDN/DigitalNote-2/win32-build/src/qt/bitcoind-qt.exe $OUT_DIR/bitcoin-qt.exe + # Linux: + cp /Users/buddilla/Documents/GitHub/DigitalNoteXDN/DigitalNote-2/linux-build/src/bitcoind $OUT_DIR/bitcoind + cp /Users/buddilla/Documents/GitHub/DigitalNoteXDN/DigitalNote-2/linux-build/src/test/test_bitcoin $OUT_DIR/test_bitcoin + cp /Users/buddilla/Documents/GitHub/DigitalNoteXDN/DigitalNote-2/linux-build/src/qt/bitcoind-qt $OUT_DIR/bitcoin-qt + set -e +fi + +# Run unit tests and blockchain-tester on Linux: +cd /Users/buddilla/Documents/GitHub/DigitalNoteXDN/DigitalNote-2/linux-build +make check + +# Clean up builds (pull-tester machine doesn't have infinite disk space) +cd /Users/buddilla/Documents/GitHub/DigitalNoteXDN/DigitalNote-2/linux-build +make clean +cd /Users/buddilla/Documents/GitHub/DigitalNoteXDN/DigitalNote-2/win32-build +make clean + +# TODO: Fix code coverage builds on pull-tester machine +# # Test code coverage +# cd /Users/buddilla/Documents/GitHub/DigitalNoteXDN/DigitalNote-2 +# make distdir +# mv $DISTDIR linux-coverage-build +# cd linux-coverage-build +# ./configure --enable-lcov --disable-silent-rules --disable-ccache --with-comparison-tool="$JAVA_COMPARISON_TOOL" +# make -j$JOBS +# make cov diff --git a/qa/pull-tester/rpc-tests.sh b/qa/pull-tester/rpc-tests.sh new file mode 100644 index 00000000..32df7351 --- /dev/null +++ b/qa/pull-tester/rpc-tests.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -e + +CURDIR=$(cd $(dirname "$0"); pwd) +# Get BUILDDIR and REAL_BITCOIND +. "${CURDIR}/tests-config.sh" + +export BITCOINCLI=${BUILDDIR}/qa/pull-tester/run-bitcoin-cli +export BITCOIND=${REAL_BITCOIND} + +#Run the tests + +if [ "x${ENABLE_BITCOIND}${ENABLE_UTILS}${ENABLE_WALLET}" = "x111" ]; then + ${BUILDDIR}/qa/rpc-tests/wallet.sh "${BUILDDIR}/src" + ${BUILDDIR}/qa/rpc-tests/listtransactions.py --srcdir "${BUILDDIR}/src" + ${BUILDDIR}/qa/rpc-tests/forknotify.py --srcdir "${BUILDDIR}/src" +else + echo "No rpc tests to run. Wallet, utils, and bitcoind must all be enabled" +fi \ No newline at end of file diff --git a/qa/pull-tester/run-bitcoin-cli b/qa/pull-tester/run-bitcoin-cli new file mode 100644 index 00000000..108497d0 --- /dev/null +++ b/qa/pull-tester/run-bitcoin-cli @@ -0,0 +1,13 @@ +#!/bin/bash + +# This is a thin wrapper around bitcoin-cli that strips the Windows-style EOLs +# from the output if present. It is necessary when using bitcoin-cli.exe on +# Linux since shells will interpret the line-endings as part of the result. + +CURDIR=$(cd $(dirname "$0"); pwd) +# Get BUILDDIR and REAL_BITCOIND + +# Grab the value of $REAL_BITCOINCLI which may be bitcoin-cli.exe. +. "${CURDIR}/tests-config.sh" + +"${REAL_BITCOINCLI}" "$@" | sed 's/\r//' \ No newline at end of file diff --git a/qa/pull-tester/tests-config.sh.in b/qa/pull-tester/tests-config.sh.in new file mode 100755 index 00000000..fbf477b9 --- /dev/null +++ b/qa/pull-tester/tests-config.sh.in @@ -0,0 +1,15 @@ +#!/bin/bash +# Copyright (c) 2013-2014 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +BUILDDIR="@abs_top_builddir@" +EXEEXT="@EXEEXT@" + +# These will turn into comments if they were disabled when configuring. +@ENABLE_WALLET_TRUE@ENABLE_WALLET=1 +@BUILD_BITCOIN_UTILS_TRUE@ENABLE_UTILS=1 +@BUILD_BITCOIND_TRUE@ENABLE_BITCOIND=1 + +REAL_BITCOIND="$BUILDDIR/src/bitcoind${EXEEXT}" +REAL_BITCOINCLI="$BUILDDIR/src/bitcoin-cli${EXEEXT}" \ No newline at end of file diff --git a/src/MakeFile.am b/src/MakeFile.am index 8c5a7e2e..ea4fbf03 100644 --- a/src/MakeFile.am +++ b/src/MakeFile.am @@ -1,9 +1,5 @@ AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS) -if USE_LIBSECP256K1 -secp256k1/libsecp256k1.la: $(wildcard secp256k1/src/*) $(wildcard secp256k1/include/*) - @$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F) -endif if EMBEDDED_LEVELDB LEVELDB_CPPFLAGS += -I$(srcdir)/leveldb/include @@ -23,9 +19,7 @@ endif BITCOIN_CONFIG_INCLUDES=-I$(builddir)/config BITCOIN_INCLUDES=-I$(builddir) -I$(builddir)/obj $(BOOST_CPPFLAGS) $(LEVELDB_CPPFLAGS) $(CRYPTO_CFLAGS) $(SSL_CFLAGS) -if USE_LIBSECP256K1 BITCOIN_INCLUDES += -I$(srcdir)/secp256k1/include -endif LIBBITCOIN_SERVER=libbitcoin_server.a LIBBITCOIN_WALLET=libbitcoin_wallet.a @@ -33,21 +27,34 @@ LIBBITCOIN_COMMON=libbitcoin_common.a LIBBITCOIN_CLI=libbitcoin_cli.a LIBBITCOIN_UTIL=libbitcoin_util.a LIBBITCOIN_CRYPTO=crypto/libbitcoin_crypto.a -LIBBITCOIN_UNIVALUE=univalue/libbitcoin_univalue.a +#LIBBITCOIN_UNIVALUE=univalue/libbitcoin_univalue.a LIBBITCOINQT=qt/libbitcoinqt.a +LIBSECP256K1=secp256k1/libsecp256k1.la +$(LIBSECP256K1): $(wildcard secp256k1/src/*) $(wildcard secp256k1/include/*) + @$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F) + +# Make is not made aware of per-object dependencies to avoid limiting building parallelization +# But to build the less dependent modules first, we manually select their order here: noinst_LIBRARIES = \ - libbitcoin_server.a \ - libbitcoin_common.a \ - libbitcoin_cli.a \ + crypto/libbitcoin_crypto.a \ libbitcoin_util.a \ - univalue/libbitcoin_univalue.a \ - crypto/libbitcoin_crypto.a + libbitcoin_common.a \ + #univalue/libbitcoin_univalue.a \ + libbitcoin_server.a \ + libbitcoin_cli.a if ENABLE_WALLET BITCOIN_INCLUDES += $(BDB_CPPFLAGS) noinst_LIBRARIES += libbitcoin_wallet.a endif +if BUILD_BITCOIN_LIBS +lib_LTLIBRARIES = libbitcoinconsensus.la +LIBBITCOIN_CONSENSUS=libbitcoinconsensus.la +else +LIBBITCOIN_CONSENSUS= +endif + bin_PROGRAMS = TESTS = @@ -65,8 +72,9 @@ BITCOIN_CORE_H = \ addrman.h \ alert.h \ allocators.h \ + #amount.h \ base58.h \ - bloom.h \ + chain.h \ chainparams.h \ chainparamsbase.h \ chainparamsseeds.h \ @@ -76,15 +84,19 @@ BITCOIN_CORE_H = \ coincontrol.h \ coins.h \ compat.h \ - core.h \ + compressor.h \ + core/block.h \ + core/transaction.h \ core_io.h \ crypter.h \ db.h \ + eccryptoverify.h \ + ecwrapper.h \ hash.h \ init.h \ key.h \ keystore.h \ - leveldbwrapper.h \ + #leveldbwrapper.h \ limitedmap.h \ main.h \ miner.h \ @@ -94,12 +106,19 @@ BITCOIN_CORE_H = \ noui.h \ pow.h \ protocol.h \ + pubkey.h \ random.h \ rpcclient.h \ rpcprotocol.h \ rpcserver.h \ + script/interpreter.h \ script.h \ + script/sigcache.h \ + script/sign.h \ + script/standard.h \ + script/script_error.h \ serialize.h \ + streams.h \ sync.h \ threadsafety.h \ timedata.h \ @@ -108,11 +127,16 @@ BITCOIN_CORE_H = \ txmempool.h \ ui_interface.h \ uint256.h \ + undo.h \ util.h \ + utilstrencodings.h \ + utilmoneystr.h \ + utiltime.h \ version.h \ - walletdb.h \ wallet.h \ - compat/sanity.h + wallet_ismine.h \ + walletdb.h \ + #compat/sanity.h JSON_H = \ json/json_spirit.h \ @@ -129,28 +153,30 @@ obj/build.h: FORCE @$(MKDIR_P) $(builddir)/obj @$(top_srcdir)/share/genbuild.sh $(abs_top_builddir)/src/obj/build.h \ $(abs_top_srcdir) -libbitcoin_util_a-version.$(OBJEXT): obj/build.h +libbitcoin_util_a-clientversion.$(OBJEXT): obj/build.h # server: shared between bitcoind and bitcoin-qt libbitcoin_server_a_CPPFLAGS = $(BITCOIN_INCLUDES) $(MINIUPNPC_CPPFLAGS) libbitcoin_server_a_SOURCES = \ addrman.cpp \ alert.cpp \ - bloom.cpp \ + chain.cpp \ checkpoints.cpp \ init.cpp \ - leveldbwrapper.cpp \ + #leveldbwrapper.cpp \ main.cpp \ miner.cpp \ net.cpp \ noui.cpp \ pow.cpp \ + rest.cpp \ rpcblockchain.cpp \ rpcmining.cpp \ rpcmisc.cpp \ rpcnet.cpp \ rpcrawtransaction.cpp \ rpcserver.cpp \ + script/sigcache.cpp \ timedata.cpp \ txdb.cpp \ txmempool.cpp \ @@ -166,6 +192,7 @@ libbitcoin_wallet_a_SOURCES = \ rpcdump.cpp \ rpcwallet.cpp \ wallet.cpp \ + wallet_ismine.cpp \ walletdb.cpp \ $(BITCOIN_CORE_H) @@ -181,28 +208,39 @@ crypto_libbitcoin_crypto_a_SOURCES = \ crypto/ripemd160.h # univalue JSON library -univalue_libbitcoin_univalue_a_SOURCES = \ - univalue/univalue.cpp \ - univalue/univalue_read.cpp \ - univalue/univalue_write.cpp \ - univalue/univalue.h +#univalue_libbitcoin_univalue_a_SOURCES = \ +# univalue/univalue.cpp \ +# univalue/univalue_read.cpp \ +# univalue/univalue_write.cpp \ +# univalue/univalue_escapes.h \ +# univalue/univalue.h # common: shared between bitcoind, and bitcoin-qt and non-server tools libbitcoin_common_a_CPPFLAGS = $(BITCOIN_INCLUDES) libbitcoin_common_a_SOURCES = \ allocators.cpp \ + #amount.cpp \ base58.cpp \ chainparams.cpp \ coins.cpp \ - core.cpp \ + compressor.cpp \ + core/block.cpp \ + core/transaction.cpp \ core_read.cpp \ core_write.cpp \ + eccryptoverify.cpp \ + ecwrapper.cpp \ hash.cpp \ key.cpp \ keystore.cpp \ netbase.cpp \ protocol.cpp \ - script.cpp \ + pubkey.cpp \ + script/interpreter.cpp \ + script/script.cpp \ + script/sign.cpp \ + script/standard.cpp \ + script/script_error.cpp \ $(BITCOIN_CORE_H) # util: shared between all executables. @@ -213,12 +251,15 @@ libbitcoin_util_a_SOURCES = \ compat/glibc_sanity.cpp \ compat/glibcxx_sanity.cpp \ chainparamsbase.cpp \ + clientversion.cpp \ random.cpp \ rpcprotocol.cpp \ sync.cpp \ uint256.cpp \ util.cpp \ - version.cpp \ + utilstrencodings.cpp \ + utilmoneystr.cpp \ + utiltime.cpp \ $(BITCOIN_CORE_H) if GLIBC_BACK_COMPAT @@ -227,6 +268,7 @@ libbitcoin_util_a_SOURCES += compat/glibcxx_compat.cpp endif # cli: shared between bitcoin-cli and bitcoin-qt +libbitcoin_cli_a_CPPFLAGS = $(BITCOIN_INCLUDES) libbitcoin_cli_a_SOURCES = \ rpcclient.cpp \ $(BITCOIN_CORE_H) @@ -242,11 +284,8 @@ bitcoind_LDADD = \ $(LIBBITCOIN_UTIL) \ $(LIBBITCOIN_CRYPTO) \ $(LIBLEVELDB) \ - $(LIBMEMENV) - -if USE_LIBSECP256K1 - bitcoind_LDADD += secp256k1/libsecp256k1.la -endif + $(LIBMEMENV) \ + $(LIBSECP256K1) if ENABLE_WALLET bitcoind_LDADD += libbitcoin_wallet.a @@ -258,16 +297,14 @@ if TARGET_WINDOWS bitcoind_SOURCES += bitcoind-res.rc endif -bitcoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) +bitcoind_LDADD += $(BOOST_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) bitcoind_CPPFLAGS = $(BITCOIN_INCLUDES) -bitcoind_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) +bitcoind_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) # bitcoin-cli binary # bitcoin_cli_LDADD = \ $(LIBBITCOIN_CLI) \ - $(LIBBITCOIN_COMMON) \ $(LIBBITCOIN_UTIL) \ - $(LIBBITCOIN_CRYPTO) \ $(BOOST_LIBS) \ $(SSL_LIBS) \ $(CRYPTO_LIBS) @@ -275,9 +312,6 @@ bitcoin_cli_LDADD = \ bitcoin_cli_SOURCES = \ bitcoin-cli.cpp -if USE_LIBSECP256K1 - bitcoin_cli_LDADD += secp256k1/libsecp256k1.la -endif bitcoin_cli_CPPFLAGS = $(BITCOIN_INCLUDES) # @@ -286,23 +320,20 @@ bitcoin_tx_LDADD = \ $(LIBBITCOIN_UNIVALUE) \ $(LIBBITCOIN_COMMON) \ $(LIBBITCOIN_UTIL) \ - $(LIBBITCOIN_CRYPTO) - -if USE_LIBSECP256K1 - bitcoin_tx_LDADD += secp256k1/libsecp256k1.la -endif - - bitcoin_tx_LDADD += $(BOOST_LIBS) \ - $(SSL_LIBS) \ + $(LIBBITCOIN_CRYPTO) \ + $(LIBSECP256K1) \ + $(BOOST_LIBS) \ $(CRYPTO_LIBS) + bitcoin_tx_SOURCES = bitcoin-tx.cpp bitcoin_tx_CPPFLAGS = $(BITCOIN_INCLUDES) # -bitcoin_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) +bitcoin_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) if TARGET_WINDOWS bitcoin_cli_SOURCES += bitcoin-cli-res.rc endif +bitcoin_cli_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) CLEANFILES = leveldb/libleveldb.a leveldb/libmemenv.a *.gcda *.gcno @@ -318,7 +349,7 @@ clean-local: .rc.o: @test -f $(WINDRES) - $(AM_V_GEN) $(WINDRES) -i $< -o $@ + $(AM_V_GEN) $(WINDRES) -DWINDRES_PREPROC -i $< -o $@ .mm.o: $(AM_V_CXX) $(OBJCXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ @@ -338,4 +369,4 @@ endif if ENABLE_QT_TESTS include Makefile.qttest.include -endif \ No newline at end of file +endif diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index f366f8b1..a27d7264 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -110,7 +110,6 @@ QT_MOC_CPP = \ qt/moc_intro.cpp \ qt/moc_macdockiconhandler.cpp \ qt/moc_macnotificationhandler.cpp \ - qt/moc_monitoreddatamapper.cpp \ qt/moc_notificator.cpp \ qt/moc_openuridialog.cpp \ qt/moc_optionsdialog.cpp \ @@ -177,7 +176,7 @@ BITCOIN_QT_H = \ qt/intro.h \ qt/macdockiconhandler.h \ qt/macnotificationhandler.h \ - qt/monitoreddatamapper.h \ + qt/networkstyle.h \ qt/notificator.h \ qt/openuridialog.h \ qt/optionsdialog.h \ @@ -233,6 +232,9 @@ RES_ICONS = \ qt/res/icons/editcopy.png \ qt/res/icons/editpaste.png \ qt/res/icons/export.png \ + qt/res/icons/eye.png \ + qt/res/icons/eye_minus.png \ + qt/res/icons/eye_plus.png \ qt/res/icons/filesave.png \ qt/res/icons/history.png \ qt/res/icons/key.png \ @@ -265,7 +267,7 @@ BITCOIN_QT_CPP = \ qt/csvmodelwriter.cpp \ qt/guiutil.cpp \ qt/intro.cpp \ - qt/monitoreddatamapper.cpp \ + qt/networkstyle.cpp \ qt/notificator.cpp \ qt/optionsdialog.cpp \ qt/optionsmodel.cpp \ @@ -358,11 +360,9 @@ if ENABLE_WALLET qt_bitcoin_qt_LDADD += $(LIBBITCOIN_WALLET) endif qt_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBBITCOIN_UNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \ - $(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) -if USE_LIBSECP256K1 - qt_bitcoin_qt_LDADD += secp256k1/libsecp256k1.la -endif -qt_bitcoin_qt_LDFLAGS = $(AM_LDFLAGS) $(QT_LDFLAGS) + $(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBSECP256K1) +qt_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) +qt_bitcoin_qt_LIBTOOLFLAGS = --tag CXX #locale/foo.ts -> locale/foo.qm QT_QM=$(QT_TS:.ts=.qm) diff --git a/src/Makefile.qttest.include b/src/Makefile.qttest.include index 777cc23b..05927f96 100644 --- a/src/Makefile.qttest.include +++ b/src/Makefile.qttest.include @@ -13,7 +13,7 @@ TEST_QT_H = \ qt/test/paymentservertests.h qt_test_test_bitcoin_qt_CPPFLAGS = $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \ - $(QT_INCLUDES) $(QT_TEST_INCLUDES) + $(QT_INCLUDES) $(QT_TEST_INCLUDES) $(PROTOBUF_CFLAGS) qt_test_test_bitcoin_qt_SOURCES = \ qt/test/test_main.cpp \ @@ -32,11 +32,8 @@ qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_WALLET) endif qt_test_test_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBBITCOIN_UNIVALUE) $(LIBLEVELDB) \ $(LIBMEMENV) $(BOOST_LIBS) $(QT_DBUS_LIBS) $(QT_TEST_LIBS) $(QT_LIBS) \ - $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) -if USE_LIBSECP256K1 - qt_test_test_bitcoin_qt_LDADD += secp256k1/libsecp256k1.la -endif -qt_test_test_bitcoin_qt_LDFLAGS = $(AM_LDFLAGS) $(QT_LDFLAGS) + $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBSECP256K1) +qt_test_test_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) CLEAN_BITCOIN_QT_TEST = $(TEST_QT_MOC_CPP) qt/test/*.gcda qt/test/*.gcno diff --git a/src/Makefile.test.include b/src/Makefile.test.include index d87cd2d3..0a1a2394 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -1,8 +1,21 @@ -TESTS += test/test_bitcoin +TESTS += test/test_bitcoin test/bitcoin-util-test.py bin_PROGRAMS += test/test_bitcoin TEST_SRCDIR = test TEST_BINARY=test/test_bitcoin$(EXEEXT) + +EXTRA_DIST += \ + test/bctest.py \ + test/bitcoin-util-test.py \ + test/data/bitcoin-util-test.json \ + test/data/blanktx.hex \ + test/data/tt-delin1-out.hex \ + test/data/tt-delout1-out.hex \ + test/data/tt-locktime317000-out.hex \ + test/data/tx394b54bb.hex \ + test/data/txcreate1.hex \ + test/data/txcreate2.hex + JSON_TEST_FILES = \ test/data/script_valid.json \ test/data/base58_keys_valid.json \ @@ -27,9 +40,9 @@ BITCOIN_TESTS =\ test/base58_tests.cpp \ test/base64_tests.cpp \ test/bloom_tests.cpp \ - test/canonical_tests.cpp \ test/checkblock_tests.cpp \ test/Checkpoints_tests.cpp \ + test/coins_tests.cpp \ test/compress_tests.cpp \ test/crypto_tests.cpp \ test/DoS_tests.cpp \ @@ -45,15 +58,17 @@ BITCOIN_TESTS =\ test/rpc_tests.cpp \ test/script_P2SH_tests.cpp \ test/script_tests.cpp \ + test/scriptnum_tests.cpp \ test/serialize_tests.cpp \ + test/sighash_tests.cpp \ test/sigopcount_tests.cpp \ test/skiplist_tests.cpp \ test/test_bitcoin.cpp \ + test/timedata_tests.cpp \ test/transaction_tests.cpp \ test/uint256_tests.cpp \ - test/util_tests.cpp \ - test/scriptnum_tests.cpp \ - test/sighash_tests.cpp + test/univalue_tests.cpp \ + test/util_tests.cpp if ENABLE_WALLET BITCOIN_TESTS += \ @@ -65,16 +80,13 @@ endif test_test_bitcoin_SOURCES = $(BITCOIN_TESTS) $(JSON_TEST_FILES) $(RAW_TEST_FILES) test_test_bitcoin_CPPFLAGS = $(BITCOIN_INCLUDES) -I$(builddir)/test/ $(TESTDEFS) test_test_bitcoin_LDADD = $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBBITCOIN_UNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \ - $(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) + $(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) $(LIBSECP256K1) if ENABLE_WALLET test_test_bitcoin_LDADD += $(LIBBITCOIN_WALLET) endif -if USE_LIBSECP256K1 - test_test_bitcoin_LDADD += secp256k1/libsecp256k1.la -endif - -test_test_bitcoin_LDADD += $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) +test_test_bitcoin_LDADD += $(LIBBITCOIN_CONSENSUS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) +test_test_bitcoin_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) nodist_test_test_bitcoin_SOURCES = $(GENERATED_TEST_FILES) diff --git a/src/bloom.cpp b/src/bloom.cpp new file mode 100755 index 00000000..a7196f03 --- /dev/null +++ b/src/bloom.cpp @@ -0,0 +1,188 @@ +// Copyright (c) 2012-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "bloom.h" + +#include "hash.h" +#include "primitives/transaction.h" +#include "script/script.h" +#include "script/standard.h" +#include "streams.h" + +#include +#include + +#define LN2SQUARED 0.4804530139182014246671025263266649717305529515945455 +#define LN2 0.6931471805599453094172321214581765680755001343602552 + +using namespace std; + +CBloomFilter::CBloomFilter(unsigned int nElements, double nFPRate, unsigned int nTweakIn, unsigned char nFlagsIn) : + /** + * The ideal size for a bloom filter with a given number of elements and false positive rate is: + * - nElements * log(fp rate) / ln(2)^2 + * We ignore filter parameters which will create a bloom filter larger than the protocol limits + */ + vData(min((unsigned int)(-1 / LN2SQUARED * nElements * log(nFPRate)), MAX_BLOOM_FILTER_SIZE * 8) / 8), + /** + * The ideal number of hash functions is filter size * ln(2) / number of elements + * Again, we ignore filter parameters which will create a bloom filter with more hash functions than the protocol limits + * See https://en.wikipedia.org/wiki/Bloom_filter for an explanation of these formulas + */ + isFull(false), + isEmpty(false), + nHashFuncs(min((unsigned int)(vData.size() * 8 / nElements * LN2), MAX_HASH_FUNCS)), + nTweak(nTweakIn), + nFlags(nFlagsIn) +{ +} + +inline unsigned int CBloomFilter::Hash(unsigned int nHashNum, const std::vector& vDataToHash) const +{ + // 0xFBA4C795 chosen as it guarantees a reasonable bit difference between nHashNum values. + return MurmurHash3(nHashNum * 0xFBA4C795 + nTweak, vDataToHash) % (vData.size() * 8); +} + +void CBloomFilter::insert(const vector& vKey) +{ + if (isFull) + return; + for (unsigned int i = 0; i < nHashFuncs; i++) { + unsigned int nIndex = Hash(i, vKey); + // Sets bit nIndex of vData + vData[nIndex >> 3] |= (1 << (7 & nIndex)); + } + isEmpty = false; +} + +void CBloomFilter::insert(const COutPoint& outpoint) +{ + CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); + stream << outpoint; + vector data(stream.begin(), stream.end()); + insert(data); +} + +void CBloomFilter::insert(const uint256& hash) +{ + vector data(hash.begin(), hash.end()); + insert(data); +} + +bool CBloomFilter::contains(const vector& vKey) const +{ + if (isFull) + return true; + if (isEmpty) + return false; + for (unsigned int i = 0; i < nHashFuncs; i++) { + unsigned int nIndex = Hash(i, vKey); + // Checks bit nIndex of vData + if (!(vData[nIndex >> 3] & (1 << (7 & nIndex)))) + return false; + } + return true; +} + +bool CBloomFilter::contains(const COutPoint& outpoint) const +{ + CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); + stream << outpoint; + vector data(stream.begin(), stream.end()); + return contains(data); +} + +bool CBloomFilter::contains(const uint256& hash) const +{ + vector data(hash.begin(), hash.end()); + return contains(data); +} + +void CBloomFilter::clear() +{ + vData.assign(vData.size(), 0); + isFull = false; + isEmpty = true; +} + +bool CBloomFilter::IsWithinSizeConstraints() const +{ + return vData.size() <= MAX_BLOOM_FILTER_SIZE && nHashFuncs <= MAX_HASH_FUNCS; +} + +bool CBloomFilter::IsRelevantAndUpdate(const CTransaction& tx) +{ + bool fFound = false; + // Match if the filter contains the hash of tx + // for finding tx when they appear in a block + if (isFull) + return true; + if (isEmpty) + return false; + const uint256& hash = tx.GetHash(); + if (contains(hash)) + fFound = true; + + for (unsigned int i = 0; i < tx.vout.size(); i++) { + const CTxOut& txout = tx.vout[i]; + // Match if the filter contains any arbitrary script data element in any scriptPubKey in tx + // If this matches, also add the specific output that was matched. + // This means clients don't have to update the filter themselves when a new relevant tx + // is discovered in order to find spending transactions, which avoids round-tripping and race conditions. + CScript::const_iterator pc = txout.scriptPubKey.begin(); + vector data; + while (pc < txout.scriptPubKey.end()) { + opcodetype opcode; + if (!txout.scriptPubKey.GetOp(pc, opcode, data)) + break; + if (data.size() != 0 && contains(data)) { + fFound = true; + if ((nFlags & BLOOM_UPDATE_MASK) == BLOOM_UPDATE_ALL) + insert(COutPoint(hash, i)); + else if ((nFlags & BLOOM_UPDATE_MASK) == BLOOM_UPDATE_P2PUBKEY_ONLY) { + txnouttype type; + vector > vSolutions; + if (Solver(txout.scriptPubKey, type, vSolutions) && + (type == TX_PUBKEY || type == TX_MULTISIG)) + insert(COutPoint(hash, i)); + } + break; + } + } + } + + if (fFound) + return true; + + for (const CTxIn& txin : tx.vin) { + // Match if the filter contains an outpoint tx spends + if (contains(txin.prevout)) + return true; + + // Match if the filter contains any arbitrary script data element in any scriptSig in tx + CScript::const_iterator pc = txin.scriptSig.begin(); + vector data; + while (pc < txin.scriptSig.end()) { + opcodetype opcode; + if (!txin.scriptSig.GetOp(pc, opcode, data)) + break; + if (data.size() != 0 && contains(data)) + return true; + } + } + + return false; +} + +void CBloomFilter::UpdateEmptyFull() +{ + bool full = true; + bool empty = true; + for (unsigned int i = 0; i < vData.size(); i++) { + full &= vData[i] == 0xff; + empty &= vData[i] == 0; + } + isFull = full; + isEmpty = empty; +} diff --git a/src/bloom.h b/src/bloom.h new file mode 100755 index 00000000..8ef2bccf --- /dev/null +++ b/src/bloom.h @@ -0,0 +1,100 @@ +// Copyright (c) 2012-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_BLOOM_H +#define BITCOIN_BLOOM_H + +#include "serialize.h" + +#include + +class COutPoint; +class CTransaction; +class uint256; + +//! 20,000 items with fp rate < 0.1% or 10,000 items and <0.0001% +static const unsigned int MAX_BLOOM_FILTER_SIZE = 36000; // bytes +static const unsigned int MAX_HASH_FUNCS = 50; + +/** + * First two bits of nFlags control how much IsRelevantAndUpdate actually updates + * The remaining bits are reserved + */ +enum bloomflags +{ + BLOOM_UPDATE_NONE = 0, + BLOOM_UPDATE_ALL = 1, + // Only adds outpoints to the filter if the output is a pay-to-pubkey/pay-to-multisig script + BLOOM_UPDATE_P2PUBKEY_ONLY = 2, + BLOOM_UPDATE_MASK = 3, +}; + +/** + * BloomFilter is a probabilistic filter which SPV clients provide + * so that we can filter the transactions we sends them. + * + * This allows for significantly more efficient transaction and block downloads. + * + * Because bloom filters are probabilistic, an SPV node can increase the false- + * positive rate, making us send them transactions which aren't actually theirs, + * allowing clients to trade more bandwidth for more privacy by obfuscating which + * keys are owned by them. + */ +class CBloomFilter +{ +private: + std::vector vData; + bool isFull; + bool isEmpty; + unsigned int nHashFuncs; + unsigned int nTweak; + unsigned char nFlags; + + unsigned int Hash(unsigned int nHashNum, const std::vector& vDataToHash) const; + +public: + /** + * Creates a new bloom filter which will provide the given fp rate when filled with the given number of elements + * Note that if the given parameters will result in a filter outside the bounds of the protocol limits, + * the filter created will be as close to the given parameters as possible within the protocol limits. + * This will apply if nFPRate is very low or nElements is unreasonably high. + * nTweak is a constant which is added to the seed value passed to the hash function + * It should generally always be a random value (and is largely only exposed for unit testing) + * nFlags should be one of the BLOOM_UPDATE_* enums (not _MASK) + */ + CBloomFilter(unsigned int nElements, double nFPRate, unsigned int nTweak, unsigned char nFlagsIn); + CBloomFilter() : isFull(true), isEmpty(false), nHashFuncs(0), nTweak(0), nFlags(0) {} + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { + READWRITE(vData); + READWRITE(nHashFuncs); + READWRITE(nTweak); + READWRITE(nFlags); + } + + void insert(const std::vector& vKey); + void insert(const COutPoint& outpoint); + void insert(const uint256& hash); + + bool contains(const std::vector& vKey) const; + bool contains(const COutPoint& outpoint) const; + bool contains(const uint256& hash) const; + + void clear(); + + //! True if the size is <= MAX_BLOOM_FILTER_SIZE and the number of hash functions is <= MAX_HASH_FUNCS + //! (catch a filter which was just deserialized which was too big) + bool IsWithinSizeConstraints() const; + + //! Also adds any outputs which match the filter to the filter (to match their spending txes) + bool IsRelevantAndUpdate(const CTransaction& tx); + + //! Checks for empty and full filters to avoid wasting cpu + void UpdateEmptyFull(); +}; + +#endif // BITCOIN_BLOOM_H \ No newline at end of file diff --git a/src/config/bitcoin-config.h b/src/config/bitcoin-config.h index 9e5dd13b..8715e994 100644 --- a/src/config/bitcoin-config.h +++ b/src/config/bitcoin-config.h @@ -53,6 +53,9 @@ /* define if the Boost::Unit_Test_Framework library is available */ /* #undef HAVE_BOOST_UNIT_TEST_FRAMEWORK */ +/* Define this symbol if the consensus lib has been built */ +#define HAVE_CONSENSUS_LIB 1 + /* Define to 1 if you have the declaration of `be32toh', and to 0 if you don't. */ #define HAVE_DECL_BE32TOH 0 @@ -95,6 +98,15 @@ /* Define to 1 if you have the header file. */ /* #undef HAVE_ENDIAN_H */ +/* Define to 1 if the system has the `dllexport' function attribute */ +/* #undef HAVE_FUNC_ATTRIBUTE_DLLEXPORT */ + +/* Define to 1 if the system has the `dllimport' function attribute */ +/* #undef HAVE_FUNC_ATTRIBUTE_DLLIMPORT */ + +/* Define to 1 if the system has the `visibility' function attribute */ +/* #undef HAVE_FUNC_ATTRIBUTE_VISIBILITY */ + /* Define this symbol if you have getaddrinfo_a */ /* #undef HAVE_GETADDRINFO_A */ @@ -134,9 +146,6 @@ /* Define to 1 if you have the `mingwthrd' library (-lmingwthrd). */ /* #undef HAVE_LIBMINGWTHRD */ -/* Define to 1 if you have the `miniupnpc' library (-lminiupnpc). */ -#define HAVE_LIBMINIUPNPC 1 - /* Define to 1 if you have the `mswsock' library (-lmswsock). */ /* #undef HAVE_LIBMSWSOCK */ @@ -152,12 +161,6 @@ /* Define to 1 if you have the `png ' library (-lpng ). */ /* #undef HAVE_LIBPNG_ */ -/* Define to 1 if you have the `protobuf ' library (-lprotobuf ). */ -/* #undef HAVE_LIBPROTOBUF_ */ - -/* Define to 1 if you have the `qrencode' library (-lqrencode). */ -/* #undef HAVE_LIBQRENCODE */ - /* Define to 1 if you have the `rpcrt4' library (-lrpcrt4). */ /* #undef HAVE_LIBRPCRT4 */ @@ -167,6 +170,9 @@ /* Define to 1 if you have the `shlwapi' library (-lshlwapi). */ /* #undef HAVE_LIBSHLWAPI */ +/* Define to 1 if you have the `ssp' library (-lssp). */ +/* #undef HAVE_LIBSSP */ + /* Define to 1 if you have the `user32' library (-luser32). */ /* #undef HAVE_LIBUSER32 */ diff --git a/src/config/bitcoin-config.h.in b/src/config/bitcoin-config.h.in index 6db9bd7d..9f66d3b7 100644 --- a/src/config/bitcoin-config.h.in +++ b/src/config/bitcoin-config.h.in @@ -52,6 +52,9 @@ /* define if the Boost::Unit_Test_Framework library is available */ #undef HAVE_BOOST_UNIT_TEST_FRAMEWORK +/* Define this symbol if the consensus lib has been built */ +#undef HAVE_CONSENSUS_LIB + /* Define to 1 if you have the declaration of `be32toh', and to 0 if you don't. */ #undef HAVE_DECL_BE32TOH @@ -94,6 +97,15 @@ /* Define to 1 if you have the header file. */ #undef HAVE_ENDIAN_H +/* Define to 1 if the system has the `dllexport' function attribute */ +#undef HAVE_FUNC_ATTRIBUTE_DLLEXPORT + +/* Define to 1 if the system has the `dllimport' function attribute */ +#undef HAVE_FUNC_ATTRIBUTE_DLLIMPORT + +/* Define to 1 if the system has the `visibility' function attribute */ +#undef HAVE_FUNC_ATTRIBUTE_VISIBILITY + /* Define this symbol if you have getaddrinfo_a */ #undef HAVE_GETADDRINFO_A @@ -133,9 +145,6 @@ /* Define to 1 if you have the `mingwthrd' library (-lmingwthrd). */ #undef HAVE_LIBMINGWTHRD -/* Define to 1 if you have the `miniupnpc' library (-lminiupnpc). */ -#undef HAVE_LIBMINIUPNPC - /* Define to 1 if you have the `mswsock' library (-lmswsock). */ #undef HAVE_LIBMSWSOCK @@ -151,12 +160,6 @@ /* Define to 1 if you have the `png ' library (-lpng ). */ #undef HAVE_LIBPNG_ -/* Define to 1 if you have the `protobuf ' library (-lprotobuf ). */ -#undef HAVE_LIBPROTOBUF_ - -/* Define to 1 if you have the `qrencode' library (-lqrencode). */ -#undef HAVE_LIBQRENCODE - /* Define to 1 if you have the `rpcrt4' library (-lrpcrt4). */ #undef HAVE_LIBRPCRT4 @@ -166,6 +169,9 @@ /* Define to 1 if you have the `shlwapi' library (-lshlwapi). */ #undef HAVE_LIBSHLWAPI +/* Define to 1 if you have the `ssp' library (-lssp). */ +#undef HAVE_LIBSSP + /* Define to 1 if you have the `user32' library (-luser32). */ #undef HAVE_LIBUSER32 diff --git a/src/core/.deps/libbitcoin_common_a-block.Po b/src/core/.deps/libbitcoin_common_a-block.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/src/core/.deps/libbitcoin_common_a-block.Po @@ -0,0 +1 @@ +# dummy diff --git a/src/core/.deps/libbitcoin_common_a-transaction.Po b/src/core/.deps/libbitcoin_common_a-transaction.Po new file mode 100644 index 00000000..9ce06a81 --- /dev/null +++ b/src/core/.deps/libbitcoin_common_a-transaction.Po @@ -0,0 +1 @@ +# dummy diff --git a/src/core/transaction.cpp b/src/core/transaction.cpp new file mode 100644 index 00000000..f835bafb --- /dev/null +++ b/src/core/transaction.cpp @@ -0,0 +1,142 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "core/transaction.h" + +#include "hash.h" +#include "tinyformat.h" +#include "utilstrencodings.h" + +std::string COutPoint::ToString() const +{ + return strprintf("COutPoint(%s, %u)", hash.ToString().substr(0,10), n); +} + +CTxIn::CTxIn(COutPoint prevoutIn, CScript scriptSigIn, uint32_t nSequenceIn) +{ + prevout = prevoutIn; + scriptSig = scriptSigIn; + nSequence = nSequenceIn; +} + +CTxIn::CTxIn(uint256 hashPrevTx, uint32_t nOut, CScript scriptSigIn, uint32_t nSequenceIn) +{ + prevout = COutPoint(hashPrevTx, nOut); + scriptSig = scriptSigIn; + nSequence = nSequenceIn; +} + +std::string CTxIn::ToString() const +{ + std::string str; + str += "CTxIn("; + str += prevout.ToString(); + if (prevout.IsNull()) + str += strprintf(", coinbase %s", HexStr(scriptSig)); + else + str += strprintf(", scriptSig=%s", scriptSig.ToString().substr(0,24)); + if (nSequence != std::numeric_limits::max()) + str += strprintf(", nSequence=%u", nSequence); + str += ")"; + return str; +} + +CTxOut::CTxOut(const CAmount& nValueIn, CScript scriptPubKeyIn) +{ + nValue = nValueIn; + scriptPubKey = scriptPubKeyIn; +} + +uint256 CTxOut::GetHash() const +{ + return SerializeHash(*this); +} + +std::string CTxOut::ToString() const +{ + return strprintf("CTxOut(nValue=%d.%08d, scriptPubKey=%s)", nValue / COIN, nValue % COIN, scriptPubKey.ToString().substr(0,30)); +} + +CMutableTransaction::CMutableTransaction() : nVersion(CTransaction::CURRENT_VERSION), nLockTime(0) {} +CMutableTransaction::CMutableTransaction(const CTransaction& tx) : nVersion(tx.nVersion), vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime) {} + +uint256 CMutableTransaction::GetHash() const +{ + return SerializeHash(*this); +} + +void CTransaction::UpdateHash() const +{ + *const_cast(&hash) = SerializeHash(*this); +} + +CTransaction::CTransaction() : hash(0), nVersion(CTransaction::CURRENT_VERSION), vin(), vout(), nLockTime(0) { } + +CTransaction::CTransaction(const CMutableTransaction &tx) : nVersion(tx.nVersion), vin(tx.vin), vout(tx.vout), nLockTime(tx.nLockTime) { + UpdateHash(); +} + +CTransaction& CTransaction::operator=(const CTransaction &tx) { + *const_cast(&nVersion) = tx.nVersion; + *const_cast*>(&vin) = tx.vin; + *const_cast*>(&vout) = tx.vout; + *const_cast(&nLockTime) = tx.nLockTime; + *const_cast(&hash) = tx.hash; + return *this; +} + +CAmount CTransaction::GetValueOut() const +{ + CAmount nValueOut = 0; + for (std::vector::const_iterator it(vout.begin()); it != vout.end(); ++it) + { + nValueOut += it->nValue; + if (!MoneyRange(it->nValue) || !MoneyRange(nValueOut)) + throw std::runtime_error("CTransaction::GetValueOut() : value out of range"); + } + return nValueOut; +} + +double CTransaction::ComputePriority(double dPriorityInputs, unsigned int nTxSize) const +{ + nTxSize = CalculateModifiedSize(nTxSize); + if (nTxSize == 0) return 0.0; + + return dPriorityInputs / nTxSize; +} + +unsigned int CTransaction::CalculateModifiedSize(unsigned int nTxSize) const +{ + // In order to avoid disincentivizing cleaning up the UTXO set we don't count + // the constant overhead for each txin and up to 110 bytes of scriptSig (which + // is enough to cover a compressed pubkey p2sh redemption) for priority. + // Providing any more cleanup incentive than making additional inputs free would + // risk encouraging people to create junk outputs to redeem later. + if (nTxSize == 0) + nTxSize = ::GetSerializeSize(*this, SER_NETWORK, PROTOCOL_VERSION); + for (std::vector::const_iterator it(vin.begin()); it != vin.end(); ++it) + { + unsigned int offset = 41U + std::min(110U, (unsigned int)it->scriptSig.size()); + if (nTxSize > offset) + nTxSize -= offset; + } + return nTxSize; +} + +std::string CTransaction::ToString() const +{ + std::string str; + str += strprintf("CTransaction(hash=%s, ver=%d, vin.size=%u, vout.size=%u, nLockTime=%u)\n", + GetHash().ToString().substr(0,10), + nVersion, + vin.size(), + vout.size(), + nLockTime); + for (unsigned int i = 0; i < vin.size(); i++) + str += " " + vin[i].ToString() + "\n"; + for (unsigned int i = 0; i < vout.size(); i++) + str += " " + vout[i].ToString() + "\n"; + return str; +} diff --git a/src/core/transaction.h b/src/core/transaction.h new file mode 100644 index 00000000..72434802 --- /dev/null +++ b/src/core/transaction.h @@ -0,0 +1,276 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_CORE_TRANSACTION_H +#define BITCOIN_CORE_TRANSACTION_H + +#include "amount.h" +#include "script/script.h" +#include "serialize.h" +#include "uint256.h" + +/** An outpoint - a combination of a transaction hash and an index n into its vout */ +class COutPoint +{ +public: + uint256 hash; + uint32_t n; + + COutPoint() { SetNull(); } + COutPoint(uint256 hashIn, uint32_t nIn) { hash = hashIn; n = nIn; } + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { + READWRITE(FLATDATA(*this)); + } + + void SetNull() { hash = 0; n = (uint32_t) -1; } + bool IsNull() const { return (hash == 0 && n == (uint32_t) -1); } + + friend bool operator<(const COutPoint& a, const COutPoint& b) + { + return (a.hash < b.hash || (a.hash == b.hash && a.n < b.n)); + } + + friend bool operator==(const COutPoint& a, const COutPoint& b) + { + return (a.hash == b.hash && a.n == b.n); + } + + friend bool operator!=(const COutPoint& a, const COutPoint& b) + { + return !(a == b); + } + + std::string ToString() const; +}; + +/** An input of a transaction. It contains the location of the previous + * transaction's output that it claims and a signature that matches the + * output's public key. + */ +class CTxIn +{ +public: + COutPoint prevout; + CScript scriptSig; + uint32_t nSequence; + + CTxIn() + { + nSequence = std::numeric_limits::max(); + } + + explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), uint32_t nSequenceIn=std::numeric_limits::max()); + CTxIn(uint256 hashPrevTx, uint32_t nOut, CScript scriptSigIn=CScript(), uint32_t nSequenceIn=std::numeric_limits::max()); + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { + READWRITE(prevout); + READWRITE(scriptSig); + READWRITE(nSequence); + } + + bool IsFinal() const + { + return (nSequence == std::numeric_limits::max()); + } + + friend bool operator==(const CTxIn& a, const CTxIn& b) + { + return (a.prevout == b.prevout && + a.scriptSig == b.scriptSig && + a.nSequence == b.nSequence); + } + + friend bool operator!=(const CTxIn& a, const CTxIn& b) + { + return !(a == b); + } + + std::string ToString() const; +}; + +/** An output of a transaction. It contains the public key that the next input + * must be able to sign with to claim it. + */ +class CTxOut +{ +public: + CAmount nValue; + CScript scriptPubKey; + + CTxOut() + { + SetNull(); + } + + CTxOut(const CAmount& nValueIn, CScript scriptPubKeyIn); + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { + READWRITE(nValue); + READWRITE(scriptPubKey); + } + + void SetNull() + { + nValue = -1; + scriptPubKey.clear(); + } + + bool IsNull() const + { + return (nValue == -1); + } + + uint256 GetHash() const; + + bool IsDust(CFeeRate minRelayTxFee) const + { + // "Dust" is defined in terms of CTransaction::minRelayTxFee, + // which has units satoshis-per-kilobyte. + // If you'd pay more than 1/3 in fees + // to spend something, then we consider it dust. + // A typical txout is 34 bytes big, and will + // need a CTxIn of at least 148 bytes to spend: + // so dust is a txout less than 546 satoshis + // with default minRelayTxFee. + size_t nSize = GetSerializeSize(SER_DISK,0)+148u; + return (nValue < 3*minRelayTxFee.GetFee(nSize)); + } + + friend bool operator==(const CTxOut& a, const CTxOut& b) + { + return (a.nValue == b.nValue && + a.scriptPubKey == b.scriptPubKey); + } + + friend bool operator!=(const CTxOut& a, const CTxOut& b) + { + return !(a == b); + } + + std::string ToString() const; +}; + +struct CMutableTransaction; + +/** The basic transaction that is broadcasted on the network and contained in + * blocks. A transaction can contain multiple inputs and outputs. + */ +class CTransaction +{ +private: + /** Memory only. */ + const uint256 hash; + void UpdateHash() const; + +public: + static const int32_t CURRENT_VERSION=1; + + // The local variables are made const to prevent unintended modification + // without updating the cached hash value. However, CTransaction is not + // actually immutable; deserialization and assignment are implemented, + // and bypass the constness. This is safe, as they update the entire + // structure, including the hash. + const int32_t nVersion; + const std::vector vin; + const std::vector vout; + const uint32_t nLockTime; + + /** Construct a CTransaction that qualifies as IsNull() */ + CTransaction(); + + /** Convert a CMutableTransaction into a CTransaction. */ + CTransaction(const CMutableTransaction &tx); + + CTransaction& operator=(const CTransaction& tx); + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { + READWRITE(*const_cast(&this->nVersion)); + nVersion = this->nVersion; + READWRITE(*const_cast*>(&vin)); + READWRITE(*const_cast*>(&vout)); + READWRITE(*const_cast(&nLockTime)); + if (ser_action.ForRead()) + UpdateHash(); + } + + bool IsNull() const { + return vin.empty() && vout.empty(); + } + + const uint256& GetHash() const { + return hash; + } + + // Return sum of txouts. + CAmount GetValueOut() const; + // GetValueIn() is a method on CCoinsViewCache, because + // inputs must be known to compute value in. + + // Compute priority, given priority of inputs and (optionally) tx size + double ComputePriority(double dPriorityInputs, unsigned int nTxSize=0) const; + + // Compute modified tx size for priority calculation (optionally given tx size) + unsigned int CalculateModifiedSize(unsigned int nTxSize=0) const; + + bool IsCoinBase() const + { + return (vin.size() == 1 && vin[0].prevout.IsNull()); + } + + friend bool operator==(const CTransaction& a, const CTransaction& b) + { + return a.hash == b.hash; + } + + friend bool operator!=(const CTransaction& a, const CTransaction& b) + { + return a.hash != b.hash; + } + + std::string ToString() const; +}; + +/** A mutable version of CTransaction. */ +struct CMutableTransaction +{ + int32_t nVersion; + std::vector vin; + std::vector vout; + uint32_t nLockTime; + + CMutableTransaction(); + CMutableTransaction(const CTransaction& tx); + + ADD_SERIALIZE_METHODS; + + template + inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { + READWRITE(this->nVersion); + nVersion = this->nVersion; + READWRITE(vin); + READWRITE(vout); + READWRITE(nLockTime); + } + + /** Compute the hash of this CMutableTransaction. This is computed on the + * fly, as opposed to GetHash() in CTransaction, which uses a cached result. + */ + uint256 GetHash() const; +}; + +#endif // BITCOIN_CORE_TRANSACTION_H diff --git a/src/main.h b/src/main.h index 7e7446d8..39d0acd7 100644 --- a/src/main.h +++ b/src/main.h @@ -16,7 +16,6 @@ #include "txmempool.h" #include "net.h" #include "script.h" -#include "scrypt.h" #include "crypto/bmw/bmw512.h" #include "crypto/echo/echo512.h" #include "fork.h" diff --git a/src/qt/locale/bitcoin_af_ZA.qm b/src/qt/locale/bitcoin_af_ZA.qm deleted file mode 100644 index d2c3d9bcc81d033f89cfdfdc6d6b7d4eaccbf5a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11441 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 GYW@orbKV;O diff --git a/src/qt/locale/bitcoin_ar.qm b/src/qt/locale/bitcoin_ar.qm deleted file mode 100644 index f9ff9ea15c6964016d0af734b754d7a767fd2158..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31225 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 diff --git a/src/qt/locale/bitcoin_bg.qm b/src/qt/locale/bitcoin_bg.qm deleted file mode 100644 index 7ad8666e672d14283cc40b3cb7673e915535981d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26590 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 DxQdvh diff --git a/src/qt/locale/bitcoin_bs.qm b/src/qt/locale/bitcoin_bs.qm deleted file mode 100644 index 89a73a4c32047ce4c073891de539fa3aa3531678..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 635 zcma)2Jxjwt7=F^)RwF86Q4xnaN;^5|(j{7_2Jr_JeH)}$XsmD#&%GSa$GznTclr6__U2`6_360#_`VIGN~c8phU(@g zF^w_1sBZPAjUT?lK{o)5YaAV362E57&3ocnwsSQ}oD)DQmnMY?3qC>=VbKGSC1fl= zELu6b&DObeca)HNSB61k3@hwmg*{#|Dr2cGJlWuZIEnVT*39D-!F=WYBkWIU7ImC~ z4?3nT-|sh^a{?wcYlcF}hTxqzX9YF_D1*^51PW;56dan+92l5;OoxTGl3^>+XAw0D zWu#8oE$tTxYS4f`o>i35OEeHmM~GF3X-4)$=IN1qmVQhQ_;b6Ezo-IJ77#V!U&_9%no= z%*^_NkPCtq1W}%P5fVb>f$$I>06_()0afCKA}St0eQH7Uf{H34ijV+_%lDr%Gdp%> z*6UCqw3_uv0>CVyz&`oi_EJ^9P`?)&K{zj5v5DWaZdXyRATw}5xDxPR^MM7>|suhfaQeX}(7Iq)0(PU(R+K)2`d(%L=!kmKIc)#`oVQz-rTdVu!} z+ppgNxk}E+&;R`z(b$#I{_lSR<7t4u|BS)L)xgi9zhK_L zT}UmAwtC`!59@r)8gvk&RChMsGeT2QU}-E|A)Xe=NRZxJbG=m&&P&l~`Mz{Qdlj&4 z*1&m5* ziCXs8-PWuv4?@<)MV4QhRv6V=l;u%dE7jKirorrBy~ zmh8gWj7I8GQH~gOr2ak_qHDTGHR5jQPSWwn4lX>TMb~k~xubh~m5(~1^t(0JXLERR zkg-o#)Wn^@7$a$i{-&6)CJthzp|jvR{ZlnD^&yR$)0b-_Upc1AA8ogbQy6v@o=1*mKZ4tGv&8ZwLRq~KN;_X5I>f>q#^(tZ+w4 zGZ3q8%a5(mmYX9ivQ5fd|IhMs-{3}?Ux3^<%70{w^0yq@&~`^7EuZ!&5gF zS2I<&%Mp*LUT;FX4mr7hTVGWFTlw0(g6KlN7v2dBQT#Sh4|tQoMUOjX))gmAPMdLl z;2Gp1JnKZhgty$%b6d8-b?~fnnYJnCKu){NVWZAqgH-IFS#Jdnf2|2&wj>9;;UM`U zMLUKqr0=_aReU^^88|s}8ceL%ITohXc1@?SK(+L7XmS@3r?&O=Ur@fI?uy_?A=!ly zZ@yQrxt4=oGxS|M)y#I$t7k79!QM5s0Zn4BP?<)ganO&{t)>+k_9-`%51c<9Z4D~e z94x?R(y>&i9Fw+}w`LDGokkzR(ZZE3fKTC)U6}kpV#E?V&QdhD7ssN830qY^jRh3ZnLGIctNJn z7@5y9I2FZaXcwDZ$I;v^vUXCc&r|sXol~~uj+!%N+zat$guQ`J1~&R-`Amy<^W4KV zRELvCyc2G{FHQ$t`5b!JZZJ>NNnnmMH=|}^d_coWX)3j-J#ETcJK5E_hN}$M4^!1sZr0&3i4T-;6cHfryY{T%=jmx7Do7ji zv@Scp1Mx}Z_QOiBv@3Gy;WvlyPVX1>cN;sS)OQK64@Q|Do$BQ5;iTM59-2L@HiGT* zEWGCaOq%>IPXzBB7D4x4-3aobtq7v)T4zzl=mMfj>z<7n(j$r1hAxCM2pt(dlBWnR zLs_RygO&7g(@~sSBaO3&5_)6RUbtV tn_QrSlw6zF^xdf%wdKRR(bVFPA#(rcr_ovbyE!_%0r;2DrS$gn{0B0gz-Ise diff --git a/src/qt/locale/bitcoin_ca@valencia.qm b/src/qt/locale/bitcoin_ca@valencia.qm deleted file mode 100644 index b5d4bb97288533f336dddb6c36a5deb20ed76d81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmZ`$F-`+95ZnubAQTA%6ciMuAT-GfLPHWnOG6*uc?BlUIoJ*;4*>B1=xFG901cu? z;t8}+@&Y8rhJ=R5THScPJ3BkK`=~ZvKJRW{w>F=9_fKzaA`+FWqXtoSI=}jLgL`Y~ zp>c^X)ehe0kgsW?${G-@&^{T`G(eOj$t}jR1w^&pWy681z{`6|IrhG7ZU0ana~4}2 zb;!~XjZ7mFpxFU|LZ0aZNRS6Ihyq8WHV#nfMItZIYf&ALX{N4-435W}O1+UoBLZ#% zl2dW5jvbCgIAKwYoZ~W>vG9;v1Xe=+h!w%63P1LN2cj@~m|N-8%!TS$D2j&*5Kuzg zc@nE2A?APAn2K2MIF^Bh6eV9wrp{#VQ5TGPGDLtYx?WH}*}!QcV`-i2i1W>Vvyr#c rH%6_dGngOIpE=uIJIW0=v2oFlF0j&JqEA>SjLg~mEA$%wwUTAu6$6Ny diff --git a/src/qt/locale/bitcoin_ca_ES.qm b/src/qt/locale/bitcoin_ca_ES.qm deleted file mode 100644 index 9f884b7a02229ca69d792911f9aeb41fac15fdd2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89548 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 diff --git a/src/qt/locale/bitcoin_cs.qm b/src/qt/locale/bitcoin_cs.qm deleted file mode 100644 index 1ef8ff1b61c48a8a48031415a3d10fea05b7e383..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84478 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�}plN}~q{g*%!aPL{jj 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 K-CSoR68{JF;8M5% diff --git a/src/qt/locale/bitcoin_el_GR.qm b/src/qt/locale/bitcoin_el_GR.qm deleted file mode 100644 index 90bc6cd45059f27ccd2333927bdb079dd9161484..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49279 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 diff --git a/src/qt/locale/bitcoin_en.qm b/src/qt/locale/bitcoin_en.qm deleted file mode 100644 index 9ca7fa87e00e6f5b952bd8ebd0a84b9b63ef9e37..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72948 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 Q<;UgL<11lK {VU&ibWbpQYW diff --git a/src/qt/locale/bitcoin_eo.qm b/src/qt/locale/bitcoin_eo.qm deleted file mode 100644 index 5b211826e8e45a915f66f69dc2990733b97c7cc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50490 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 PuXNpBgF`d5H8uYi#$Z66 diff --git a/src/qt/locale/bitcoin_es.qm b/src/qt/locale/bitcoin_es.qm deleted file mode 100644 index 91fec44e4fc02c72dcecf13496e18917ab492dfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90698 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 WF_ns+#5m)ohFV{#@$w7H%YOqVJykUT diff --git a/src/qt/locale/bitcoin_es_CL.qm b/src/qt/locale/bitcoin_es_CL.qm deleted file mode 100644 index 9d55722abd2c946962e53e81724b7818dbedacd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34504 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 A(*OVf diff --git a/src/qt/locale/bitcoin_es_DO.qm b/src/qt/locale/bitcoin_es_DO.qm deleted file mode 100644 index a531e32d3dee99f9df9e31319b6c3cf0146df47d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53257 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 HY-so&rS6&r diff --git a/src/qt/locale/bitcoin_es_UY.qm b/src/qt/locale/bitcoin_es_UY.qm deleted file mode 100644 index 0154d66aa6038244af74e6519ef701f4636a3a3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10083 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 diff --git a/src/qt/locale/bitcoin_eu_ES.qm b/src/qt/locale/bitcoin_eu_ES.qm deleted file mode 100644 index a5b2d86d6ca92a2dd92ab29b664005def3c142cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15013 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 diff --git a/src/qt/locale/bitcoin_fi.qm b/src/qt/locale/bitcoin_fi.qm deleted file mode 100644 index 4839389ea3694faecc8e3e3c42b77614adc69b54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94426 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ℑ|ccl0fNx>b|X12GS=q~i*Lze-! zDn4k+Nie(Y0b#$_TDwQbVZ&tDqS6;Z6=XpxiA?)m(th5TpFUCs*4;fFbnOLrp@jh# zl+9w+E+-dd%^aWnV$LTT1D@1LjF4+gKt&V_zmXA&JWSxyYggo9afJ&nganQ$dS_mB zqjH+~ZukT_1^ilkPyQ|pak$R37~`7lxQVaUk{Fk!0l`3A`EpKrCCibMtBH7}1+5BL zkSs+cpb^o5d*xwyW)WBv#6_46!{%glCbnKONaD$z?G4#*CQdNrQO$C8*xSrx()tl| z%O3fvH)RBT@d!p7-MFvsBqcM#+kj=*E8dK?wsCaGTT9B2MX~Ew6(nR@Mf8Fxf~|O+ zW;-prCyEbf7S-Y~WWHHtfm#ZCcfFcztX1EnL#yseE3EwVvN6jebcEapr|=o4>KUz} z>>AJ&=3Z7dH`$x&Qi^5C*x~a{(etr$srJupEBFxXt${wV-I!!gBsxicJ&g37Z}+CN zZ4i$RyAeiuO>!c<(*7;c5QrNRjAedXv}TVQkK&B41iABklL=a>>nTNPg#=G>Bquq1 zjQ-5o;ITE!t|HsH`mF4LccMs}OQ zYU9(Td#4X=^w|g}JJw;1CU$9~<%DWm=^0DsvIOG^v57*-c)JEuLQ4+1Qqi@WrFWEs zOpCKRvqt?pbpd&!YbnOQ97}oR!VmJ21cIvMLezL4=iT9~UM- zgy1b=nH;fD7weTFyi59SjIBs0F1?BAkQl~zS%6vLT-5KFbv%C7wX61jVVVKG-L zmF9;@juj;Gj8IhjOC|iaXS>8~jz%%=u6#1JawW^Cwjwl%t0>lF4(bBkQN(HKDv1+9 za-`uVo%1A0VJv(`7KB`8;lie*dc9f?w~WNy2C`-hjT)5~QIXK;O3@FXGsO|j={DNH z{vyhiC`ST{(t`y6wLm9L5(i_$BWTt&E1r1$+I6#>ws>M7R!HSnI_}L2bc9p5t`#;z z#kFlK3QRHbH>ep<68N_5juF0uR%BoKiWd6}>v=jLl|#2a^g+(`qe368G1E-ZWb=g) zAH0jlhp|IPqZyZHa@M$>%%anMATS>@I-NgJ=mQ zH5r+NlXF98Tphm?tcrTo1sfi)ufgR#x?&xAC7US>4mmyByEgaWSWM>NnBKGiP@1%b zUb^o3R$Oxi9;vkQy;^RN?)`*T)4Da5Oq0d}CObzX%+DTNIgJ4d77j&friWg@pyGu} z%HMz29?yy~`a+858#JMHblStjg4V4(lFHL>ZVV2&25MYf{t}DpgbsvzK9<|>1|S1q zl?qxDwXzgdk9&r^(*J<>YO%)cYO@DRRqOW6A?V-~yhe%L0uUJRUa4)}fg3}@c5KL_ z)MB|4rp$?)@OngR#4u4qw2Re;cRYAzwTi&<=Y=RUX0QOV--(6$M|F(?aVRSSZxysShHH|MaaVTdAnyD=$`U;A_Nb*+26qU`bw zj7;`rKgY)@EoD>GLjg=Iik_5!i|_}@li|e?yW99l0)+gH-ha*7qD73&P0cH*H0?v{ zF^q-n?~fZi5@+O|N*tNZTjd(WmH3w9N(PtwOT$(ah#c0D*a+VxJ6gl`&7FljZo)&R z7EbjTWHYp99<1c23@N2@cDau%X0x0{D45;Utq&^HMQUYE!o-z19?`|`N@aj31}g;!jmdNo9*ef# zuAvN@`jfa^3lp@{7e{wk-ie4d$v#QpI$F9}-vF94OIb5X&p3#>8X^pr50z--z%!ioYfNpR;)&3r{9RB^b|9I zG)K#db$n!~Hci!{_-SBLuF=9a(F9A$q@44-?~nJ{{~fMjqw5`^x`A%Q5Sj@Ldw0DtZCGM$x7v~I{-|Ls$hv&H+#D=lA(on@C1{_%S%ZQVP(fCx)a zKWU0ak)qqVH~cNr_EsZV+j+{?*obHk=~doJT@VaIWDQ^_ zUE%oVB)v%~9EEJh+G%Iy@ z@k|`WoDPv0N#(_nH9HP*U^1+57MXG``_tm<%`_-#Jry`X#?XQ1~4w zh%%Dvvr^yC3=g_ck{Vi{<5`fMb z;ot~_pnP4_{01IACs2#jFd9zQ!X5Ij78U?T+<|c|PPi)R(!>jgg-Zo`1G7Y`t?lqm zapYque*v2ATBLiOtO1$EP%MdXTMjor>`!=iXJ!2_AdZV_5C~+qTo5Ou`uC?0lHQ6! z#_|UjJNwt*t_SpkfXrUZgacw6yc{mnrllJq!96Kn#)f$$S?9(gf~6uf$yQ*65x?La zD5ETI;3+%cCj090oL2XMNdU)fIxHPn?C}(9zmoy!a{RHp_8L0A#y|IKyOS3!UlhV# zYAQ&AM0F765s8Uj-wt1Uwdf88K%Ca@9bum0WX+%?RVsoKZ*eCs3&dRnA-Mi@$*X>k z*5)ipgS6WWUx-s`>@!I&unt*xmIWs!UhDVHDCx=RbUi3Tgr|$G9_k+QJD(t*5h3Ie zbA;3H&FyiQhI1jhB_`^GVF59ck1`VYc*zl@V3?omBGAGczn`CCn$%5CI#hz z!|k5fDY-X7v#ZIA!MJcMph6&wG<$*DAa|5lq9T##sWGl>0@E5(#69uL-9p6{e(J@i zgkXxzIm!rn|1{{uSR-r7{&GCSm|>10p9l-d5#DlBx-{(}PQ0keFd7)@g^7k!A6Xy} z;TP@tnrw}(KtsMXhYSwu8r|3oe$-df=|Vp+J+hd%))cqfNf-hS5;GSh9G~A9vM=hM z|DWUU6y0a-RYl1K9;s4JOEQF{!zdf&Hgj;4*8GViM%#|WB4v)!+nh>@F_c$ECRWF` z?Ly#WZ47Br_sc&RYTb$(@wQus>?G4&D)voz*dHeL=mJzl=V)&5(h7=-A9K zW2>mx=0&(#SYwy;Q^>xBaobr%x`#w$fVM`o-yDA>p%*Ku+x<&m7+!-_7DWN@FeAc1 zZPHkyIw{&zH;@;ysi(W8f4i|RZUMtSl%ld3+|FQEBX24mJ#8}`C5SuGy`%UDioWQO zb2n{wkBRI6w%vPxw*X?&2$YvMO!az{-3Grf1qagDpU@oLqT6H{p`jb;O-7qE;g?U> ztKE3sZYp6_mb#HtQ`+=n$UxfgQb-h6c`$THJxAeU=B7=Il!^y7Q)8&B>5GB=5DOJ& z2Sx2P`&ia3py`}+IcPIH`DOe^PAQppyTE9VF$+UhD3=#d%c11JgRHiP8YlRb$ORsG z+nEn(E~Ye;l3EghsAKXhe-cZXh~hWAgOMszOnj-K@4)Y5cj;@>E*I~SC@1R5&IaQ7 z@lpg~YTv|%#pk7bFf~@(E{P!76OuM=p%bX{V5G&F(< zMT&s@L?cZ#Dc9+L5JP_Xbsr51T*t=5Fi6OMw23#O!<^vxCd4XPOkI2%POKf+=b=yEfEc#6f(_YQBJ7N$srWc!zC_zE>;Xu(4TOjvgP91S_opIEr3pMj9IGiR1 zq@Zgpi^>W5OS-g`lt{#i8Wy4sdL#*{xjO-kV{o7vNs!GK8)5#XjUIV2Q4q zdkGu4TrSJYXY`>SBHx^EcjZE`T)P$Q&lQ{C8S&!py+aX6aui`%NhV96M+_h`!67d( zOqpj1)=!+_IP+tLI>F*4?%~B3)u0E<5D(An5E)3R@z8}_9R8{yYqHK8`IqPubsDT- zQ3o2>9f()%IB{c#Y1)Op0s6Z0L_B1$!#cZA&KD~x2zn8#EF~5pE8M|&?$}cGI!to)Vc}G;v;YMa4;Hg3D+r*-~ucSOy1odILAQ zvW>DUm^;|4wHNP7C{wDkn9LMwh2PSv#D8|o)*jMer|Cr2bjHpu+;-qAF$(Vb@4pYH z{GE-UAEsC-KLl+&zr_79#T}G83=Ih%Q)QfiQ#I}QIfMTgsN!!eoX$GlZ^pw0D6fU{ z#}h!hG4C0;feHYNa4iGA89JMbr@%<~h@*B38;=OV2E0V*jrnaUs@^Sr40&x9LVnxS z2E7PrxNrse_RBUsF!FTyi<$F>bl_b|*m zCe2~){%F1}qc}FYDUEPhjUE=g;_`{`Q-ClchX;SDsrheQ#7y9$($tcK zE`=!ma@^Y1F6@Fnh+H}YD?B%YyJ(`&{IGhap2e1?RYmD*tUT)lHPC+ZGj&sIw`~Uy zw1GA(E}BjRwa8B@6zhFXGG&NPZ#FhCkkmS<6b@;~N&RdEOAWeTCelHZ2bY4PVI}qHVu!7AHv_Xls(S#MvAT}BvY_n-4mMS z1NCYN=4~wKNU&GBXA|{4)6fgsxHg@1s}!0Qb#Cdvy@Jq5p$p)h!9KQVN;Odb?I8#JU_}*E{ZEGhms2c0^_J{9*u$5-5&0`+fnJ* z(?Qq9)U?qVU6<%>P;@&gTI7suz=9&PUs1U*J&W>!AI2HRp>}K)<9LkfNj!i&Kx2(@ zT=Kpt@?iLiTf*QHgIk7iO=yh5QI;&m9z#ep-lPzUB*DOsShy5+LL}nr@hR&=FfAbk zAN1G72rc7M=v%)%RM738N~1lx9TcoXVPHq!Zs89~K=j8DctX_#8;<&p{pl1HZ?NL= zO6)c6U+2NUR4hA)!&~lna_p~k>)D%vF#98r)!PeFc3=ANb6)h3C=X`ucDE&uL73!n z__x_`3FER7K&mr{O1hr3*JacAuBolHaZdSd_{_3N)OnTFfsxAGBszm;Tx+iO>9ldl z_TVU*E{8EzIgNK-(-M=OJ~~S=lF8{-AVopEpmRLh$Sp;$2`k(BZJv866-`Zu59>o( zVRC7bCn+c)AT2!}uGR6DKoM{Y^r+NtOP-0eEGP5n6fsk6J0`G%k_8xYj?!#ja1$yC zpoVX#99EN<7R9F!fS4|_jna@#zPDTSTDDnb7X?-*>HZ3&_!u%sZrXyXH8zS4$ht1W z-Gg8rcrOr^La;Zd)u0q?)3KtI;#JTrL@`zFlnVTfl(5mcF73EM%*hynzb+727Vosf zPP8~=(Aikwlwc(5td=Bk{OylAY-6GlXYwR;$-Cqbg*d>*L9n()lY=ZyahtJ8d=p6N z%4bvUTQpkmSU>H0_mp2C;Vr`E+p1K8vK<>v>gmCMTL8MxI-`*EDC($PIeNAfXFWYz zDj90qw2ol~A~{;Tb)qU*iU=>WcW)PFFS27nB!2XqxF?aq?!tS{Af8zqK8Igu%-q0r zS97DhwbW=7Q@OSDpq{6Ty#akOs8@6ycHjsT)FN-P$fD4RTHyySQA?q=mZ2_;H!kv8 zbw|BH*G9`FaHpv^c|+BqmTr;L`?}Bprvwe?y&he>WNF8;$TLb5{ZO&31U<$-d8_0~@FPy+mX5>Dj!I`M$zx~_Q z+!>EMynjHhd<afO$I@y3dZYunnH zN`;QMQbWVkpwPoBr~vThIf}x;++mJ-Ryj2hI^{{YcE#U#!0f*Pfwqt762ZNu5v#pQ zZ^Fq4vkWA&!?LwHxfMEFN7-z4bQ%=g1c^s8=wKa4+gTlAlxKqU4Nw^!BnjNt)!O%F z=#vA61#@Xblc;F}6mg!nxPZIO1Lqt6zUtDO%>#$|2ktcw9Os|8)jV*((woGCgX1nf zJ?s_TbbeUl(xMXwpQ1=qG3`tpgYw1=x}iL9_|m(-LoRpp1}?v!JaE|Ycf0&{^1y*U zr-hx!+Twyt;RJF7T{xnG<{e!?J}pKoy>xDbxRDf_{GI&Pjwbm{zAY-ooL#Y;XJj}P zoAFfa*vwGyC)P5ESA^SDJdAB$Tac!>3GXP>K&FsJKAWBLba|`hSBU;ZtbfRRD8teg zmh(;SO4lb5II%G;>|BRIU_(0R7;0BT zYE<+v`gKkqv*B^p^RO6g7$vG41lL`23Mo?#)%{V=*tKR|HO||Fn{-n>mKSO%y(X-o zo0l1z)O-*dsWvwdO0vjegGqE|Qz-7l){3d)J%M&)H_nbRU865+AAl&!9UrM|6_UZ^oTr&;`AfXl>D#Yra1 zQC>4JZ7mszxscfX^`Itr9dzkDFPjhEVrB-db<#%R>cS4>qJudQjFJr$lj#U_mUU)n zocIgHZC<-%!CTCgSUXFg=Xb=g6!!?BxE_nM1<0!6Z)a3C<;mV>CA)ZI1i#i zdVe~D_$zYxxF*ohNhmNKn2biBRDp70>KIQdX%eO=5HVseTbWu?B&<(JNO!crZJ=_b zCbOl=G@3+IiGJhEa$fE5mV8t{*f%qLxC@<*sVQn%_(Q_ypVIh+?;`QQMO0%1E2!Q3 zzXP9SElO}bU7d8))tbMVYDa4wco5k!T^7^~N!jWm#(xl@zOz+VB!#{h1)1}bmHDdE zBa52ORDQlr?FLO{-`G+7hVI}H^oB&Ggc?XAw>n2mMETwnw$qQ2z@d%SO8A;% zNbv(G_s ze$A>tB#b(_M1m)2*hy)+sBkd_X&RK1m}!Cm+2WD!JXFb{#Bi3M$YxPinEMHx9H>pF zD8{8dp3F5d8iw>K2*^f3ClSIRq-B23T*ReM*84BXjQM2)gKk}6#A_sT{CY`zCU^{{8O-lw zBr*lxw}}BdEc6%T8;PP>bzmI+!xR;OgE~C}LBkq5NoDNDx5X;PCZcJ=o4g(ayT$P- zUnB~@qll2Reu0BlG*nMYT!0RRT8a5RGpk@^x`UOo#Q zfXDi9T|HvP>Gov09b>l-C*yGhx?=f!%spCBkykr(M#So-U;-9G@n@)7Tnj|28n>HM z#fjDyO+-^Ucq-u)>6th|sbk$$uz|X<14vD_QKG zpSZ(!Xh?I4u>)Bt$J14@K^(f!QOAma^#%Y|i5OoQm~+d(w4&n`0(uY`Qpu}G;){Gh zb4F?rNv4#NbUy7lE(WTpUHtmW@6eVWi5KUK<4{KPU4N)|Ir1W-EI8!lG~%cx?71%2 zE_VZ`Uh(DlJFqjrCa8Ke|m9${qoFjI#6|5rO!a6aiFR6t?eIf zFxbcn%Jx{a* zKSdTu|f`wmW)J3mtLYp=n(aJTAnyAWCincw(|J!%g-onioGw zd^(uMjTR{F+(v@?r^_yUKIIv`u%?YX^>3nXrXUuHu6Tb%MHm%H`aPj2qVy^zYP0Qf z>_*aEZ9oC-VQCTlsvyK8f^9|UK!If`ZNJL6Snqivvf+&0TUH}JXj%JhZ@(U3$%MA@ zJ@|{y-@0 zBq2T~%|=m%f~XOwM1I3t6(kuV`B1)P?h4qk!X=ObH^f8OJdj zlN_r^)%z*{7`%&qN~c}SV3jLe!3CrTIWKB0p@qeO#^Dr5o3wb&GqIMNwI*eh(?OHB#wor9L8 z2%bS6bEbxK8r)cOghUax2EtE#(mXMjH1OQC$$1{a@5D0Zc!ZjBkd#I+FMr3s*$Sf_ z|DvVL{vRBRK}*hC+&s(pBQl@BF1PK7fZ+^0BSg4@l{TLvenn5Q`j){i!o|jcTt6*# zx$s4>%xBnlN!I7TwN9E$2MayfS;kaIdt@SFK(HlirWT<$z*TZ4i3w2@%55E%5?|a4 zBaPLiTGhGMsoSN>pMyg0kN~?bF&q^7&_kg;F6=(I=%ca00x3fqWX0Ef_MLL#zp3tWD(l^>|bCcnh(A1NhJ7 z8E>5EoW%<>0|Sg;g^s{;I*YN0Vu*w?Ne9++Z^mc^+fpfX#6^I^)Pso_r=2oKQy)+5 ziKHMc@;Ss4tFXG26<(r+%uBFn$Mdvk++`W}b#J*d(e5mpiN*VoZ^Wj{Enjoe(0cJi zTTTuc1tD>ZW(ctegb|Eh69GZ9#Rixtv}`1-Y^feJa~F8M*7|sl9%?|@4P6tT4^Fh$ z3dLm97MFR$)^_TugwS^;>r@R3yeLn!Hu2uAV@CrJdg#kdI9JEplHwEs-fOj8=th$a ze`^YotQ4=o4JxYFx~(Y!2{?+Z3y*jE=c_>vfeO=2b6=7E2h^6NGJhwLBcus|uLWP| ziYNPu3@OSX?7ekYug_+5zmyQjw`g?*G3mY0upyCVHN9Jx6F_VeeuW9C z&$23sfy+;Pj?c?}b8n?QUSP0NmpCK!mEz8<)YQw0oxnLn^cnneM~vNM64chIvil)+ zAlL5M4v~J3IiTEFIIqh=rK75|eDNZ; z!7tPeITo-KhW5Kp2WZ{zwabJlfUyw1fYKMUK;D!#JRMH=0Eb|XKwB?7#qT9!bf+Fp zfr5M53ur%#(4kxNhrwpiwTeN)kAV4S>0A)O$)r!zjv*JIuL3Zq3Si1)`k|jDeCf%%I$xkGaM~z}@`V5Gfx;--nYe|)q0_N3kZ=m=Pb^qYFA7;~36I)nKP-7A zFK80Bl?BJ>wi}FF!&uNcI89KMOoo|d(@AZvoKChSi?|sCs=okxG=+lN(B(#5Ed>;MScP8{^LZO<9D&ByTPu{zYKCnUu znWhO(TQOmdSNxg>(Xk?+b3BD~*z7SKIHB?iP?X-lO@4_Py5cFoDxKt_K&LlG zBl88m^nicUJs+vQY-_6X*+TfvOwr8-r|RqxAn9d|cRT=3?xji`iQ#r=UIk0d;kmkT z_>I}5T+Zd5Var>ul1n%- z3Q9oE_10X|mR=as4xWFoUiNs|3N@P2zOwXH7faTP*}6`NdzUW02o_ z_86nrnznR}Wyg&HOLLb7oVd`GNTNXbqzz_yW|e9ahY%GcJo6Qo`bRdsF?NpstWX6w zPb!J-%B(bd*}{W8D2qb`#_Y4ZFvIOe03g~*BN*dt&Upc|8^^@V&xRr^K?%ecu|-2x z%xj4Y8;Hsw^<{v4tw@~{Vzl%Ms3ar~O@TvB4(K(BZ^g5rU}6H^65k>^_uATJ+bLM%s8M3f+$UAs zL$&>hB&bsd)hfWgtpe;uJW3YpaFWlK%TItTL$h5SO*0BZpW?OBZ#>Xestp=NbgV>( zkT>W!2@;KiS4rnhw=R%5$ZLFtapcdadziME2M?D=>7E;Rlw8G4XF`dt9C=ANi`&m& zx4kmU^7d=ZwH)QFy+C{+x>jCeEx8eC&XVzXMjEgeU??!Y;18wL=$kmk!OAqG4t#-6 zgzjAz-qQ?q+im=_0^PB8zu4a>@i8>25;Ud`^HC3i%HBl9Z5jVIF6qAjhZy1k*?LE1>El6=b`KymbI^3{=oxlq1!4n!yshvWK&RI}jF&OfeEf*D-=c&I&TCHu%8gZtqgI(3>w)67sl=sRw_IltnCn5VmZ&UnD%0-42vKo=} z!5rus>P&{YylRiKb;w^iK8^6C&SvRd9{7=Jv(@^mBx>G?3SAfQPgDdEdpMb{x;hc*j1 zgb+$HYca10u2Lt7Cq>Od-_x&ON$t!kI{pq4G_8IJj27B^`f!`{}Lf)io~z*FT0E zaAI!Lq-C{_nk5!kmL%}7GEEz_rb!L0qcW<~hGS)_o1sTBnL;u(MH~%USSH@SHt3NK zBoev>K_D`w>Vc%W=O{p-7mI{Y$q-}i4JCm?Oa_aFxjBu!#qLeu0Bmo{+<>;zy_suz zGx6A1C@ojC>H?=}28L*ty60NFi6)2>68O$^U-<%sxVRF<+@pIfL14Q4(=2!-qt_!nmr$IFxo8JS9Jfg`j2 zzy?m%d8_yCT5v$C}nEm0>8K)f{)5OQ#>#d|^ZoV~yS-xe(%PY1lR=|;f`?hvl4{k-s>@SSSJqhhFmATjjPJ0fW zxAeNXQnM++%Q>fLIi(y@if1lOQaq#@2?j7MGlIog8(sn&It<|L#xeog$3rFbWy_Yk zcbJf8FvxEK^V+-D$UY|J&RC~dewc_Z1gEsC5lQ%lQG{u`FLkh2#dU}$hu_IlWs8~ z7WYr>K z)XT`Aq|1=j_bMT6#R63Kq@aHWal7nep_DK*A; z*STaZ4X-~{>zQK)QkgI_4q1^h63Vbs~OCe53%4fti*D34+)Ps;sp3!z>r3Yyua| z;k;*iAGgw#?JJ!V=j2Wd25$)9C18|M17$H0xsNLHe-G5QQc!UPXCjMAy(BJN5oJ^f z;5D#{t&+3sA=V)o+aw1VW1=W1i#T~ZIl~1-0!pr}Xn+XD*A7T6W&})jL5N2LZ;-KS zO+{-$irSzi#Cskva}bH-jbYMU99&3MWep9QNN&|!IRk7fgNn{W7bHXv_Sdxd5Hm<5 zEQy;tEv4*IQY?fABJ^NF&`n@675_QhtcU^_+R(xHxwQ26UxZTDgCEIYk;`}PNo{G{aM+U8|rD{v$R(WfLvF%yl*#wTkB*00iXRkE+$6S@Jq{AjINi z7iGD{jHZ>1eKoDkpd>4W^C@odvYbVt)^hW(UZcaF!Fb+bp9cnLXc#-sZ{GIdHop>ULcczZQ34BVB@9<6?j(Iw|Y$_e0G{|6R8ihn)4}A}5PWy>X2p8Z0N!{odRf#xfnB zwSo$%T>N_*7c(gB&Ik8GPN_omq@3$hVpy5f)v^eHIzqTX|hWc%&*HOgJe!d z_$#Gk`5qz2QC?;UVV@$s4E`F_T6F=c#r55E(60S7EsKh&bOgMdZf=1NWo%S@72{oq z-Xx$RI%T;OoH~YzeKUp|(P68aSYlFKEku;D3Xi{`WgsIn>Y@`8?zf~W@va5MOu|t7 zOP$dnpP%2m?qH(7fTfw3pcb|<)E}f0qr9yumP)|)MTXt0NNAg*OOX4A#$Mdx4dQf<-0B!BhfhK%#2(wFCl}%C^^(;g(0f2Qsvz(hour zkAkEpJV(P+>|j1g-IPI8bwB=1Q_Gyf=A1OZguJZg4#o$q&^{FS+2cG&7gfT9KHtIP znL{D?c#l5&M)@wb24NLGmq@Uf)~@`=@1&H6r=yrCV2D6MNqmmf(t+>%t}yRyc2lT$ z{#1RA&qSe#2TBmK5~G8M^dFlIJ9WLBTZVuT^8|83SL@L66;HTbesSs|bK{6~Jw(Y$ zhyb}Hpq7M!Lkw~EYz3g99l;%wFc@JJfgroem6slfl}iuAsx0Rx34Ab84K?Daig~!2 zL|;&}d5sP)BkoLJ!)CGMq;}4|m7-i8wjyOf@*%j4S&V3O5>!Lf#ZiT+8*n6vSB7eF z%-D!dNCfMegPJzDBGM@Ln$7^jnWPn3rn0w2_!aXCxxm)bkQ0onLB3f8mAXP}oYFAq zVxRatX(L+;4rSzov!;F>ihxCnMiu=Mj)3rNThxw_m(4GP5c@gEZ&7>r0X3?P8l`wa zjO2(($vY<(snaSLl-l_Bwza)`m?Y|+*K-3=#-65)xoFX%)AThs1Bi$QBmZ3<8}ZZ* zgN0JWEF_uLJI-0T9U%b;&5ZwuJtH;ebZhLkS+?x#PABt8ga|GW{O4l$87CNdF@$OM z=Qm`i#&SaiiTW~56T+IUZs17lw$N*IJS*;Bee{V> zmKz)L0GMI!XmImbhY>JY761xsc_~DToyDLDr+X9P0&Ei+sT7}??XwmQzZz4>1W4>L z@Mbf-TxJrC%%Ol4ctZh6Ms?D1;>EwhRkXd^wenzrMjB7Cn*3B;tI9$xmoz?m0Sjl>ocC5*p};6E4PQ52Ch>!mHxkfI>_ddJh4&tav042pevI z$sfc?yu*Smh&cWDY{&c*uoS)YRr;_FI>2cd69KEJ3>kcmM0Pac9+dIm3*PBjIv%bi z8}LzV4U0;*{_Dgoh#wej5|Xa@NQtRInkY>hw)>(&l6j&OE;TZEHMjY0HGW^7Yg>%# z_FjvW_j3I9|0(W#dgHvRFrKigvOq$rx}*~zsvB&liITK(L;6pE3T+Z%r=bWTjqQm& z#GV<=*lFEA2vtZRmV5wKhy`NJCqR4xR;*a?8MG+<5uw z4f5GX0%?=c(Z=8!kMy{sW$cAOGAZ`|nEv&rn*Q~|^S)I~zoOT~f-OK`owL5)n)UUb zS+5qfQ6PeBX;~x!c93LQ8TITt=99wejp9bOHYOs~5d=|uK?d7~J~$!%@uoNE^_g?<&-$~fyLpa0;G;!xIkgD!-QXw>nRp=UX@u*IgzCzy z{P*7-emFinJ_M3S@dF93DmK@hgpbrIa23&9zA6l-ZqwT6g+OlT!5+2$(~?AT_&^oG zS1SqHtMDhQ!<#*lAQJgvF(8{BG3*yrn$8K~m{AfkfVen2UK1~DQ-?My$ykHnnmFdg zw8+abL^+k0RrfhQ9Dk(D;3!>jDWzTT^W6-wbqF~>Hfis#Y*;#|DRe$Mimh= zBS+Dg15pwj8qe~$qbB}E8QHgXKmenNpPfkrBmqu%9LT|rkG*X7#pdy&L1B6e@EBGg zl3*xPbZm2~o^R`Nk*_HJy1umRckUb?ZgcQM*MBObu4^fYM^l;8;drq<+8;iFzOx-j z>2(tCwh^2ytu4bVH?Q}qz(=jDlnE22+|Ey>yj(2|Ja#Z~?0hC?1Q3N5EI<@*WZ%D~ z_st9a-bhW-s-ZJSGI|S+{>y8BFr7cv9v|V_DVtbLd37Az)^y&Z*Uze=7js2G*3O_m zbNAGg`G%Crs16Fn3iZXvC@DaV_b%%4p@l|nqO}XLbfdic70Po`9^1+_12hL@D)>#S zUT)XKNKGQMVxjo3tz!H2W%QT;>i zFIQ^Wsg)bS*~u>0aMt>)AfdWHBhWu*(@k`BxlodEygw+jkGi{cfA(M+0PerSP9bl;~_Wph3f-EyQum zKU$Hw#yX+ET3>IfE&0xHl9K%ffT^$q>NWu5xg6A4G&!KVasPONIZT|J zO33y^!BNDr(5mka)qw#fR=+nYo_i$miI#d(W(H%iY$NeZr~xTDc$sdxYH;qM77!$W zF(M>n_JnYe%EQOSw?uLd+2<|z=H})*b?MSzMU}2;az(~%@NoQioEDpxs!mZQifZ4b z9xAC9r5h`@m*gPrHKc7DnZtAyb6em~q)X9v(_;;?o1&8vM1azq`HW09BhLVW;;KFZ;hG49 zb>SobEm>)aK94>jq*O9JKTcaWg~;PsgBG~<^7>2qbG64>f3`Fs*UtPhX%v9&N{U#s zU-ro{bcJOic?1A9QUd>EFTSqFr zs;x0!;`B)SLk_B9A9gF!c8KCaL43pdm zI_w$ZlNvzdm@GN;G-Ct?6|_AmX*&b+3+w~_y2f@dt$Sio}c)Hx|`?^zvShg~k~0R0xXC&5q)(jKAK{Nq{P8j8S7!i7#S{x!nBn|j7Xns z|J4|E+(>V|X4C}t$QYXw$(t-`elid;#lXQXa0LH4P0L=I$cJ!79d)zHm6(`ljzm0i z3e4Q>yq2>#SzeA)+iQyBT;`MRm9k1wlK0pb9i!CQc&a1hCs!2ptSM>I%zkV0wPg8n zzbGFSqGU2LWec;Z5LtwIN?8TK%j{2BDJwo$oAgwv0;_3S@Jk{MPgjAy)&FxMdShLD z{xiGC@ZVt(v;StdapJ%w{P^^sdzg48hWRX}1u!~|4dr;CX{{X1=5b`R^48}5d^~x) zZb4Lk9w*r7*-v%0yN z?z&Lcng%9&$7*5$9SDjk242Jl>%6dM;GeYy-V{Fz5;Tcp9e#6TBJ91lHd^KdV2hUK zs9zVuEam0dC?-Y$JF|jo5%-cjnVR{IgWAh0bP8{MxivYL-kL>l0A^2|TarE(gTS8- zc2(-Qql9%&k@{}y3w$;ed7!vwgHe4;j|JE*7JfB`Hq$LJ{mZ?(uIGD}yRD}fmf#~W zD_y$UE45^GnPzS|otN{wG2DuF@QAC{$W7_?jP_hT1|4(?KAsGb01gp-L=L zaB}d1@fh!*&lmG3--+_Mdmx1}!6@<*%7BV-yb=iLckwE=*0fqo;9cYOd{3fi00Q%BQ?TF<;}C1 zwqJ6tJ>=kTR25`ygoW|Yqsp^ohoSoWa(LCMXckPq!}cF3Ffk|t$6AXiVg3;)6Y!`c8pyJZ>= zCRP>CK784&w0}vme+H#NbMLQU}3~ z=iCN8N+-)N?XK#@-KPB9Usb5aB;4)N6EI0;b_oHTMI<2TE$WpH-{E;Q<$HpA0H8vZvH?-XR;J9h?p1 z6)M2LC<;y@^|3FUwI#@6Ldf8xn9+{rM(2>ndL<4Y8)Q{^?c9Z0pI^!|OqW!py3ypU z)n9c!)jrFQ=sL#NE_Cbqd#RR}uYiVP&}gfNzP7}`V+~j!kQr0sHpFPD!X99#gm#w- zM{)VVubd^%lfDeCwOEaN4x4yFzz1UPdf*Q#BzlW9)e-Jg#`Hu28R)(ERx@W zIDn4M!pIn6`4u2=c_2ea}xHZ0D8j`+x@$gZl>ez(lNUf9ad%MMo$7Q?+!&w=xU`b|vW zt^|n6IvKR4-$0;Y7Oy?@jg z_yeuQM1MD`m53C(%`%D$Ucit>=_4`^GA{SFHl#l-)Grx~D@^0Ty~#aR=y2$s910Pu z9vrE~K=yKdB*q`VqM4MWMaT<-&^$Anoz3m1n(gw@*d9mox5ngyq3$~09rg*FW7ZK3 ztP9-=5WX0y1-eqfu6yqh%Xb=L$r!n`f7xC<%OHR_$wpKLt=mZa zp#ES?7BLcX2`BaRJNcr%S}hMWrM_CfJ>l^OVaT%9-H@OcZCG8_@{#}<_!#F7sYJ6PV9`%bfaF4Q{L0F#rfW%P2(pI z-?)G0?K?l*7{t+p3|XW^DwMcL$g7i^C&H?Y<6K zX872ybCpO+ua!=SZGAF2P;0U3=Bsvcl5@drHJ}!-Ny6;bV(mwF_8=e+m&iN#LTEm_ zhzg(-Y&$R@q=yX|f^+^Bh2i;&H6nPu78>EbfS!^&ssZ5CP(pudc{LS8fUs2SMhRvl zbkF4hi^t>HY_yxYZnr1?bETJ?>|4Nk*3cy}3_bc=#AN)e0|4`390KHY7|z2uA;a?3 zhd$P>&_wZ}y4fj2soL5#SvbWbJ(&BS9Ru|s0(s}H#(S5Xw(J7W9@&e#TDE;eb` zBzcp?c5TM1xF(Pw+Y?eRmkr#m1T>KjTZ^UP^AXKl1SK|*8hL?6+#*#czEe}Co-=U& zPL(y-7Ss)!#pLl~&9giaVnx0nln;C4Yy!5zJ`hkF`7)*i@w^Pttnre0#u5Gqx(YMmY zAsAQIU}~`r7L#kw!f2OwRI_AgI6`50F~uxjxPTw&QMeHvXEX8}pY0u!qfV!`utMGX zZ~GmkZzoQlYVsm+bn%Nzc+udX^^i)o=>o5UhoG&_a*~h!a1GfksHN6znJX zHUz^W`?TexFxS^>aU`va5;IL`x=k6-k=jL8j!K(5^|RN6{NqaNu%!_bxkLvI%b)LHzo`SuKCGPrM|&cHW06@G;a3fh!iLB8x9G8= z!9Zngw{u}Ju)g+_@hr>1XJ-vRDs=R>^`e*ngX>8|dEMIX;@}Nk*D2lvN2MaIN-qyi z>`MzQl0YU9qpC9=Y^x>cKp9-MTGExJ>8ONkc+|b>g=5``oghoMs-EvQ*JoSBP+gnn zcC)}x;JgZ`EIc}Nqjg7ULy~(#k79m#9$t!FZbZ{HlK5Wa&bshQUhh?jcK)_OSiR-t+wa>uIS15FxR}W;qAOI9qz8tPyfN^z|Y#(NW_l1@%b_N3RI3=fXgt&1}Sa&;B$UNAoEFZHC{ z&OdWXoEAt7RYo3on4P4ANbv*Bd@h5^8Eh1@e2jA3csELDn33yV@NgUFE~HI#q25Bv zui`t|kjR&<$=2{nvNmi8Hi|Ru$k!W_?ci8G-5r}YYZ!JLdPc-gz!GQTf@D9kW#pW&9!=Tv}cPlFyp~D4d#OnIbxoBG*yi Yx4H~QWh<)Y5pA~Rcj~A8we#oy2OnXxcK`qY diff --git a/src/qt/locale/bitcoin_fr.qm b/src/qt/locale/bitcoin_fr.qm deleted file mode 100644 index 1645f377453e85dac95f87cfa4c68247bfe27959..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93876 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 Q4@EEFDD5ly5>N8~0qw1rU;qFB diff --git a/src/qt/locale/bitcoin_ky.qm b/src/qt/locale/bitcoin_ky.qm deleted file mode 100644 index 5a1310dfdd8cb1f7eabd1d6f2ba690e1902b8f31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2896 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

&UvQTKmJDv95yR+HpWAVvkgj054 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�FF) zh}L>*Ljg^Af+2ANM+8R-Y&GD=D*&&S429#hbBeD)(PvtF@IgK8qB@6Ffr0E7ZwLRPoS7UxgZKPZNc+ZcDe^`#!E{n z*iBA*;E;Is)pXUcSco#%utdjRud{hULy;xitRK>i6137!@|&7?$-FXpl?^X#Uxk$m|YWNDX-hPA^Vy1TQ%C zQWumBw=iI-2~2`%U3DkR6P&eS0B*N0_k&XA^ChPmUCp9RP(DUT+8V7YNmb;6a!DOf z@>@(W&!zq1eb`-@!p(J}RdL741=D7kY}0UR?j+m$$;@ccCFJ3=;6SEOnm`u_8|1AC z^fQOp%$@eGkD3w^h7eQ0DBf9f4&kv+*W@$a#I=Dyup z-CbB6jLGuArKN;7uM`W$lZ9@RfJ?*n!?+X9;eH6e)=EJ`e?5Xw z6MmY1*Baul%Ddtg9aekb7`&u&yJ58$Z>6OHX>_aFvo+qCB8mw2CAhyvK`9T07duO7 z4G6auB+uEQarI*B18`yNz*@WZM-r?zO zyto5fGDvKS)(q}Vvvy>5`usd^zQSPwoDsHq>@%R-t&N-XWN=wN;3x4 zl3;brS{Y`O@}4_h!5e&WS-1Y$MNoJe?A1;q)|E05*4CIpmD+B?u~oFvUQz;RoN1_K zGg%bb-Vu<$D~{>H?j>C>wDmZ4fpJuY@u^yIIkhW(4~&sxfogjF`&S|Eif6P@JP|P! zr{yk#Z4oZRtI|Uq#P!H(n5m4}$n$8k8gRxwtVi?W6A(zmca~@Xb}27=BqpDfWT&s(OFR8PeYKkhHnVz- z@ph{RshJ?>yJg!tnVL=sL;2N0l7~on8B4yT=Tbu~&+P!mDJBt2A4w&{rmbN*sVOFP zMSuP)`nF+1>XPJHd$YzIB*D?m7$wUYlf`drL*If79Z6YH@%{_AOALnAV~iC5!A}Rp5>*%>yyYwt%>7N$Pe;ME4w5K`6CC-fiCy0$va*t z!LUQy{3d}6BdSTf=jKDl)jyqQ40D76D#wJN-_FW!#228gQy~dT9s6m4yqU%21Xe64g=tYaXxJ zDZl_akALcgyYUWBXmOmUT)R)mbz?NkV@PxP>@Lvf$o4&)Qm(|4j6L#U9xgVI&Kdnd zAFCUu%e(c*FRJC`i161rRzeV+Y7+l;`uK6ly;un6d(2}&9Pz{64KV&o94|eQo6N^i zgm!{A{yrw}#3j?vY#%Ibi@^xa%}CPgyYcN}o#5^NAp!KYzQKw_<>eDSD5V$ikH4?8 z1~m4IHNyz<+rnAniY){;id>J&mn`R!ik_)rF;`e4LOAyr`!>1ofr6kvIFs3NA0)NunM|5~|AjN40 zHwrQchhZxw87J%gf}Z+>S?>4zf5wPMyU)rV3HL+P7cj)7^fIUPlxXLR!gr${<96v0 z;<);&q>hWL3-*Xz>v_+t`jQ{^0+ zs78SiWx6b@1mW6ayB8@7Iw9c%7xAQ&UO0aWY%h8nk z^I9968Y~a+BZuJ~HM96xjmfDMxFCY(#*h+_m%iO-9`{FIpxtxED{Lp^wG?II{;x`F ZRk?A#gWFm2BQLCJ{ryt&!upnl{|B5d#3}#) diff --git a/src/qt/locale/bitcoin_lv_LV.qm b/src/qt/locale/bitcoin_lv_LV.qm deleted file mode 100644 index 4d2cd905753018d8bb3d2ee7e2d6559e7af8751e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30093 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 diff --git a/src/qt/locale/bitcoin_ms_MY.qm b/src/qt/locale/bitcoin_ms_MY.qm deleted file mode 100644 index e2560b19865b2e4a3a31fb044c58b42166797d27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1806 zcmcgsy=xRf6o2`+58{~*HNhg_DCCH8UL^?8BKHxagv4MHs}z~L9q*Q#+gbL*aD`x_ zg-9v`DQqmPVk-!Viml*(pje24m5qo^!1reN*5z`CsVrva?VI=Ud%yQ)uD&u(zyI-c z`@`AEw;Ru1e<}jN4&;~i00w7Z_VY`CfgRYo{s#Z=_di_A0rXD{j6V8;|GyF^4xXU> zLE_9D{=?;DZfYCPeFLEGfW)Pt7r6(hhs^vpwCme90g~$|K?bt03>*wx%`}-Laiy|lA%!PWD325j!x64q zRI0JeYod?bCZGV4TyS~7pn|&teiR^+T@srt^z0dB7OtV6iIEtzP_m$gl7SiTcl`JVYVUFbJhQqsnm;%+oBMobCxF@W^>oI>kfDI zH8@#tas1nwvdN{Y>1YhO>Jkkr?(D%Z-H9Vc&B2;xEVvTH{UN+vGK}96Hnv&!_=t&) zz+y?6R!Lc&qhze^2`K6rpxzcVR{a=6EFRB>>@#{fsEfm8vu1i+E-6pUuien>4dd%W z4**@Ucn^+cZ`z)zEH|Ie_wwxyJ>AYrZew#eQX!5Q_U@h;GLAo5J-pLcImhWYqgvBN zF1b||GkRE8gk=zC?msiehjo0_;g-v*RCUL|c842x9*H^MHpQmq_J2OFo%#O&kV}_q diff --git a/src/qt/locale/bitcoin_nb.qm b/src/qt/locale/bitcoin_nb.qm deleted file mode 100644 index f89832354402c59f8fc5159a5be954525611d568..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59751 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 diff --git a/src/qt/locale/bitcoin_pam.qm b/src/qt/locale/bitcoin_pam.qm deleted file mode 100644 index b471e55b6d71f54a1b52bd13ffb6e77d29484cb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43900 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 N>zo{(<`KiU{}0h46*m9? diff --git a/src/qt/locale/bitcoin_pl.qm b/src/qt/locale/bitcoin_pl.qm deleted file mode 100644 index 3cb50c89b4c0b924e506407260cb9571c53ede7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53414 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 diff --git a/src/qt/locale/bitcoin_pt_BR.qm b/src/qt/locale/bitcoin_pt_BR.qm deleted file mode 100644 index ab26ae3972f42abf381a4f166d5201fbbef86ebf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58720 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 diff --git a/src/qt/locale/bitcoin_ro_RO.qm b/src/qt/locale/bitcoin_ro_RO.qm deleted file mode 100644 index d7ebbecc5f5ae935bd0b7816966605033a2a464e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88599 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 Yj@s9-=W{hueQ`AU?`Y#cFO7ciKhuS?$N&HU diff --git a/src/qt/locale/bitcoin_ru.qm b/src/qt/locale/bitcoin_ru.qm deleted file mode 100644 index a320b2026cf9406132350e8c2eb3a804d3939f48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87624 zcmeFa34EMoxi@@IGuhL0p{1pkc3NmiOOqyP(j}y6lXRtRx}_i#kV!I0h9)y{X3_-} zH{4m=;OIHZ(IYB|2YnS6+>Q$_h@#@kQ2_;1l!LG5;C9@;|Npw4`+1(3d7ep&yzlpZ z@9+EdmrgP>&%IptwQqOV$A=ew_1AB^>FdiD|J#-C{Pd4|jhP!WCi)#?9{ad4cD19-*zPqZ3y{sqRw@!g%Pjd}Pd#vH(Vujw`>J8I18oyNTQ3wZ7m zCVJbujam6_ef@H^zJBj%ef{Y#P4vFk;`8t8>)Y0t==ZKS=ERx$`rb|xeeiN)zI>l4 z|7^mThwjzaC(2C4uYZ6we9Khc{SjjxSZ!v$e!VeO+w}F(C(YcKU1dyHnOV^DCS$I+ z-z@0E>#Js&ML$|=%$xd6!?jl$^ZHB7s!v9ZDO+t;eRG8|?X70jlP!21GUu=Vt1(x8 z%$z^+8Dm~?z?}cKt;Tdrne+b{`+LPJOmqJyjcI+#teL;jm~a2lbRSt_%(2_emWQ#P zg_}*!mod-BUuSkajPW;ZF+11&#+X}A>g)Rsnw?m#x%Ccxec$zF*Pj;|^ItzO7v7EU ze|e+X^VUIQy6@1}KfT%P`N+!w-#43sCq8A&%qR49)fxKw*iX$s^e$r_yiH#pzug@E z8rFNu40F+)pEu_5N6f`9-EGXze{C*)XU3RcY%oVIeGOi}X5y=EH<9y(O#JecF;BkP z4E=Tp`-_^<7xx=;@;Z~e>{7tFUSHo{X~tiElQG}C&^&*1qlq-{HW{wxn=dd^zj+Af z^B41~u5M%6?lRY3v(`k;zsB6K6Yy*Qow?x+U&MYMHaFgXjWPfBq~ATvy8dzP3C>uiBps2&NRl!_L`5r=~iR@^dSk#$5Ee$nx_}8q@e=eZBcPk@LRsS7Sc> zuaWjI{>DVQ1|u70++j@fipT}mooh_R7bD%ncIZ~EdD#>}pc+si=O$FC!wOMJnY>W@b5xexno>xz8oOzh*$)sgT1_#tCD zKM;BBp|_gI(%F&Uy&9jdy>Uk5Wv?=3!6P#w_wF*0IXQ|3A%m;R9J?KK6$hFTEL`f8#|nUU?XF zUU|igw;7z*nOkPOa|iIJ@n!mY)8}X0de2G|S@fSXZacownCHE8#)pU(hhIA5W67(* zC;m3$E4Ljm=AYgsuaOxK&-m8vbBuYaf5s2L{t*+|ux!R3mezsy{GcqF#J)bAE{pyK z@F;&$Uw@h|n>mQ{eLh})4>&Y*>g!Jyl+Awaqd2!sWh)=R{;t|xw(iJ7CNlfMvURUr zY0R$n+1}yTm`Ho1Y=8Z^Cer%pvLjFa)tH0#lpX!XL&kjQ z>t*SG1zc`BzijdapqKZ3rR?f2gKxa6uk4!EVerT6%C6~5n#k(kmc8yRUj?7qR(9iA zhd{_5EBnVUG#hitJIda1ebz))K2`SKt8X!po~z3K$3Eb}s~;=-!sE|3=Ke$a`opra zuP#p+le@O;tN-u{W4`v=vaj{Fn@HU&%D(rJ+fAhU4P`(0B-U58v+PHMzcuFNH<15y5MHeXL&NZtQX_| z>-o`@@wrb#|E2vx@RcRe_ny&j%;pzHZzKQx(zm0xkK+AfXGGus zAn5<$OQIk8KIT2~(&$&doCCi8K6>9{lsE5)-uJT~f)9>Fzsc{d_%D5Z3hn{U-)6b_jBddFU0qkTv1-XxK~U9IdcKks$_4Sv#C-ju|7yz-Uh zO&|CS=%&1U!(yzzcX|2Y>V?KUI$VCD<~H!z_m-bHd=vQJy7CvkX26*Lcvbn!!3QH7 z8_Hk3_qE3S>`3{0zH$@r;g<5-=KU3Pa(DUrUW)fm9w~p{>%M^Ze^7qsv79k~?kNB0 zdok}dtII!n+gf9;-&X$FhrzGb^p@ZIB7Fafm&j|RZFl+CTd?j2A1(jJ`&WQ3?k)d8 z+daUC75aM3`^$f@sSjwntNdq>d6Aiql>hS5M@{6cz2(2T3gf=`zKUhPfV^+Pq z;vH3h-x=K%x4r2SW7f1++|m4QV|rFr-1*<2hfmC^_`qkbg}iv8;&V+aO=M0-#h1qC z8MEOf6<_JN1$g?qiu;n+m`KGdD!yL5!bEDWsQ3=$#9#X>zH?3j>$+ZFZ(3IIz1vd8 z+0ozT~RUtYQ5nmNA>mfudZymu-};V z`zqVlG()cZu5#UvZUxa4xM*Kgcg)ws6?aDPkHn)m$CM9zJjrsletG3>JmWedHzG{2L+o1nd z=<6LvsC6=DGcbs*BsPE@+xZ z4neM+e?VW~zO(9zuj2bJxxH%We$d?#Q+2|mOk~s2s(-4+zSh0E>Ywh7n@Cx@>O-Hs z(3toBqU!F?<6Jt{RsGw!Uo_?gAE>(b&4-P-^PN@q-iv*t@2vXTi(dh{f3)hs{{*}S zJF0&8+h${4+gkOb>TRI2cUJx4T;TP}PJR7pMRmnZ_kteouU?YQ&XPAH55F<$cwiPtP)D&!OszAL|GHURRxR;@|x>uZ2{fm8X1)i*_{^b?Fhdf+Z{j2|s0x#>TpZwUnjQPSJtDjo;a(wSS)xV)$ z`JK;I|JR)Rjmdno`nQL#F=pEzYbv_&{eSsM&Fo(tg?=})=A4eFO{DToHSKTyF7&6% zYc{?H^!lcMuGzG0fiZnYYkKAZuJ1Tev->OWhCcMJn%&=p++KgIX76(BXYA)SM~-73 zpQ)%B?gBl0>5VnRZ~d|{zq_d>aU1r3?F}`f$MD>$oi#74{Hrk=-%|71Kjuv2IUlZh z!$+Y1E?ijimR-QN=Y6{79pAni`cYZU`&Z++8NaFd#NHm*S(|D;b=?5uG>u(1>Uh}+~Z+r*m^qODRe6zD0`om2%-@52-WB%bjeSPJ68FT2JwXb*`@agQc^!32iwXY^VUi*dG8z~Rp zdsJWVy1DlC1F-*^dTMVz@2w^>Z)NQxb>G1{hiV_$4ZVM8Ywb@*v#`tlvG&O_@QLmF zYk!jk9B+A1?H{{ghgIENS9$4EuqQrUH}|EFfQF z)P4FXjI-gRb^kW&i;&CL)!p-Yz-#wqb@zN8=XlQh>h669&g*%-bq{PzLGO8}?zHw|@@&>(+HMcij7+i7XhLdFWrR0KAXSoOBYdHF|R zr+>HpjK)6j_dnGy`uQa$vg(EPvHNj;J07oJ{y{wV%bxn?{(pk}sHkuM(mk+iw$^vt ze*^TgFV%OZ@!S({ukT&61oH5+_0Qe14f@Sk{UvXD6YR6I>&L#`2E2Z%KAk!Pc6qM; zMY9hI@$vfiT!HW3aYy}~gn#SX>pwY(_doKj`g{NO80Ozs|JB8q?_2M# z|L)5dm`Lrr>mOT(aev=m|MX+^;Cre1KhM42M4BF{|I3s3-sFc0zyo&+pILbUEmyqkh)5QOs9%hrZta>sc4BILky9AD(sOXV4$d-Z1Mj&{1Uh z>RIvModdqMb5`ocjnE_BIBP1t26BDLtYc00nn-lhtP^{?jk&9J*42NmHj%lrXT6B} z&nH`E-FR%RF~5Fr)*GOoM{4_L-SPzX`>JEJ-t+v6jrr|Uvp%!{^Hk~HuzO7qkec=tafS(?j^~ljBkjLMe^|z{zfe$qTY5M*Q3NUS^%M6-sv(+TcD1LG# zZpKZ&N#nN!K3gN7#-eS}j_8(XPjo|c9~3{34t^GO4R&u$jwW;Q@&0r!(Y0o$ zTJZaN{I&~A+=az%itff_x8tYHwBX-H(W*pWY9AHbd9q)8Rd)%$eY~bo*J;TG9L^jLeW;wt2rqf6F$43)_gtIZ^Ie54w zdI1K-VD12w4Oy5JaoX}-~lldH`^zCho{?y?dWF7gY0Hqbmcej(~2jy;>j)e zooB~I0r2jUE|4YVK!rn7nM@*;8$SsMj3Ewi)B>wuikR1zN#L+!@mLC!;cPf`^xk}m#^QMj zt%7>NXRsl<9^dK_#?piH^B})gnSemH1nfsL=?VGHcrqJK`nN>q0qaRkz1Z$rK${e? zL;h-|fC7c_EO_{qoc*Y>flLbDa&Z>F6NGIzyLNfLQ`nf&Do_!hZmk zK72}KyAbbmVhtVztk{~K8XQkF0f&Z;@<0<{Xcp|TbS5@lk~Wq^mqd4B1FeK4CfSQu z!nPYH(CdTktZkVL21}fnOlNY*)M)5|c1D}>h6v^UfLmX*A5&UxT!B}5|-v z=h!n3B}Y@ShUxhAOJt?f4qJq6?S=aTCS8F2l3@`8i9as>;k#X73Xuzm4q0$KHlY%R zxHFkaA4|kerl(@*<0(+EU*1ng$$!AXgH*7LxmXBrDsMr=t#*f?h+P-p@OL;%Cy{NI z&5$Fn!_P(t6OKbNQ+7wj&n5(qun`bV?X@B0e+*fsz_dWMbL09M(`g z6+4K@uFJo{XdRbEfno*okKb=0IhG)|7>efIUta&f^%(y79HJ+~K zK3VB}m8>oFvBjL4uyP+OcU7K{hpu$Urw>R=m6Kdzcis_g6EYFrr`pqn->G@P;4+)tr8M;@!p8*YWFE(p*)b7CsiDlt$sF-7gQFOSioTiqJfkNI ztv;Kb9LvPB37?s{7`jHjNZpJnxu6St+Wwrrv3P1U0qnLzlpJ)6!*P2ZNGQsZY2@$M za?ygF`hb2`Uph6C%uG0Yi6wM@j?o;tt5ssN_7qH~x>UhrE>P>YCKPrGwo)66+zP0H zXM&%$M0>C;az3goVb9Op%(@75X5wI>|kOd zF);|%pBszk+;1q4w=@=mJfMz0GBpm{1CQold?*ppD*zEh4R|m?(U8rh#}ld8;7Q1y z@#7R-$4rQ8+?>)3pOacH z5TQakrM94GL)unJpn}Ug3{n(7%||v*e{hUnjN7GJB)(5BMh$SA%)u3Ng@l{sC|v6^ z+abA3@mkbmB+u!_r~Vx)n$h?nPofT`_7=6!^@O2tP?|D?K8;U>mg=8`65TvI@c#jP z$}^z(ul#Y3?2Is1DEbk&c#Vqa-U<(3Mi+e}^LOptzwh8cPyaw?tS3c2k~o%3Pi13+ z&@rbbv!Z#9#i685#D{_6BYrWjZiVca_!|ZjPK-Y@0y3BrLz;rgkx^QKdR6q z8*gmSr$5J2si51^bzgG$)uI-)35KahlDOo@7;h5K(>niPViNA10!~(HqDU0#3C%s4 zSVVctx-7ZT2&3qvFjrfajI0;$&?Hj`?2(1h;p8{%#O*I4Ty=A*9waCAyeR7-v>5v! z+0mP#e-r7ugy8u~HNh|P!Nu{^*?DYF6%Q&(WF&Y3-yrkj`FN`%IR`Npm#ob54ka?j zUx`osQxzVmA z-8j@ctokc-W4x1vRxy-@H*_dhdVyW8RJQ(RU5qsXR4Vg5I%3*{4(Jkq8s=MK1DBYc znw%V`o#(AJ8yilG_j4ki8yYLUlAP=RqeIfFpB{cvfQaHJ>LS-gjO`FR$y2fOL7OiO zOX&{117k4X8M%q)2*Ok%F)VD#)$zPt2`V|(f_DJ_C-1K3G0(#u%{4nQ z!d8$boq`@|msUw<9@cqIK_lH7XwrpRkSGQ z*z+k!5n>GeRf;)OrTv-#)o4E^_u*4jrVCa_aN&piUk!bc{f>zA08h;Wasobg$;qI} z4})z!xWpR#kKge5TPiuF*RX-e0yepB6mEUIU4I3Ph=#hSK9~SpUQd8*Lu?kv?BY3#q0}GS2Ze5tK*h= z5b*NlGU;)jU-C>mOSVC!Pt`>-4KL7L=>82E1<Pb#%Puw@9`j1OJxX?K&gh2(lRS|~9 z>F&3VAVv&PP^HAK7m1nG4(_2YRz`mvEz%uprsG!@T~G2~Le70*$Y9;>P}R;*syl=X z6AMX*a6>QdaM&dhb9|w{kP%mhj7T?Y5x%*j*X!tlaw7=|#)ga^w&ETKqrBL$W`xA2 zL&mTHZIHdoU8H1A!9faCD{;(W<5`YVxIpDOB?b)3p2~-2zq`yTf#oxUqGf5`B6ZVl z>Ojb;G=`iyE&C1N(EOjgyVqSMFdg_bnMtPU&ndC}RUt!j`^^4g?3gA!1VO>z&!0j7 zwe;X^U<(|mC^yaQLXM+aa?~8CA#|#J=T35l>;Qq*R5lJbIn=vdTTASt3T7m|aUP?L zB9WmKs?U|3Bdy9|(EEHGFFGw_UQBRf(cXN%NMW#4Ad@5{Xi5HckA!S=@1Wm!uqY;pr6i zM@B{`Cr#mQXUBNuXtH!`U{hct-h=NVwpj)ZG-!a`Q3g`TFY*VVRsHM^;O?|}1swI@ zw+J^3rBf+JDATFN>`FSneA|YjOzZ#xKL{N44meZ?+rtgkxo>TX?&BNYcf?cRE}=LBq+z4mp(G^dA4+3%EqrUXGo8NW*C=Z+J_0705)%*?c$$e7%gi{IYupUVBV zyOlajHIYmqu3KWVdCp`+2d2qxBGz);pbun1yAIzIc~inkolXsxn9>eF!1IXUYUhN- zZ*K^G+jANan8y=|qa`M@r-d|xXgkNV2QP2vR_%8fob#xggP%;qOP$nWgm0Ein}RpD zA+Tm52y>TUz}Wx_B@4rrVVT}D8=Qn9H`P06w5=G8rV&AGgM}Q~3+47XxtXdZ^#kb& zJR?31Hm9LiVuCUC)HFAXdnjn$80KAwS(MpRJEYUf=OuUXWqyNNX|eromQRUs>j-YF zkg=C7?ie)WTF9M=;qx+U;j_d)cab#>nlxJiNHrMZT&xhO;qGJQ4cp;p z4r6FqHsNN;_@3IC7@rJ#s@Z`=q5IDwS^*-tqt-QuYe+#6Huzke^JYxIBpv!~{V=F) z*f&YJkSzg(d3bgy4%(l9>ZM9lH5`=G%utAMdgPX35C$yUz!*J2UfysBX_;XQ=fr2@ z8CosOF4{nGFM;ofEpS7K}m#quAd&-GR?(a3U_#Vn0!e_5ovl)UGY(C`!jJz=*lF zjK)cFE`b=IaVDU5oS^~m0l=1$h^7%uTAsH$mFbA|!UqyA4la(<5%9l1m#rvBjL$hf zW38GEV*$rGwaSeJ0CYr?cF4BriB$7cPTt1|_V*y*fVw^nF2vG9QVM~Xv0qJM#xOHh z)5xP_ju$NE6v7kP_(%d-8FVU(>-hOoNe$QrA!LmRIA+=BT(qlJdDd`19DzYkZ2_+M z<%}w$h1R%LM*)6p)W!uEgZEH;rXzH=yP>k6`Ffv4IcH}q&7rRR`)9m*hjuV=ENl50wLsM<1LQj!Emz|P+{7TCOJ6J_5zw=KyDNud#+!}q!5G-bK)&< zytjF9b$oh3FdeYoC1&bDU2jDV>LTGGc^)$7(>8p%9NXXQ{Jj=`yDFvgUc0Gr(Q73= zRh_XFtu>C1KDMH*X5i!`-&BP0#VXnx(0d^uR(jCfJd_fP{`a9@#$<{bPMssBpe8R426s zYFz5+<))uyl~!c@I4KKG)=xO7mk1e3m6?0`#__wl=aUIQJqKE)D z!T;39T>YJYJ>A#AF;-cYr>Qb@Hz1``zBuo1?D^Jrxg z{c`Y&0TP@a)4&F};tiN#0Lp{C(#!PL{W8Q@(;G+9}47&I;lAX+s!HOH6-$AkcKWvu{M z3#ml9P$Ofy#s{krWM-*0)Toi<=#-PPl~z+k^5T3v>TMORk*;$sJFZorI(i;85vKeLJg&>p2hVs=w3n#asfKcinAwE zL*OT2M}O(xv0_rb+81;QT|f~D1fT^YpSUYr69iM%e+{Qo=jCEfZg`HRctfl^30v!h zVpFp^$7cU4B~p|kxfXNh`DO4og(tPC7H}&1v#AzK7Z7)CEA~w$*#824n^Ce|O3LA6 zd^DBL=8{7s)hr5M!dA3joJr&WYJE}Cz&|7!mdi0QuLyFPUDal;t5^)6n$=y``N-U5 zHWkD;efJ~_WWgYL-4hEjN0AQYl;;Yk^uvqRBjq_8188!A$0%kWfDspqGa0tDO>l*} zHiYrf&{fx!d+fp@!TPbq!m>?@5m&#N*6Dc;y(EeeDrkM&(dsr~2ZOvRfctbL?`+Hl zEy@FL*w6z3CK0m%SYgHu@^^7B;&)o$8|B;yD1OSYN1;gpv&}vCrQ(iJVK^Q`m38J= z5~Tn*`O>m$d%&v5Kk~H$nrp<*;8sBA`NYO@SqEyotO^l}v(=B^IS>Y*meX2_-z#ud z$fV(3g3AKt%Ga}9d~?Xqt18I%?a|gNC@yyorB&8NMbK*4o@&i>c2#G{K5UtG7;H|z zUBGN@7cjkF>ix*sFR2p1Zf4S91}VF9L53{WrIQR8Dg4U&Ox^?5(&zxE!l&9oicc<) z@(k+K+H!)bh}JW9iMgDwJE{pyJy5GmrJ)7JTkC@M$RVvaYwjA%bYCL%zX|D81YKZ7 zE8nykd&j-^+xR}zb42&RA9G0*>p&Anpe2Q)Kyl(QHHj5#!wz9FkcOO^GK*5fvj+T$ z4Rt8WX8A>Wd@!B~8|nrO1(qtf!w3ikQ>Pm?wf3E|T4I=Ij8Ie-G6Km##`_di%v>aJ ztv82Z2X+4CJ0A1gi!NBV55T)ay^6M<RTXN|ILl>v!)_>u#24xc+=7kSNjVJOqc?LigoR4yE_|Pyl2TOzKwE&h zF}!oO#9ojaiQip6sQ`)jkq4Y-Byx@4sTHUbn2sG4QXTjfQ*b$BE5;{Rrfe?ov)~=P zD^$U6^HX(r>2CQK_o2_*DrqJ#Q3>zEs%cwl7YXlK?LWbJ{rUn6Qfwy-`fiK0f__=C zMKO2Z_%3O!9sg*5t;3AEM<*)pz)Yb=7n1l3F0bRy%NrM5RYFm;IAcEgM59N$R0kv4ie14!TMlA6{#1abde+fDy~*m|0p01X&XUK|u`% zu3{78cXA1>KPR-|2-WxSKZ%zWt~@{D5$)&QJ`JvAz|$o_g_69OW3`TW%u}$+P9}1& zfMUmz*(A!l!idfM%vI6JJ*d3FyNyW;QAv){95x4$owf|0+cqnHl<^8@d$8zzKvhR& z6~%;`Rg$66Ph|E>Py8LCIMA)4wR9Z8BMq&1b9#T_edfV?rZj(}c+nMms_)q0gS%Lo zF69k?51N8O4PJ(ZbpRgU$9rNn!hOIP1ROKR;^WC-ziwjnLpC--!8)}VND2u1(}FsdvdDoVrvegkx&DW44#6D;-won&+5?vwZ%79fbYVN=YnLNvvS}giYD9&9O;fp zPUW}=5h26J>e1k5VIX|v|CY^>^nyaKn~Ju#;dHjA)i#OYQXA|H-5~e{PN&2fx-ego zw%X0c-;s?p4*i*+0K;NGH!1y#~3RyZ|7;u>(}o5 znHTe9R_Zn4C-QobhCps>^bDLi1tQN&eDlJHRJB)~!q!50T7?Z^OKF?$>=v;h0E?j< zKRFZ1wZg5`>9tX3hB#1-+C8^Zg7SRMcsf9CnRc=;(4N7mP6x6s9g1%3S7mIpf_@fj zY$1mRf04;(0FGUJJar=hQ^{2qkVBRpNUbg8r)-}n$OF^PhbVtTE9YS}6n`F8vkkw;Pzwp02?xz$K04dzonnl!pE(4yr6gcP zv}LS=5}H1x4xftHiDWl`DK$EU*2b&Fm`t3APfVg2#`59B^R{kV9%~#;g?*prjlApAqC*%+*7J(=t0ay(xGNLX{kQlk(sqi@O`=gL2>R=l?{FI)Q~o_ z4tT5=k1fUC+p&8sw-$844(NqsQ5@A+q(YcOW*-W*cjMLi7unc%gYRU{M%Q(zq<}*u zlb#wKiyhk6xBC#CH78EWfdwpJA(H+Yux{(5D2_K(HEd0iF2Z)sF79Vw@$|Bh*LZ+0 zZ`d18riga|6Az=GFMC-s(8dyOmaSORu@FP=T>IFSQZ%yjEzI1N8iRH0qGTc8r~Oof1V zk-LtvhJCw308&pxz!Y2HsRG}1AE{{A4<}mK`3>NS1=wl5Z0o0%_3u>_f>0A!H%#xB3yoCmIzB< zqGSJrK$@xjtUM$)Kq>~l58A;0WOU^JLfG{EN~*PuN~`akP@_u@-d=o8n^>K8HX7s` z1D}&&d){RwBN+#tu>Ghm+VA?Mt)8ta&{nKt6XviMk49IVjt^L?r>MQSXDXLwf)WHa zlxTD@QkBz>6`GnC6Mru-gcJrI1kKe^!A1RMM+f*-*$7M8Tj)2WvlCD}8#}x|wO=Cp zICE&Yi4@yuX>XF^gEN_u2j^D>9MlUrDg~i+BwNDZVTBXM=6sNdnvn0;6hAU3M6wmA zqx)|N5cM@+OD6(!IX`_!);QQ3r3?iFWfTPk^)_0t#7nCSDXY{dhUMzSXp7ZWiKnLI zo%KN9Seo5Sd4P__hVvO5MmICcP&DN8(W7H}Nc)=+v;&m0ljF69mE?(p?e;?@L?1Oz zFR~dN2hS6bvTrI86pDG`QhI&l>%fc_SvV>ESn;bcC5-&ScL04+GG?U@PM5i|R?pQ> z3r@|VD~98KK^$vLG>X@+MziF!pO@1$~#cYK2}a{21Q+cM+maJQKala4gJ+2n$)BF<14;Q5I6A2d6{eWk=xrw zl`75iBg2#lfHwZ8{V5leh;MCCbPnDtj$LmM9l?u%>zF)^^@2xUi%c&t>2E}@VMuaS zxljeKqN~UXif7~M{1{|)M5_gX(~x=+o|%L7kV`R)w8_B%YDmR1SU(~;B(*w; z-kVm`Qp|D2qF$viBOhga*u%*pSUOzCfA!9dY67Ax%OCz`{2VMWcC;6W5J$?Sgu*A{ zN7=p-c^;zm_#S{45AQnBboeq+pEY!J9B#|KNNeGXw_3`cjk zj)a;nhipBTRq0r-!Mp>UZ~-7@Q>-kP0!;7;E6=sfRKLfU_A`X<#n597fI`UFJ4NCv zwELN(|%W?O2bG1B0xpIAEbo4xr?36 zp@u~oG$B(MdH{X52;akANKV2B96%>}u{(UzK7 zVqpppi}2?PqELK-jrhDGo`-6dx;Nfd0|+rEf1tbVu#p)Zob(II{gX}TGbAC<7AM8 z&G>N;6V(#UyHQjJYzQ$|Nl|AkGivA{hdG3`6nIZ5A`l}hDD9R}D3JQF7u=P{zwtv% zMD00#^Fv&F36nSYTrl!KfWKEArjb&*=#npwX(=+Xj72`QgiWig@A+hNvFocFr~M~(Z}+lWOj2tfE)Llg9F$_>{W zNZ$erKk|)GM0Fv5!ti?`sT9)}g}S`GJ6?~Fy{~gpkd}g>ilqXEBft|3qANSE&0JB= z4ln9Gh>VE*8iuUR%BkB28Nx~e_mb2awD=%kpvJmujBZDs92Z#p^|{PN0mcwhS?S{s z-Bj;FOogVpU_|k=7eT|ORlz-IfRvg!Q>6gz z+`%|76V4*lke&9(%(2wPNyCle#mzc#m;ETni8dE06ve+ zNt$BKe~7#(lvV!tle(4k@;8;8sy1JNj)aeRKSjBQ z`wgwcPwSdIR_TlSKW#Hr z8R-YvfJ74w8(RC>rDb2e(7u5*dx-$j;+j<=l&;{U2Ec?Gx^t@nX;Sa1$fc!PgP^u$ z)eaR0bD00zgdIe@I@aihh13u%wH!%UWz3NK=}Qc2dx*)J!=52L#&=aqU+1! zgB7x%5FY4VfD!~V|1fojQQR&U<0Xbe20NuRNodbVUq3!@h*Ov)n)X- zN%sew6)Be0yR?~Uz&geyJlHI85Hm@x?qy6A-*mwmbM7Dpwn?rgQ}to?q+`xyzRGxu z7GLMf@ABckT%f7wTJ*>~fgQCOdnJ)yFRF4fszM%aM!2Hi?7&7ALZz|JN*huW(?D)Z zpG2^A)TjK<-QT|>wrc{}G6;>VYMxAuike>x&&AMAd>2FcVdYc$>K&*+*x9?Fiie6h z&O06jkxvaB>&!b4UFQOS)!mGCq^ z;o*{5QkYRsQHmmwlTEArPvdDL*(=_qipY?P>N&bnWxQYr_?+&02H(NRr7fC<0K6mg zJEHpFh(dB1tz2RessW`J7X0xUxRiLO((sh1oKQOxC$!v2)B4uf`;tSjjnx}PWamF3 z7ov4Sb-s(Ji;w3DupUhzrJ6;#207-aO!!;CLNF45nuQ=8u|@VP09C!(E@@4d|tp?HPYT;zO@P@TC z07me%?vc*+58Maeeh@fT13PRO!DoeH3Nk_s@T){)L>7 zHjrG?gKyg00D6Y#E)ObVr8@vUxbY0_nH zcszp}%I$bsCsKH<>^PbyIk0x33|&LGlUn}@g}zh)h@_VoI-tM|Nj`7YFNI@%+l)f{ zNp0kOzDangmQEKIqutas7$Yb8QB|ap8zAU=lNrTGPy<9Dg@u6Jl>EOIdQ4F4o*8s$PZ%!H5i0g1-x}1QnNUa62~OY!*U}c zo9LzL;5B1#xs2mltS;!DgNDeOpG4Io$11vse3oy<@)(Hf4#0iDUC)M#tT$zDfK;Lq zy-*$P?;#UEh90OA6?LE&jBs~BR_D8vJl&crqYGHmSb5hhr83v0j(QqtY_V5rSE^A^ z8PUt1sfkN9FEY_{a8->%;_L~45Cxq+tF!OLD%3UZk2Ll(ID*;=^*9|zj1jlz9hc4l zsra$vC_~3i>m+qc0cd@>%y`ot0UPjdNR%0^)(AwYbwvOogLTTV1R#!@g5>&19C!)= zOAqA&a!Qn0hY)@5V=phib3l?W04O}>*sp`fJrB5owlpZ_Ccsv-#Tr+v73({2we0pY4@YHNjVPn_STE-yEqSF4 z^*zJGG4>WuPTH2Ffg?|UM_S-xJHf@s{rx#s>eUq4fKT!}g;4I(KBW8IF#x29&+8Ae ztVh$2+&m=olwk}Cne{*cbo`L+8-a_d&vV*&Hds}!26Du068K~dbStYx47*_cFi>oBb@(K|>y^KFR+@atO(mc zpxyxft$seMR0b#h=}5tGXXGdgt~%=ZvhAjjm7_ zk$88xe8+ZF)AVuTjXFQIqZ(Onb33~dX7AtPr`f`66NzNp$l7@edQ9U7T0>_YCpFj&JG(D#l3!j--<5WEn z^U=g;?Q()^o}jAO?gotMD zKxf0(8S`g?>IAZ~I7n7fP@RmrP+7632(y84fQ)SeLhFwLn%?sDqVuQ@srcnj3F`M< zrhJZtq7Q;7J(r$-PS+5*PC1C!%qiU~8Tcda^!q}Xg_QZ*yL;`L=Dc*3x{^6p3BxIfb)mWbkxv@QK^^}mVE`XM#+?#w` z(a&>gy~mS6^JoOrIy;w{V{0*Rz2PIcj@a3yWvNrc=Y8~9x| z5Lt}#kmhr~oUTf3KPOI>dNOk1+o(9PP2pysZ7Q{Fd z(esVhFR#33Ja@hX(1IrQp4ji6l{_H@sX8$<#7uBfhXdX$w8_@`9V3X;Ld3|GlEd$^lt!|*&tT{ILU+r z=>ooSQ6huOgq(MMVHTZW3s6B-B#VcIX>Q)lAG7S`m!~>~$EJfAd&$*#j|Or0l8-)n zto}U9>Jb}sj$25KXKmlG9KYm}oqXvzaJJA8{TuGv~?f~))FY9zU zIEiJtp0mKom=)`ijnn90@)WLBNR~qO*m6I5EhmGtcX7qCz%vP7OpA46(3P#DNO8}u zm6n|5yes=A7qM&MUdZIBQIl`77{)4%E|(19k!^kS((uUKJZ-yL?tvdT{iO0ZXG!?4 zD-vo2tDPoS={YKf{9e#g2jQ!WCijVs;EDZgQ9PZ`E<=3w+`1*9-dVKqB3|XgZvTmR zxO|>Mo~J&68w8LXO)>8UBY_%H+&Ud1&$z5;F(jhm_<|+2yyb}b7qEB;FUCEzi}h2QkgKt`oj)At%>&CZq6k zO_1^j(m-ZtJfu(i_uyNXGrrC}jWCh9&ndY_^=uZeM7`#;Gj@XbZMGiSLh-urj_ige zG}{7dt{k;Otx%IY1zcy6WiwjLMCPKm8Wf!no^VgY*|l9Q;jB!TnfY7ryUnWO`;0sQ zzG!zk0iSycc`HfzKPP!UO?Wp6Z~U-$=9hckmB<1QUCAJrU+xH=)h_-vCg9z4qU++3 zmY$V^@Z%oM!gD=|##neo*%|&%HoYgMhfyZVXJ?_8~k!Hf{2Yocs z9P0)9M6ZyMsd4d;;9Knei*Cl4SZXGOk9v%iKA+=kK_V^#<+At`9&bx_$s9V+j9_6< zxsRoBEyG|!>iRQ~HTW8@Y=DzI)s##%VeF=fi@FqBH1Cd=5BXR{(Pqb=l^Y{Qb}+R zih337ZS;=8mPPpFv2b1Dgyqa${YhBy#CiLD)e%BDR@Y>v8VgF|qsZeIhib`1kDS(` z{fJ9_i{jw)7QV7*;U052&81%kkD(^xYUZHrc^>E=5dLl>LhOzKw8P>x-m9e-n)L2u zPP^#Xu|JbM#xy@R%vWE4uWZH9_#L0Hn-X~{a9;+RAX7HAV1?O5k`IaM!tCifqg z)RwE}Avxlw<(Mf+Hy@k^KnN!QIQfZ^`Jf6j(vgYszZ6*gdBB1Ls}RSZWk_vxZ6$ky zeZkEYj+)}TpaYPjrfzFpK&mc!=NA_`T-t5?1szp;w8Y8Pr)Sp9r?NK3MFu9~u3{-+ z2xnj3-58?mO7w90iM1D$#j=TUY4H-3w@++PFq1bb{B%Yeq#A1h0OJbvTC9(R_Jf`F=O9`4*4P!)f!g!6}G>*)y9x^QT>=!Zsf3@tI{Dlrf z`PY<~9I|Y3KGS?SiQ;8#fKhVMcVW?<8W!rwEHd8w#`Yd;O52WDW1Bg&wJE z#_)pzK?4!?ngI$`KLRdx?%r~5jgou#aQlGmqFw3`XAFW8$uV655c|r{G5!7Nit&ry z3)c!+Wc#i=yzDLE|pFjAkOQ5_l=~hIa zqn$bpef(iRv`z@n_YxC94iOm&EhM22!jL}}ADzNgG|2CpL=lm^rM`XkUOF zy&a-SiW7xH@L^d(av0(znL~yllxQvkWRHpW@ggai3(lDFlTE{k9E!EzF+pdc9J;%u z&;XmNX?zry$l$T*C6Uc6QN&di&zoY2lw<&&r7;^hA*l3WA%P?bYAP8@;8R&m_}`ky z4oOpYW_%(Yhu*GD1fc_0U;CBb@7u;3ulWwR!%VdW<;bwT%fK zwM|Hi(v+<~K@V?XGL}OOViGm>4Ewftpg2K;}VQdLT6PZp_l1LFO-1%3ob{kR+ z@;)LY!SdE!K|9~d&}AqT-1CC6(cB3tdL%I<^l8nc>=G)L`h6_ckB*frvIoM44p4{b zmAyhI@TToUJC0=dQ&n(2kj;5<_UKlSR_HA3?#8~1{(778t%<=BQ>>D7Mxpd15vm&_pOtobGQu6Sg1}>>J@4;U-9>o3oQ}?_~7WTK}dUrUQw159x^?YGl+^fx+vF*}%bbOlC zGgt$@p~SE5U&?!{;;QUtFGI>$=Hh8;2~}q;Po-uTGj}*61dE1l^GSh$g*#CQE#WXC zHAs8uHQ%Ku(Hu=pcyTodi3eGYh`Nn;B7`HgxgIB39BaeK3Qa9ZN0U#7)!8}>Cf|7# z2@V6tQ-$X$H50NqiGsq@6dKcHqJ zzY7BDET|S~C3+AGGOWFK>Iz)mSD_UJq1${%u z;~+zKgU?a1AoXXbOi}Z&JqjKQM~X{!xACl?IzNXF1>HO_Dla*~$yaxmRm+%$FNER8 z8P~k46S>T8Uyz&bqtRSuD*TXT>3G7Q_wOye(n;nIUG-Z;E4OX^$RvF|3q@hl$d66p zP_&>zqIFd3@qH>36xkd_v&^g_qgjtrG$tjBk$h(^2XGfxR{*&fd<$kW-o;JxETF4UPQ#jiOL@J&=+p8;L%ey6iZBh z5RBf|;n00lsA8*;#ZP!;0+m*}jz~d{_{KZFVk{_xu3~2z)l@~+3k&OpwV@Lm=U7e4 zUzk;5jopr8tjLqWkdJsgtT9yh4H&+@ME1o_KL;$OvCt_q-7%#C)*$`z0S~A#?m8q3 z9c!Y>O)Hvev6=~ltfeC@b_+HT^4Gk^Su;IcTr@N~bVkV_GU41Jl?ODG8?*Tw(z-5aeu94rt$2-! z*4z6Iib-^}+Exh6xp^f{!}t|#)8Ty`u#dh2)@FM0vs^AWm<9&*(8q)Pv6cHgXKV=^ z`oF_cDY3z4X0MbOaETZ|c^)BAE$CB#!_bwIXEP(iVNwmiOx z_pRT@#{TH}p?6gyf!dLRDzDe+MV;izYLvj$lJF_kz77INFR?xt;kwkbE$5X~Rooor zxip~pAyZE-L_(_2Ae5w&HV$u@mGmDdfjD3B8?D%2AZy0^OR*{5r|PDR<2_bUY=JCC zc#?nNhuW?bbps%dehcvQ;}h#@pkdAGE%G}FQxeqpogKh7;9JzA_uy}JjpdhmmeN=} z4eCO_VoLwgRJJ*`Q({{h;39-2Ka4~`1=`o(mPV%=bec}eRKOhH5cPVGMcMLj8l+pI z&tQjvkalr+p0rP7`;b$YdP|&C;b1A_vG7{oy$91QcREemZ?s*6>wH8#uYi9HjK|$e zneAWZI~n)Or>u|%PPHB2q{0YeLQsm{5%wja-`Af5M1P6gX2uvbbtx#HtKbtJLW`ke z`RXq24nn0J?)76BLYfn^tNl>+n8?e(RV)lpbg5@~Ag^}SXaYQNkg%>_ZhCOuH+b_5!J@OE!+XKy7js=vQ%a|*jH zbYoi}wEaVPz7`wyQm>1qj1==&FUMfPHkpi#^=(!GuCU9+L#K`sGhLX>D0YmxC|Bck zIB>sTzNh4Yoy!X?a0~>EX!$r0$%(*wJSJGo(e3VFHPR@20(ZiNgMJ9}+Ndw^8pi002*ScFzO|JagI&Hag~eXdfdnp}<`P7D}%f_qq<+0QH2z`(COJ zvd>|2b2z~*4je`FRbSb8g^Z)^JbkC{?mI~1^}8QEjn}HGfpAbIzgQ>t59L=?0|!w* zj(QxOfVJQV6;T>z^cT{TM)yE5wtMx63$@p^57*UYSQMCWp@25k7*m7M41Bv-=);5> zQCCaj;bPVhyCc!J31!$3(H?qK%Sgu)32AE)2#PZc7Q}vVi2b@~sY9FuLkh*REZav&~=1rj)9XzF}SBn%uvH7@S6+s_6Mv1 z_2+j!lO9=MunrZ~Y9^)UT4h?Udi-hPSd3GT9675rqZEyvSVtUGPd4$-|1IeB=0fyq z+=nZLnv8UVb`NT0kHmK2g@djI14ily`OAfe_VqVumuLAzkh2c?EsSwD4Iz>(`sJO0 zYgDb*CUR>=8J%Dn2oM7d$?o_T-lO-H4lyPYlgswAT@cbhXqAxHs@GPHHVQ+I%|N|v zf~fw>CiJA_J$5I|Nts8U!fuD~UJCyb_$}vCF1NY+c5h8^{JZEyhb+8UqjM)`XRMVS z08{B$6YM(N&kc!-?aNc5g%-o)9w*V3{!_V>5c{%;n-|dHl2c_uEl;L290t&R^AOZx z=s)nuo{!#}yKpVkPQb|f#Q*Lxd>h@w@kATGvkZl&{pK+KMyn6}mB{;REuxRx@a;~s z1^*8KGq%a4Qv(>^^JrbFkkZcZ$w>$fTrK4SXJF5vW3A0?=kMILV`r!Qp}#Ie@A6}9 zoy+3=hxhF1T$a$6wOh9x>fCZ@;NZ6Y9RoWL)frVTyoih$Ob|@ zlEVP4)4>BOU!)l%dnP6(r5DK2L}F5Wx6W6P4-rEX*A&@MF~&^hVGPwos++`gQUCBe z^kJMoNb z>eUlXuxPl+)v=~58qvvqxkHQj!P~ejbQ=LDRmhUCG3F)Zr`D^3A_k=2?=HDrm+WIu z1tjdH$?w|lk7^df{Tj87UDv&urZilsD0@iaD(sG4=xDmml6g+#VYqLD+}NJeG?d-q zqp=Hm#*fEOW@ES=4LQP0x0p<@XRa#wNJu`GME_j(jC}Oh5<*0;ceF2Z+-~d!jxns3 zzj=4)iQ7xw^^jdIT~HZ;8w0pAF%Gb+6=n+G^~jI%hTOT&g_R{iC{_4AjtpF=9o&V_ zX5Hi4)02uNaO*;bi9)>92wt->T5t9aZd}j6pa*3SEs)rXDZLFPiMB_QDGgHEwf|Uq zXKY1?Q2Nl{vw83URsMrF2=3r)jW-M&#Kj8x0{}(grDiVUL@huK2HUzEZbXoTfoJep z0?)eDsOcVuI3LC3$H+Gaiz*GY41h)t1w#zfR&)cnbQgb9GBf(89S6Njwv_c!kCeEf z;EM*vY$iFMlMYcqZHQf**x2K7PPkabH#q6l>4GOo!!_{ROlArU_BeKiOLEbCH<%IK z=4d5tu+&J?;HL_DxS9r~4a2ZBxS*f3km0De)T8)5vDy~mc~XPbJZxcuatv~5a%}aR z68n!xRvKMlmm~AUp(A|5p&yGvE(A98Cc$2DNTUesxw#n4G2T~lWGtP{UEV3g04KE5 zsuu)=16>ykfZ&VFDC@LSuq9QSUxvf=8D$H4_3Aj=7C0?A3|X<#ikaxnysiib0Bld@ zavmmOs6f+VRu)Lp4NVVxUd53Mj0Ju16us@kNJ|;b#G#Gpfd}vPqY~sRb}HF>uoZRf z8tjg(vqDv7rFl{+yPodA%G6QLZ_%eo6PT(v**lmSQ35-dEAS-i*Y2sL`hs2I9qDk7 zS4EXRZOr6LGdSezHa&=<4rV|K@WJGO-oE>y!0npzdZ;t+#6}uy>*~x@iY!vB^5Toe$98QR#Up(`z1rQN5cNmqzfWgDQqF9*ne0y&n+WBdmZxM#v{-%8-HqKAb_qg%BH^0=#H(%PZX?{R<- zOsrL%(c>T`_MW1VcmlF(7)&tdj=V_y{mz<@j(-$K&K@Xt?ZJTp zBH-!?ciM&d(@v+-T~;t@{$#+HpvlPOrHa?5XW$(Yb)K5)E^1ZSqB>(2i_U3PP_2q8 zKD?Ws@iL1Q2m17wGU64kQ2*=@5w1#&swsJD6|B!B?q5kl-ci!^gOft?xf|R*?FKWr zqZ@ZrqAPj=*IC&6=a}^6;}wB;82NkdVp)b0{QvJ_p%2PdQ-$9dW6doqY;4@oTxb9t_5W*ku@upCWNsc!lcg{cLkqb$%0p*kA>FDko;rgyeW(Sf(oJ<*lxa#1 z(I{BML2UtcD2p6Lsn!E;q6vW~JE8~hKO;^Tva}!X(eR)kbqo>wu2Co(T;|-W$ZZX=sY ziH9Hhyxazqmvk(NYsI_y1XRl14!#g$b#{N`N%d*IW0Rxvv5VNOl1#Jli&qW|mE3e% z0;C%M=rm;sEz%Hk`pG)g^Zhn9p^yX}h-J0M)4F0HYX@ zpp)XbR_9%lez2*<-Xo@Wpn_e7IBBjbtmJd|hZcOo<5{l)|D$jO=BC?{a#8>lU2=6w zDei?19cBy!P?j&OwQ4)qGA|q4-7B#y1i5I~dl?GaUW85W12sRR7nN#avSkE34ks*v z1>i3(OWvdKK`hQyO3&PZido)GEslQPu_hts;Hh5bB&&Ho42!#JT`QibPHgXi_gg5N ziEU!r#t>S_ffj7nFK>sv5w9re7p~pB54{hZ?c!Cfw0T-9UjK7HRhk zP8H9-ftQ#9{H46N}^qqe1`WixGBNfiu6t$A24 zYm3N6NJ!hUF3(p|yDPs7N3lRWmy8UUt!Y5qr}p_E=93acyLYjEZt)Fu!OL1F!|F*> zA7i}5^*iCD{kadI`yxl|;$11}PiHe2PQjDeHtm!-7?znpC+Z@1x*YVjQ<$tFZ!*1z zlZ=98$n*+Qn}ycn0^xrJ$)T!J9~1!1g&9L6DX@%p#h+73yi_XFQAfz zrO>?Z8N!009m0by744d>=E<`U4+}vL9eP9HA=gz+3k*Uige$zwX?p|f42MsC#ELVJ zuAqVx>;Yv|BhB|MSx`_2SlyMn3|mE!zp8hMes0<=N(m(X>5yRqblY}8A#eNr{ZkWz z4D;a1XQYwf&R^Owl8ZNy%nl~T;>VZ}qx2v-B|sF1R#>3!YP1{HwTFV@g$1ERe-M*Q z+f&;MNE@4_mTQ^0QUWEQNK-c>h%}4}k45Tw5C(N+ZW>I-J_)2U_h670kUhX)=Lj77MNgmg*kt& zF0%}m+GUTYGbr*3k@mr=@fDIQs=AWDQ!HsvGZmBqZMD8=Ianu8hTrjbzFFlpRoz7f4xxW$TDvoL4WL!D_vX;GetJ{OM z`lYqy`y_ahx4_?lGmBp6z~YV(v~mfb>Q13prT{H=S9rxj>u}S+5ZbtU<|(!Xha52n zRGuY;s|3&UU<4n}67eP|$MSQpjso2Pbtartl54{Bf-6Pmu>J)ET3UwXzLqHrlpFz9D zr#NtDHjlmaB7YnS(>W@&ov}tFA^@N0B#*?t5rQG$c=ju(=U& z#IkXx;xn;LvD*pGU@7~M)wvt5On@a)h(1I>K;Se%{hH3D;#bf*56K0>vU(@MLd27o zutMg|=tg6EQ-{x~5~iYE3O?;A7?vdcctR$oCYxr1XOM@>+$T?%1jdNXu!~>kp=y8F znwDH2vcNNvKaufAfkT{uuNDE>12#(bS{xP78gnn-hCX~!jow&DV_g}sV|D_sCQr$- zYJ&;c42?j4T76nF4#C@x=me6{?qth}(UhFbGb7v9H@Dzlm}l#af<-DN>=6*<^LG!Kiz9x>-1H zhZ1X4T(NyDPZ0tEsd&7+3x+jr@`9QqUuYgr;}$C9U z5H8;J(aYq#g0>**9o6E+Vyo}Wyp_5&S1xD@Dz1tLNJY;DGH#4sfW=Wy+v4yBBBi7; zJMYq)$=>W_CfT1w8I}xL>CV6WJ*#5T~mL?KW&sd9*94ivP!K9dGbNNPe+abgsm~A^42Ol1a z!-bD->sOOdaIw;8ywGS2HJ@L3O538fgau>iT=KKIEj0)|DY`CiV@MG^iqx~wl6!*< z7;NEh`7`+XHz4#sNgaC}8&X=`MQ)S{5Okd0Hj-hOBw zd)>XZdOtAhpOZZ&_Nr}bFfvH$WMa3``FlAeR4B4wSF@=NMnmU|8b)D#jYbsRBCu(> zc>=FR%hTwmLbR&R6R*aFO*D$CowVJ{dcB3T-TCFFWtvna`P6w+xJjKx{N9 zt6)$?<8yIkw6U`s`^nL+dU3{(P?^{ha}#+s)-=XC>%gga)4XoiP&ud^^^zldR)BFI zJAx?VR4i04{=azlc(kYP_`SV@iMkmmX<#zea*s1(LO6o@UALU$S?gBk>xG_<^rs~M zCoLP&5?aETq4Ej*;a%?{SBTBw4Nk=SbRrh=U|{SxPmS7^pO_>xZhfBKnWoLgxI+pf zx<&_b2XMk!kiIZE4`jfdZhKZlB|YKj9q|KCh>=~dkE68#)(6jb%LB>43@K=t5WK#f zkMc-5s$lD_O@)wPcoVW!#Acugc58-+C|RT8s42$lno0r%bRXKQj`w**u#mr=dLMP9 zdpeVeXlW9=1@ZdE7!POMg_aMU#TQNHDhuZLN!f@b{{q94jz?oDlI;@e8>^dr<~_%zz*?2|=zv_AnZFBJ9P_=s zoDmw8xW;yrQbyP~b+>VY^cAY9$+z zOv_~+I?PyYic~^Q;A7X57Vn(uC?2-fR5+_ifl}3IUf$<+E0-~pN`*^@41~<+BmiSG zk&Nut<$j4#alya@NKg`DXbm?RB#63hnZ)Qwczs3#RBW zC9sVU-mL-CgVj2imEcOTNp+Oxb|!h%HJHRq!w&o>`v_w&`A zEq2`x?S~N-6(T_uG4ZzJw0W$ah#9jvU4Z)$R797A*5_m+SybsQexskUt@w1F+L<=L z#pb;mm1wUn4UEv0#n2yUGJ$6H2}>SmYF}>7cGOQ^;X&_V)w2DoCu~1AL*o<;;H2A? z)HuVUuoFyD1ff>GFgNsvHjLEiQaoV3fc}{3^0g@}rPE*4TLzIMnlK>T=OCJmo$8v# zzjFR%aJHT@cJ6&LqmMDrD*RXuMQx6T%T}& z^wuYK2fIhWW?ln%urzh)= zw?FOCJ3)eRopT^9KaXM}KfTz@=RG#*^}C{d2p}MwpwL8tdVdjbjl{S({LufPGsU-Bm&^#c%al9Kgk~!cd~9HCsPNRU?cS$y5#~(UKw9sIuAy*hp(j^P zA15s#$8^hlw|JrD$O+uT`Yw-d*MuhUlW9>GpT?gqX5319O0UC1)WZ~g4DlJzIVN-L zb;Qv+_bE^%6e%CY=+EOQ>0PLJx4xrqx}$t$&k@h03`BY&3cqnnP1dT;^@slUn(zI$-yYWq{DlBJ0X^e)-kmka!)6M~Mc3yM`*|Wr9l<((xuo z(&3>_WO-Lz2$vN@P^XhvJ1z+x^SboLfhIm1ua+5Z@z)Z~ige+|DMv+TfdyV`2w`$1 z!P%TFAX=##+B*x-_ZhJ%AqwEjTH18WU&cHH=0u^0d-Mc6N=$)z&y3IH;tUjd_kxLz zzMCw3Avv@wrE$Qj^a+fIo3`S59iwXh^p294herf6>Q#&!l!lT{^b>G_`z9~QBz?i~ zmsn9-!okq(*y+gR*rlR*PDpE%Ve~rXDeI?ry7SEo5}*B2@tGsuR=pKkz$sCR?pU+V zP(#;y-Sf+Lrh|PADjH^7s8<==C9^kt{sI?faH~QBQtJE z?iHY&_>$Vp5}&0zSlo{`1vJ9r?6UYN1k}Jzc5FN0fTutx8pW zQK?^Lm8#jM)XLAx=k0&OC%%8_Hl^mhR;lb&N^O|0)U*Gt)b?pgUHyBdb}Ulr<0DGt z29!EIsnlEU#`}+{N$Y zljQS%u2+>0T#Vn>$mhTPL{&a|sZtj&lh3c8s45?Ool-x0ovM7kPpO|?sH#%?mHOn7 zs_L$UQh&ZdK3}>>RsZp)O09TK)!hCSrGEWs)%dZIjZgCDfoQ1n)~mSO4VJV z=Kf%|QfnVnbAJ!KuA8Lho$@!O-f)?k*MFx{SDm5eUA;!B^|fl=CxEA`a;jr1aM<;J zwcx1JlzO^Ttvq*zQt$bZTJ;OSdBV%8^E;UT`;V&izrgrgcdHG{uorh+BA<7ipf+F` z>W(|*^R7K=<4e<2q~S?*=Iwa?@rTvst9q5%cB}r39DRz~{FQfLpMI@&?)#cjQzyyi z;Zz6MmHOa^BNbntq|~`zid5BHqts0wja2P!QtFdE+sWlOFn;QunQnEdBPMRAgW%a_S`T*coq)y!Mh= zN;MuESsBNBKe{Q>c}ta2yWSJ&nS$rv{pU#HOTgp91Ci{#2UNs4IZ~MQl!_dCUu56y zGn6{&w8$IpdI5a=mB^bP#C)koBbQtcKE30=BUgO;e5H;)I`X08@p=E{ko`qsZS^3BBEN;TgWx#t0_zw6=1y+>nRH;hDn{PQQ2+H_as$tSK- zk*-AKf8K-N*S1ZHy#3vv&l@L2?%Sv$>rbCFb<;IUUAb`5j6IiuA1f!V%w7n7`rD*+ z`|iPf=TF-6rHG15|I?)2rJn`e|8Y`!3HCjenKX9JA{9CA-brImU!)>4mrr`r4|AaR z*G_udhw$F74o-U4F36e2yC+?(u&<|GH|bOBL2nDcBcGrD)}+teGe|i>9!=~LH3?W-@Sf^QvbG2e@15fc+$h0PE?VacTIZyfu$I) zUp_zIH|g>3e?>)lyC%JGLW5HE$5&J)frlTytD^Exz+c13^7%jWDjIu1A8)_9qVX@l zTgQC)eC`(&lP~@i_I+Q)k+ZMIe#9&0{1A9~=kWe( zK3uVC@g5bKbYsQ($PG&U=E{mKao}Ok3l-a&W~s>8cT}AF`@bpG`~8Zchn`UCyXlI| z7l7A0qZK1>1RvgYWySvQT%pwMXIH%O2V0do?)ZuWi{eThJ6v&Kc~V8XFRgg*NA8Eb zOjKNcTsLI+&WexT-J#S4J1RbTX--A9y{6*2{nx0-@D&yRw(Tj%g=rOcKlKKse)$dg z{KJbC_qU{#dgnJQ?*H&Rl{&bi;(M!?f-kEp9{tJmo}1_r;aRddm6x?tDfQ7)D?jx7iI4|{%Bw&8TkPMC z%4_x6k39lCcv|JnKf(MLf1>ic-^qjiFRFatN$Sag$_IY^IPm(_${+B#_TS0p zbDymI$y2kiUZ?Uemvkugr%zNx9>qR1K2cTmCJ4uauc@kg6P|CKRn;`(GNpdEysG&U z{CoC>sw3VAd^et1HRa_Gf<9AKM?Zg*Qr*{Aov;>kSNFXtXX=Y8vc0ov*37F^WNWhO zr1u_D>WW9I+LPFykG{RC{fl=hb<)?XPMwZ*bT?OR`_6KuUY=RCtL|8({xYj-Ulerv z*Ns*Cc3r6=JHA!*#@~Q$ZhO4yO&9g3NcFd?-U0a=>ARrnJzFkT>d=u@9|s>qmVcq@ z+V5Toer>3_ek$lS@j}(--iF`b`{t_8z4vZ>zpCn{(LCht7piW(4)DBhZq=>VFH!1K z->bUo7b{g{*DY1|y&2DEhV*CToHMJwzYyzs=Ao*GZk!FdTv7GY#rJ@27Ru-QuC4m% z>0L^F@7k(gzwaCsSuj-f+daQhk<;(5`qKp%_x%r7ACa1>BJrPB&-~X)70Dc^Zux2} z=x}rO{Mmr>*axat|7a=n$HMA$UAL>qnijqk8Y9wXmOlUj4@E3fMk3RKIZ$@GrPm zK0kkC^;_O@qEhKURbO}}?1wXItKZ#*`47IQ`rY$;pjT&CzxTU&e80N-0~Z3$myWFd z$We2lFRSJA=G&@2e*J?gGIdh*Cu@PLH;Zqrz8CmV8y~O!?#b6E^^W7JA4nchky%64->;jk zB5i-Iegyg~GHp%uBPS*R_g?w@+`ZM0UY}O###HsAPXo`Vexmv(@5lNJk5~Whcldtv zmg>Ls1222>)h|3%fIjH0{_8g||5J-=)E7UY)OBq&ktMJPrkqz(aRc#9 zV9kspZUUb?SaU+=G~nR}^7)6Rn%M_lgkAbJ`J8u-e17IHHSK3^1-|d8S-PMD^0=mE z+0Q-$x$x_n*M8~iurp`L=k2%Gta=N6|Cd!Y8(aE77bnzgo(@}d)B2hnwSaHxZ)?uo z^asePb823{<0hrzxthMm9#rZBKdwo<7x-DXtY+xv!0*~iYeqKzK&kzA)x4A6?|880 z(^o#GB4>W5=JS{Q3h>=0pYvXn&!_jx=d%~qeEu@*f8xTLFTFkre8p?Ne9L_*a>~bQ zZh1Hj`Tao6t$%w7HuR@zzV=T1`@foNzB&CjN<}{RMq@EbvNwR-8Bb)bBc-_`T3d`n!z`1Ewz!O4k$HLR~z~2kCYl%Q5$^tG*g?@Lc))=Cs;%--djcf0KM(alCw9`)uuo^I*Tc-l;wFx;vGcd|B<5cU=ZL z{&DTDy_o+SL$$k?0`BUoYR~z%(=gAUYR~Q74|@KAe17?i+Vk(ndspnL?RyY>J^Nd= z`xNM8a8>O)-#tUAQ*NpKSRLTsa8&Kb?u)6&34OIU-*u)^Uw@$X_HSVy*F9AGjalDT z>eBzJz3+p&V1KQuz3)D(@2!8Y{oY&N3HkDi+Q)A}G&s>D@chvpr63E~B?z*S9V4dy9*FC-MD$wEab-z9TFDf$c z!*##=b0zHTi|T%V+rPq(x~=XH%ie+KK2!H6+S^Y*U-#@04?=GIsP6e)2b4PNo@n(- zJpa`fqIEy}sEVBR-RR`s4XMa^e~X@Y@^dOOdq;HX2Y(EEvOjv-MUW3SM5Cv#Jw~aX zRng9=*pFLJh;I7sXJH@S5#97-$eq~L(Jd`l@7PzP=kCRNesn}Mz5;yrct5Bz*&Uvyv;?=8MP`lgz{DRt&IqZhx3b*(xz`u?xLKUneQ=tnk!en&nU{p62s zSCN(bqBqXRdv$xFcWmi|d_E%jwM%-S?=Ojd_peVX^&h$D_dgE$eqSv5&?C2iPEL*f zV0jh%*^fmZKI?X+zHps<{(GN%-n};Z?uP@m^E=V!s(`mI zAE;N0VOO2=j{3;)po5nV>d#2mtoq0p{{7?E)mJ^W68rvAeeDt8yM-6m*L5VJf4*5C z9hn0^v8Vos+b&Y-_Yc<}c>(Yj`%V3cQQ&LG-1-wAKA_awmers1-v5AIe|-JPlQ+Wd z8meEB#W+)LslVVc;P0(F>(e)W8S;CMe12|!{pb_lgME9fd_KRwe(!8 z66kQ*zWNW}@UV&;Jy3t^&=V@setG?WHar6Och&#rCiqMFqw0S-kb|82&-&k2KtAn0 zs{T(o;P;ld*1xzCer(eh8fy0Z0e!ZHfaPhB~!jF1u!=;;mcc-`EvgHZb&s7bdIr=xyUw?17Vc#9_2WuKW-*GzR{j!ET z{)lz1U)k{WKVY0Qk7)Qt^S5D79FWf&9%{JfeZcFve{HzuTiEXnjScsG68kzbyWxkY zrD5Ma((vO`UxeM?*6{qP_ACXq?mV9OU@B8t3uz zw_j^q@J8^@od0TE5(S^k|6}92Z$eJqv8!?YeZb#}n#S%=pO1Z5*I4-BPr%<#G`{7j z2cZw{YP@JW_%VJ+KHvRi{Tb<7*!YpwdZoU$tMR58pTRl?8gH350{iZS#@kPrqtxn= z#y_3}xLdDos(AQf#Ckr`)cCruAWrg=rX$R$TD~+# zMJoQSsblNMpy&FUmfm|0*7eJ#lOMbc_UJuL%QId0y{2jPf*H`;Pc@yrYAx)y^PA4O z;tI%%Cz}R;v>1GGcT*;PB;p^JH@$gsH|)-bnm)b~`!aBI)3xX0`ERD0ZsPuQt!n!B z5q$r^vZnj~{v_z_g{J$bW4>P>)%4?c90NHwtLe#QS3uuIo1S~J3G(y5nqHdnAmR_{ zrk8(@=T4v7Tygt!$i1_gD{lebc7LMzwB@ZT(r`@k>95gF`RAAU+??%mB-e&r7;a{f^BHMGM& zHrjmc8+NNm)32LvJ_c|!AK!f2PxgTCztMch<=mfNG~fOHYapLzH2>$&45gAy&3~`G z4f2daX5>h4N@b6Vsveb5dHiwI1uB96Ce%JPg8yb!QVruXjb9I{6h6oBYYtELC^LYUeXk4pnx4Co|5{TQG81X z;`(2u#0VRz2I6Nmeb!Rj1RVI&54`t=$~-+k&Cy$U}^ zkX8jhS&g+co*Th)Tx$xyt;O4$?;H%RHk^>Sb-h8hNE_2&(io)%Gu>t(F4lioH0P*sMVM^i&0|uZ(Mc2^@XvIAph)W z&tNj=;Qtf*MiSZNa3Y{(~Ym&KqHrZRqC*n>a9ZzJP{9wY_vax5u z*^3r=4?3x2Um~4L%y)8$gnlB{*OwU{iKWMq=>exdnMyca+qR#xaqD^~lXX_aoWX3O z|MZr@e12s4f(3i`?(N8oV1P^^+n4CbWCs?w1LhVCC-d#@KRQMRM_N|C@^@A&h^@p@ z^ioH%nRuZu?^2UeY0GE>4E^#~23;~O|=ut)Fpjzbe-%QcLk2`H1pywO%6mm=f2~Qjtr8p2JvNVh&oi+{lYC zYS73;8D$mUef4AeVGZ7rK$tz`UDTBs8OtUI2J_ChZg3VaTzFdh;)RQrIz8a_)yaHc z22^i2B%6ztJiTbKeR^wVG}bl2<1(&qr+i}vZ5l*ptJO~6eUa*vjf`&BGr$*87vO(K=ZCqiGGj2Cxd z)3cbJMvr~9s&#EVnGb#OSiC5^eXt00%NPxMAMLxHz3{Sfwr<|54)8Vxk-#K82M ze{E_m6n-B-9#wO^xu$nzhKFO&9wV`AjJigvjJCNQeYw#&p>sQdG|>uWNv4Fs>y2Np zNuqUgtT&Mg9qxj_;S6Sp=luYhRu30;sAvzl@Hl?sUX0;S9@h6T{!JNif&R7+l7xGd z2BOA1z+S5XqfYHBWV2AesWD(71$_e~#Ds*Md`4@W+*mH376F-6Z_lPUD3678Udz9DW&0;0#DjYd|gEUmXd-wbN} z(8eTJO`Lb#&lokGLvvq_=Z9x4aY=8 zd>$lBS_!j*{CKs5e6j{N<_wDtAf3Ph9!)r7nSztqn+CV}weSR77n$yhMNp^{)EIm& z0v%>`SQX9a1SySA^Ya<)tCAH)^n%6n?A8A97FT3(!Hic>p$H-k zB0NAPkQmp}*C?Y5P)Tt}q+*Q7N}!RRGd;l=Mwh6Gj82(7sM(Z~oD4_-$yFxw^Wr%= zkUj@B6C22%@d?bUVKl){fCEJ|XM->d$Aj)fHqnNB{?BRg}j!E?Eh!E7v-@Hv!6YipcSkY?z0k^d~Jj_4YU zr3VtAW%F{`;Z|z2(E!Otnq6FsTOTG9JE?Sy)<8S1E0gX|W`{vgT!WL4b-Au;=xW+P z&56T7riaR=H3`9(OjK@hk$s`O!YG!bmrJ{c>Xv*8B)AJT@{UrC3MlPzu1MqzBrEYA zKnfaFF)f?7YOd!dRNzHP8IGT;NphY|m<@kb$YPHR4ZU2h47s<#h{xWn0*7)}iL>R?*Tl9Wj3tf4eWbK2bf zg%o@OyqaeaN-Gq4<4_>9K6?`s?74gFGI9@ z4o?DDqFw8<`NTx4rh&nU;26}t$R@+&8E?GFYtw-8FnK)EGHyh1G3e)bW9y9`Pi{;Y zFoKmuq>8eFWRb&0i#YKbgA&g`Z8ZJR|P-ObYvIP5H!7M#Z`d3zp zl3e+%>|n==-t2;v+fxY$XC3W~`5%QvfzTZTkuY9{GoZ69f|ek|zCrly@L97t2J`0Y zAaC!=gpMbfNB3s3as6|7BHTJ|Q>nVhx7=3p(V_2B`@V)}^X}-!f^o2Y>t~C&wbRmY?WN z(bpEE-MS8DpMvm3lCt;`0;5@5Vhdpw3FVYRM+^_)4|W_Xg33kKCwwhjPhOQ3H|lW& z!!(R3XPyDfA~^(WheGi~7pHW7;KtBd0xzm}Z+DMEhGliVf3x}XE zlGAR&U<@9`a4epnhoBXT@V-QKa)UbD(+l2CjHF_H#(;Ju2XxUuBAw7ty7@-A@fk6X z7`N+iG_@xXIZ5WnFib3$N$2K|2L{t~)I!?Tk;TKnl!RLCO+a^PQIvw}bZFIQGVohv zDPXB=9&(CoKgS+k$U$On+t& zZtlyMU(~{oMIH2jI)q)8U==Cfg4If}a)ptR6di60U(ShVbSQZ^mhT%ZKl=v}ZDQb% zC@@*JgHUjsiAd%CGnzy{L;~G@q*EjtKOso*Q6LMozmjdSD_pJf$w(MO6cVlJL?W(* zl4ro%Rcn%T-8;J}yY18g`py&1jk{!Yq4Ba(ZaFA91t~QM+M!`oS}79Fh<5GA?iL;Az9HKp}>M%!`BG!X~>jd3v$z+D?tU9z0>IUc%SHd3{*$<})kv`KpJp zvg=>%yjcGb3^m3JC2~u}#`+X7u;>~wb3+%6kyaXF!tvwr$aid{F%YXh>fKR{SF)|F z(}@>!P!$2xBn4<1azDYWhmOa398J+lpWNG*^3=RlZ2)-UlZlO3YP(SgSvh}5OL^)D zE{mHrj8FcZI>i#=Ja-vB0i(m6g+7KCBwzrK4AC+v-Uy}5Q$2R0sqZ>1n79;7YWHBu znd*Y#^7&y<&67HLPP>44CRrSnAYGhJKvB#aBH4{YLQ0^lDus{VkwWMU&<$az)0o)I zGw}O@))=gc^x1jZ&=yT1NjY(|#r>u;Bco6Qjbd)=eldM5wRVnTE#y|@)7E+}{7jFt z61!vBG_2F*&PHu(8`3GVyXlMS=#e(Y?XJ$(=DIe6;dXD{*1gv0+`QS@w$3?c+b*QE zwr$+nO@Di4S@E!;48pf)1uL}1ys#}M>;f7`fH((!D8qt7$}VcAwUUz^DB?*2ahugFl+_rbATls&4H2X1}Qy)vGJ{@wnBQ2 z?4z%qW!$w!)&y(pFy^DiNx|U0Mx=-FF*jry!Wa* zhiNXCc_(V#@y%8vZ0p(Q^6&&-uSiO2IpU9Pej|DuGjxpbRHIgVO_u_P2>A|{b zdMJ{mGLhtGy!AE^!AKly(kZj*sW#Q%20&n;dZRSD2?T8=>T;xz9iK98nBRDV)VYI* ztr0Rna5)V9sL~QCtPB-WzHD#Eh;u_KVki$OHGTBuf!ZWvYZB{E=$w1V=&}pUxpNmx z2n3~E*i@V6lhU2oM5H$(5Y%2nR~~q}bPaWsAgwZ68a$fO$ECoDv?(*(tU%!W7(_P4 z1F=?PusrU90hAH_g-^0vuNEX^C*}vj$Kr$i5d0EC6p0Nj>cQEp;Y=apfznW<7hVMd zn3mE7LR8S+z+f4W=SVi0VF2kB4?7Hjz=9`geQ4>DVc$?dV!iyZ9f9cBi0}?mYcw!; z^ng(rU5MaKaHNJC$@g>)!Ejoa8`qS9o|)a9uz9-F25*SUHM_cd%D%Hkt8DOy?;X@l zm3c=5i{Vw~{j4sioIndS!MdS~{NrB!^LAs`4M9o(_N*KJ1a z6mkhtofATz)1YDlY0dgD)rk?_Q z7Ez~vfE_MrmKh+DMOc6vB4H7a;b}tYz*-iV=I=D87-c7wQdrw^n?8Ie#foGQ<7>EL z7r$tY3fmJQx{qDfRWar?jAk#Kn%897W`YPJEp z8upZQufLK4tc+?k5`Io6+5(gh-j-b$RZm75HMr>u+wnBt zGtiq6M#045)!V?xC(G`=Uoq#B`%xqTW=akW7`9xr5dSBp;l%v8$U)@S8R{)!Q*db) z_`y~t^sy|`Rxrh)VhS|Ifu^!B2Xm@l)kDWDlj z9K$PqAG}8In$+lrD8MLQ7ZcN3gcVSE2 zWkGK$g2Q60dct|97rn_91Yy2j#%Z5m1FErnSe@R6O-g6VEV&vC4zc4sT`^YHA#c(K zDD@hNY_a!R9mt8{)7fZYga#G9s=W2PHtNFLDejw;cE}HaOs%8Iw|f(V$+S-41iif- zZ?nvYGKx{~rNKRbaK38~@)lQ&3Xt6R+P9heMyzXR{@(f%pZ?Nq^1 z`87VJ)dBOznzl!@uGS@7jwIYVI_C@0bb>`k2Mpb1T~$ zT6OkLmLE1G4=-=gVO8xcK>a&ImoDHZRD+f@3o9E%7vDNQ!gpD#E%Q}oYnUeiEqSY;znUKz>VRRx3ZkuKy z+9ajN%cq#*&~9Xgp3^wv1- z0TeRUOQZ&s_B6U`W1Uy26g2AGQk~?DS}Hc|$tW{&dAYH=bmS1B%x&cs(Q;!PmIf1R zXAtN1urt$L%U-F&qN9y!9J=H1wsn3rjAK@4sl%p6gCIR!EwAAi#4McSS<TG5&&PDhGNeJTRGg+Oa3PSABsv8s8K2F0WOxe`MI!Kl;7e>mk(AmJEXmsI7 zqth7}p<`oCs}OSE2%qk+r8BHPqg#r4T#X51ps%H8368zhmaptL| z9t?AE@I0{`k@~1xz5ow1+A}u7@0LVeLl1vn8V$q4(YhLZoHyvrQ16o`VPnh+9s?_q zRsu})Sm80nHzK=4AQcfdu=Fr7A`mp?fmOA(b)WPw2}1Qw^&eUnP??fjnL#m`AZCjS z6!H+#1k9XqqIpN|A~%Z|CdJA*TE8_vpUqQrE`#k9m<=Ikf&AP$1)Wbpp%nWXgzD=v z!6-piAhnM;+-*d71K;d&i;P5U13rcDq|R`B*Pqc_gCB zn4+_+?FM$EtSMq_NLTE#x8SK8QDhDe7bi1p6g6!9Q&B^ghQMMm0MmE6%G(>Neq$Q- z>?j$Bc^Njs*;?+4=wveZh)A{@cW~`8RXUv-oh5c}vcb7B@nfvzeJWH@O#= z5U;ML_YTBBUO2IVOsH!n2Nn;{Dn~xMZ)gHK+oMbSm^ILih_FI<3EHZXJU|lPXeI|{ z8JS|QM8Pc$1{!tz479d9+|Nh79oq=O$mvfG6x?d}jF|fRn1N61gl!HJ_@d2e_%V_p zsR5)dyou_!qO#UKBNsN#&cJcx%qABDYe7q&@$L?#l}T4JZ%xODhe~X?be3;^9y^M$ z*_*5O5TIv3U&^n71mpI90ATD=*bn-p31r!5c6qQe{r#zAI@IAf?|%iCWR=*_h-a+j zJP*yy{j!1H)=dCoZYxJVoV~0wydcv67IPHDi*K=p?o=fbR@Xg8V)BX0yv6 zv2L`_FsK!*M7Ul|v0PR!%0!Q8oKSy5pL_p;B)Kq?FIpaPgIaJR;<_6ln4exJyoq zXNJmK^J_d&FR?QTu1fewyof-NhKa=%p(L_fa3UiJviqU}ee%rM9$_0`{BRwXaEY*- zPMnOnVB<`z4>!P$DUCaDf$X@-y|j92P>17~d=qD&ILc$?$O$?;A*w3npa)QPG>Nl~ z*h`UdVN0X~R|*LwRI#q69^w3fi1(!5V3CG~W|*;Zt$E8cdtzQt6quGk zVHlCHU>pK~2ONYGikeoHxSErtb=Ac2nmculSQNF9DqN~*n6T1!CI@{opckxirPPtO z3Vh1^=2iD&(?kg~L2RC5D2rpzdZk;Ty+cSR2A8dD-LIGFKc$kv8{!nRT+EES#6$JD z-E!cbJq=c#!%j?lr6U2f`Rqmf(i}1HeZQFB!&pX!3o?)ORTK(HGNiFJXsr=v!N=?+ zVVg1?@$4kL3&tBI&Ls{J@n}G0TyJdn|-xb^1q|OSDij31FU+qsK`NA{vDwq-C8QhF5ekaRYh!YA87vwr7D1V&o55jLgO6 zqyVKKT3t^Ls4z%BO=8iobx#X{aX*wwpr+&oO*%m+nK?27O! z9)y}gI`=Z?oA=jt$)LJXr-O#Q04}sfW8Zk-Fs>+WId}=N1vV^>Tp#p~RgyM!hy&C| z$`+wc+BW@>DE555y?N8a;4&9lFey${ddGNm2Xe|EHynl>4t^GopTC8nZ2v!fL9}tG z3%qc}xFwzXN|q$YbQAG%i&_`BDA^z5*m{wa@ZIuoKBEXgip3(lhv9Y#txTisG{;(B zrp7&h8uo6BIv2#@rjIB#h08%EMq|Ft1F!B}90kjxZs~PlqcQi~iG7fg56e%rrr?7w z9>M6fn-}mMGd0=!;^w{8wi9*8d#iQahFXdY$MCsiPbDJbrwaCG7;oD7`=T6c8#uei zwD)R3poL|~{L>*XC9+^5i$1mB;jTf4?A=wD!NT%#qiN_R63H1EucZ|vQrhnM(RwcH z9=UE)nORpH=B$EE@lj|WX(IR5I91O}TSv!dY*+aZ%&o?)HWW@wpBoV_W_YoYJp^ll zy>KYfic+^ewK&blqn+pX^wNHIvvn zjB*^64}Sj1B3suX9Tyf)s=&s=UfqD~zq+{GH|mD{`|8Edz$D7O-- zvKS6~gxIO&Rd+%{==p(RPWe9fSJoU2qeZFK40J7I=KPgJN}NpRUP%A4CSDJN~LHYB6T&_QTm> zl!u-+ogeB12WLU(Xa5VJS&P5Z80GiO((!BuT@*Sx%Z?P_m^^uzqgM%BdPbcEYm9Eq)i=;KC0)w@W(`dn_= zF_r-t#(UR@ayRf9P11rO3pI;gwoKul8ABH1>E3eSy{cs`Yffz;ui)#XgyGJT;QROo4tVIeVbp4tBAa#906}s0~OoUCJ%~=)@_?Y5MX>D$}S&EwQfg% zFKmy_!|=>)`sGbnz{-`7uB2o?!h@PzcpA$DxQpby2XsrTh$nx>kMdD2+Ch8H&`n(p z`1X{@Ye~T{gid+R038XJrVcknBzo@%yaXGl~(T z&4MDVNK6}iplcIou}e5#7(^Sm0SmhkksImXXRH$(k17{(dX)g)mUx*p~~H?33&a;*}FAdiNJ=wFGlq^)S|X!51OjC@)M zh!-<1z2Phl^H}Vh=jmCY06*`zXZ}1D9P=w-r!CPj&>>8NY8HKRkR^exy6(wj=Y(O2 zE}z|ZkxwE|+{QbAxE1ul4#do;(GQ?Zv%AZ+3vC(dqr{8r>Ob}#q*+F(G1F%=ceo~i zt_X2j0W&+tp`%8ORYEzehgYS7+bI%eYP&gr2bgQ%ovqeMGgKL5(D1k7UE*z#r$CM_ zbpQCR`nHYRy$}LRaX_%z-f>aAXz?i>3-Ld(=>uRp6$VKw=qtc>cXa@1Q}UojJCHwZ zA^emrt;Xa4XXu+RLUjL9%tarLSQh=rzl(<9-(W6->Zm)om#$p*^z+m$u@RBU(&D?7 z5;l0I2>URGuW7tdReS=3rZ{(t79p=_le`c;Ep)TcU9Cl+GQnVQLXKf3mAamswaI-_ z^pXFrz=Qae$qI4jeJ%p_m~tybAPsVb zVO{&`3Ig}e?e88Q>|(|A(E2(ECeD7(#o*(z*lT9aCRJs+5B)l#+PX zErKP_g;yMq#u#-V&geSZ8baz;-j2&G)wB zeG`Twx3Gm1>1C^VE*IA`mhzX)=>|u-0n2I-TMUJqx^Q4PHpH&u zs7=xKnXkG4aYuaX)*c|KqKzt)|Rth9YiFAYI zfV0p!Wkzu=93?IJl3b%p&hdAlWKyvSAi32d_>KLL=;^@Lz{m{M4EgALx4RUabJ0C6 zQJD-YgRy0lHNa;{jvzt6XgSPteSM5}FmjZ!xI>+tXK=AyIG?w6dPZWR4G-b7>Pl_ORLuXHE)Y`C{??GF|ry0EKmln7IVX!RAW|K zhV8&A&G0q@<40AoxhO;>q$!14%-LAcSaQjNW+szQfvR?EXu{z58IoSakf|V&z%q%R zByW$D*q}T~UI<*@Sc9h~jKpdcKzBk+AOGmqx!)lwhU2w(M#L)ixtYof0RkvE z53AIfASB5py&AH$!tgjil65wE#M5f1Crm6J4Ktj4!e~Fy;?lXb2YkgV0s47A#Dm1K z#1>$!KN+%sK})?`xm=1`i_?fFK_SS~ZPaXjF(*4R26h)&P0yEqH{P=U)W=#__tY;s zCaG^D*K&<94Y$`XHUN4kGt77z>Z*CesuqISDg6|(C1D(KL8JjhViYd}k}Q&?Gc%F1 zU*6Sc63Q%HvIit!~gL#3Ye&_m#S=hxOQ| zkyMeXr_JcZxDu~vC`Q|f{usqaNAz8KoULIS6etgKYzNkLel@DrY2pKNJ@_iupa5*TeN#}HKxR0ViDD#KLxh^DCbNtd4 z-7-=s5a6h$H$PJwu-1EHU^+zE#MF<8dBoyc0ZwNX#{+k?l~k^((m7&p@MyO&oI+N| z5;W4OF#wA)g5A^%!7oO7ii{H?hPEf86XTDoi29{`GzGl$<^+NC%D5rof63LlS%)HsZ&f2n%$vags?0#e~l^~H+(Ts2jcJ_C*sA~Q0P2Ugvb~RWp&ZI zcY#Z+C=J#D?j8rsEw@LA^M}GsrH$y_i$SLtG~l zRm4K4yj=`82Ln=2td=d~N%d-&(&l0`E0Xnn&EOy+POiTchn-;^KUIo5Vv%P#jB=J+ z1bqZVK7)}==v*=br3cF8{D+@|{f8B|^<>x>1(?;*ZDB`!^9*?bIG}6d-tR^3l-t$v z8GUSqs5Pg}U49OhMmHDXV!V7DkCo!}T0Bq-Gg!yYRKkR!A|2Q0pf|vG|8W?Kdl>S0 zOxf2PcHtbq zz5_cE4;kbztIo&M{VGVRnkzSryDLy`kdThBjz% zP-gh^ip%j$9~LRe;C3x#+VMn8o0&Y2$8LkPscfsV4petAG@)&8zocBwh9iAL?fFbQ zkLBnS6bXH_tr4*)gwFE%a>lGSPuP@i7e;2hOpILaKEsUu{&e-N-Q<`~(@(5n$IdPs zBl4A?OxBj9C`*=%S(^14(tYPmq-H?3v%^lHZ~Ck8}~{RWFi$O?MDAP zYu&=Skk@!bbSvtSdG{t8-5-Rglf1ti=HP`-1HO37l)iC$(CLb$=;m&Ap)PlFFc>gymJcCZRx?zVlrO7CLs{%?Z#}4 ziN-QpAO|Q-(I%~=1^6Seb8d^j%C`$KJyZxXL_nIrK~LQ(Y(4@Z{s{@wkrj1MCLSVUOyl*gpUfIE5*6M;}N3HhOR*60YtNCzr=k~5H z>5t$#J<{@Ez3<^FJiNZ_)0;}3-c$=Akm)LLrr9rSMXYQt7|nC1&-JMB(s+uhR1T6Bn&XFwQ02n-o`Lr?Y(-G!u85K9lrH#YRa$l}_IV4?(zRw6INshGFiclM0)YRtTKM7O13is*BYLCbl;Cq>0b3fyl!bTD1hU@D?({G0XO z#eQD`ijdSq`lry(K^ig$#!aAHWFV|ZKVh;~QcPiri)8a4>X2xqz~fSxZq*Ia@h?#& zIsmSpU|5bZ72!mBox*p97p*N*(2bf(<3qY}6Kp$SNk?CB;SY2`JjW2KLj3@ng!&G0 z>9i7?Ch+(h_7Ycz^C(v;mL0(19d|rA$W^+v)aEuNU>T)yTS3aHOJDd_sXD_lgSStg z>cOwHo9TX2?J!qE$Y&kcwO z>ti)czXvf9dy+EBfVyyx?<6)8$ih4>q+KG{t~O`f+50sGRIh*o(yLbb&@Sk=4Wa10 z8iC5N2FrQIZ-hneDQs}clkcpi(P!dGlQHCc+yn!aT5J@Zgmtxni@jhf{aSJGT_0e2 z22hLpNiHXUOXQMp(qXd%#1JzB%mW}q3S5##ag#Czs!cRc&Zg5tXS6V-+M()*Ejnn$ z7^0iT;5Z|GM$lVJj|5NnEJn664T+Od64>NbYPb}9F9LcQSUaQ10hVUC?aw6o3FLL< zv#IvY8hv=Ij~2Fj_9~FH=6i^eq&j_dR;HyvE!}z{wz9(NvZHq8=v`7Mb$4$rXEd#W zxM1~}-2Fu)Gkol~2Kiku-#IX9w*##fAt&ulq_FSsTgTS{!yhw-WZ+6C`E152jZ$(+ zb2qA2y4ZWq7uk8mw=)NhGD$7;7%j3ebh1`>V2jlfD3_(Ed0GZ+^r*A(-#5CIYP>t` z4E1Jjs2bFSEp&R$4jpi6(170S(M5}wbSyo2S-BC~K)s|~X{TlQT%u9pCi0G@CBD$j zR8St8TA^75w+2pQ+w3JecoT>jx>?)7D{O6J%5rV*GBhsopl#}m#~pU(m%9x^*F0U5 zF*(?l`;o{fbF7Xkxq3PfHec&z4+?)gFYu++;1v_SVbVjYAz!A5(5Xr3Fi-nOo+6mG z;}g+*hBw*FPAMStDhbiaim6we&jG2Tb(rop6bQx?t!gQA8NOon)2_XCwPZ1MtS<2F zChs0>N+SEF?l<%SWC^EgdUK_QRQePiB$wEzFCY>XZIR<3iee}e+sb{cO^ArRu z`jgpV**=}R3Y~>5j@_gYs=kF*#?9g_!FDP~pi2{n-1{3keDKY}B*s9_@g@qmR6CFo zUfq@2fkOq~Fl}yOv=&Ush1#!REYnxP3LClW8_^M5s}PFA|HWn6fx!LaF24>OJ`7w6 zUmcVJm01jozxw(W3|dm$>QRpj>c99paM16<^5})JNz;q=2lHOE{#kJ>XCfH;u&$Y$ z-J_{Sdx9k(akx_cCup`wIN5jvbhwITFAcvmzNMQ-hmh6@-;tUodaL9=fBOmPsVAQ7 z`1G*9?bx<81!*Rm@D9xMX9{U#s@Zc)7jtT^g=kO2(6Y`HPi9zb!t!$cD-H}w*K2Ln z1fuTZakhGxL1ocL}@s7AEd+~k>|KnOaK)o~u#MLnn6BfY@trc>FNp+J$#6p+x z3}oUU6_+}=-nWh%NsSSsXPilbAI0NZEB;ZPxLl6DGBD(Q#|Bu-kxg8nd!M?&iecQk z$=ZbxcpALvI!EIlZlI2G&}v7=(@s&QcIB|bq4!pTT)@FO?k=o9lS`ik>@NYPyQ z`q=MZZc}AU&0oT5ty)}gu-8G%3LuwTuDB^iQ~HzNb=$MaOg5R9Mh}6@odWrZFcjFG zODismsoPP2Szq?`)zFA>7b^!N8!!YZ!kWokToKiP6NL}Sd6X(POLF|q#4zG0V2xA} z&-Eu0skjaR1+G9cSe}{d&tP@8!W{`Ev17F*YkeF~@_0KM?WQ}UUGLCQR+fw+Re$uO zcs`6tDv^`a*u#+eQd3O%sr9)xmo!<2o*iahob7ZF6BU;-$6N2IaYKPv1)ax?7}bcF z6NuyJ3$aDX7;$Hcc^H=Dej6Xma)_3A?m3&pzP>~PaaVm*%&pl8*YIchU=Wk%5IkEh zQUavIfRLGSigoG38hjx;4!?OwX`}pgp#f@GI5S*8g#)U?bRam(!m%`tpoL=QJlF#! zQcmm?Z-zC$s5XqWVQ`n~Ov1Z72u7low#Y^dumPWia|z+}_RF)9kjkeh)(x<{WIi7A z()ob|eGO!>t*ttUscq>2r%!-QvAIB}Y<1YCik6e`y;v9EIq=^zdgFx)8S^T~p#~)q zlw=gZE_yu|Ed^aclw!}uBJ1wgp*VTR+R$XWFI6z-1p^VW9i<%GAz=345AQWui$5Fj zUm8;s(grvwVwu>Uw4!F#?#`WCH*Q_O9LE+y+mnUT)anV~V!;2P%Z0*{PH#C?ovHjhodFG+$iA_?_ziuCKj@8x zFmK%b)j=ssR1{{k`RzA4HRz4&xcxhfhof_G<{#`XNLmY;^8at&EojAQAX$pYtScil zBpO7FVP0%aXUHO4Tnp$od@GI=1-6bMYi44&p!kjAEjrzJq*Cj~R(6fWyb+rH&w?7M5?y}x183;eJE>mT6;2~+_%tgivk{jnp-sJZd8f#_c-Gy*Yec3 z_SASdJ9LgSDM%2sXtg!Txgpm04J9b6G)WNu%uvQ=Z750WT`vxwhkl01#M)wh_lhDK zK?ET=5eA$5H>xoDB6YXEAYH4zO2w_cB_faE7iT51xG2s2)|bp;Mo)5hvS+>_OB}dn zbE)p(4s8W&kVq~Im3=ixHkW;stW(_Jsg!yAQlnS~oMgl_a;ffydQ}tV3nQ(|0x=!z z^or9LWk)<86^|0>B!!D;Y|;KtC`ssEq++#FJNfG)4A1agW}__m%tfUeiU3>uMASkO zHunfRIZ%^MhfGLYo1x0-sgq>UjS=>)z+GHcL;fWH8d!{=4wG+-yBL}wgLwxk3`B&J zKe#>eilkmy>@L;fFAj-eU<@;9eUN%G>@}h~{GrUlN7Db_8on&nw}L+CnKKCESNVP! z#Mq_8RS)4gYP{k+sgL@-{WwYXgOuPFtn0|0mna3f=p*$L5%45^VJisJl7(;kL9(L( zDFq9>D4v35Ft+v);@7r`oAwpv`Da#9iPs z?Rbj+&0~xNJ{i=C<9`f}d#-!r7)zWK5-gN)Rm*&jTH6u`XS#WQ9f;N)cY6`Q9m*kK zJ%Xlw_{8~6{5O&B>u}Hpx-Xv^o1j#>Qx45spE1{dV?Cb+zO z78(VQ@$wwR#?$S|bUVgwA5O;Oh_%J?`IvjeqO7!NfwVB&>L*{b_5S7~&9052m6h8U zsqElOi&d%KaiJYEC8@YL-0tnEI>tX8m+ZR-q3pD@o5lJHX0Y%nr<*DD*1C669`?L5 zN^t3Cb3Y!BD4ykTF!@h)UCJV}2YV=q0!9eQ_aZwP1ZTk8Z-AJ%q!xr2on-} z%-%EQZY~C)wjyy-8(Fz)Ep76Sam7ShhZL(@$*4|7%4C#9i@a1s{BPe0E!Q4**aPeY3z#eQhvm>74rZ8SPFc_n6pKO~>9QCQh9P57X+H-tU}XeVGn;IPC1)a+ zjCS+8ysJ3FD>*IUSWjemH}UFIS=1}&U%-Rv$kQ@jtAhr9v)g6Ki3~dwFKovOjK@LI z-i|*MAGTSs@rS8v7T}MO)aHAm7%arI2(jCVwcXL+FL1>1hURlc>4dOdR+2WcxF?*p zW}%c;58~H)kJle$6*`bN2Us1%%rE14t+r{HE zz613@mIdQPg2A2C{EPCB0uC@TgNS@*9EV^`wyZ3@t{w*p`*(<-5fjVwI*|OVG$Hd- zt_5g8F+g#c(^6ZKN4ZMg=i0`TI1w+sTgn1=ttY{ZBkD;o*F6k!i3*T7Tmogop*AoR2oD!N7Pe zgErOp-ETOEoRyWD%OfoG6gR{#nMP9nCcZ!z#NiVOJ{||-S8nO*cjv(TVU4I(Jg#-; z_K5N)rqCxNz+y@a2f6-wD70sVMFsbDG&WGc1yd+s8^Hl0{grs>Ir#4gBS@nN?bmBt zOot0N1Yg!5B;ye2C|`1~YSv*{OuUU(#Ob*Zc1Vr2#}j!R*g|XoJzMhVp_oSNdK!1J z0bBIJ%FX^MOHetkAJGPpY#$EiD=VLsMvYrq{gCHveB zTa-T;WfM5}$hv%8GA9*K7%rWY8u~SfT%R6msvc_rM(W4^C>%k#9w^b-ixy=1`x(8V z+1DI2!gO~8(U8Ru*%E>#j8w3#jzULUs6{#HOpei#cZ?s#z$uf|v+<2w3J%Ao0&p#U zMK2*zt43etYaV81peI>26N~pDR|#z<*CWkNL&e1tZ82ff+n%tz6v6bSY5+A)-X^4f1rlRmi64=WVWJVUL^zPv%JJ9ULZ=o^!D z&k8vT!=`;U6RQTsBJ%z`gPRU?613Q@8^Sc{D#MWkb zGw1pV0M(&v8r2e&nG}8Jzjj`(n~-;ERcc)m zQKm7xM^k}Dh%SND>y|_Hk^m?-F4sh7LY~*}Yb?twrb3G2i`&!U7OD|`o*UsFwCFt` z#3DEf?wb9$m)_{;@{gx_0I6VBX0ZqRGpZN%Fe4qrBh)XVr@{igNVA(s({0z%hug%G^mbE?iX=R*aPz7e3rt{1oz2t$-a75?&wy6 zh!{Y>!w{i)F8wWZhnWs%V?T#rs9YN=JQVNc9rPod0yXqB4ba6Gkv6wJ4}-PP7m7h@ zkAS6HblQX9WYQ;TkBtk^UFXd~0az`WJ}4V>jMw*U*)sz%jKprj)I8ooQTFS?N?#r| z{>9x8a4vvWjvOuzlt}(|A+|K9T58}!Wgctaj7=Z&WM7Rhauhfj8vsxykq#M;6Y9>B za=k&K=5uW{6^H#Y z`Z37*>SNVQE?`XG=^Em{`ORifz4t(FGe8LIKun3a4vBaTi69 zhDimuVBV|M-5?UTbUZ-gDB2Ko5bP?d(WW6^2sbyY;eJ3ydNWMw$%H~QHQ>~feY4&N zQ0NfTQ1iP62roKDfK9+IdLT6U268s82_37o7#s*sQ79C>CNc!y)En1N>AX=Tbl@pk zeiHMHQs~wV-XKw0@hE61qxaQhtqVx!JX?r(h4*$d5tKG91l4iHdjsY&}r1J^FP?kWpygNTzE>&9{^NBQ`dc=Oc;&eHCH31LWhg4vwm?Ov+#>N#Ep6F^$?|JWr-ZUgmsRp|6V9qK zCd(Wz7U#|EbKuHM&7vi9-iJa%DvV9!oAE9h-p2PdhXH6(OUBeSeK9ky(DuwV)h6yE ziZFN*D=zJt*x|<5PySOtW#B7rML?sIYMdQ8*vgSKRTT5^VSc*XiU5+dh@Tmte0^lIkPf}Jf7#gyMm7p` zXleVnTwCctR3Ztw(h;>XkS)atD0;OkftgY53HpRDU@Z^LiI5=ZEGy?sUE!<`(%kW{m(Gf?4eAPqU7XIgx8Tg$X3X`PyX^^~|dc%JGf3*v5ej zt8NgEllG}r#+_nrt{Bf~^TpGF6XumTxDEbiFP?~|Clht_%XKi{AO5J)S5-`~`X<=J zK~c<_Z8n5ihH@7B%xTGyla?7#(8fuTl~ZKjSf``hYXP3avcsIQ^@A^%Ev`q9rnIVI!4wZ6q$ov!MuBaVRU(Q4iF-^uqiZGwEm}%=8KOG9>jO*S%x} zIK+l@Gg@R*90G`#L*&EykgMJaESN%{Rs*dXqCn&@k>j^x84{2nnaFPDzJlxxYw?`v zHy9b^Ddakw4KRMtpO*j8u_j%#L^7vo>uX<2$IeU7Or%q)K_1X49#vJcm*4~>HACLP z8p^A@sk$#AZR^9=aYwtM$zof~`bqV^TP-F4vjMSIQ_SdN8=ocYcZ|-$MNF;%eHOwv z+#>`SJ-k$yMq0j|@m@LXjEDEeDmN~bNqD;y-1ckYz|WC#4#!e`K=j9( zMD7+d#W<8CtR0oZM;5mfu9PB%97r<72j5@Q49%d zS8KslJhEYd3&8GLq~FjD0cG}~o8AMP%zw7UM?P2_4?-A+(HkG%Q|nN}Fn42GrXF++ zU4QV+Su1Un+!8Lhiy9g&FVWhwPpjX+6}I@g&d7X8%qKTblM|6u@_41$y-H-?2yWSh z{}sB}r9d06u9g8xB&QqklX%r3pqFPxfL?E!W7g^k*fQVb*>THaJ{CG%CBu{6>yyR@ zA3gGmYWK95H>x(5-MDF}zoA*clQfLRFmcO-8P2PCQ$}^u?%_;Y?3_SEn{k*1A$1G zQUnSYZbS0&`j~qwN8sy6!{#jKxYYL)J1l{N)FL`U3)}h>RXv$_Y%G*!L+!i3;VXd^ zYx7JJ=OXY)xunrn(xC555kKfAMG%NCN7PHfpBJXAcn`E!PN#)U2Og;vV}hELM8`tt zEDNdGhd=y2hpu^)ptQWD*&0s(_Ji&QAdTRTXh|wAiq(}kudkwdKB_x^gv~^lJ?mV` z474>PkWdLx_wwFP@xTs(_euHU=yFlgRZ+sSc%?Pi!asIK{&88dD zeIq{UFiN2VNuBGb8^=p6c?6wN9gAUshbmGU_zGSb2cnubiBs8OQ=}lORa7_A^A1W7 zydnbZBdZ#v_R!Q1`g0#_@zs@tI!PYHps(5zLRBoOD20yUoff=9(~3Awt5v!HiFdY1)32zJ zfRSI$#*s;uH0WXoeS*iyj`WSha=E>kEbr^o(NpbR4iu!brZzB_M`!1v8};Ewf6SRf z70`yAA=my)3db!OpN8ni^}|TX$f(Psm;z5_Pxloi<12n`o;e-Ew{bN0ipn(Ff6n1?DGb%dYMoXX~~e7IF}*9G>WiqS!*ih-ynrfznWh z9}@eLIdnkOodI#^69p8!D;bHkM7EuWL78-E*PTfF`5s!04kvL_0q*0$fEpJ_kP=24 zgr}#j&qXD&c}&4mr+9)3!&y^KD%IKWml@VbC5CgajWTPG6Rf<6bU98`d2gPMc3o%} zK0D{U33aE)zqjX{79R?oPCkq3kN9vhy{bQx=>Qy2YKaDvtg+~&y$_`=+Tmr>a@H!5 z#0NBKkLl|PJZ5wSfi+pCtmuQQIe@D%R=RaD+I$&5^y|G~7|$IFHyeIni4+rO%zpU4 zqpUHP!7z|U+GRdSq!s(QZG$9jhc$&3_lA1aoK9Wwf=q|L8Ui;+Am_(8(V5-bwzf-) zd;NJ@YqrA9zZvoOaETyibU7An$YW*LrL7?v8PDVCWi&a$={=y~BFBvxvPq(;257B(x7fv#f)C z)^F)p!1#6FsbzU_#sGwXB!|{_h=fowW;L|oEA2t4V>i~1MrdEX*WnZV;#bT8YC|M6dmqJJ%cyrWiH4%yX>@pj^0yd1FyEdW z(m{hlnDMv@(L+nm=I+r&9gF8}*tmYfa{Uka>r7n2FuHj8%-Ggln>R0?nUIeqYu0uz zU)9~SbM4mkJsUz0_jZ?H;H*U?;>qhMB`|2bMv7x5`^@Hxn&2@52|H5MQ@v!NY#8wo z5+Q*UlO5lqk|Kf8`{mX^QFz3^3NbCDwsoBrq>Q`cl#%2B)TbwgM|88Dp+sWDNOAWX zA_r}f)4_t_0xXf-NU9cFEX3&scx$jH-S{N%M29Sbo~&6`THn`6j^}b%jqF2?x0Gdw zvmu(fW@|UD)5#1KM&yE>c0`c4y!jAx5dV6mT$`cp;02sFZUH6YV;mp^jSLQB5+(>S zEo~DvVkA+c5)k%ZHnLPe_6eF2Hnk^jHg5OVWsK*>52>@XXF@C)oAhODydg0mAQp>C z$A&DPqD@u|8nI6sn724ca4~q_IGWkFaNb_%u>KdFwC!^k<;!u3)EXqk`C+4^6W)|e4J?y^tuW;fr__xVba!Bye2}LhXIJjSg}RgVga*-uh}#+$%$S zfjWgzA7^$!V*(e7=M(yvM<(rT+&;Q=xidRN+1&hpu;^u4`H;=1KuO2KbWdt&CE>(Z zgPz`h5PFu)cThtHH9g?;qR9n?Re7X|G_s4Gx5qln=9AVCOa^YlY&=Dwr;dX}E zT@i}!1Dbw&v~XIdm7O%@n0pzqNAV$>P)C#$^Td0 z`TfXwm3Q2(D6MFz1dV_qRK`?RHfDFTb{!|$*ba$9z$I~(*v3GAsI$A{-OcXKPG@$E z9exN^RY6>!s;Uq|s28XgTvn*!kLgwSvPj%jRTT-f-_P@X&wI{0^SX_v06^50Tw z=Gw^8(6h!vyrg{8X%SBS@Jl{SGd0~liX5y-2Za1HDHd;OX9XrlIZNz`zFDP{dCN=P zRLy!2815iK6Cgg#c9zc>Y#+Yi1G2Y;@OQ?2VJa_W`^^7AV*>D<=$RJNxa?gT`F6Fx zobKj4k%*g0up2Pq_+V+rFd#;1V5e*5ozJooM-1(f(~g#5UoJlG+VRyig*CS6Ks^3 zTl}EUPllQMWIggvR3je`bgHSE8LVu=u$6XM?>%{b@?`sh(1#a)NIJf*eIPy#8mk{x zp(1T`ia{;S4oW9KV_d3lYXSc{&=Vasf@{prr6KY5%m8zU_+!TK zm0qdTPAP%RzP4Jd88h^W#0m|-f&Zy29Z*Ha+~*Z21V#Ep4#}0Usp~RhKw6b#KF>OI z6`F;)$hTC9hn06jQO1NR!(yr#MX@fwIn~Ea#Nxre55pBY|Gr_ok2h%Tg%-lQq<<&K zJrMs8WX&vEVz4|?`+>0N5>@bWA?na8rmU{1M|!m$=~02u#{*S}4#eS2__Q2&eS2?G zA^7%XB=@w z1J-eGBL9kr|1jiOxivGRz49_7iR=euHfIoB;LD2wY0_yKgkc?E2aoS0;? z=qt#NYALzISX7)+uj=oe#6lE7h=I4(b`yCHdD;-X`I3riJFBp&l^J)_z z2chza+!Uc7Ra234A*3|(I*{%0 z(UB^+!U!LYl==NYUFSyBvvw%d_vO%Y&1=6IA?8*l)6(9k>=;Ob`e3u6ZmHFWnII9^ zkWc&u*2KTPsqgS(XI~q4I|G~L+K#(hAd{W}fH_x>?~+5{d&9lsJt@Vvn76@G0FKSR z(B)wGU~hahjGn*eeg4S2h`!!BnQ|lAAcRBrH9Rl{a-%w_rykHpJ)mlLs#tAbC}Qxi z8jb4J8 z_r;+95t`4&G>6GF^NS3qYC|=)2OGFNw9U0j323pz?wyG%4bz{9IHR#lOl9==6?>79 zAQ>5mlDYWXQo|xLQn%u)OTSf#h+vB2B2A_iV*N6imf}wYnF?Fzz$sUxYR(5+eSsUk zrbOJw6e*B-L=5qv`pzs96{@Zv$r?nHv#s+1VRLJI=GS=~+x%$0F~f1)>M=WKrdmax zqLfUJd8bn8$TH|{aA$CFDc1kETC+-@;%ph{q{`_qVo|b+s~B>zob3Yt3`Z;_9D=&( zo)NYt06z8NI?>h1hKI}88Spb)ie*z)(FB)yebeZh%C6Z z6E1RVq;N)C<3Y-hA5M!1BDlnPRb zwnP$qRAvY^Z#pI{yleUeLE|GOu*kA?dgs#*2U}Am+@{!bSfYLHse{1-PN0ssJ-VLl zMx~i*o3I^vTZghL_5h_2a` z-_WNr+OVQ$Iim|sx)zOmOjQF)^co(!xWC5a*IsewGRZ#sV{ksJgIa{k9Bx?g57*Yx z*`hvyKv<|lEI9hpL<8nPnw%vqEDD4p)vlI#uK#%@K-ChL|E!|=>Ts{4V9}5hC>bXX0$!vv#>Wb)=7f!B*4CDL zYrSi9k?!F8`)6K^*_v5r+TQ2T6_9-R46^UFLI*D(S=}2d9gJ6#0jMwPny*=2R?(Cq~ zi~eLCJM}N54-RX&k~uD|0CE_!vUK^Td@ruq4?bHv^Fng$=-QlV+OIik<>n#L%Bts5 z6^c#XUc5eQYilpy^obE!gh z543dX3gqgdAfTl;auuT=dchhg1*m9db>_vJ$@69wob>fs{i-<5vsazAP`Wxm9FyIt za~X(tcC6!Shr5HllKg~)6;rRv2j>qQZYSQAN^!ZiH?@hVEA}*Hzlu~j;P7m;@MGze z%qrRK6mi1KEw5Y=RndWsAHV8um$y_JxkYz`rmj*cKv;8$lnU%TpoU0)P`J?;2N zMj;>kp)6z~ZokC%bcEdTL)pKl8s8UBNk6oJbNA67l$*nxIKMpBrWfJp%=Mb1w+Uh4oALivj~A9{{6( zvIz@c*QajkTolTAR++BP=qmUl6)E!G9Llq=D{!UO5orQ~@_m`MuQES{EeRjB<_`)u zUq#DZFQ|I)nP)FPgA?aic7!?#uJbP!_@PkQJ z#5C`NTJL;3v9-kCV9s(kHedIl^g3I5j#asiaQ=nMb1(GvX&Ujg^YQJO6|v!7%Ddt2Jxb8!v@H#|J-XzPI7`$AzI4SmxVxj zM488Z@lqF?|3pPrufGxOX^JRg8*DG6j;msJA)2uVW{ck-Zl#3f0O_ zq^(~_1X)X6`L*wyE?_&h1)2}N_rFD#M9It|FLlrbgZuGBfl?h(;jgO#W_TLuMTneb zGryasF_{tVY~Ed6M+^<8iNgeNItGkG8$1Wr!r|&2f;rsH0_EaAs{-e}!@akZaX8r9 z*+tvwggfQyO9JX}+=t=`b+6J+Ie4mA@vfQuOC{}b$sl(*)#GiA4A17iK5dJ^`5uXn zK|vF?6a5Y#ARNNh@UPk130uD{R$!KFE2m1?eT0aEa(GxX7|GkLn+DIx^u8QhColM| zThl1$QtV=)Y}?^>xCx?YLDf~8gWdiEY*0&uNWCQ~*V*>^KD!T|yK=d6@tp~lB!XSc z$#kE@=e<INPaM4l~WkH6tQi zb}F!_KM$L=dr|El%1#XANV^*&d0~uWVIkhnNHRNo?sa=0TD=d&YRgp=UW-RCN7JL> z++yvWcFcW6HAJ8`drV)bM0}$du1`R zqxX>F#8R>dOy` z9ZcOzTP59>K7YExm1W%0)FI)xb_bD$!o4UP=s>Aub^TEXe?IpRE?fuY!Z-krK@& zq(umASNx0BY=yz<&imlAfBniEYO2~FM%u8!Z}c{gVMjHsw)1?{sKX2d=|f`Nzb0i% zcbFMmtbS|^ATr#$F!2`^ULa%BL`a(ha1V=uc?pOhCb#u&aKbRY^C)VFSzBHyl9_7{ zo_S*$sfXcGRw>MmJj|rMD|oLAI@#0&PxQG_;Mzfjzm>U5VI`=&)(w^A1v4>j^t4r4 zYigD5y{9YKPKlCiQs6Mbk|ZFYgtsiNl4MHz?U^-SQh}u^3;{Ef_1=U0!*nhzfL>F&xxNE+3fG)KC19=)NMVGigt^ z2|3!=GanW5q*?}UCwB@XQ!%CdQ>t_ummcDdXx0P9rnd_Y%yBcLqyCjGuSKcCjLCfP zuDPl?jVk!$9oiOfxg;mas&JwITrA*#h@D3t$S}%4s}hxP7VM20j*?5yuCD37t`N+3 zl<;oNlcr>8#ju}_$pHV+%k9|6)3VPW1A=pOy-YbJ(1Iap_|^JJL}KY!!p72lHKOn& z6=U2QJZ(iz#3iC-+CoPvLu7Ms8nyT=E?7M{(y7WSP;6K3ZaxHgI!CrFmb*J8U5{|A03o>QX&LYi}$ z{FqQ_;wmH2)AE!3c%^IRBC|NGd~*hyTknJl&xS*$q`^i>gP6Va&aNC)3cBtcsn6u2r)4LtkciqyjM3Jc zqtUb7Bsy*-k%O7Z@BFJ>@^X^PF-iPza>6cN=&m(>t7QVhm}lQFp@1unQo54>)d-0! z57~E-tf+Nnf~muSGf{{=vX0$5uMDF+&oqFd!`h9e`bc4g086N)y)E}G*iu?e=|JuZ zpL}16>KK@yc~}Qz7_h4Ej{+U#?2IJz@R#J$WZSo7=FX1ZF;7O`AUJv zvUt34dw0Ay+@FC$fWa+gu_*a+KDVeU6{I*Y07{3f9LpX?8rrLm4l~l5?KX$#esi+R!OuT@7EsTA`m_TI& z(2CgS7~6A9(g3OMk5k9W3V8OmH0_g^DpQUCaV=s#5H&lIv|Huyx3k{Qih4Zf zd?v=S-^6cVYuHlPlIXqI=tSt!Lh~(-ZjUWHvb?1X+so?xf7g{TDVoSme98AG z;TlhnmnT)5T7{S4Er1JK2cMt=NOKk0HEni-Hd>TE%cA~?R4WNEMjrfh??8RL!bzqi zqk0>Uv2<2a&qrKngjgagP1Pm(*FZhIqq>58Rj1!}I7R z{`fGc)nN{VqBs}vG?qmc`d9A=lj+C?&6*kIZVxc%e3&z9$8Lj(6H=VD;gy(N|IgAJWnh{hYr+%%O&wiJB`$*2XpDWrL zYUQRd4`M6fvpLW&(3ZYj$c*!1Ej+P2H`DK>yLDw%w1<&l$t(yXh{LFJQ!UQ8w-i6B z(Z+NAy~bQh)hW(h#P4d5Df#N(DuQekfd3}?y~i_5^IBPb${DC&ETAmfqb>>Hb+cj2=*u; zyAd%f8v0PwM9p$_TZ-~0)8JB0!K7}-Ba1v5)<(u)cPpihs7oLO?I?r~tYh7qP?8Pm zeZc<%(L`7QIn33ZMsQqk?8onp%GO%=v=7uqRtcVxgUYgRr`89vY}1^fQ_gaD@7+m% zXVB3&%#Lrij}4#KnSzFy0%S{)G#msxLb_Iz5wp7mc*?m*PAwx%rCb5^;{dvfDHFwfg^59@*u0j7N!&sjsUfupMIbiLP;Me+2%qWnEl6@Rjb8BB)ZdY8CSrQ0M0;!Qr61wSfV?zT3A;ABl^Q&)DQ4c?e~wV&w96r8pX(WA+_^iz<*t%9}cauumF4z&%tdpcTk zsAz1sj7m=tEwc$tyXK;U5X&=!m`Afrx5^5xHQEyl22c_*p%P&2+ve3%^tONJ`}v#( z;I85CESu-Lv`Dg5)24*sm^N*k?6bwrCch>1-a+s;({w-n1xm>xi>Z!g&|zo?H)~f8 z^4X8bp5D+1zN|m!J-Q>`)c>O%KyRsL(u%oF4I{`;B*Lw3bTFIlyc;vh3aBNILsy}Q zdhz@K<&NU2?=M)iL>h3F<-A>t^X7H=yJbB!@5s9@ z#Fa^zbPB@8Zffp2SMSD8)kMR17W7g;O}PU#9#gB|BdKq)RCR`n2t&yrhl)=2_eP_^ zc1Mo`_aG$W3jt7iiQQep$}APk8en8STqi!%!~EF2zMAv1U+Kq-z!LVCEDN`9yYTq3 zwo4Ps^fefxc><8zmFBRWj59@+l&;8bGN_xKQ81kE&n&lm&)t<|naJ2vkM;=(dC{!B z=_Hdm(!nC%Z5<}d%wBXxfx%+hb(VM)G#3+`gbW~W%W}t1Aes2>-e~J4P;$U}0Sl|o z>~XtZO%3*EyByIXZ9Je4rLe*}^QD}(Oeou+DWB2@Nivgg3@aioFz9Fj0HBp>f#P#Y{H3lo)Ow6C<+m<-%!mqW^u31gxf?U zKY?*1al5Z4Kuqo$$MeY;OTS_aBksZprz=EoEfQ(S{(fHEmYs!mD~ha34OeAwQPrvN zkJ$fF#OKbrvye>UP^r0SJ(|YI%~GA9DM2PD8lNMrzR_Q%gEJ9cT_h)FV#3vcv&ETd*y0~~>I zFk*kaGmQ>(4*LjT^kib{6b!nx2zvPIYx=&O)Bbb8v_bJ$XUPhtu^B5Vc`LQYN?Urk zG)3}8JOiPS!bsob96=J9!{$}!i+V@m-!Ggw5x?Z8F#Yllc&}@Nb8S+=)&h7KgV>=; z%jc*qL`~Fh)LZ!TDt?7}TA`b0!FWXY@U45Y2EB}2TY?sWEfu~kd6 zn6MbAC#%fMHG#t4nOp*z;?X9lTgU1?S%C#f$>>Vgp(f8REtu4e%0&jR*bxUG1P6%& zvA^4z@txE6`C!wKO_FvTnFM!A9v06)8aBD0#0?GEq`NHpQrN8t)!4KO6N{jhhfS@? z43cxPNFNR^ECF9qaI;)qa_6^d;@j0n+&f(Up@``Na88Hf9FUcQPVSQj8G!CU9kIYI z1@4PvBH&z=``z2rQ50%oNz>lctW8QUjDxGAGhdfx zB)J5sgntSI^}PO0--Lt;nC^Sfgj`#$Y=f6#Lzx>fblW8%RKN>@b&t}3lX*VZ+iQv> zvr&MF0G&>lW9*tN&3;<*izAuQDS|~*AAcq4(kgw@KX@SjlB|Q*$9w92(LX2}{Oeab zImr~R?*A&HE~+fPzPj0$WE%?GJzpu;ajz-@hpP%sQ%FRzvF0A@;oUgM6&xkyl#UqS zkc8=|oxRTdvlbmYlZEhkYmVDm9Ly8heQ;(pZDmJ6Oe`!Dmf| zT3zc1=$(B|HYhnMZktj9Kr_o&bDlqEkPZd;ggmNCV0A0|*-VfWH%&RIfY5aA;ETcf zWo#Z{MhT&vRHr*J4|wUoBX_g9#AJ;7OC{j#ld9UvKp@G99_Nz&{)(P~O|_yw3ifH8 z@lJ4Gb~a~k(cg#VJC(zBBJ5P2&~|lH)j?f{?E#$gi7P%P?pJ))T010oqg4YYwGZN& xm#l7*j5Ng|hh`#jk(#yiYZUZ}HgQo&ik{o8%n$0@I(Y59XV3okdw%0R{{ufUr+xqc diff --git a/src/qt/locale/bitcoin_sl_SI.qm b/src/qt/locale/bitcoin_sl_SI.qm deleted file mode 100644 index b0c4352ee1b2b044455249d019cbebdf20ee14d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86019 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
mrichtextedit.h
+
qt/plugins/mrichtexteditor/mrichtextedit.h
1 diff --git a/src/qt/messagemodel.cpp b/src/qt/messagemodel.cpp index 6ad0880b..f20cdd83 100644 --- a/src/qt/messagemodel.cpp +++ b/src/qt/messagemodel.cpp @@ -8,7 +8,7 @@ #include "ui_interface.h" #include "base58.h" -#include "json_spirit.h" +#include "json/json_spirit.h" #include #include @@ -48,7 +48,7 @@ class MessageTablePriv void refreshMessageTable() { cachedMessageTable.clear(); - + if (parent->getWalletModel()->getEncryptionStatus() == WalletModel::Locked) { // -- messages are stored encrypted, can't load them without the private keys @@ -85,7 +85,7 @@ class MessageTablePriv sent_datetime .setTime_t(msg.timestamp); received_datetime.setTime_t(smsgStored.timeReceived); - + memcpy(&vchKey[0], chKey, 18); addMessageEntry(MessageTableEntry(vchKey, @@ -113,7 +113,7 @@ class MessageTablePriv sent_datetime .setTime_t(msg.timestamp); received_datetime.setTime_t(smsgStored.timeReceived); - + memcpy(&vchKey[0], chKey, 18); addMessageEntry(MessageTableEntry(vchKey, @@ -151,7 +151,7 @@ class MessageTablePriv std::string sPrefix("im"); SecureMessage* psmsg = (SecureMessage*) &smsgStored.vchMessage[0]; - + std::vector vchKey; vchKey.resize(18); memcpy(&vchKey[0], sPrefix.data(), 2); @@ -211,9 +211,9 @@ class MessageTablePriv { // -- wallet is unlocked, can get at the private keys now refreshMessageTable(); - + parent->reset(); // reload table view - + if (parent->proxyModel) { parent->proxyModel->setFilterRole(false); @@ -222,10 +222,10 @@ class MessageTablePriv parent->proxyModel->setFilterRole(MessageModel::Ambiguous); parent->proxyModel->setFilterFixedString("true"); } - + //invalidateFilter() } - + void setEncryptionStatus(int status) { if (status == WalletModel::Locked) @@ -309,9 +309,9 @@ MessageModel::MessageModel(CWallet *wallet, WalletModel *walletModel, QObject *p QAbstractTableModel(parent), wallet(wallet), walletModel(walletModel), optionsModel(0), priv(0) { columns << tr("Type") << tr("Sent Date Time") << tr("Received Date Time") << tr("Label") << tr("To Address") << tr("From Address") << tr("Message"); - + proxyModel = NULL; - + optionsModel = walletModel->getOptionsModel(); priv = new MessageTablePriv(this); @@ -324,7 +324,7 @@ MessageModel::~MessageModel() { if (proxyModel) delete proxyModel; - + delete priv; unsubscribeFromCoreSignals(); } @@ -386,14 +386,14 @@ MessageModel::StatusCode MessageModel::sendMessages(const QList #include #include From 4d7280290cc3aae79acc7eb727eba1596f8ed730 Mon Sep 17 00:00:00 2001 From: 2a5A1Ghu1 <13294167+2a5A1Ghu1@users.noreply.github.com> Date: Sun, 15 Nov 2020 00:43:16 -0800 Subject: [PATCH 13/35] [QT] Change Obsolete setResizeMode to setSectionResizeMode --- src/qt/messagepage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/messagepage.cpp b/src/qt/messagepage.cpp index 993ca273..24562f17 100644 --- a/src/qt/messagepage.cpp +++ b/src/qt/messagepage.cpp @@ -144,7 +144,7 @@ void MessagePage::setModel(MessageModel *model) // Set column widths ui->tableView->horizontalHeader()->resizeSection(MessageModel::Type, 100); ui->tableView->horizontalHeader()->resizeSection(MessageModel::Label, 100); - ui->tableView->horizontalHeader()->setResizeMode(MessageModel::Label, QHeaderView::Stretch); + ui->tableView->horizontalHeader()->setSectionResizeMode(MessageModel::Label, QHeaderView::Stretch); ui->tableView->horizontalHeader()->resizeSection(MessageModel::FromAddress, 320); ui->tableView->horizontalHeader()->resizeSection(MessageModel::ToAddress, 320); ui->tableView->horizontalHeader()->resizeSection(MessageModel::SentDateTime, 170); From fb24885a2a9ff05966d3c12531073a40fad383a3 Mon Sep 17 00:00:00 2001 From: vgulkevic Date: Sun, 15 Nov 2020 12:14:15 +0200 Subject: [PATCH 14/35] Fix Qt obsolete method calls --- libtool | 2 +- src/Makefile.qt.include | 23 ++++++++++------------- src/qt/messagemodel.cpp | 7 +++++-- src/qt/sendmessagesdialog.cpp | 4 +--- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/libtool b/libtool index 61429e19..8cb93dea 100755 --- a/libtool +++ b/libtool @@ -45,7 +45,7 @@ macro_revision=2.4.6 pic_mode=yes # Whether or not to build shared libraries. -build_libtool_libs=yes +build_libtool_libs=no # Whether or not to build static libraries. build_old_libs=yes diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 08d7915e..fb9ab3ec 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -124,8 +124,7 @@ QT_MOC_CPP = \ qt/moc_sendmessagesdialog.cpp \ qt/moc_sendmessagesentry.cpp \ qt/moc_blockbrowser.cpp \ - qt/moc_superblockpage.cpp \ - qt/moc_plugins/mrichtexteditor/mrichtextedit.cpp \ + qt/plugins/mrichtexteditor/moc_mrichtextedit.cpp \ qt/moc_qvalidatedtextedit.cpp \ qt/moc_flowlayout.cpp \ qt/moc_clientmodel.cpp \ @@ -167,8 +166,8 @@ QT_MOC = \ QT_QRC_CPP = qt/qrc_bitcoin.cpp QT_QRC = qt/bitcoin.qrc -QT_QRC_LOCALE_CPP = qt/qrc_bitcoin_locale.cpp -QT_QRC_LOCALE = qt/bitcoin_locale.qrc +#QT_QRC_LOCALE_CPP = qt/qrc_bitcoin_locale.cpp +#QT_QRC_LOCALE = qt/bitcoin_locale.qrc #PROTOBUF_CC = qt/paymentrequest.pb.cc #PROTOBUF_H = qt/paymentrequest.pb.h @@ -200,7 +199,6 @@ BITCOIN_QT_H = \ qt/sendmessagesdialog.h \ qt/sendmessagesentry.h \ qt/blockbrowser.h \ - qt/superblockpage.h \ qt/qvalidatedtextedit.h \ qt/flowlayout.h \ qt/clientmodel.h \ @@ -280,7 +278,6 @@ RES_ICONS = \ qt/res/icons/synced.png \ qt/res/icons/transaction_conflicted.png \ qt/res/icons/lock_open_toolbar\ .png \ - qt/res/icons/superblock.png \ qt/res/icons/export.png \ qt/res/icons/editconf.png \ qt/res/icons/digitalnote-16_testnet.png \ @@ -386,10 +383,10 @@ qt_libbitcoinqt_a_CPPFLAGS = $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \ $(QT_INCLUDES) $(QT_DBUS_INCLUDES) $(PROTOBUF_CFLAGS) $(QR_CFLAGS) qt_libbitcoinqt_a_SOURCES = $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(QT_FORMS_UI) \ - $(QT_QRC) $(QT_QRC_LOCALE) $(QT_TS) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) + $(QT_QRC) $(QT_TS) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) nodist_qt_libbitcoinqt_a_SOURCES = $(QT_MOC_CPP) $(QT_MOC) \ - $(QT_QRC_CPP) $(QT_QRC_LOCALE_CPP) + $(QT_QRC_CPP) # forms/foo.h -> forms/ui_foo.h QT_FORMS_H=$(join $(dir $(QT_FORMS_UI)),$(addprefix ui_, $(notdir $(QT_FORMS_UI:.ui=.h)))) @@ -432,11 +429,11 @@ translate: qt/bitcoinstrings.cpp $(QT_FORMS_UI) $(QT_FORMS_UI) $(BITCOIN_QT_CPP) @test -n $(LUPDATE) || echo "lupdate is required for updating translations" $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(LUPDATE) $^ -locations relative -no-obsolete -ts qt/locale/bitcoin_en.ts -$(QT_QRC_LOCALE_CPP): $(QT_QRC_LOCALE) $(QT_QM) - @test -f $(RCC) - @test -f $(@D)/$( $@ +#$(QT_QRC_LOCALE_CPP): $(QT_QRC_LOCALE) $(QT_QM) +# @test -f $(RCC) +# @test -f $(@D)/$( $@ $(QT_QRC_CPP): $(QT_QRC) $(QT_FORMS_H) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) @test -f $(RCC) diff --git a/src/qt/messagemodel.cpp b/src/qt/messagemodel.cpp index f20cdd83..6255df7d 100644 --- a/src/qt/messagemodel.cpp +++ b/src/qt/messagemodel.cpp @@ -212,7 +212,7 @@ class MessageTablePriv // -- wallet is unlocked, can get at the private keys now refreshMessageTable(); - parent->reset(); // reload table view + parent->beginResetModel(); // reload table view if (parent->proxyModel) { @@ -222,6 +222,7 @@ class MessageTablePriv parent->proxyModel->setFilterRole(MessageModel::Ambiguous); parent->proxyModel->setFilterFixedString("true"); } + parent->endResetModel(); // reload table view //invalidateFilter() } @@ -230,10 +231,12 @@ class MessageTablePriv { if (status == WalletModel::Locked) { + parent->beginResetModel(); // reload table view + // -- Wallet is locked, clear secure message display. cachedMessageTable.clear(); - parent->reset(); // reload table view + parent->endResetModel(); // reload table view }; }; diff --git a/src/qt/sendmessagesdialog.cpp b/src/qt/sendmessagesdialog.cpp index 9ade02b3..f9f98931 100644 --- a/src/qt/sendmessagesdialog.cpp +++ b/src/qt/sendmessagesdialog.cpp @@ -1,12 +1,10 @@ #include "sendmessagesdialog.h" #include "ui_sendmessagesdialog.h" -//#include "init.h" #include "walletmodel.h" #include "messagemodel.h" #include "addressbookpage.h" #include "optionsmodel.h" #include "sendmessagesentry.h" -//#include "guiutil.h" #include #include @@ -155,7 +153,7 @@ void SendMessagesDialog::on_sendButton_clicked() QStringList formatted; foreach(const SendMessagesRecipient &rcp, recipients) { - formatted.append(tr("%1 to %2 (%3)").arg(rcp.message, Qt::escape(rcp.label), rcp.address)); + formatted.append(tr("%1 to %2 (%3)").arg(rcp.message, rcp.label.toHtmlEscaped(), rcp.address)); } fNewRecipientAllowed = false; From 8c89c16931796ab8807168a9d8225c57f6aea3ba Mon Sep 17 00:00:00 2001 From: vgulkevic Date: Sun, 15 Nov 2020 14:12:28 +0200 Subject: [PATCH 15/35] make && make deploy fixes --- Makefile.am | 18 +- contrib/macdeploy/DS_Store | Bin 0 -> 15364 bytes contrib/macdeploy/LICENSE | 6 +- contrib/macdeploy/README.md | 15 + contrib/macdeploy/detached-sig-apply.sh | 53 ++++ contrib/macdeploy/detached-sig-create.sh | 46 ++++ contrib/macdeploy/macdeployqtplus | 337 +++++++++++++++-------- contrib/macdeploy/notes.txt | 14 - libtool | 2 +- share/qt/Info.plist.in | 94 ++----- src/MakeFile.am | 16 +- src/Makefile.qt.include | 22 +- src/clientversion.cpp | 4 +- src/qt/MakeFile.am | 2 +- src/qt/bitcoin.qrc | 43 +-- src/qt/macdockiconhandler.h | 14 +- src/qt/macnotificationhandler.h | 13 +- src/qt/macnotificationhandler.mm | 28 +- 18 files changed, 448 insertions(+), 279 deletions(-) create mode 100644 contrib/macdeploy/DS_Store create mode 100644 contrib/macdeploy/README.md create mode 100755 contrib/macdeploy/detached-sig-apply.sh create mode 100755 contrib/macdeploy/detached-sig-create.sh mode change 100644 => 100755 contrib/macdeploy/macdeployqtplus delete mode 100644 contrib/macdeploy/notes.txt diff --git a/Makefile.am b/Makefile.am index 217fff0e..ff330b23 100644 --- a/Makefile.am +++ b/Makefile.am @@ -14,17 +14,17 @@ BITCOIN_QT_BIN=$(top_builddir)/src/qt/bitcoin-qt$(EXEEXT) BITCOIN_CLI_BIN=$(top_builddir)/src/bitcoin-cli$(EXEEXT) BITCOIN_WIN_INSTALLER=$(PACKAGE)-$(PACKAGE_VERSION)-win$(WINDOWS_BITS)-setup$(EXEEXT) -OSX_APP=Bitcoin-Qt.app -OSX_DMG=Bitcoin-Qt.dmg +OSX_APP=DigitalNote-Qt.app +OSX_DMG=DigitalNote-Qt.dmg OSX_DEPLOY_SCRIPT=$(top_srcdir)/contrib/macdeploy/macdeployqtplus OSX_FANCY_PLIST=$(top_srcdir)/contrib/macdeploy/fancy.plist -OSX_INSTALLER_ICONS=$(top_srcdir)/src/qt/res/icons/bitcoin.icns +OSX_INSTALLER_ICONS=$(top_srcdir)/src/qt/res/icons/digitalnote.icns OSX_PLIST=$(top_srcdir)/share/qt/Info.plist #not installed OSX_QT_TRANSLATIONS = da,de,es,hu,ru,uk,zh_CN,zh_TW DIST_DOCS = $(wildcard doc/*.md) $(wildcard doc/release-notes/*.md) -WINDOWS_PACKAGING = $(top_srcdir)/share/pixmaps/bitcoin.ico \ +WINDOWS_PACKAGING = $(top_srcdir)/share/pixmaps/digitalnote.ico \ $(top_srcdir)/share/pixmaps/nsis-header.bmp \ $(top_srcdir)/share/pixmaps/nsis-wizard.bmp \ $(top_srcdir)/doc/README_windows.txt @@ -74,17 +74,17 @@ $(OSX_APP)/Contents/Info.plist: $(OSX_PLIST) $(MKDIR_P) $(@D) $(INSTALL_DATA) $< $@ -$(OSX_APP)/Contents/Resources/bitcoin.icns: $(OSX_INSTALLER_ICONS) +$(OSX_APP)/Contents/Resources/digitalnote.icns: $(OSX_INSTALLER_ICONS) $(MKDIR_P) $(@D) $(INSTALL_DATA) $< $@ -$(OSX_APP)/Contents/MacOS/Bitcoin-Qt: $(BITCOIN_QT_BIN) +$(OSX_APP)/Contents/MacOS/DigitalNote-Qt: $(BITCOIN_QT_BIN) $(MKDIR_P) $(@D) STRIPPROG="$(STRIP)" $(INSTALL_STRIP_PROGRAM) $< $@ 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/MacOS/Bitcoin-Qt + $(OSX_APP)/Contents/Resources/digitalnote.icns $(OSX_APP)/Contents/Info.plist \ + $(OSX_APP)/Contents/MacOS/DigitalNote-Qt if BUILD_DARWIN $(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING) @@ -97,7 +97,7 @@ $(OSX_DMG): $(OSX_APP_BUILT) $(OSX_PACKAGING) $(INSTALL) contrib/macdeploy/background.png dist/.background $(INSTALL) contrib/macdeploy/DS_Store dist/.DS_Store cd dist; $(LN_S) /Applications Applications - $(GENISOIMAGE) -no-cache-inodes -l -probe -V "Bitcoin-Qt" -no-pad -r -apple -o $@ dist + $(GENISOIMAGE) -no-cache-inodes -l -probe -V "DigitalNote-Qt" -no-pad -r -apple -o $@ dist endif if TARGET_DARWIN diff --git a/contrib/macdeploy/DS_Store b/contrib/macdeploy/DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7527dc671fbe8730abc2497c2717778a19a024c6 GIT binary patch literal 15364 zcmeHMU2Ggz6+Yuk+FjeR*LK>ZX&P3zKoQy9*~7X>B`Q<_y+^up&iy&(-t*19XU^RvBCWV?C5fU$6hdJh>BVCY;(ji>s7tmS0N0>T zZVA$>rCPPp@OF(>4GIB;fI>hapb$_9{5K$gZ#Gk?M{xC22q**;0!;)sK15NN7bM>n z+z%ai_*VdM9nC&Lj<5h8mAoMNw&3UiX+jlTsA}?xp$T=gN9DMJZM8-D*=dOJ^$f=3?aFr0aNQ#j)$Ya>cSSAy9ZRa(HViZ5YR+$-Hstcyuena(X0n=~9Hkp?f}(KKZGV zd-16+f90!Bf9?723kNkBBxs<+;TKTXC|)UVNN@EYieD=X;}4PkroY`iz3?|OFgSGZ zuDcH%zURojM~@y`j0}~`^6GM(S3T)g-FmUQZo|V?>+G7jY)@1xX5+Etdc~TnndOSJ zyx`eScypD{VeDXQtZ(7dw)L4-)BJ_n?e_dJpQzimZvgaDHLv12jWc$=0e;r3*G*^HE?#)NYL@KkDW~Xqp1Zaf>GyTZuJdr+X1#?9 zWM1d+$r}Q4pjaLB03-ge$Yxi@zy;2(ZL7cTII$!(LccQE2~#IuNB`H8|(jYYx!ess$*V(gIyHsctT-TH+wYT6s4P7eh3dm$SK{%bz=M=;kz{@Y>PJ>cJ<6=VxDGzI*J z{izZ>Q=&Oh8`c7;A<_~=cVV49ytlXv7tRWYhYJr#Avgw+uI7mt7F`$~2%(5J@3@W~ z4i6U=WMhavN+;LGnVKcWxoAJXG`PA}*a z`lLRi&+4BPHoAfk_JLp`!Sy+Cgs@t%Xo!HVMGU6=xX+r8tTCS0kXx-J5AJ8Zcif#j zF#Qkg0-pLZ@~VDt9r@HeIMaT}KM*2CAYYeq0rIb;j2A%>4g;XBD3J#{Opz#dxi4Yo zKt3w{8-)CK***lhSGGqX&q%odc}2?FZ;5Wo@e#<^Wmwq0L3CWsi*A9?sz7M}t0mW6 zed7*R(<6q|ekXPlmhQv={*cJ?iW4vDtvyTRM;MH0JM)MgVqE9hk8nHIz<@9kyvsh0 zf>=fRKBCWOAb^5;5buJzExMci=Vd*xTSc9t$kQm#p|BoLHt~~NkMKGVqj1(Nf%M-l z4{0Y2eh2f><a(XHkOQ&+_Sbo&N<3YoinjD!- z7Dto8oTfi-i2izr=l3o8(=rzO;QP0*)%fMHUH=02|TQ4UMFd7@DdaBjU1akc|I zJm`KA`U~{l2%vdV>0~j{57j_#ANT!+P-kuEW+JQEsB>Fy(7A&OaTU z;8+;=^f&bLKPv1)doT>DPz3suEot-t!nc#)-WBbgVh*h$GcO z@tSu-$IfzKwjyQt^8i36Ek7;lR zXI+l(j9RY+_A!q4%3cY=Jo?yQx`DHT^TMI*Kehf~zq0M74Eur1E^xf!z5fOp-$c=I zSebMACHKLHjFqx8B{ON6sgY58w3N%3Su2&dGpSN$$;_mT{OCx!WLV9&zFT-#dx@u~ z_{Ln_sk(l)$qVj5vbIMGH(Pbf@|uGkLg!FUus$aMptsR#yBz&KxGuC^j(Wm9ef>S} z`Q<3gm!m^lTd8ygm!lNljdD5MjYjfm+>O4}c{lp*_k0)qE#^y|cO$+#y$t{z;D!P2 z6wT2h3g=&SvTp}g4xJEm=3(3P^E;aww~zN< z-o>^#dT9drd5x;b$IH<2z+KGMp{La`&vR{heS2o|aae%0jybnGbW!~uCIk|uC}#%` zB8c+WN|8c9A@Ke}K+~t@ri$=cW-GhA=L{u^avp_=$88JltKi`$G2loD{0e8a53r0j zgEhapb$_9 bCy)5Kssx1QY`Qmk9g|T$FB3 literal 0 HcmV?d00001 diff --git a/contrib/macdeploy/LICENSE b/contrib/macdeploy/LICENSE index 92f7d3fd..94a9ed02 100644 --- a/contrib/macdeploy/LICENSE +++ b/contrib/macdeploy/LICENSE @@ -98,7 +98,7 @@ public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through -a computer network, with no DigitalNote of a copy, is not conveying. +a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible @@ -318,7 +318,7 @@ modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the -User Product is DigitalNotered to the recipient in perpetuity or for a +User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply @@ -450,7 +450,7 @@ receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. - An "entity transaction" is a transaction DigitalNotering control of an + An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that diff --git a/contrib/macdeploy/README.md b/contrib/macdeploy/README.md new file mode 100644 index 00000000..0aa57b47 --- /dev/null +++ b/contrib/macdeploy/README.md @@ -0,0 +1,15 @@ +### MacDeploy ### + +For Snow Leopard (which uses [Python 2.6](http://www.python.org/download/releases/2.6/)), you will need the param_parser package: + + sudo easy_install argparse + +This script should not be run manually, instead, after building as usual: + + make deploy + +During the process, the disk image window will pop up briefly where the fancy +settings are applied. This is normal, please do not interfere. + +When finished, it will produce `Bitcoin-Qt.dmg`. + diff --git a/contrib/macdeploy/detached-sig-apply.sh b/contrib/macdeploy/detached-sig-apply.sh new file mode 100755 index 00000000..d080d686 --- /dev/null +++ b/contrib/macdeploy/detached-sig-apply.sh @@ -0,0 +1,53 @@ +#!/bin/sh +set -e + +UNSIGNED=$1 +SIGNATURE=$2 +ARCH=x86_64 +ROOTDIR=dist +BUNDLE=${ROOTDIR}/DigitalNote-Qt.app +TEMPDIR=signed.temp +OUTDIR=signed-app + +if [ -z "$UNSIGNED" ]; then + echo "usage: $0 " + exit 1 +fi + +if [ -z "$SIGNATURE" ]; then + echo "usage: $0 " + exit 1 +fi + +rm -rf ${TEMPDIR} && mkdir -p ${TEMPDIR} +tar -C ${TEMPDIR} -xf ${UNSIGNED} +tar -C ${TEMPDIR} -xf ${SIGNATURE} + +if [ -z "${PAGESTUFF}" ]; then + PAGESTUFF=${TEMPDIR}/pagestuff +fi + +if [ -z "${CODESIGN_ALLOCATE}" ]; then + CODESIGN_ALLOCATE=${TEMPDIR}/codesign_allocate +fi + +for i in `find ${TEMPDIR} -name "*.sign"`; do + SIZE=`stat -c %s ${i}` + TARGET_FILE=`echo ${i} | sed 's/\.sign$//'` + + echo "Allocating space for the signature of size ${SIZE} in ${TARGET_FILE}" + ${CODESIGN_ALLOCATE} -i ${TARGET_FILE} -a ${ARCH} ${SIZE} -o ${i}.tmp + + OFFSET=`${PAGESTUFF} ${i}.tmp -p | tail -2 | grep offset | sed 's/[^0-9]*//g'` + if [ -z ${QUIET} ]; then + echo "Attaching signature at offset ${OFFSET}" + fi + + dd if=$i of=${i}.tmp bs=1 seek=${OFFSET} count=${SIZE} 2>/dev/null + mv ${i}.tmp ${TARGET_FILE} + rm ${i} + echo "Success." +done +mv ${TEMPDIR}/${ROOTDIR} ${OUTDIR} +rm -rf ${TEMPDIR} +echo "Signed: ${OUTDIR}" diff --git a/contrib/macdeploy/detached-sig-create.sh b/contrib/macdeploy/detached-sig-create.sh new file mode 100755 index 00000000..c6cdfd1b --- /dev/null +++ b/contrib/macdeploy/detached-sig-create.sh @@ -0,0 +1,46 @@ +#!/bin/sh +set -e + +ROOTDIR=dist +BUNDLE=${ROOTDIR}/DigitalNote-Qt.app +CODESIGN=codesign +TEMPDIR=sign.temp +TEMPLIST=${TEMPDIR}/signatures.txt +OUT=signature.tar.gz + +if [ ! -n "$1" ]; then + echo "usage: $0 " + echo "example: $0 -s MyIdentity" + exit 1 +fi + +rm -rf ${TEMPDIR} ${TEMPLIST} +mkdir -p ${TEMPDIR} + +${CODESIGN} -f --file-list ${TEMPLIST} "$@" "${BUNDLE}" + +for i in `grep -v CodeResources ${TEMPLIST}`; do + TARGETFILE="${BUNDLE}/`echo ${i} | sed "s|.*${BUNDLE}/||"`" + SIZE=`pagestuff $i -p | tail -2 | grep size | sed 's/[^0-9]*//g'` + OFFSET=`pagestuff $i -p | tail -2 | grep offset | sed 's/[^0-9]*//g'` + SIGNFILE="${TEMPDIR}/${TARGETFILE}.sign" + DIRNAME="`dirname ${SIGNFILE}`" + mkdir -p "${DIRNAME}" + echo "Adding detached signature for: ${TARGETFILE}. Size: ${SIZE}. Offset: ${OFFSET}" + dd if=$i of=${SIGNFILE} bs=1 skip=${OFFSET} count=${SIZE} 2>/dev/null +done + +for i in `grep CodeResources ${TEMPLIST}`; do + TARGETFILE="${BUNDLE}/`echo ${i} | sed "s|.*${BUNDLE}/||"`" + RESOURCE="${TEMPDIR}/${TARGETFILE}" + DIRNAME="`dirname "${RESOURCE}"`" + mkdir -p "${DIRNAME}" + echo "Adding resource for: "${TARGETFILE}"" + cp "${i}" "${RESOURCE}" +done + +rm ${TEMPLIST} + +tar -C ${TEMPDIR} -czf ${OUT} . +rm -rf ${TEMPDIR} +echo "Created ${OUT}" diff --git a/contrib/macdeploy/macdeployqtplus b/contrib/macdeploy/macdeployqtplus old mode 100644 new mode 100755 index 9cd92a12..e7f17038 --- a/contrib/macdeploy/macdeployqtplus +++ b/contrib/macdeploy/macdeployqtplus @@ -17,9 +17,8 @@ # along with this program. If not, see . # -import subprocess, sys, re, os, shutil, stat, os.path +import subprocess, sys, re, os, shutil, stat, os.path, time from string import Template -from time import sleep from argparse import ArgumentParser # This is ported from the original macdeployqt with modifications @@ -38,14 +37,17 @@ class FrameworkInfo(object): self.sourceFilePath = "" self.destinationDirectory = "" self.sourceResourcesDirectory = "" + self.sourceVersionContentsDirectory = "" + self.sourceContentsDirectory = "" self.destinationResourcesDirectory = "" - + self.destinationVersionContentsDirectory = "" + def __eq__(self, other): if self.__class__ == other.__class__: return self.__dict__ == other.__dict__ else: return False - + def __str__(self): return """ Framework name: %s Framework directory: %s @@ -69,51 +71,51 @@ class FrameworkInfo(object): self.deployedInstallName, self.sourceFilePath, self.destinationDirectory) - + def isDylib(self): return self.frameworkName.endswith(".dylib") - + def isQtFramework(self): if self.isDylib(): return self.frameworkName.startswith("libQt") else: return self.frameworkName.startswith("Qt") - + reOLine = re.compile(r'^(.+) \(compatibility version [0-9.]+, current version [0-9.]+\)$') bundleFrameworkDirectory = "Contents/Frameworks" bundleBinaryDirectory = "Contents/MacOS" - + @classmethod def fromOtoolLibraryLine(cls, line): # Note: line must be trimmed if line == "": return None - + # Don't deploy system libraries (exception for libQtuitools and libQtlucene). if line.startswith("/System/Library/") or line.startswith("@executable_path") or (line.startswith("/usr/lib/") and "libQt" not in line): return None - + m = cls.reOLine.match(line) if m is None: raise RuntimeError("otool line could not be parsed: " + line) - + path = m.group(1) - + info = cls() info.sourceFilePath = path info.installName = path - + if path.endswith(".dylib"): dirname, filename = os.path.split(path) info.frameworkName = filename info.frameworkDirectory = dirname info.frameworkPath = path - + info.binaryDirectory = dirname info.binaryName = filename info.binaryPath = path info.version = "-" - + info.installName = path info.deployedInstallName = "@executable_path/../Frameworks/" + info.binaryName info.sourceFilePath = path @@ -128,22 +130,26 @@ class FrameworkInfo(object): i += 1 if i == len(parts): raise RuntimeError("Could not find .framework or .dylib in otool line: " + line) - + info.frameworkName = parts[i] info.frameworkDirectory = "/".join(parts[:i]) info.frameworkPath = os.path.join(info.frameworkDirectory, info.frameworkName) - + info.binaryName = parts[i+3] info.binaryDirectory = "/".join(parts[i+1:i+3]) info.binaryPath = os.path.join(info.binaryDirectory, info.binaryName) info.version = parts[i+2] - + info.deployedInstallName = "@executable_path/../Frameworks/" + os.path.join(info.frameworkName, info.binaryPath) info.destinationDirectory = os.path.join(cls.bundleFrameworkDirectory, info.frameworkName, info.binaryDirectory) - + info.sourceResourcesDirectory = os.path.join(info.frameworkPath, "Resources") + info.sourceContentsDirectory = os.path.join(info.frameworkPath, "Contents") + info.sourceVersionContentsDirectory = os.path.join(info.frameworkPath, "Versions", info.version, "Contents") info.destinationResourcesDirectory = os.path.join(cls.bundleFrameworkDirectory, info.frameworkName, "Resources") - + info.destinationContentsDirectory = os.path.join(cls.bundleFrameworkDirectory, info.frameworkName, "Contents") + info.destinationVersionContentsDirectory = os.path.join(cls.bundleFrameworkDirectory, info.frameworkName, "Versions", info.version, "Contents") + return info class ApplicationBundleInfo(object): @@ -161,7 +167,7 @@ class DeploymentInfo(object): self.qtPath = None self.pluginPath = None self.deployedFrameworks = [] - + def detectQtPath(self, frameworkDirectory): parentDir = os.path.dirname(frameworkDirectory) if os.path.exists(os.path.join(parentDir, "translations")): @@ -180,7 +186,7 @@ class DeploymentInfo(object): pluginPath = os.path.join(self.qtPath, "plugins") if os.path.exists(pluginPath): self.pluginPath = pluginPath - + def usesFramework(self, name): nameDot = "%s." % name libNameDot = "lib%s." % name @@ -196,32 +202,35 @@ class DeploymentInfo(object): def getFrameworks(binaryPath, verbose): if verbose >= 3: print "Inspecting with otool: " + binaryPath - otool = subprocess.Popen(["otool", "-L", binaryPath], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + otoolbin=os.getenv("OTOOL", "otool") + otool = subprocess.Popen([otoolbin, "-L", binaryPath], stdout=subprocess.PIPE, stderr=subprocess.PIPE) o_stdout, o_stderr = otool.communicate() if otool.returncode != 0: if verbose >= 1: sys.stderr.write(o_stderr) sys.stderr.flush() raise RuntimeError("otool failed with return code %d" % otool.returncode) - + otoolLines = o_stdout.split("\n") otoolLines.pop(0) # First line is the inspected binary if ".framework" in binaryPath or binaryPath.endswith(".dylib"): otoolLines.pop(0) # Frameworks and dylibs list themselves as a dependency. - + libraries = [] for line in otoolLines: + line = line.replace("@loader_path", os.path.dirname(binaryPath)) info = FrameworkInfo.fromOtoolLibraryLine(line.strip()) if info is not None: if verbose >= 3: print "Found framework:" print info libraries.append(info) - + return libraries def runInstallNameTool(action, *args): - subprocess.check_call(["install_name_tool", "-"+action] + list(args)) + installnametoolbin=os.getenv("INSTALLNAMETOOL", "install_name_tool") + subprocess.check_call([installnametoolbin, "-"+action] + list(args)) def changeInstallName(oldName, newName, binaryPath, verbose): if verbose >= 3: @@ -239,10 +248,11 @@ def changeIdentification(id, binaryPath, verbose): runInstallNameTool("id", id, binaryPath) def runStrip(binaryPath, verbose): + stripbin=os.getenv("STRIP", "strip") if verbose >= 3: print "Using strip:" print " stripped", binaryPath - subprocess.check_call(["strip", "-x", binaryPath]) + subprocess.check_call([stripbin, "-x", binaryPath]) def copyFramework(framework, path, verbose): if framework.sourceFilePath.startswith("Qt"): @@ -250,19 +260,18 @@ def copyFramework(framework, path, verbose): fromPath = "/Library/Frameworks/" + framework.sourceFilePath else: fromPath = framework.sourceFilePath - toDir = os.path.join(path, framework.destinationDirectory) toPath = os.path.join(toDir, framework.binaryName) - + if not os.path.exists(fromPath): raise RuntimeError("No file at " + fromPath) - + if os.path.exists(toPath): return None # Already there - + if not os.path.exists(toDir): os.makedirs(toDir) - + shutil.copy2(fromPath, toPath) if verbose >= 3: print "Copied:", fromPath @@ -273,68 +282,85 @@ def copyFramework(framework, path, verbose): os.chmod(toPath, permissions.st_mode | stat.S_IWRITE) if not framework.isDylib(): # Copy resources for real frameworks + + linkfrom = os.path.join(path, "Contents","Frameworks", framework.frameworkName, "Versions", "Current") + linkto = framework.version + if not os.path.exists(linkfrom): + os.symlink(linkto, linkfrom) + if verbose >= 2: + print "Linked:", linkfrom, "->", linkto fromResourcesDir = framework.sourceResourcesDirectory if os.path.exists(fromResourcesDir): toResourcesDir = os.path.join(path, framework.destinationResourcesDirectory) - shutil.copytree(fromResourcesDir, toResourcesDir) + shutil.copytree(fromResourcesDir, toResourcesDir, symlinks=True) if verbose >= 3: print "Copied resources:", fromResourcesDir print " to:", toResourcesDir + fromContentsDir = framework.sourceVersionContentsDirectory + if not os.path.exists(fromContentsDir): + fromContentsDir = framework.sourceContentsDirectory + if os.path.exists(fromContentsDir): + toContentsDir = os.path.join(path, framework.destinationVersionContentsDirectory) + shutil.copytree(fromContentsDir, toContentsDir, symlinks=True) + contentslinkfrom = os.path.join(path, framework.destinationContentsDirectory) + if verbose >= 3: + print "Copied Contents:", fromContentsDir + print " to:", toContentsDir elif framework.frameworkName.startswith("libQtGui"): # Copy qt_menu.nib (applies to non-framework layout) qtMenuNibSourcePath = os.path.join(framework.frameworkDirectory, "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): - shutil.copytree(qtMenuNibSourcePath, qtMenuNibDestinationPath) + shutil.copytree(qtMenuNibSourcePath, qtMenuNibDestinationPath, symlinks=True) if verbose >= 3: print "Copied for libQtGui:", qtMenuNibSourcePath print " to:", qtMenuNibDestinationPath - + return toPath def deployFrameworks(frameworks, bundlePath, binaryPath, strip, verbose, deploymentInfo=None): if deploymentInfo is None: deploymentInfo = DeploymentInfo() - + while len(frameworks) > 0: framework = frameworks.pop(0) deploymentInfo.deployedFrameworks.append(framework.frameworkName) - + if verbose >= 2: print "Processing", framework.frameworkName, "..." - + # Get the Qt path from one of the Qt frameworks if deploymentInfo.qtPath is None and framework.isQtFramework(): deploymentInfo.detectQtPath(framework.frameworkDirectory) - - if framework.installName.startswith("@executable_path"): + + if framework.installName.startswith("@executable_path") or framework.installName.startswith(bundlePath): if verbose >= 2: print framework.frameworkName, "already deployed, skipping." continue - + # install_name_tool the new id into the binary changeInstallName(framework.installName, framework.deployedInstallName, binaryPath, verbose) - + # Copy farmework to app bundle. deployedBinaryPath = copyFramework(framework, bundlePath, verbose) # Skip the rest if already was deployed. if deployedBinaryPath is None: continue - + if strip: runStrip(deployedBinaryPath, verbose) - + # install_name_tool it a new id. changeIdentification(framework.deployedInstallName, deployedBinaryPath, verbose) # Check for framework dependencies dependencies = getFrameworks(deployedBinaryPath, verbose) - + for dependency in dependencies: changeInstallName(dependency.installName, dependency.deployedInstallName, deployedBinaryPath, verbose) - + # Deploy framework if necessary. if dependency.frameworkName not in deploymentInfo.deployedFrameworks and dependency not in frameworks: frameworks.append(dependency) - + return deploymentInfo def deployFrameworksForAppBundle(applicationBundle, strip, verbose): @@ -348,6 +374,8 @@ def deployFrameworksForAppBundle(applicationBundle, strip, verbose): def deployPlugins(appBundleInfo, deploymentInfo, strip, verbose): # Lookup available plugins, exclude unneeded plugins = [] + if deploymentInfo.pluginPath is None: + return for dirpath, dirnames, filenames in os.walk(deploymentInfo.pluginPath): pluginDirectory = os.path.relpath(dirpath, deploymentInfo.pluginPath) if pluginDirectory == "designer": @@ -365,7 +393,7 @@ def deployPlugins(appBundleInfo, deploymentInfo, strip, verbose): # Deploy the script plugins only if QtScript is in use if not deploymentInfo.usesFramework("QtScript"): continue - elif pluginDirectory == "qmltooling": + elif pluginDirectory == "qmltooling" or pluginDirectory == "qml1tooling": # Deploy the qml plugins only if QtDeclarative is in use if not deploymentInfo.usesFramework("QtDeclarative"): continue @@ -373,6 +401,22 @@ def deployPlugins(appBundleInfo, deploymentInfo, strip, verbose): # Deploy the bearer plugins only if QtNetwork is in use if not deploymentInfo.usesFramework("QtNetwork"): continue + elif pluginDirectory == "position": + # Deploy the position plugins only if QtPositioning is in use + if not deploymentInfo.usesFramework("QtPositioning"): + continue + elif pluginDirectory == "sensors" or pluginDirectory == "sensorgestures": + # Deploy the sensor plugins only if QtSensors is in use + if not deploymentInfo.usesFramework("QtSensors"): + continue + elif pluginDirectory == "audio" or pluginDirectory == "playlistformats": + # Deploy the audio plugins only if QtMultimedia is in use + if not deploymentInfo.usesFramework("QtMultimedia"): + continue + elif pluginDirectory == "mediaservice": + # Deploy the mediaservice plugins only if QtMultimediaWidgets is in use + if not deploymentInfo.usesFramework("QtMultimediaWidgets"): + continue for pluginName in filenames: pluginPath = os.path.join(pluginDirectory, pluginName) @@ -391,39 +435,43 @@ def deployPlugins(appBundleInfo, deploymentInfo, strip, verbose): # Deploy the opengl graphicssystem plugin only if QtOpenGL is in use if not deploymentInfo.usesFramework("QtOpenGL"): continue + elif pluginPath == "accessible/libqtaccessiblequick.dylib": + # Deploy the accessible qtquick plugin only if QtQuick is in use + if not deploymentInfo.usesFramework("QtQuick"): + continue plugins.append((pluginDirectory, pluginName)) - + for pluginDirectory, pluginName in plugins: if verbose >= 2: print "Processing plugin", os.path.join(pluginDirectory, pluginName), "..." - + sourcePath = os.path.join(deploymentInfo.pluginPath, pluginDirectory, pluginName) destinationDirectory = os.path.join(appBundleInfo.pluginPath, pluginDirectory) if not os.path.exists(destinationDirectory): os.makedirs(destinationDirectory) - + destinationPath = os.path.join(destinationDirectory, pluginName) shutil.copy2(sourcePath, destinationPath) if verbose >= 3: print "Copied:", sourcePath print " to:", destinationPath - + if strip: runStrip(destinationPath, verbose) - + dependencies = getFrameworks(destinationPath, verbose) - + for dependency in dependencies: changeInstallName(dependency.installName, dependency.deployedInstallName, destinationPath, verbose) - + # Deploy framework if necessary. if dependency.frameworkName not in deploymentInfo.deployedFrameworks: deployFrameworks([dependency], appBundleInfo.path, destinationPath, strip, verbose, deploymentInfo) qt_conf="""[Paths] -translations=Resources -plugins=PlugIns +Translations=Resources +Plugins=PlugIns """ ap = ArgumentParser(description="""Improved version of macdeployqt. @@ -431,15 +479,21 @@ ap = ArgumentParser(description="""Improved version of macdeployqt. Outputs a ready-to-deploy app in a folder "dist" and optionally wraps it in a .dmg file. Note, that the "dist" folder will be deleted before deploying on each run. -Optionally, Qt translation files (.qm) and additional resources can be added to the bundle.""") +Optionally, Qt translation files (.qm) and additional resources can be added to the bundle. + +Also optionally signs the .app bundle; set the CODESIGNARGS environment variable to pass arguments +to the codesign tool. +E.g. CODESIGNARGS='--sign "Developer ID Application: ..." --keychain /encrypted/foo.keychain'""") ap.add_argument("app_bundle", nargs=1, metavar="app-bundle", help="application bundle to be deployed") ap.add_argument("-verbose", type=int, nargs=1, default=[1], metavar="<0-3>", help="0 = no output, 1 = error/warning (default), 2 = normal, 3 = debug") ap.add_argument("-no-plugins", dest="plugins", action="store_false", default=True, help="skip plugin deployment") ap.add_argument("-no-strip", dest="strip", action="store_false", default=True, help="don't run 'strip' on the binaries") +ap.add_argument("-sign", dest="sign", action="store_true", default=False, help="sign .app bundle with codesign tool") ap.add_argument("-dmg", nargs="?", const="", metavar="basename", help="create a .dmg disk image; if basename is not specified, a camel-cased version of the app name is used") ap.add_argument("-fancy", nargs=1, metavar="plist", default=[], help="make a fancy looking disk image using the given plist file with instructions; requires -dmg to work") 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("-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") config = ap.parse_args() @@ -458,6 +512,15 @@ if not os.path.exists(app_bundle): app_bundle_name = os.path.splitext(os.path.basename(app_bundle))[0] # ------------------------------------------------ +translations_dir = None +if config.translations_dir and config.translations_dir[0]: + if os.path.exists(config.translations_dir[0]): + translations_dir = config.translations_dir[0] + else: + if verbose >= 1: + sys.stderr.write("Error: Could not find translation dir \"%s\"\n" % (translations_dir)) + sys.exit(1) +# ------------------------------------------------ for p in config.add_resources: if verbose >= 3: @@ -478,17 +541,7 @@ if len(config.fancy) == 1: if verbose >= 1: sys.stderr.write("Error: Could not import plistlib which is required for fancy disk images.\n") sys.exit(1) - - if verbose >= 3: - print "Fancy: Importing appscript..." - try: - import appscript - except ImportError: - if verbose >= 1: - sys.stderr.write("Error: Could not import appscript which is required for fancy disk images.\n") - sys.stderr.write("Please install it e.g. with \"sudo easy_install appscript\".\n") - sys.exit(1) - + p = config.fancy[0] if verbose >= 3: print "Fancy: Loading \"%s\"..." % p @@ -496,14 +549,14 @@ if len(config.fancy) == 1: if verbose >= 1: sys.stderr.write("Error: Could not find fancy disk image plist at \"%s\"\n" % (p)) sys.exit(1) - + try: fancy = plistlib.readPlist(p) except: if verbose >= 1: sys.stderr.write("Error: Could not parse fancy disk image plist at \"%s\"\n" % (p)) sys.exit(1) - + try: assert not fancy.has_key("window_bounds") 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) @@ -517,7 +570,7 @@ if len(config.fancy) == 1: if verbose >= 1: sys.stderr.write("Error: Bad format of fancy disk image plist at \"%s\"\n" % (p)) sys.exit(1) - + if fancy.has_key("background_picture"): bp = fancy["background_picture"] if verbose >= 3: @@ -538,7 +591,7 @@ else: if os.path.exists("dist"): if verbose >= 2: print "+ Removing old dist folder +" - + shutil.rmtree("dist") # ------------------------------------------------ @@ -551,7 +604,7 @@ if verbose >= 3: print app_bundle, "->", target os.mkdir("dist") -shutil.copytree(app_bundle, target) +shutil.copytree(app_bundle, target, symlinks=True) applicationBundle = ApplicationBundleInfo(target) @@ -571,27 +624,34 @@ try: except RuntimeError as e: if verbose >= 1: sys.stderr.write("Error: %s\n" % str(e)) - sys.exit(ret) + sys.exit(1) # ------------------------------------------------ if config.plugins: if verbose >= 2: print "+ Deploying plugins +" - + try: deployPlugins(applicationBundle, deploymentInfo, config.strip, verbose) except RuntimeError as e: if verbose >= 1: sys.stderr.write("Error: %s\n" % str(e)) - sys.exit(ret) + sys.exit(1) # ------------------------------------------------ if len(config.add_qt_tr) == 0: add_qt_tr = [] else: - qt_tr_dir = os.path.join(deploymentInfo.qtPath, "translations") + if translations_dir is not None: + qt_tr_dir = translations_dir + else: + if deploymentInfo.qtPath is not None: + qt_tr_dir = os.path.join(deploymentInfo.qtPath, "translations") + else: + sys.stderr.write("Error: Could not find Qt translation path\n") + sys.exit(1) add_qt_tr = ["qt_%s.qm" % lng for lng in config.add_qt_tr[0].split(",")] for lng_file in add_qt_tr: p = os.path.join(qt_tr_dir, lng_file) @@ -631,12 +691,21 @@ for p in config.add_resources: if verbose >= 3: print p, "->", t if os.path.isdir(p): - shutil.copytree(p, t) + shutil.copytree(p, t, symlinks=True) else: shutil.copy2(p, t) # ------------------------------------------------ +if config.sign and 'CODESIGNARGS' not in os.environ: + print "You must set the CODESIGNARGS environment variable. Skipping signing." +elif config.sign: + if verbose >= 1: + print "Code-signing app bundle %s"%(target,) + subprocess.check_call("codesign --force %s %s"%(os.environ['CODESIGNARGS'], target), shell=True) + +# ------------------------------------------------ + if config.dmg is not None: #Patch in check_output for Python 2.6 @@ -666,26 +735,26 @@ if config.dmg is not None: elif verbose >= 3: hdiutil_args.append("-verbose") run = subprocess.check_call - + for key, value in kwargs.iteritems(): hdiutil_args.append("-" + key) if not value is True: hdiutil_args.append(str(value)) - + return run(hdiutil_args) - + if verbose >= 2: if fancy is None: print "+ Creating .dmg disk image +" else: print "+ Preparing .dmg disk image +" - + if config.dmg != "": dmg_name = config.dmg else: spl = app_bundle_name.split(" ") dmg_name = spl[0] + "".join(p.capitalize() for p in spl[1:]) - + if fancy is None: try: runHDIUtil("create", dmg_name, srcfolder="dist", format="UDBZ", volname=app_bundle_name, ov=True) @@ -699,28 +768,28 @@ if config.dmg is not None: for file in files: size += os.path.getsize(os.path.join(path, file)) size += int(size * 0.1) - + if verbose >= 3: print "Creating temp image for modification..." try: runHDIUtil("create", dmg_name + ".temp", srcfolder="dist", format="UDRW", size=size, volname=app_bundle_name, ov=True) except subprocess.CalledProcessError as e: sys.exit(e.returncode) - + if verbose >= 3: print "Attaching temp image..." try: output = runHDIUtil("attach", dmg_name + ".temp", readwrite=True, noverify=True, noautoopen=True, capture_stdout=True) except subprocess.CalledProcessError as e: sys.exit(e.returncode) - + m = re.search("/Volumes/(.+$)", output) disk_root = m.group(0) disk_name = m.group(1) - + if verbose >= 2: print "+ Applying fancy settings +" - + if fancy.has_key("background_picture"): bg_path = os.path.join(disk_root, os.path.basename(fancy["background_picture"])) if verbose >= 3: @@ -728,43 +797,81 @@ if config.dmg is not None: shutil.copy2(fancy["background_picture"], bg_path) else: bg_path = None - + if fancy.get("applications_symlink", False): os.symlink("/Applications", os.path.join(disk_root, "Applications")) - - finder = appscript.app("Finder") - disk = finder.disks[disk_name] - disk.open() - window = disk.container_window - window.current_view.set(appscript.k.icon_view) - window.toolbar_visible.set(False) - window.statusbar_visible.set(False) - if fancy.has_key("window_bounds"): - window.bounds.set(fancy["window_bounds"]) - view_options = window.icon_view_options - view_options.arrangement.set(appscript.k.not_arranged) - if fancy.has_key("icon_size"): - view_options.icon_size.set(fancy["icon_size"]) - if bg_path is not None: - view_options.background_picture.set(disk.files[os.path.basename(bg_path)]) + + # The Python appscript package broke with OSX 10.8 and isn't being fixed. + # So we now build up an AppleScript string and use the osascript command + # to make the .dmg file pretty: + appscript = Template( """ + on run argv + tell application "Finder" + tell disk "$disk" + open + set current view of container window to icon view + set toolbar visible of container window to false + set statusbar visible of container window to false + set the bounds of container window to {$window_bounds} + set theViewOptions to the icon view options of container window + set arrangement of theViewOptions to not arranged + set icon size of theViewOptions to $icon_size + $background_commands + $items_positions + close -- close/reopen works around a bug... + open + update without registering applications + delay 5 + eject + end tell + end tell + end run + """) + + itemscript = Template('set position of item "${item}" of container window to {${position}}') + items_positions = [] if fancy.has_key("items_position"): for name, position in fancy["items_position"].iteritems(): - window.items[name].position.set(position) - disk.close() + params = { "item" : name, "position" : ",".join([str(p) for p in position]) } + items_positions.append(itemscript.substitute(params)) + + params = { + "disk" : "DigitalNote-Qt", + "window_bounds" : "300,300,800,620", + "icon_size" : "96", + "background_commands" : "", + "items_positions" : "\n ".join(items_positions) + } + if fancy.has_key("window_bounds"): + params["window.bounds"] = ",".join([str(p) for p in fancy["window_bounds"]]) + if fancy.has_key("icon_size"): + params["icon_size"] = str(fancy["icon_size"]) if bg_path is not None: - subprocess.call(["SetFile", "-a", "V", bg_path]) - disk.update(registering_applications=False) - sleep(2) - disk.eject() + # Set background file, then call SetFile to make it invisible. + # (note: making it invisible first makes set background picture fail) + bgscript = Template("""set background picture of theViewOptions to file "$bgpic" + do shell script "SetFile -a V /Volumes/$disk/$bgpic" """) + params["background_commands"] = bgscript.substitute({"bgpic" : os.path.basename(bg_path), "disk" : params["disk"]}) + s = appscript.substitute(params) if verbose >= 2: - print "+ Finalizing .dmg disk image +" + print("Running AppleScript:") + print(s) + + p = subprocess.Popen(['osascript', '-'], stdin=subprocess.PIPE) + p.communicate(input=s) + if p.returncode: + print("Error running osascript.") + if verbose >= 2: + print "+ Finalizing .dmg disk image +" + time.sleep(5) + try: runHDIUtil("convert", dmg_name + ".temp", format="UDBZ", o=dmg_name + ".dmg", ov=True) except subprocess.CalledProcessError as e: sys.exit(e.returncode) - + os.unlink(dmg_name + ".temp.dmg") # ------------------------------------------------ diff --git a/contrib/macdeploy/notes.txt b/contrib/macdeploy/notes.txt deleted file mode 100644 index 28cf5e81..00000000 --- a/contrib/macdeploy/notes.txt +++ /dev/null @@ -1,14 +0,0 @@ -You will need the appscript package for the fancy disk image creation to work. -Install it by invoking "sudo easy_install appscript". - -For Snow Leopard (which uses Python 2.6), you will need the param_parser package. -Install it by invoking "sudo easy_install argparse" - -This script should not be run manually, instead, after building as usual: -"make deploy" - -During the process, the disk image window will pop up briefly where the fancy -settings are applied. This is normal, please do not interfere. - -When finished, it will produce DigitalNote-qt.dmg. - diff --git a/libtool b/libtool index 8cb93dea..61429e19 100755 --- a/libtool +++ b/libtool @@ -45,7 +45,7 @@ macro_revision=2.4.6 pic_mode=yes # Whether or not to build shared libraries. -build_libtool_libs=no +build_libtool_libs=yes # Whether or not to build static libraries. build_old_libs=yes diff --git a/share/qt/Info.plist.in b/share/qt/Info.plist.in index ac4d2556..a455283e 100644 --- a/share/qt/Info.plist.in +++ b/share/qt/Info.plist.in @@ -2,74 +2,32 @@ - CFBundleIconFile - bitcoin.icns - CFBundlePackageType - APPL - CFBundleGetInfoString - @CLIENT_VERSION_MAJOR@.@CLIENT_VERSION_MINOR@, Copyright © 2009-@COPYRIGHT_YEAR@ The Bitcoin developers - CFBundleShortVersionString - @CLIENT_VERSION_MAJOR@.@CLIENT_VERSION_MINOR@ - CFBundleVersion - @CLIENT_VERSION_MAJOR@.@CLIENT_VERSION_MINOR@ - CFBundleSignature - ???? - CFBundleExecutable - Bitcoin-Qt - CFBundleIdentifier - org.bitcoinfoundation.Bitcoin-Qt - - CFBundleURLTypes - - - CFBundleTypeRole - Editor - CFBundleURLName - org.bitcoin.BitcoinPayment - CFBundleURLSchemes - - bitcoin - - - - - UTExportedTypeDeclarations - - - UTTypeIdentifier - org.bitcoin.paymentrequest - UTTypeDescription - Bitcoin payment request - UTTypeConformsTo - - public.data - - UTTypeTagSpecification - - public.mime-type - application/x-bitcoin-payment-request - public.filename-extension + CFBundleIconFile + digitalnote.icns + CFBundlePackageType + APPL + CFBundleGetInfoString + DigitalNote-Qt + CFBundleSignature + ???? + CFBundleExecutable + DigitalNote-Qt + CFBundleIdentifier + co.DigitalNote.DigitalNote-Qt + CFBundleURLTypes - bitcoinpaymentrequest + + CFBundleTypeRole + Editor + CFBundleURLName + co.DigitalNote.DigitalNotePayment + CFBundleURLSchemes + + DigitalNote + + - - - - - CFBundleDocumentTypes - - - CFBundleTypeRole - Editor - LSItemContentTypes - - org.bitcoin.paymentrequest - - LSHandlerRank - Owner - - - NSHighResolutionCapable - + LSAppNapIsDisabled + True - \ No newline at end of file + diff --git a/src/MakeFile.am b/src/MakeFile.am index f724c0cf..acca8ba3 100644 --- a/src/MakeFile.am +++ b/src/MakeFile.am @@ -25,7 +25,7 @@ BITCOIN_INCLUDES += -I$(srcdir)/secp256k1/include LIBBITCOIN_SERVER=libbitcoin_server.a LIBBITCOIN_WALLET=libbitcoin_wallet.a LIBBITCOIN_COMMON=libbitcoin_common.a -LIBBITCOIN_CLI=libbitcoin_cli.a +#LIBBITCOIN_CLI=libbitcoin_cli.a LIBBITCOIN_UTIL=libbitcoin_util.a LIBBITCOIN_CRYPTO=crypto/libbitcoin_crypto.a #LIBBITCOIN_UNIVALUE=univalue/libbitcoin_univalue.a @@ -42,19 +42,19 @@ noinst_LIBRARIES = \ libbitcoin_util.a \ libbitcoin_common.a \ #univalue/libbitcoin_univalue.a \ - libbitcoin_server.a \ - libbitcoin_cli.a + libbitcoin_server.a + #libbitcoin_cli.a if ENABLE_WALLET BITCOIN_INCLUDES += $(BDB_CPPFLAGS) noinst_LIBRARIES += libbitcoin_wallet.a endif -if BUILD_BITCOIN_LIBS -lib_LTLIBRARIES = libbitcoinconsensus.la -LIBBITCOIN_CONSENSUS=libbitcoinconsensus.la -else +#if BUILD_BITCOIN_LIBS +#lib_LTLIBRARIES = libbitcoinconsensus.la +#LIBBITCOIN_CONSENSUS=libbitcoinconsensus.la +#else LIBBITCOIN_CONSENSUS= -endif +#endif bin_PROGRAMS = TESTS = diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index fb9ab3ec..522e249b 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -78,6 +78,7 @@ QT_TS = \ QT_FORMS_UI = \ qt/forms/coincontroldialog.ui \ qt/forms/sendcoinsdialog.ui \ + qt/forms/qrcodedialog.ui \ qt/forms/addressbookpage.ui \ qt/forms/signverifymessagedialog.ui \ qt/forms/aboutdialog.ui \ @@ -133,6 +134,8 @@ QT_MOC_CPP = \ qt/moc_guiconstants.cpp \ qt/moc_optionsmodel.cpp \ qt/moc_monitoreddatamapper.cpp \ + qt/moc_macdockiconhandler.cpp \ + qt/moc_macnotificationhandler.cpp \ qt/moc_peertablemodel.cpp \ qt/moc_trafficgraphwidget.cpp \ qt/moc_transactiondesc.cpp \ @@ -151,6 +154,7 @@ QT_MOC_CPP = \ qt/moc_askpassphrasedialog.cpp \ qt/moc_notificator.cpp \ qt/moc_paymentserver.cpp \ + qt/moc_qrcodedialog.cpp \ qt/moc_rpcconsole.cpp BITCOIN_MM = \ @@ -207,6 +211,8 @@ BITCOIN_QT_H = \ qt/guiconstants.h \ qt/optionsmodel.h \ qt/monitoreddatamapper.h \ + qt/macdockiconhandler.h \ + qt/macnotificationhandler.h \ qt/peertablemodel.h \ qt/trafficgraphwidget.h \ qt/transactiondesc.h \ @@ -225,6 +231,7 @@ BITCOIN_QT_H = \ qt/askpassphrasedialog.h \ qt/notificator.h \ qt/paymentserver.h \ + qt/qrcodedialog.h \ qt/rpcconsole.h RES_ICONS = \ @@ -360,7 +367,8 @@ BITCOIN_QT_CPP = \ qt/sendmessagesentry.cpp \ qt/blockbrowser.cpp \ qt/qvalidatedtextedit.cpp \ - qt/plugins/mrichtexteditor/mrichtextedit.cpp + qt/qrcodedialog.cpp \ + qt/plugins/mrichtexteditor/mrichtextedit.cpp endif RES_IMAGES = \ @@ -372,7 +380,7 @@ RES_IMAGES = \ qt/res/images/header_dark.png -RES_MOVIES = $(wildcard qt/res/movies/spinner-*.png) +RES_MOVIES = $(wildcard $(srcdir)/qt/res/movies/spinner-*.png) BITCOIN_RC = qt/res/bitcoin-qt-res.rc @@ -411,7 +419,7 @@ qt_bitcoin_qt_LDADD = qt/libbitcoinqt.a $(LIBBITCOIN_SERVER) if ENABLE_WALLET qt_bitcoin_qt_LDADD += $(LIBBITCOIN_WALLET) endif -qt_bitcoin_qt_LDADD += $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBBITCOIN_UNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \ +qt_bitcoin_qt_LDADD += $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBBITCOIN_UNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \ $(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBSECP256K1) qt_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) qt_bitcoin_qt_LIBTOOLFLAGS = --tag CXX @@ -435,10 +443,12 @@ translate: qt/bitcoinstrings.cpp $(QT_FORMS_UI) $(QT_FORMS_UI) $(BITCOIN_QT_CPP) # $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin_locale $(@D)/$( $@ -$(QT_QRC_CPP): $(QT_QRC) $(QT_FORMS_H) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) +$(QT_QRC_CPP): $(QT_QRC) $(QT_FORMS_H) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) $(PROTOBUF_H) @test -f $(RCC) - $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin $< | \ + @cp -f $< $(@D)/temp_$( $@ + @rm $(@D)/temp_$( + res/icons/address-book.png res/icons/quit.png @@ -92,46 +92,5 @@ res/movies/update_spinner.mng res/movies/update_spinner_black.mng - - locale/bitcoin_ar.qm - locale/bitcoin_ca_ES.qm - locale/bitcoin_cs.qm - locale/bitcoin_da.qm - locale/bitcoin_de.qm - locale/bitcoin_el_GR.qm - locale/bitcoin_en.qm - locale/bitcoin_eo.qm - locale/bitcoin_es_CL.qm - locale/bitcoin_es_DO.qm - locale/bitcoin_es.qm - locale/bitcoin_fa.qm - locale/bitcoin_fi.qm - locale/bitcoin_fr_CA.qm - locale/bitcoin_fr.qm - locale/bitcoin_gl.qm - locale/bitcoin_he.qm - locale/bitcoin_hr.qm - locale/bitcoin_hu.qm - locale/bitcoin_it.qm - locale/bitcoin_ja.qm - locale/bitcoin_ka.qm - locale/bitcoin_ko_KR.qm - locale/bitcoin_lt.qm - locale/bitcoin_nb.qm - locale/bitcoin_nl.qm - locale/bitcoin_pam.qm - locale/bitcoin_pl.qm - locale/bitcoin_pt_BR.qm - locale/bitcoin_pt_PT.qm - locale/bitcoin_ro_RO.qm - locale/bitcoin_ru.qm - locale/bitcoin_sk.qm - locale/bitcoin_sl_SI.qm - locale/bitcoin_sv.qm - locale/bitcoin_tr.qm - locale/bitcoin_uk.qm - locale/bitcoin_zh_CN.qm - locale/bitcoin_zh_TW.qm - diff --git a/src/qt/macdockiconhandler.h b/src/qt/macdockiconhandler.h index 89baa725..51886c74 100644 --- a/src/qt/macdockiconhandler.h +++ b/src/qt/macdockiconhandler.h @@ -1,5 +1,9 @@ -#ifndef MACDOCKICONHANDLER_H -#define MACDOCKICONHANDLER_H +// Copyright (c) 2011-2013 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_QT_MACDOCKICONHANDLER_H +#define BITCOIN_QT_MACDOCKICONHANDLER_H #include #include @@ -32,8 +36,8 @@ class MacDockIconHandler : public QObject void handleDockIconClickEvent(); -signals: - void dockIconClicked(); + signals: + void dockIconClicked(); private: MacDockIconHandler(); @@ -44,4 +48,4 @@ class MacDockIconHandler : public QObject QMainWindow *mainWindow; }; -#endif // MACDOCKICONCLICKHANDLER_H +#endif // BITCOIN_QT_MACDOCKICONHANDLER_H diff --git a/src/qt/macnotificationhandler.h b/src/qt/macnotificationhandler.h index af6276e5..f7a4cb7f 100644 --- a/src/qt/macnotificationhandler.h +++ b/src/qt/macnotificationhandler.h @@ -1,8 +1,13 @@ -#ifndef MACNOTIFICATIONHANDLER_H -#define MACNOTIFICATIONHANDLER_H +// Copyright (c) 2011-2013 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_QT_MACNOTIFICATIONHANDLER_H +#define BITCOIN_QT_MACNOTIFICATIONHANDLER_H + #include -/** Macintosh-specific notification handler (supports UserNotificationCenter). +/** Macintosh-specific notification handler (supports UserNotificationCenter and Growl). */ class MacNotificationHandler : public QObject { @@ -22,4 +27,4 @@ class MacNotificationHandler : public QObject }; -#endif // MACNOTIFICATIONHANDLER_H +#endif // BITCOIN_QT_MACNOTIFICATIONHANDLER_H diff --git a/src/qt/macnotificationhandler.mm b/src/qt/macnotificationhandler.mm index 8bb9b887..794e9a6e 100644 --- a/src/qt/macnotificationhandler.mm +++ b/src/qt/macnotificationhandler.mm @@ -1,8 +1,25 @@ +// Copyright (c) 2011-2013 The Bitcoin Core developers +// Distributed under the MIT/X11 software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + #include "macnotificationhandler.h" #undef slots +#import #include +// Add an obj-c category (extension) to return the expected bundle identifier +@implementation NSBundle(returnCorrectIdentifier) +- (NSString *)__bundleIdentifier +{ + if (self == [NSBundle mainBundle]) { + return @"co.DigitalNote.DigitalNotePayment"; + } else { + return [self __bundleIdentifier]; + } +} +@end + void MacNotificationHandler::showNotification(const QString &title, const QString &text) { // check if users OS has support for NSUserNotification @@ -59,7 +76,16 @@ MacNotificationHandler *MacNotificationHandler::instance() { static MacNotificationHandler *s_instance = NULL; - if (!s_instance) + if (!s_instance) { s_instance = new MacNotificationHandler(); + + Class aPossibleClass = objc_getClass("NSBundle"); + if (aPossibleClass) { + // change NSBundle -bundleIdentifier method to return a correct bundle identifier + // a bundle identifier is required to use OSXs User Notification Center + method_exchangeImplementations(class_getInstanceMethod(aPossibleClass, @selector(bundleIdentifier)), + class_getInstanceMethod(aPossibleClass, @selector(__bundleIdentifier))); + } + } return s_instance; } From c4bdd0c8ced0b550f8a0907a62e187b0f6dc4363 Mon Sep 17 00:00:00 2001 From: 2a5A1Ghu1 <13294167+2a5A1Ghu1@users.noreply.github.com> Date: Sun, 15 Nov 2020 12:06:39 -0800 Subject: [PATCH 16/35] Update .gitignore --- .gitignore | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 4bad53c5..9b9ed848 100644 --- a/.gitignore +++ b/.gitignore @@ -63,8 +63,8 @@ src/qt/res/.dirstamp # Compilation and Qt preprocessor part *.qm Makefile -bitcoin-qt -Bitcoin-Qt.app +DigitalNote-qt +DigitalNote-Qt.app # Unit-tests Makefile.test @@ -109,3 +109,11 @@ src/crypto/common/.dirstamp src/support/.deps/.dirstamp src/support/.dirstamp src/qt/plugins/mrichtexteditor/ui_mrichtextedit.h +libtool +build-aux/config.guess +build-aux/config.sub +libtool +src/qt/plugins/mrichtexteditor/.deps/.dirstamp +src/qt/plugins/mrichtexteditor/.dirstamp +build-aux/config.guess +libtool From 32c1544bed8656bd7e0d5a5959c6fa54675136ab Mon Sep 17 00:00:00 2001 From: 2a5A1Ghu1 <13294167+2a5A1Ghu1@users.noreply.github.com> Date: Sun, 15 Nov 2020 12:54:48 -0800 Subject: [PATCH 17/35] [BUILD] regenerate bitcoin-config.h as necessary --- .gitignore | 5 +++++ Makefile.am | 3 --- src/MakeFile.am | 7 +++++++ 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 9b9ed848..ba40af37 100644 --- a/.gitignore +++ b/.gitignore @@ -117,3 +117,8 @@ src/qt/plugins/mrichtexteditor/.deps/.dirstamp src/qt/plugins/mrichtexteditor/.dirstamp build-aux/config.guess libtool +libbitcoinconsensus.pc +src/qt/plugins/mrichtexteditor/moc_mrichtextedit.cpp +src/qt/bitcoin-qt +build-aux/config.guess +build-aux/config.sub diff --git a/Makefile.am b/Makefile.am index ff330b23..97437761 100644 --- a/Makefile.am +++ b/Makefile.am @@ -59,9 +59,6 @@ $(BITCOIN_WIN_INSTALLER): all-recursive @test -f $(MAKENSIS) && $(MAKENSIS) $(top_builddir)/share/setup.nsi || \ echo error: could not build $@ -$(if $(findstring src/,$(MAKECMDGOALS)),$(MAKECMDGOALS), none): FORCE - $(MAKE) -C src $(patsubst src/%,%,$@) - $(OSX_APP)/Contents/PkgInfo: $(MKDIR_P) $(@D) @echo "APPL????" > $@ diff --git a/src/MakeFile.am b/src/MakeFile.am index acca8ba3..17741f6e 100644 --- a/src/MakeFile.am +++ b/src/MakeFile.am @@ -345,6 +345,13 @@ DISTCLEANFILES = obj/build.h EXTRA_DIST = leveldb secp256k1 +config/bitcoin-config.h: config/stamp-h1 + @$(MAKE) -C $(top_builddir) $(subdir)/$(@) +config/stamp-h1: $(top_srcdir)/$(subdir)/config/bitcoin-config.h.in $(top_builddir)/config.status + $(AM_V_at)$(MAKE) -C $(top_builddir) $(subdir)/$(@) +$(top_srcdir)/$(subdir)/config/bitcoin-config.h.in: $(am__configure_deps) + $(AM_V_at)$(MAKE) -C $(top_srcdir) $(subdir)/config/bitcoin-config.h.in + clean-local: -$(MAKE) -C leveldb clean -$(MAKE) -C secp256k1 clean 2>/dev/null From 310a9b4d25c72cb4a856971a725a116fc7e22fc1 Mon Sep 17 00:00:00 2001 From: 2a5A1Ghu1 <13294167+2a5A1Ghu1@users.noreply.github.com> Date: Sun, 15 Nov 2020 13:09:47 -0800 Subject: [PATCH 18/35] [BUILD] Fix libbitcoinconsensus.pc Creation --- configure.ac | 1 + 1 file changed, 1 insertion(+) diff --git a/configure.ac b/configure.ac index 8ffe74dd..d0f91517 100644 --- a/configure.ac +++ b/configure.ac @@ -691,6 +691,7 @@ AC_MSG_CHECKING([whether to build libraries]) AM_CONDITIONAL([BUILD_BITCOIN_LIBS], [test x$build_bitcoin_libs = xyes]) if test x$build_bitcoin_libs = xyes; then AC_DEFINE(HAVE_CONSENSUS_LIB, 1, [Define this symbol if the consensus lib has been built]) + AC_CONFIG_FILES([libbitcoinconsensus.pc:libbitcoinconsensus.pc.in]) fi AC_MSG_RESULT($build_bitcoin_libs) From 376a0cb0b189cccd524433fc6121cc31a6e3e6e5 Mon Sep 17 00:00:00 2001 From: 2a5A1Ghu1 <13294167+2a5A1Ghu1@users.noreply.github.com> Date: Sun, 15 Nov 2020 16:51:41 -0800 Subject: [PATCH 19/35] [BOOST] Solving boost signal placeholders issues. https://github.com/PIVX-Project/PIVX/pull/1899 --- src/json/json_spirit_reader_template.h | 110 ++++++++++++------------- src/main.cpp | 26 +++--- src/qt/clientmodel.cpp | 20 ++--- src/qt/messagemodel.cpp | 10 +-- src/qt/transactiontablemodel.cpp | 10 +-- src/qt/walletmodel.cpp | 22 ++--- src/rpcserver.cpp | 6 +- 7 files changed, 102 insertions(+), 102 deletions(-) diff --git a/src/json/json_spirit_reader_template.h b/src/json/json_spirit_reader_template.h index 46f5892f..f2b19eab 100644 --- a/src/json/json_spirit_reader_template.h +++ b/src/json/json_spirit_reader_template.h @@ -11,7 +11,7 @@ //#define BOOST_SPIRIT_THREADSAFE // uncomment for multithreaded use, requires linking to boost.thread -#include +#include #include #include @@ -65,7 +65,7 @@ namespace json_spirit const Char_type c2( *( ++begin ) ); return ( hex_to_num( c1 ) << 4 ) + hex_to_num( c2 ); - } + } template< class Char_type, class Iter_type > Char_type unicode_str_to_char( Iter_type& begin ) @@ -75,19 +75,19 @@ namespace json_spirit const Char_type c3( *( ++begin ) ); const Char_type c4( *( ++begin ) ); - return ( hex_to_num( c1 ) << 12 ) + - ( hex_to_num( c2 ) << 8 ) + - ( hex_to_num( c3 ) << 4 ) + + return ( hex_to_num( c1 ) << 12 ) + + ( hex_to_num( c2 ) << 8 ) + + ( hex_to_num( c3 ) << 4 ) + hex_to_num( c4 ); } template< class String_type > - void append_esc_char_and_incr_iter( String_type& s, - typename String_type::const_iterator& begin, + void append_esc_char_and_incr_iter( String_type& s, + typename String_type::const_iterator& begin, typename String_type::const_iterator end ) { typedef typename String_type::value_type Char_type; - + const Char_type c2( *begin ); switch( c2 ) @@ -100,19 +100,19 @@ namespace json_spirit case '\\': s += '\\'; break; case '/': s += '/'; break; case '"': s += '"'; break; - case 'x': + case 'x': { if( end - begin >= 3 ) // expecting "xHH..." { - s += hex_str_to_char< Char_type >( begin ); + s += hex_str_to_char< Char_type >( begin ); } break; } - case 'u': + case 'u': { if( end - begin >= 5 ) // expecting "uHHHH..." { - s += unicode_str_to_char< Char_type >( begin ); + s += unicode_str_to_char< Char_type >( begin ); } break; } @@ -120,7 +120,7 @@ namespace json_spirit } template< class String_type > - String_type substitute_esc_chars( typename String_type::const_iterator begin, + String_type substitute_esc_chars( typename String_type::const_iterator begin, typename String_type::const_iterator end ) { typedef typename String_type::const_iterator Iter_type; @@ -128,7 +128,7 @@ namespace json_spirit if( end - begin < 2 ) return String_type( begin, end ); String_type result; - + result.reserve( end - begin ); const Iter_type end_minus_1( end - 1 ); @@ -143,7 +143,7 @@ namespace json_spirit result.append( substr_start, i ); ++i; // skip the '\' - + append_esc_char_and_incr_iter( result, i, end ); substr_start = i + 1; @@ -156,7 +156,7 @@ namespace json_spirit } template< class String_type > - String_type get_str_( typename String_type::const_iterator begin, + String_type get_str_( typename String_type::const_iterator begin, typename String_type::const_iterator end ) { assert( end - begin >= 2 ); @@ -178,7 +178,7 @@ namespace json_spirit { return get_str_< std::wstring >( begin, end ); } - + template< class String_type, class Iter_type > String_type get_str( Iter_type begin, Iter_type end ) { @@ -193,7 +193,7 @@ namespace json_spirit // NB Iter_type could be a std::string iterator, wstring iterator, a position iterator or a multipass iterator // template< class Value_type, class Iter_type > - class Semantic_actions + class Semantic_actions { public: @@ -226,7 +226,7 @@ namespace json_spirit void begin_array( Char_type c ) { assert( c == '[' ); - + begin_compound< Array_type >(); } @@ -287,7 +287,7 @@ namespace json_spirit private: - Semantic_actions& operator=( const Semantic_actions& ); + Semantic_actions& operator=( const Semantic_actions& ); // to prevent "assignment operator could not be generated" warning Value_type* add_first( const Value_type& value ) @@ -321,9 +321,9 @@ namespace json_spirit if( current_p_ != &value_ ) { current_p_ = stack_.back(); - + stack_.pop_back(); - } + } } Value_type* add_to_current( const Value_type& value ) @@ -336,9 +336,9 @@ namespace json_spirit { current_p_->get_array().push_back( value ); - return ¤t_p_->get_array().back(); + return ¤t_p_->get_array().back(); } - + assert( current_p_->type() == obj_type ); return &Config_type::add( current_p_->get_obj(), name_, value ); @@ -364,7 +364,7 @@ namespace json_spirit throw reason; } - // the spirit grammer + // the spirit grammer // template< class Value_type, class Iter_type > class Json_grammer : public spirit_namespace::grammar< Json_grammer< Value_type, Iter_type > > @@ -419,7 +419,7 @@ namespace json_spirit typedef typename Value_type::String_type::value_type Char_type; - // first we convert the semantic action class methods to functors with the + // first we convert the semantic action class methods to functors with the // parameter signature expected by spirit typedef boost::function< void( Char_type ) > Char_action; @@ -428,18 +428,18 @@ namespace json_spirit typedef boost::function< void( int64_t ) > Int_action; typedef boost::function< void( uint64_t ) > Uint64_action; - Char_action begin_obj ( boost::bind( &Semantic_actions_t::begin_obj, &self.actions_, _1 ) ); - Char_action end_obj ( boost::bind( &Semantic_actions_t::end_obj, &self.actions_, _1 ) ); - Char_action begin_array( boost::bind( &Semantic_actions_t::begin_array, &self.actions_, _1 ) ); - Char_action end_array ( boost::bind( &Semantic_actions_t::end_array, &self.actions_, _1 ) ); - Str_action new_name ( boost::bind( &Semantic_actions_t::new_name, &self.actions_, _1, _2 ) ); - Str_action new_str ( boost::bind( &Semantic_actions_t::new_str, &self.actions_, _1, _2 ) ); - Str_action new_true ( boost::bind( &Semantic_actions_t::new_true, &self.actions_, _1, _2 ) ); - Str_action new_false ( boost::bind( &Semantic_actions_t::new_false, &self.actions_, _1, _2 ) ); - Str_action new_null ( boost::bind( &Semantic_actions_t::new_null, &self.actions_, _1, _2 ) ); - Real_action new_real ( boost::bind( &Semantic_actions_t::new_real, &self.actions_, _1 ) ); - Int_action new_int ( boost::bind( &Semantic_actions_t::new_int, &self.actions_, _1 ) ); - Uint64_action new_uint64 ( boost::bind( &Semantic_actions_t::new_uint64, &self.actions_, _1 ) ); + Char_action begin_obj ( boost::bind( &Semantic_actions_t::begin_obj, &self.actions_, boost::placeholders::_1 ) ); + Char_action end_obj ( boost::bind( &Semantic_actions_t::end_obj, &self.actions_, boost::placeholders::_1 ) ); + Char_action begin_array( boost::bind( &Semantic_actions_t::begin_array, &self.actions_, boost::placeholders::_1 ) ); + Char_action end_array ( boost::bind( &Semantic_actions_t::end_array, &self.actions_, boost::placeholders::_1 ) ); + Str_action new_name ( boost::bind( &Semantic_actions_t::new_name, &self.actions_, boost::placeholders::_1, boost::placeholders::_2 ) ); + Str_action new_str ( boost::bind( &Semantic_actions_t::new_str, &self.actions_, boost::placeholders::_1, boost::placeholders::_2 ) ); + Str_action new_true ( boost::bind( &Semantic_actions_t::new_true, &self.actions_, boost::placeholders::_1, boost::placeholders::_2 ) ); + Str_action new_false ( boost::bind( &Semantic_actions_t::new_false, &self.actions_, boost::placeholders::_1, boost::placeholders::_2 ) ); + Str_action new_null ( boost::bind( &Semantic_actions_t::new_null, &self.actions_, boost::placeholders::_1, boost::placeholders::_2 ) ); + Real_action new_real ( boost::bind( &Semantic_actions_t::new_real, &self.actions_, boost::placeholders::_1 ) ); + Int_action new_int ( boost::bind( &Semantic_actions_t::new_int, &self.actions_, boost::placeholders::_1 ) ); + Uint64_action new_uint64 ( boost::bind( &Semantic_actions_t::new_uint64, &self.actions_, boost::placeholders::_1 ) ); // actual grammer @@ -448,16 +448,16 @@ namespace json_spirit ; value_ - = string_[ new_str ] - | number_ - | object_ - | array_ - | str_p( "true" ) [ new_true ] - | str_p( "false" )[ new_false ] + = string_[ new_str ] + | number_ + | object_ + | array_ + | str_p( "true" ) [ new_true ] + | str_p( "false" )[ new_false ] | str_p( "null" ) [ new_null ] ; - object_ + object_ = ch_p('{')[ begin_obj ] >> !members_ >> ( ch_p('}')[ end_obj ] | eps_p[ &throw_not_object ] ) @@ -483,20 +483,20 @@ namespace json_spirit = value_ >> *( ',' >> value_ ) ; - string_ + string_ = lexeme_d // this causes white space inside a string to be retained [ confix_p - ( - '"', + ( + '"', *lex_escape_ch_p, '"' - ) + ) ] ; number_ - = strict_real_p[ new_real ] + = strict_real_p[ new_real ] | int64_p [ new_int ] | uint64_p [ new_uint64 ] ; @@ -518,10 +518,10 @@ namespace json_spirit Iter_type read_range_or_throw( Iter_type begin, Iter_type end, Value_type& value ) { Semantic_actions< Value_type, Iter_type > semantic_actions( value ); - - const spirit_namespace::parse_info< Iter_type > info = - spirit_namespace::parse( begin, end, - Json_grammer< Value_type, Iter_type >( semantic_actions ), + + const spirit_namespace::parse_info< Iter_type > info = + spirit_namespace::parse( begin, end, + Json_grammer< Value_type, Iter_type >( semantic_actions ), spirit_namespace::space_p ); if( !info.hit ) @@ -540,7 +540,7 @@ namespace json_spirit const Posn_iter_t posn_begin( begin, end ); const Posn_iter_t posn_end( end, end ); - + read_range_or_throw( posn_begin, posn_end, value ); } diff --git a/src/main.cpp b/src/main.cpp index 06ef8508..45f3db00 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -34,7 +34,7 @@ #include #include #include -#include +#include using namespace std; using namespace boost; @@ -133,21 +133,21 @@ struct CMainSignals { } void RegisterWallet(CWalletInterface* pwalletIn) { - g_signals.SyncTransaction.connect(boost::bind(&CWalletInterface::SyncTransaction, pwalletIn, _1, _2, _3, _4)); - g_signals.EraseTransaction.connect(boost::bind(&CWalletInterface::EraseFromWallet, pwalletIn, _1)); - g_signals.UpdatedTransaction.connect(boost::bind(&CWalletInterface::UpdatedTransaction, pwalletIn, _1)); - g_signals.SetBestChain.connect(boost::bind(&CWalletInterface::SetBestChain, pwalletIn, _1)); - g_signals.Inventory.connect(boost::bind(&CWalletInterface::Inventory, pwalletIn, _1)); - g_signals.Broadcast.connect(boost::bind(&CWalletInterface::ResendWalletTransactions, pwalletIn, _1)); + g_signals.SyncTransaction.connect(boost::bind(&CWalletInterface::SyncTransaction, pwalletIn, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4)); + g_signals.EraseTransaction.connect(boost::bind(&CWalletInterface::EraseFromWallet, pwalletIn, boost::placeholders::_1)); + g_signals.UpdatedTransaction.connect(boost::bind(&CWalletInterface::UpdatedTransaction, pwalletIn, boost::placeholders::_1)); + g_signals.SetBestChain.connect(boost::bind(&CWalletInterface::SetBestChain, pwalletIn, boost::placeholders::_1)); + g_signals.Inventory.connect(boost::bind(&CWalletInterface::Inventory, pwalletIn, boost::placeholders::_1)); + g_signals.Broadcast.connect(boost::bind(&CWalletInterface::ResendWalletTransactions, pwalletIn, boost::placeholders::_1)); } void UnregisterWallet(CWalletInterface* pwalletIn) { - g_signals.Broadcast.disconnect(boost::bind(&CWalletInterface::ResendWalletTransactions, pwalletIn, _1)); - g_signals.Inventory.disconnect(boost::bind(&CWalletInterface::Inventory, pwalletIn, _1)); - g_signals.SetBestChain.disconnect(boost::bind(&CWalletInterface::SetBestChain, pwalletIn, _1)); - g_signals.UpdatedTransaction.disconnect(boost::bind(&CWalletInterface::UpdatedTransaction, pwalletIn, _1)); - g_signals.EraseTransaction.disconnect(boost::bind(&CWalletInterface::EraseFromWallet, pwalletIn, _1)); - g_signals.SyncTransaction.disconnect(boost::bind(&CWalletInterface::SyncTransaction, pwalletIn, _1, _2, _3, _4)); + g_signals.Broadcast.disconnect(boost::bind(&CWalletInterface::ResendWalletTransactions, pwalletIn, boost::placeholders::_1)); + g_signals.Inventory.disconnect(boost::bind(&CWalletInterface::Inventory, pwalletIn, boost::placeholders::_1)); + g_signals.SetBestChain.disconnect(boost::bind(&CWalletInterface::SetBestChain, pwalletIn, boost::placeholders::_1)); + g_signals.UpdatedTransaction.disconnect(boost::bind(&CWalletInterface::UpdatedTransaction, pwalletIn, boost::placeholders::_1)); + g_signals.EraseTransaction.disconnect(boost::bind(&CWalletInterface::EraseFromWallet, pwalletIn, boost::placeholders::_1)); + g_signals.SyncTransaction.disconnect(boost::bind(&CWalletInterface::SyncTransaction, pwalletIn, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4)); } void UnregisterAllWallets() { diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp index 48fd9d1b..134e2ee7 100644 --- a/src/qt/clientmodel.cpp +++ b/src/qt/clientmodel.cpp @@ -17,7 +17,7 @@ #include #include #include -#include +#include static const int64_t nClientStartupTime = GetTime(); @@ -222,7 +222,7 @@ QString ClientModel::getConfigFileContent() const boost::filesystem::path path = GetConfigFile(); QString pathString = QString::fromStdString(path.string()); QFile file(pathString); - + if (file.exists()) { QString line; @@ -233,7 +233,7 @@ QString ClientModel::getConfigFileContent() const { line = stream.readLine(); result += line + "\n"; - } + } } } @@ -246,7 +246,7 @@ void ClientModel::setConfigFileContent(const QString &content) boost::filesystem::path path = GetConfigFile(); QString pathString = QString::fromStdString(path.string()); QFile file(pathString); - + if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream stream(&file); @@ -294,16 +294,16 @@ static void BannedListChanged(ClientModel *clientmodel) void ClientModel::subscribeToCoreSignals() { // Connect signals to client - uiInterface.ShowProgress.connect(boost::bind(ShowProgress, this, _1, _2)); - uiInterface.NotifyNumConnectionsChanged.connect(boost::bind(NotifyNumConnectionsChanged, this, _1)); - uiInterface.NotifyAlertChanged.connect(boost::bind(NotifyAlertChanged, this, _1, _2)); + uiInterface.ShowProgress.connect(boost::bind(ShowProgress, this, boost::placeholders::_1, boost::placeholders::_2)); + uiInterface.NotifyNumConnectionsChanged.connect(boost::bind(NotifyNumConnectionsChanged, this, boost::placeholders::_1)); + uiInterface.NotifyAlertChanged.connect(boost::bind(NotifyAlertChanged, this, boost::placeholders::_1, boost::placeholders::_2)); } void ClientModel::unsubscribeFromCoreSignals() { // Disconnect signals from client - uiInterface.ShowProgress.disconnect(boost::bind(ShowProgress, this, _1, _2)); - uiInterface.NotifyNumConnectionsChanged.disconnect(boost::bind(NotifyNumConnectionsChanged, this, _1)); - uiInterface.NotifyAlertChanged.disconnect(boost::bind(NotifyAlertChanged, this, _1, _2)); + uiInterface.ShowProgress.disconnect(boost::bind(ShowProgress, this, boost::placeholders::_1, boost::placeholders::_2)); + uiInterface.NotifyNumConnectionsChanged.disconnect(boost::bind(NotifyNumConnectionsChanged, this, boost::placeholders::_1)); + uiInterface.NotifyAlertChanged.disconnect(boost::bind(NotifyAlertChanged, this, boost::placeholders::_1, boost::placeholders::_2)); uiInterface.BannedListChanged.disconnect(boost::bind(BannedListChanged, this)); } diff --git a/src/qt/messagemodel.cpp b/src/qt/messagemodel.cpp index 6255df7d..5edff355 100644 --- a/src/qt/messagemodel.cpp +++ b/src/qt/messagemodel.cpp @@ -19,7 +19,7 @@ #include #include #include -#include +#include Q_DECLARE_METATYPE(std::vector); @@ -605,8 +605,8 @@ void MessageModel::subscribeToCoreSignals() qRegisterMetaType("SecMsgStored"); // Connect signals - NotifySecMsgInboxChanged.connect(boost::bind(NotifySecMsgInbox, this, _1)); - NotifySecMsgOutboxChanged.connect(boost::bind(NotifySecMsgOutbox, this, _1)); + NotifySecMsgInboxChanged.connect(boost::bind(NotifySecMsgInbox, this, boost::placeholders::_1)); + NotifySecMsgOutboxChanged.connect(boost::bind(NotifySecMsgOutbox, this, boost::placeholders::_1)); NotifySecMsgWalletUnlocked.connect(boost::bind(NotifySecMsgWallet, this)); connect(walletModel, SIGNAL(encryptionStatusChanged(int)), this, SLOT(setEncryptionStatus(int))); @@ -615,8 +615,8 @@ void MessageModel::subscribeToCoreSignals() void MessageModel::unsubscribeFromCoreSignals() { // Disconnect signals - NotifySecMsgInboxChanged.disconnect(boost::bind(NotifySecMsgInbox, this, _1)); - NotifySecMsgOutboxChanged.disconnect(boost::bind(NotifySecMsgOutbox, this, _1)); + NotifySecMsgInboxChanged.disconnect(boost::bind(NotifySecMsgInbox, this, boost::placeholders::_1)); + NotifySecMsgOutboxChanged.disconnect(boost::bind(NotifySecMsgOutbox, this, boost::placeholders::_1)); NotifySecMsgWalletUnlocked.disconnect(boost::bind(NotifySecMsgWallet, this)); disconnect(walletModel, SIGNAL(encryptionStatusChanged(int)), this, SLOT(setEncryptionStatus(int))); diff --git a/src/qt/transactiontablemodel.cpp b/src/qt/transactiontablemodel.cpp index c42fe2ab..388757f1 100644 --- a/src/qt/transactiontablemodel.cpp +++ b/src/qt/transactiontablemodel.cpp @@ -17,7 +17,7 @@ #include #include #include -#include +#include // Amount column is right-aligned it contains numbers static int column_alignments[] = { @@ -726,13 +726,13 @@ static void ShowProgress(TransactionTableModel *ttm, const std::string &title, i void TransactionTableModel::subscribeToCoreSignals() { // Connect signals to wallet - wallet->NotifyTransactionChanged.connect(boost::bind(NotifyTransactionChanged, this, _1, _2, _3)); - wallet->ShowProgress.connect(boost::bind(ShowProgress, this, _1, _2)); + wallet->NotifyTransactionChanged.connect(boost::bind(NotifyTransactionChanged, this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3)); + wallet->ShowProgress.connect(boost::bind(ShowProgress, this, boost::placeholders::_1, boost::placeholders::_2)); } void TransactionTableModel::unsubscribeFromCoreSignals() { // Disconnect signals from wallet - wallet->NotifyTransactionChanged.disconnect(boost::bind(NotifyTransactionChanged, this, _1, _2, _3)); - wallet->ShowProgress.disconnect(boost::bind(ShowProgress, this, _1, _2)); + wallet->NotifyTransactionChanged.disconnect(boost::bind(NotifyTransactionChanged, this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3)); + wallet->ShowProgress.disconnect(boost::bind(ShowProgress, this, boost::placeholders::_1, boost::placeholders::_2)); } diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index c89ef09a..2750ae2b 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -26,7 +26,7 @@ #include #include #include -#include +#include using namespace std; @@ -625,21 +625,21 @@ static void NotifyWatchonlyChanged(WalletModel *walletmodel, bool fHaveWatchonly void WalletModel::subscribeToCoreSignals() { // Connect signals to wallet - wallet->NotifyStatusChanged.connect(boost::bind(&NotifyKeyStoreStatusChanged, this, _1)); - wallet->NotifyAddressBookChanged.connect(boost::bind(NotifyAddressBookChanged, this, _1, _2, _3, _4, _5)); - wallet->NotifyTransactionChanged.connect(boost::bind(NotifyTransactionChanged, this, _1, _2, _3)); - wallet->ShowProgress.connect(boost::bind(ShowProgress, this, _1, _2)); - wallet->NotifyWatchonlyChanged.disconnect(boost::bind(NotifyWatchonlyChanged, this, _1)); + wallet->NotifyStatusChanged.connect(boost::bind(&NotifyKeyStoreStatusChanged, this, boost::placeholders::_1)); + wallet->NotifyAddressBookChanged.connect(boost::bind(NotifyAddressBookChanged, this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4, boost::placeholders::_5)); + wallet->NotifyTransactionChanged.connect(boost::bind(NotifyTransactionChanged, this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3)); + wallet->ShowProgress.connect(boost::bind(ShowProgress, this, boost::placeholders::_1, boost::placeholders::_2)); + wallet->NotifyWatchonlyChanged.disconnect(boost::bind(NotifyWatchonlyChanged, this, boost::placeholders::_1)); } void WalletModel::unsubscribeFromCoreSignals() { // Disconnect signals from wallet - wallet->NotifyStatusChanged.disconnect(boost::bind(&NotifyKeyStoreStatusChanged, this, _1)); - wallet->NotifyAddressBookChanged.disconnect(boost::bind(NotifyAddressBookChanged, this, _1, _2, _3, _4, _5)); - wallet->NotifyTransactionChanged.disconnect(boost::bind(NotifyTransactionChanged, this, _1, _2, _3)); - wallet->ShowProgress.disconnect(boost::bind(ShowProgress, this, _1, _2)); - wallet->NotifyWatchonlyChanged.disconnect(boost::bind(NotifyWatchonlyChanged, this, _1)); + wallet->NotifyStatusChanged.disconnect(boost::bind(&NotifyKeyStoreStatusChanged, this, boost::placeholders::_1)); + wallet->NotifyAddressBookChanged.disconnect(boost::bind(NotifyAddressBookChanged, this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3, boost::placeholders::_4, boost::placeholders::_5)); + wallet->NotifyTransactionChanged.disconnect(boost::bind(NotifyTransactionChanged, this, boost::placeholders::_1, boost::placeholders::_2, boost::placeholders::_3)); + wallet->ShowProgress.disconnect(boost::bind(ShowProgress, this, boost::placeholders::_1, boost::placeholders::_2)); + wallet->NotifyWatchonlyChanged.disconnect(boost::bind(NotifyWatchonlyChanged, this, boost::placeholders::_1)); } // WalletModel::UnlockContext implementation diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 29f353d8..e815acf8 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -21,7 +21,7 @@ #include #include #include -#include +#include #include #include #include @@ -685,7 +685,7 @@ void RPCRunLater(const std::string& name, boost::function func, int6 boost::shared_ptr(new deadline_timer(*rpc_io_service)))); } deadlineTimers[name]->expires_from_now(posix_time::seconds(nSeconds)); - deadlineTimers[name]->async_wait(boost::bind(RPCRunHandler, _1, func)); + deadlineTimers[name]->async_wait(boost::bind(RPCRunHandler, boost::placeholders::_1, func)); } class JSONRequest @@ -899,7 +899,7 @@ std::vector CRPCTable::listCommands() const std::transform(mapCommands.begin(), mapCommands.end(), std::back_inserter(commandList), - boost::bind(&commandMap::value_type::first, _1)); + boost::bind(&commandMap::value_type::first, boost::placeholders::_1)); return commandList; } From f026f1a7e86ec3b241add58f67cb678f3f6c8e87 Mon Sep 17 00:00:00 2001 From: vgulkevic Date: Mon, 16 Nov 2020 09:23:09 +0200 Subject: [PATCH 20/35] Change bitcoin to digitalnote in a few places --- configure.ac | 4 ++-- src/Makefile.qt.include | 2 +- src/config/bitcoin-config.h | 6 +++--- src/qt/res/bitcoin-qt-res.rc | 2 +- src/txdb-leveldb.cpp | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/configure.ac b/configure.ac index d0f91517..37280374 100644 --- a/configure.ac +++ b/configure.ac @@ -5,8 +5,8 @@ define(_CLIENT_VERSION_MINOR, 0) define(_CLIENT_VERSION_REVISION, 3) define(_CLIENT_VERSION_BUILD, 4) define(_CLIENT_VERSION_IS_RELEASE, true) -define(_COPYRIGHT_YEAR, 2014) -AC_INIT([Bitcoin Core],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[info@bitcoin.org],[bitcoin]) +define(_COPYRIGHT_YEAR, 2020) +AC_INIT([DigitalNote],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_REVISION],[info@bitcoin.org],[bitcoin]) AC_CONFIG_SRCDIR([src/main.cpp]) AC_CONFIG_HEADERS([src/config/bitcoin-config.h]) AC_CONFIG_AUX_DIR([build-aux]) diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 522e249b..fe8911d6 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -457,7 +457,7 @@ CLEANFILES += $(CLEAN_QT) bitcoin_qt_clean: FORCE rm -f $(CLEAN_QT) $(qt_libbitcoinqt_a_OBJECTS) $(qt_bitcoin_qt_OBJECTS) qt/bitcoin-qt$(EXEEXT) $(LIBBITCOINQT) -bitcoin_qt : qt/digitalnote-qt$(EXEEXT) +bitcoin_qt : qt/bitcoin-qt$(EXEEXT) ui_%.h: %.ui @test -f $(UIC) diff --git a/src/config/bitcoin-config.h b/src/config/bitcoin-config.h index ba70d85d..101cae67 100644 --- a/src/config/bitcoin-config.h +++ b/src/config/bitcoin-config.h @@ -24,7 +24,7 @@ #define CLIENT_VERSION_REVISION 3 /* Version is release */ -#define COPYRIGHT_YEAR 2014 +#define COPYRIGHT_YEAR 2020 /* Define to 1 to enable wallet functions */ #define ENABLE_WALLET 1 @@ -268,10 +268,10 @@ #define PACKAGE_BUGREPORT "info@bitcoin.org" /* Define to the full name of this package. */ -#define PACKAGE_NAME "Bitcoin Core" +#define PACKAGE_NAME "DigitalNote" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "Bitcoin Core 1.0.3" +#define PACKAGE_STRING "DigitalNote 1.0.3" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "bitcoin" diff --git a/src/qt/res/bitcoin-qt-res.rc b/src/qt/res/bitcoin-qt-res.rc index c95b28c0..318a8382 100644 --- a/src/qt/res/bitcoin-qt-res.rc +++ b/src/qt/res/bitcoin-qt-res.rc @@ -22,7 +22,7 @@ BEGIN VALUE "FileDescription", "DigitalNote-Qt (OSS GUI client for DigitalNote)" VALUE "FileVersion", VER_FILEVERSION_STR VALUE "InternalName", "DigitalNote-qt" - VALUE "LegalCopyright", "2009-2014 The Bitcoin developers, 2012-2014 The NovaCoin & PPCoin developers, 2014-2015 The DigitalNote developers" + VALUE "LegalCopyright", "2009-2014 The Bitcoin developers, 2012-2014 The NovaCoin & PPCoin developers, 2014-2020 The DigitalNote developers" VALUE "LegalTrademarks1", "Distributed under the MIT/X11 software license, see the accompanying file COPYING or http://www.opensource.org/licenses/mit-license.php." VALUE "OriginalFilename", "DigitalNote-qt.exe" VALUE "ProductName", "DigitalNote-Qt" diff --git a/src/txdb-leveldb.cpp b/src/txdb-leveldb.cpp index 46187f1f..de3a45f2 100644 --- a/src/txdb-leveldb.cpp +++ b/src/txdb-leveldb.cpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include "kernel.h" #include "checkpoints.h" From ff8bc85bca9512d70a9d544d8a49c5a62538d93e Mon Sep 17 00:00:00 2001 From: vgulkevic Date: Mon, 16 Nov 2020 09:31:42 +0200 Subject: [PATCH 21/35] Fix memenv compilation error --- src/txdb-leveldb.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/txdb-leveldb.cpp b/src/txdb-leveldb.cpp index de3a45f2..46187f1f 100644 --- a/src/txdb-leveldb.cpp +++ b/src/txdb-leveldb.cpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include "kernel.h" #include "checkpoints.h" From c8b94de1165a0b5e2dba2a92b5a808f51113fb40 Mon Sep 17 00:00:00 2001 From: vgulkevic Date: Mon, 16 Nov 2020 09:59:02 +0200 Subject: [PATCH 22/35] Fix remaining boost bind warnings --- src/init.cpp | 2 +- src/rpcclient.cpp | 2 +- src/rpcprotocol.cpp | 2 +- src/websocketpp/common/functional.hpp | 2 +- src/webwalletconnector.cpp | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/init.cpp b/src/init.cpp index d9a72b08..d0979fc4 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -35,7 +35,7 @@ #include #include -#include +#include #include #include #include diff --git a/src/rpcclient.cpp b/src/rpcclient.cpp index 81f82257..a3d38007 100644 --- a/src/rpcclient.cpp +++ b/src/rpcclient.cpp @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/rpcprotocol.cpp b/src/rpcprotocol.cpp index 9f546cc6..fc46c333 100644 --- a/src/rpcprotocol.cpp +++ b/src/rpcprotocol.cpp @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/src/websocketpp/common/functional.hpp b/src/websocketpp/common/functional.hpp index d332dd15..1bf3baae 100644 --- a/src/websocketpp/common/functional.hpp +++ b/src/websocketpp/common/functional.hpp @@ -52,7 +52,7 @@ #ifdef _WEBSOCKETPP_CPP11_FUNCTIONAL_ #include #else - #include + #include #include #include #endif diff --git a/src/webwalletconnector.cpp b/src/webwalletconnector.cpp index 1217b601..acf7b314 100644 --- a/src/webwalletconnector.cpp +++ b/src/webwalletconnector.cpp @@ -9,7 +9,7 @@ #include #include -#include +#include #include #include #include From 2f59cbac7cb9b9bea7d2a18da853c2928a9e547e Mon Sep 17 00:00:00 2001 From: vgulkevic Date: Mon, 16 Nov 2020 18:53:30 +0200 Subject: [PATCH 23/35] Minor makefile changes --- src/Makefile.qt.include | 7 +- src/qt/MakeFile.am | 386 +++++++++++++++++++++++++++++----------- 2 files changed, 280 insertions(+), 113 deletions(-) diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index fe8911d6..d466856d 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -130,8 +130,6 @@ QT_MOC_CPP = \ qt/moc_flowlayout.cpp \ qt/moc_clientmodel.cpp \ qt/moc_guiutil.cpp \ - qt/moc_transactionrecord.cpp \ - qt/moc_guiconstants.cpp \ qt/moc_optionsmodel.cpp \ qt/moc_monitoreddatamapper.cpp \ qt/moc_macdockiconhandler.cpp \ @@ -164,7 +162,6 @@ BITCOIN_MM = \ QT_MOC = \ qt/bitcoin.moc \ qt/bitcoinamountfield.moc \ - qt/intro.moc \ qt/overviewpage.moc \ qt/rpcconsole.moc @@ -232,7 +229,7 @@ BITCOIN_QT_H = \ qt/notificator.h \ qt/paymentserver.h \ qt/qrcodedialog.h \ - qt/rpcconsole.h + qt/rpcconsole.h RES_ICONS = \ qt/res/icons/quit.png \ @@ -421,7 +418,7 @@ qt_bitcoin_qt_LDADD += $(LIBBITCOIN_WALLET) endif qt_bitcoin_qt_LDADD += $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBBITCOIN_UNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \ $(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBSECP256K1) -qt_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) +qt_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS) qt_bitcoin_qt_LIBTOOLFLAGS = --tag CXX #locale/foo.ts -> locale/foo.qm diff --git a/src/qt/MakeFile.am b/src/qt/MakeFile.am index c0772b3a..7d06a0c1 100644 --- a/src/qt/MakeFile.am +++ b/src/qt/MakeFile.am @@ -74,154 +74,324 @@ QT_TS = \ locale/bitcoin_zh_CN.ts \ locale/bitcoin_zh_TW.ts -QT_FORMS_UI = forms/aboutdialog.ui forms/addressbookpage.ui \ - forms/askpassphrasedialog.ui \ +QT_FORMS_UI = \ forms/coincontroldialog.ui \ + forms/sendcoinsdialog.ui \ + forms/qrcodedialog.ui \ + forms/addressbookpage.ui \ + forms/signverifymessagedialog.ui \ + forms/aboutdialog.ui \ forms/editaddressdialog.ui \ - forms/intro.ui \ - forms/openuridialog.ui \ - forms/optionsdialog.ui forms/overviewpage.ui forms/receiverequestdialog.ui \ - forms/receivecoinsdialog.ui \ - forms/rpcconsole.ui forms/sendcoinsdialog.ui forms/sendcoinsentry.ui \ - forms/signverifymessagedialog.ui forms/transactiondescdialog.ui + forms/importprivatekeydialog.ui \ + forms/editconfigdialog.ui \ + forms/transactiondescdialog.ui \ + forms/overviewpage.ui \ + forms/sendcoinsentry.ui \ + forms/askpassphrasedialog.ui \ + forms/rpcconsole.ui \ + forms/optionsdialog.ui \ + forms/masternodemanager.ui \ + forms/addeditadrenalinenode.ui \ + forms/adrenalinenodeconfigdialog.ui \ + forms/messagepage.ui \ + forms/sendmessagesentry.ui \ + forms/sendmessagesdialog.ui \ + forms/blockbrowser.ui \ + plugins/mrichtexteditor/mrichtextedit.ui -QT_MOC_CPP = moc_aboutdialog.cpp moc_addressbookpage.cpp \ - moc_addresstablemodel.cpp moc_askpassphrasedialog.cpp \ - moc_bitcoinaddressvalidator.cpp moc_bitcoinamountfield.cpp \ - moc_bitcoingui.cpp moc_bitcoinunits.cpp moc_clientmodel.cpp \ +QT_MOC_CPP = \ + moc_bitcoingui.cpp \ + moc_transactiontablemodel.cpp \ + moc_addresstablemodel.cpp \ + moc_bantablemodel.cpp \ + moc_optionsdialog.cpp \ moc_coincontroldialog.cpp \ moc_coincontroltreewidget.cpp \ - moc_csvmodelwriter.cpp moc_editaddressdialog.cpp moc_guiutil.cpp \ - moc_intro.cpp moc_macdockiconhandler.cpp moc_macnotificationhandler.cpp \ - moc_monitoreddatamapper.cpp moc_notificator.cpp \ - moc_openuridialog.cpp \ - moc_optionsdialog.cpp \ - moc_optionsmodel.cpp moc_overviewpage.cpp moc_paymentserver.cpp \ - moc_receiverequestdialog.cpp moc_qvalidatedlineedit.cpp moc_qvaluecombobox.cpp \ - moc_receivecoinsdialog.cpp \ - moc_recentrequeststablemodel.cpp \ - moc_rpcconsole.cpp moc_sendcoinsdialog.cpp moc_sendcoinsentry.cpp \ - moc_signverifymessagedialog.cpp moc_splashscreen.cpp moc_trafficgraphwidget.cpp moc_transactiondesc.cpp \ - moc_transactiondescdialog.cpp moc_transactionfilterproxy.cpp \ - moc_transactiontablemodel.cpp moc_transactionview.cpp moc_walletframe.cpp \ - moc_walletmodel.cpp moc_walletview.cpp + moc_sendcoinsdialog.cpp \ + moc_addressbookpage.cpp \ + moc_signverifymessagedialog.cpp \ + moc_aboutdialog.cpp \ + moc_editaddressdialog.cpp \ + moc_importprivatekeydialog.cpp \ + moc_editconfigdialog.cpp \ + moc_bitcoinaddressvalidator.cpp \ + moc_masternodemanager.cpp \ + moc_addeditadrenalinenode.cpp \ + moc_adrenalinenodeconfigdialog.cpp \ + moc_qcustomplot.cpp \ + moc_messagepage.cpp \ + moc_messagemodel.cpp \ + moc_sendmessagesdialog.cpp \ + moc_sendmessagesentry.cpp \ + moc_blockbrowser.cpp \ + plugins/mrichtexteditor/moc_mrichtextedit.cpp \ + moc_qvalidatedtextedit.cpp \ + moc_flowlayout.cpp \ + moc_clientmodel.cpp \ + moc_guiutil.cpp \ + moc_transactionrecord.cpp \ + moc_guiconstants.cpp \ + moc_optionsmodel.cpp \ + moc_monitoreddatamapper.cpp \ + moc_macdockiconhandler.cpp \ + moc_macnotificationhandler.cpp \ + moc_peertablemodel.cpp \ + moc_trafficgraphwidget.cpp \ + moc_transactiondesc.cpp \ + moc_transactiondescdialog.cpp \ + moc_bitcoinamountfield.cpp \ + moc_transactionfilterproxy.cpp \ + moc_transactionview.cpp \ + moc_walletmodel.cpp \ + moc_walletmodeltransaction.cpp \ + moc_overviewpage.cpp \ + moc_csvmodelwriter.cpp \ + moc_sendcoinsentry.cpp \ + moc_qvalidatedlineedit.cpp \ + moc_bitcoinunits.cpp \ + moc_qvaluecombobox.cpp \ + moc_askpassphrasedialog.cpp \ + moc_notificator.cpp \ + moc_paymentserver.cpp \ + moc_qrcodedialog.cpp \ + moc_rpcconsole.cpp -BITCOIN_MM = macdockiconhandler.mm macnotificationhandler.mm +BITCOIN_MM = \ + macdockiconhandler.mm \ + macnotificationhandler.mm -QT_MOC = intro.moc overviewpage.moc rpcconsole.moc bitcoin.moc +QT_MOC = \ + bitcoin.moc \ + bitcoinamountfield.moc \ + overviewpage.moc \ + rpcconsole.moc QT_QRC_CPP = qrc_bitcoin.cpp QT_QRC = bitcoin.qrc -PROTOBUF_CC = paymentrequest.pb.cc -PROTOBUF_H = paymentrequest.pb.h -PROTOBUF_PROTO = paymentrequest.proto +#PROTOBUF_CC = paymentrequest.pb.cc +#PROTOBUF_H = paymentrequest.pb.h +#PROTOBUF_PROTO = paymentrequest.proto -BITCOIN_QT_H = aboutdialog.h addressbookpage.h addresstablemodel.h \ - askpassphrasedialog.h bitcoinaddressvalidator.h bitcoinamountfield.h \ - bitcoingui.h bitcoinunits.h clientmodel.h coincontroldialog.h coincontroltreewidget.h csvmodelwriter.h \ - editaddressdialog.h guiconstants.h guiutil.h intro.h macdockiconhandler.h \ - macnotificationhandler.h monitoreddatamapper.h notificator.h \ - openuridialog.h \ +BITCOIN_QT_H = \ + bitcoingui.h \ + transactiontablemodel.h \ + addresstablemodel.h \ + bantablemodel.h \ optionsdialog.h \ - optionsmodel.h overviewpage.h paymentrequestplus.h paymentserver.h \ - receivecoinsdialog.h \ - recentrequeststablemodel.h \ - receiverequestdialog.h qvalidatedlineedit.h qvaluecombobox.h rpcconsole.h \ - sendcoinsdialog.h sendcoinsentry.h signverifymessagedialog.h splashscreen.h \ - trafficgraphwidget.h transactiondescdialog.h transactiondesc.h transactionfilterproxy.h \ - transactionrecord.h transactiontablemodel.h transactionview.h walletframe.h \ - walletmodel.h walletmodeltransaction.h walletview.h + coincontroldialog.h \ + coincontroltreewidget.h \ + sendcoinsdialog.h \ + addressbookpage.h \ + signverifymessagedialog.h \ + aboutdialog.h \ + editaddressdialog.h \ + importprivatekeydialog.h \ + editconfigdialog.h \ + bitcoinaddressvalidator.h \ + masternodemanager.h \ + addeditadrenalinenode.h \ + adrenalinenodeconfigdialog.h \ + qcustomplot.h \ + plugins/mrichtexteditor/mrichtextedit.h \ + messagepage.h \ + messagemodel.h \ + sendmessagesdialog.h \ + sendmessagesentry.h \ + blockbrowser.h \ + qvalidatedtextedit.h \ + flowlayout.h \ + clientmodel.h \ + guiutil.h \ + transactionrecord.h \ + guiconstants.h \ + optionsmodel.h \ + monitoreddatamapper.h \ + macdockiconhandler.h \ + macnotificationhandler.h \ + peertablemodel.h \ + trafficgraphwidget.h \ + transactiondesc.h \ + transactiondescdialog.h \ + bitcoinamountfield.h \ + transactionfilterproxy.h \ + transactionview.h \ + walletmodel.h \ + walletmodeltransaction.h \ + overviewpage.h \ + csvmodelwriter.h \ + sendcoinsentry.h \ + qvalidatedlineedit.h \ + bitcoinunits.h \ + qvaluecombobox.h \ + askpassphrasedialog.h \ + notificator.h \ + paymentserver.h \ + qrcodedialog.h \ + rpcconsole.h -RES_ICONS = res/icons/bitcoin.png res/icons/address-book.png \ - res/icons/quit.png res/icons/send.png res/icons/toolbar.png \ - res/icons/connect0_16.png res/icons/connect1_16.png \ - res/icons/connect2_16.png res/icons/connect3_16.png \ - res/icons/connect4_16.png res/icons/transaction0.png \ - res/icons/transaction2.png res/icons/clock1.png res/icons/clock2.png \ - res/icons/clock3.png res/icons/clock4.png res/icons/clock5.png \ - res/icons/configure.png res/icons/receive.png res/icons/editpaste.png \ - res/icons/editcopy.png res/icons/add.png res/icons/bitcoin_testnet.png \ - res/icons/toolbar_testnet.png res/icons/edit.png res/icons/history.png \ - res/icons/overview.png res/icons/export.png res/icons/synced.png \ - res/icons/remove.png res/icons/tx_mined.png res/icons/tx_input.png \ - res/icons/tx_output.png res/icons/tx_inout.png res/icons/lock_closed.png \ - res/icons/lock_open.png res/icons/key.png res/icons/filesave.png \ - res/icons/qrcode.png res/icons/debugwindow.png res/icons/bitcoin.ico \ - res/icons/bitcoin_testnet.ico +RES_ICONS = \ + res/icons/quit.png \ + res/icons/editcopy.png \ + res/icons/address-book-sidebar.png \ + res/icons/onion.png \ + res/icons/add.png \ + res/icons/transaction2.png \ + res/icons/trade.png \ + res/icons/folder.png \ + res/icons/staking_on.png \ + res/icons/tx_inout.png \ + res/icons/eye.png \ + res/icons/configure.png \ + res/icons/send-sidebar.png \ + res/icons/receive.png \ + res/icons/eye_plus.png \ + res/icons/history.png \ + res/icons/tx_output.png \ + res/icons/key.png \ + res/icons/connect0_16.png \ + res/icons/connect1_16.png \ + res/icons/connect2_16.png \ + res/icons/digitalnote.png \ + res/icons/connect3_16.png \ + res/icons/connect4_16.png \ + res/icons/remove.png \ + res/icons/debugwindow.png \ + res/icons/edit.png \ + res/icons/transaction0.png \ + res/icons/tx_input.png \ + res/icons/browse.png \ + res/icons/mnodes.png \ + res/icons/clock1.png \ + res/icons/lock_open.png \ + res/icons/staking_off.png \ + res/icons/clock2.png \ + res/icons/overview.png \ + res/icons/qrcode.png \ + res/icons/clock3.png \ + res/icons/tx_mined.png \ + res/icons/clock4.png \ + res/icons/address-book.png \ + res/icons/clock5.png \ + res/icons/block.png \ + res/icons/lock_closed_toolbar.png \ + res/icons/onion-black.png \ + res/icons/eye_minus.png \ + res/icons/digitalnote_testnet.png \ + res/icons/synced.png \ + res/icons/transaction_conflicted.png \ + res/icons/lock_open_toolbar\ .png \ + res/icons/export.png \ + res/icons/editconf.png \ + res/icons/digitalnote-16_testnet.png \ + res/icons/filesave.png \ + res/icons/digitalnote-16.png \ + res/icons/send.png \ + res/icons/message.png \ + res/icons/editpaste.png \ + res/icons/lock_closed.png \ + res/icons/dark/digitalnote_dark-16_testnet.png \ + res/icons/dark/synced.png \ + res/icons/dark/lock_open.png \ + res/icons/dark/tx_mined.png \ + res/icons/dark/lock_closed.png \ + res/icons/dark/connect0_16.png \ + res/icons/dark/connect1_16.png \ + res/icons/dark/connect2_16.png \ + res/icons/dark/connect3_16.png \ + res/icons/dark/connect4_16.png \ + res/icons/dark/digitalnote_dark-16.png \ + res/icons/dark/digitalnote_dark_testnet.png \ + res/icons/dark/tx_input.png \ + res/icons/dark/tx_inout.png \ + res/icons/dark/digitalnote_dark.png \ + res/icons/dark/tx_output.png \ + res/icons/dark/staking_on.png \ + res/icons/dark/staking_off.png BITCOIN_QT_CPP = \ - aboutdialog.cpp \ - bitcoinaddressvalidator.cpp \ - bitcoinamountfield.cpp \ bitcoin.cpp \ bitcoingui.cpp \ - bitcoinunits.cpp \ - clientmodel.cpp \ - csvmodelwriter.cpp \ - guiutil.cpp \ - intro.cpp \ - monitoreddatamapper.cpp \ - notificator.cpp \ - optionsdialog.cpp \ - optionsmodel.cpp \ - qvalidatedlineedit.cpp \ - qvaluecombobox.cpp \ - rpcconsole.cpp \ - signverifymessagedialog.cpp \ - splashscreen.cpp \ - trafficgraphwidget.cpp - -if ENABLE_WALLET -BITCOIN_QT_CPP += \ - addressbookpage.cpp \ + transactiontablemodel.cpp \ addresstablemodel.cpp \ - askpassphrasedialog.cpp \ + bantablemodel.cpp \ + optionsdialog.cpp \ + sendcoinsdialog.cpp \ coincontroldialog.cpp \ coincontroltreewidget.cpp \ + addressbookpage.cpp \ + signverifymessagedialog.cpp \ + aboutdialog.cpp \ editaddressdialog.cpp \ - openuridialog.cpp \ - overviewpage.cpp \ - paymentrequestplus.cpp \ - paymentserver.cpp \ - receivecoinsdialog.cpp \ - receiverequestdialog.cpp \ - recentrequeststablemodel.cpp \ - sendcoinsdialog.cpp \ - sendcoinsentry.cpp \ + importprivatekeydialog.cpp \ + editconfigdialog.cpp \ + bitcoinaddressvalidator.cpp \ + clientmodel.cpp \ + guiutil.cpp \ + transactionrecord.cpp \ + optionsmodel.cpp \ + monitoreddatamapper.cpp \ + peertablemodel.cpp \ + trafficgraphwidget.cpp \ transactiondesc.cpp \ transactiondescdialog.cpp \ + bitcoinstrings.cpp \ + bitcoinamountfield.cpp \ transactionfilterproxy.cpp \ - transactionrecord.cpp \ - transactiontablemodel.cpp \ transactionview.cpp \ - walletframe.cpp \ walletmodel.cpp \ walletmodeltransaction.cpp \ - walletview.cpp + overviewpage.cpp \ + csvmodelwriter.cpp \ + sendcoinsentry.cpp \ + qvalidatedlineedit.cpp \ + bitcoinunits.cpp \ + qvaluecombobox.cpp \ + askpassphrasedialog.cpp \ + notificator.cpp \ + paymentserver.cpp \ + rpcconsole.cpp \ + flowlayout.cpp \ + masternodemanager.cpp \ + addeditadrenalinenode.cpp \ + adrenalinenodeconfigdialog.cpp \ + qcustomplot.cpp \ + messagepage.cpp \ + messagemodel.cpp \ + sendmessagesdialog.cpp \ + sendmessagesentry.cpp \ + blockbrowser.cpp \ + qvalidatedtextedit.cpp \ + qrcodedialog.cpp \ + plugins/mrichtexteditor/mrichtextedit.cpp + +if ENABLE_WALLET + endif -RES_IMAGES = res/images/about.png res/images/splash.png \ - res/images/splash_testnet.png +RES_IMAGES = \ + res/images/header.png \ + res/images/about.png \ + res/images/splash.png \ + res/images/splash_dark.png \ + res/images/about_dark.png \ + res/images/header_dark.png -RES_MOVIES = res/movies/update_spinner.mng +RES_MOVIES = res/movies/update_spinner.mng \ + res/movies/update_spinner_black.mng BITCOIN_RC = res/bitcoin-qt-res.rc libbitcoinqt_a_CPPFLAGS = $(AM_CPPFLAGS) $(QT_INCLUDES) \ -I$(top_srcdir)/src/qt/forms $(QT_DBUS_INCLUDES) libbitcoinqt_a_SOURCES = $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(QT_FORMS_UI) \ - $(QT_QRC) $(QT_TS) $(PROTOBUF_PROTO) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) + $(QT_QRC) $(QT_TS) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) -nodist_libbitcoinqt_a_SOURCES = $(QT_MOC_CPP) $(QT_MOC) $(PROTOBUF_CC) \ - $(PROTOBUF_H) $(QT_QRC_CPP) +nodist_libbitcoinqt_a_SOURCES = $(QT_MOC_CPP) $(QT_MOC) \ + $(QT_QRC_CPP) BUILT_SOURCES = $(nodist_libbitcoinqt_a_SOURCES) -#Generating these with a half-written protobuf header leads to wacky results. -#This makes sure it's done. -$(QT_MOC): $(PROTOBUF_H) -$(QT_MOC_CPP): $(PROTOBUF_H) if TARGET_DARWIN libbitcoinqt_a_SOURCES += $(BITCOIN_MM) @@ -258,7 +428,7 @@ translate: bitcoinstrings.cpp $(QT_FORMS_UI) $(QT_FORMS_UI) $(BITCOIN_QT_CPP) $( @test -n $(LUPDATE) || echo "lupdate is required for updating translations" @QT_SELECT=$(QT_SELECT) $(LUPDATE) $^ -locations relative -no-obsolete -ts locale/bitcoin_en.ts -$(QT_QRC_CPP): $(QT_QRC) $(QT_QM) $(QT_FORMS_H) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) $(PROTOBUF_H) +$(QT_QRC_CPP): $(QT_QRC) $(QT_QM) $(QT_FORMS_H) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) @cd $(abs_srcdir); test -f $(RCC) && QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin -o $(abs_builddir)/$@ $< || \ echo error: could not build $@ $(SED) -i.bak -e '/^\*\*.*Created:/d' $@ && rm $@.bak From 3523dbcc2d712c5eb51a15c7cfb71d3af6e6d9f6 Mon Sep 17 00:00:00 2001 From: vgulkevic Date: Mon, 16 Nov 2020 20:40:52 +0200 Subject: [PATCH 24/35] Fix many compile warnings --- src/MakeFile.am | 15 ------ src/Makefile.qt.include | 2 - src/hash.h | 2 + src/instantx.cpp | 4 +- src/keystore.h | 3 ++ src/masternode-payments.cpp | 2 +- src/net.h | 3 ++ src/pbkdf2.cpp | 9 ---- src/qt/addresstablemodel.cpp | 8 +-- src/qt/bantablemodel.cpp | 4 +- src/qt/bitcoin.cpp | 2 +- src/qt/coincontroldialog.cpp | 1 - src/qt/flowlayout.cpp | 2 +- src/qt/guiutil.cpp | 52 ------------------- src/qt/messagemodel.cpp | 4 +- src/qt/messagepage.cpp | 4 +- src/qt/optionsdialog.cpp | 6 +-- src/qt/peertablemodel.cpp | 4 +- .../plugins/mrichtexteditor/mrichtextedit.cpp | 6 +-- src/qt/transactiontablemodel.cpp | 4 +- src/qt/transactionview.cpp | 12 ++--- src/qt/walletmodel.cpp | 1 - src/ui_interface.h | 4 +- 23 files changed, 42 insertions(+), 112 deletions(-) diff --git a/src/MakeFile.am b/src/MakeFile.am index 17741f6e..0f58e8c6 100644 --- a/src/MakeFile.am +++ b/src/MakeFile.am @@ -319,21 +319,6 @@ bitcoind_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) bitcoin_cli_CPPFLAGS = $(BITCOIN_INCLUDES) # -# bitcoin-tx binary # -bitcoin_tx_LDADD = \ - $(LIBBITCOIN_UNIVALUE) \ - $(LIBBITCOIN_COMMON) \ - $(LIBBITCOIN_UTIL) \ - $(LIBBITCOIN_CRYPTO) \ - $(LIBSECP256K1) \ - $(BOOST_LIBS) \ - $(CRYPTO_LIBS) - -bitcoin_tx_SOURCES = bitcoin-tx.cpp -bitcoin_tx_CPPFLAGS = $(BITCOIN_INCLUDES) -# -bitcoin_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) - #if TARGET_WINDOWS #bitcoin_cli_SOURCES += bitcoin-cli-res.rc #endif diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index d466856d..a7d035e8 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -142,7 +142,6 @@ QT_MOC_CPP = \ qt/moc_transactionfilterproxy.cpp \ qt/moc_transactionview.cpp \ qt/moc_walletmodel.cpp \ - qt/moc_walletmodeltransaction.cpp \ qt/moc_overviewpage.cpp \ qt/moc_csvmodelwriter.cpp \ qt/moc_sendcoinsentry.cpp \ @@ -312,7 +311,6 @@ RES_ICONS = \ if ENABLE_WALLET BITCOIN_QT_CPP = \ - qt/bitcoin.cpp \ qt/bitcoingui.cpp \ qt/transactiontablemodel.cpp \ qt/addresstablemodel.cpp \ diff --git a/src/hash.h b/src/hash.h index 361bda74..45e39834 100644 --- a/src/hash.h +++ b/src/hash.h @@ -16,6 +16,8 @@ #include +#pragma GCC diagnostic ignored "-Wvla-extension" + /** A hasher class for DigitalNote's 256-bit hash (double SHA-256). */ class CHash256 { private: diff --git a/src/instantx.cpp b/src/instantx.cpp index 66037d70..4402f0ec 100644 --- a/src/instantx.cpp +++ b/src/instantx.cpp @@ -67,7 +67,7 @@ void ProcessMessageInstantX(CNode* pfrom, std::string& strCommand, CDataStream& bool fMissingInputs = false; CValidationState state; - CBlockIndex* pindex; + CBlockIndex* pindex = nullptr; CBlock block; CTxDB txdb("r"); @@ -343,7 +343,7 @@ bool ProcessConsensusVote(CNode* pnode, CConsensusVote& ctx) LogPrint("instantx", "InstantX::ProcessConsensusVote - Transaction Lock Exists %s !\n", ctx.txHash.ToString().c_str()); } - CBlockIndex* pindex; + CBlockIndex* pindex = nullptr; CBlock block; CTxDB txdb("r"); //compile consessus vote diff --git a/src/keystore.h b/src/keystore.h index d13234c9..1b96e58b 100644 --- a/src/keystore.h +++ b/src/keystore.h @@ -8,7 +8,10 @@ #include "key.h" #include "pubkey.h" #include "sync.h" +//temporary until they fix their own deprecated class +#define BOOST_ALLOW_DEPRECATED_HEADERS #include +#undef BOOST_ALLOW_DEPRECATED_HEADERS #include "script.h" #include diff --git a/src/masternode-payments.cpp b/src/masternode-payments.cpp index 210a2973..f2946d40 100644 --- a/src/masternode-payments.cpp +++ b/src/masternode-payments.cpp @@ -216,7 +216,7 @@ void CMasternodePayments::CleanPaymentList() bool CMasternodePayments::NodeisCapable() { - bool fNodeisCapable; + bool fNodeisCapable = false; LOCK(cs_vNodes); BOOST_FOREACH(CNode* pnode, vNodes){ if(pnode->nVersion >= MIN_MASTERNODE_BSC_RELAY) { diff --git a/src/net.h b/src/net.h index 728c743b..bad1d408 100644 --- a/src/net.h +++ b/src/net.h @@ -25,7 +25,10 @@ #include #include +//temporary until they fix their own deprecated class +#define BOOST_ALLOW_DEPRECATED_HEADERS #include +#undef BOOST_ALLOW_DEPRECATED_HEADERS #include class CAddrMan; diff --git a/src/pbkdf2.cpp b/src/pbkdf2.cpp index 6d3f3dcc..975b1137 100644 --- a/src/pbkdf2.cpp +++ b/src/pbkdf2.cpp @@ -3,15 +3,6 @@ #include #include "pbkdf2.h" -static inline uint32_t -be32dec(const void *pp) -{ - const uint8_t *p = (uint8_t const *)pp; - - return ((uint32_t)(p[3]) + ((uint32_t)(p[2]) << 8) + - ((uint32_t)(p[1]) << 16) + ((uint32_t)(p[0]) << 24)); -} - static inline void be32enc(void *pp, uint32_t x) { diff --git a/src/qt/addresstablemodel.cpp b/src/qt/addresstablemodel.cpp index c947e3cc..eb59309a 100644 --- a/src/qt/addresstablemodel.cpp +++ b/src/qt/addresstablemodel.cpp @@ -83,15 +83,15 @@ class AddressTablePriv }; } // qLowerBound() and qUpperBound() require our cachedAddressTable list to be sorted in asc order - qSort(cachedAddressTable.begin(), cachedAddressTable.end(), AddressTableEntryLessThan()); + std::sort(cachedAddressTable.begin(), cachedAddressTable.end(), AddressTableEntryLessThan()); } void updateEntry(const QString &address, const QString &label, bool isMine, int status) { // Find address / label in model - QList::iterator lower = qLowerBound( + QList::iterator lower = std::lower_bound( cachedAddressTable.begin(), cachedAddressTable.end(), address, AddressTableEntryLessThan()); - QList::iterator upper = qUpperBound( + QList::iterator upper = std::upper_bound( cachedAddressTable.begin(), cachedAddressTable.end(), address, AddressTableEntryLessThan()); int lowerIndex = (lower - cachedAddressTable.begin()); int upperIndex = (upper - cachedAddressTable.begin()); @@ -323,7 +323,7 @@ QVariant AddressTableModel::headerData(int section, Qt::Orientation orientation, Qt::ItemFlags AddressTableModel::flags(const QModelIndex &index) const { if(!index.isValid()) - return 0; + return QFlag(0); AddressTableEntry *rec = static_cast(index.internalPointer()); Qt::ItemFlags retval = Qt::ItemIsSelectable | Qt::ItemIsEnabled; diff --git a/src/qt/bantablemodel.cpp b/src/qt/bantablemodel.cpp index 79561a98..9f7af986 100644 --- a/src/qt/bantablemodel.cpp +++ b/src/qt/bantablemodel.cpp @@ -65,7 +65,7 @@ class BanTablePriv if (sortColumn >= 0) // sort cachedBanlist (use stable sort to prevent rows jumping around unneceesarily) - qStableSort(cachedBanlist.begin(), cachedBanlist.end(), BannedNodeLessThan(sortColumn, sortOrder)); + std::stable_sort(cachedBanlist.begin(), cachedBanlist.end(), BannedNodeLessThan(sortColumn, sortOrder)); } int size() const @@ -144,7 +144,7 @@ QVariant BanTableModel::headerData(int section, Qt::Orientation orientation, int Qt::ItemFlags BanTableModel::flags(const QModelIndex &index) const { if(!index.isValid()) - return 0; + return QFlag(0); Qt::ItemFlags retval = Qt::ItemIsSelectable | Qt::ItemIsEnabled; return retval; diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index 61c11026..b053cbff 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -251,7 +251,7 @@ int main(int argc, char *argv[]) splashSelect = ":/images/splash"; } - QSplashScreen splash(QPixmap(splashSelect), 0); + QSplashScreen splash(QPixmap(splashSelect), QFlag(0)); if (GetBoolArg("-splash", true) && !GetBoolArg("-min", false)) { diff --git a/src/qt/coincontroldialog.cpp b/src/qt/coincontroldialog.cpp index c5860f96..d57098bd 100644 --- a/src/qt/coincontroldialog.cpp +++ b/src/qt/coincontroldialog.cpp @@ -516,7 +516,6 @@ void CoinControlDialog::updateLabels(WalletModel *model, QDialog* dialog) bool fLowOutput = false; bool fDust = false; CTransaction txDummy; - const int listSize = CoinControlDialog::payAmounts.size(); clock_t begin = clock(); //for (int i = 0; i < listSize; ++i) foreach(const qint64 &amount, CoinControlDialog::payAmounts) diff --git a/src/qt/flowlayout.cpp b/src/qt/flowlayout.cpp index 5c8ac04a..e92b0e2f 100644 --- a/src/qt/flowlayout.cpp +++ b/src/qt/flowlayout.cpp @@ -116,7 +116,7 @@ QLayoutItem *FlowLayout::takeAt(int index) //! [6] Qt::Orientations FlowLayout::expandingDirections() const { - return 0; + return QFlag(0); } //! [6] diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp index 53920bcf..fe733259 100644 --- a/src/qt/guiutil.cpp +++ b/src/qt/guiutil.cpp @@ -625,58 +625,6 @@ bool SetStartOnSystemStartup(bool fAutoStart) } -#elif defined(Q_OS_MAC) -// based on: https://github.com/Mozketo/LaunchAtLoginController/blob/master/LaunchAtLoginController.m - -#include -#include - -LSSharedFileListItemRef findStartupItemInList(LSSharedFileListRef list, CFURLRef findUrl); -LSSharedFileListItemRef findStartupItemInList(LSSharedFileListRef list, CFURLRef findUrl) -{ - // loop through the list of startup items and try to find the DigitalNote app - CFArrayRef listSnapshot = LSSharedFileListCopySnapshot(list, NULL); - for(int i = 0; i < CFArrayGetCount(listSnapshot); i++) { - LSSharedFileListItemRef item = (LSSharedFileListItemRef)CFArrayGetValueAtIndex(listSnapshot, i); - UInt32 resolutionFlags = kLSSharedFileListNoUserInteraction | kLSSharedFileListDoNotMountVolumes; - CFURLRef currentItemURL = NULL; - LSSharedFileListItemResolve(item, resolutionFlags, ¤tItemURL, NULL); - if(currentItemURL && CFEqual(currentItemURL, findUrl)) { - // found - CFRelease(currentItemURL); - return item; - } - if(currentItemURL) { - CFRelease(currentItemURL); - } - } - return NULL; -} - -bool GetStartOnSystemStartup() -{ - CFURLRef bitcoinAppUrl = CFBundleCopyBundleURL(CFBundleGetMainBundle()); - LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL); - LSSharedFileListItemRef foundItem = findStartupItemInList(loginItems, bitcoinAppUrl); - return !!foundItem; // return boolified object -} - -bool SetStartOnSystemStartup(bool fAutoStart) -{ - CFURLRef bitcoinAppUrl = CFBundleCopyBundleURL(CFBundleGetMainBundle()); - LSSharedFileListRef loginItems = LSSharedFileListCreate(NULL, kLSSharedFileListSessionLoginItems, NULL); - LSSharedFileListItemRef foundItem = findStartupItemInList(loginItems, bitcoinAppUrl); - - if(fAutoStart && !foundItem) { - // add DigitalNote app to startup item list - LSSharedFileListInsertItemURL(loginItems, kLSSharedFileListItemBeforeFirst, NULL, NULL, bitcoinAppUrl, NULL, NULL); - } - else if(!fAutoStart && foundItem) { - // remove item - LSSharedFileListItemRemove(loginItems, foundItem); - } - return true; -} #else bool GetStartOnSystemStartup() { return false; } diff --git a/src/qt/messagemodel.cpp b/src/qt/messagemodel.cpp index 5edff355..a4816328 100644 --- a/src/qt/messagemodel.cpp +++ b/src/qt/messagemodel.cpp @@ -297,7 +297,7 @@ class MessageTablePriv cachedMessageTable.append(message); } else { - int index = qLowerBound(cachedMessageTable.begin(), cachedMessageTable.end(), message.received_datetime, MessageTableEntryLessThan()) - cachedMessageTable.begin(); + int index = std::lower_bound(cachedMessageTable.begin(), cachedMessageTable.end(), message.received_datetime, MessageTableEntryLessThan()) - cachedMessageTable.begin(); parent->beginInsertRows(QModelIndex(), index, index); cachedMessageTable.insert( index, @@ -518,7 +518,7 @@ Qt::ItemFlags MessageModel::flags(const QModelIndex & index) const if(index.isValid()) return Qt::ItemIsSelectable | Qt::ItemIsEnabled; - return 0; + return QFlag(0); } QModelIndex MessageModel::index(int row, int column, const QModelIndex & parent) const diff --git a/src/qt/messagepage.cpp b/src/qt/messagepage.cpp index 24562f17..e89a4f4a 100644 --- a/src/qt/messagepage.cpp +++ b/src/qt/messagepage.cpp @@ -31,7 +31,7 @@ class MessageViewDelegate : public QStyledItemDelegate void MessageViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const { - QStyleOptionViewItemV4 optionV4 = option; + QStyleOptionViewItem optionV4 = option; initStyleOption(&optionV4, index); QStyle *style = optionV4.widget? optionV4.widget->style() : QApplication::style(); @@ -62,7 +62,7 @@ void MessageViewDelegate::paint(QPainter *painter, const QStyleOptionViewItem &o QSize MessageViewDelegate::sizeHint ( const QStyleOptionViewItem & option, const QModelIndex & index ) const { - QStyleOptionViewItemV4 options = option; + QStyleOptionViewItem options = option; initStyleOption(&options, index); QTextDocument doc; diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp index 558a34da..27ab3aed 100644 --- a/src/qt/optionsdialog.cpp +++ b/src/qt/optionsdialog.cpp @@ -192,8 +192,8 @@ void OptionsDialog::updateDisplayUnit() bool OptionsDialog::eventFilter(QObject *object, QEvent *event) { - if(event->type() == QEvent::FocusOut) - { +// if(event->type() == QEvent::FocusOut) +// { return QDialog::eventFilter(object, event); - } +// } } diff --git a/src/qt/peertablemodel.cpp b/src/qt/peertablemodel.cpp index cd536d3d..0d366833 100644 --- a/src/qt/peertablemodel.cpp +++ b/src/qt/peertablemodel.cpp @@ -87,7 +87,7 @@ class PeerTablePriv if (sortColumn >= 0) // sort cacheNodeStats (use stable sort to prevent rows jumping around unneceesarily) - qStableSort(cachedNodeStats.begin(), cachedNodeStats.end(), NodeLessThan(sortColumn, sortOrder)); + std::stable_sort(cachedNodeStats.begin(), cachedNodeStats.end(), NodeLessThan(sortColumn, sortOrder)); // build index map mapNodeRows.clear(); @@ -192,7 +192,7 @@ QVariant PeerTableModel::headerData(int section, Qt::Orientation orientation, in Qt::ItemFlags PeerTableModel::flags(const QModelIndex &index) const { if(!index.isValid()) - return 0; + return QFlag(0); Qt::ItemFlags retval = Qt::ItemIsSelectable | Qt::ItemIsEnabled; return retval; diff --git a/src/qt/plugins/mrichtexteditor/mrichtextedit.cpp b/src/qt/plugins/mrichtexteditor/mrichtextedit.cpp index 07f52161..668430d5 100644 --- a/src/qt/plugins/mrichtexteditor/mrichtextedit.cpp +++ b/src/qt/plugins/mrichtexteditor/mrichtextedit.cpp @@ -39,7 +39,7 @@ MRichTextEdit::MRichTextEdit(QWidget *parent) : QWidget(parent) { setupUi(this); m_lastBlockList = 0; - f_textedit->setTabStopWidth(40); + f_textedit->setTabStopDistance(40); connect(f_textedit, SIGNAL(currentCharFormatChanged(QTextCharFormat)), this, SLOT(slotCurrentCharFormatChanged(QTextCharFormat))); @@ -150,7 +150,7 @@ MRichTextEdit::MRichTextEdit(QWidget *parent) : QWidget(parent) { // text background color QPixmap pix(16, 16); - pix.fill(QApplication::palette().background().color()); + pix.fill(QApplication::palette().window().color()); f_bgcolor->setIcon(pix); connect(f_bgcolor, SIGNAL(clicked()), this, SLOT(textBgColor())); @@ -401,7 +401,7 @@ void MRichTextEdit::bgColorChanged(const QColor &c) { if (c.isValid()) { pix.fill(c); } else { - pix.fill(QApplication::palette().background().color()); + pix.fill(QApplication::palette().window().color()); } f_bgcolor->setIcon(pix); } diff --git a/src/qt/transactiontablemodel.cpp b/src/qt/transactiontablemodel.cpp index 388757f1..9e40d210 100644 --- a/src/qt/transactiontablemodel.cpp +++ b/src/qt/transactiontablemodel.cpp @@ -91,9 +91,9 @@ class TransactionTablePriv qDebug() << "TransactionTablePriv::updateWallet : " + QString::fromStdString(hash.ToString()) + " " + QString::number(status); // Find bounds of this transaction in model - QList::iterator lower = qLowerBound( + QList::iterator lower = std::lower_bound( cachedWallet.begin(), cachedWallet.end(), hash, TxLessThan()); - QList::iterator upper = qUpperBound( + QList::iterator upper = std::upper_bound( cachedWallet.begin(), cachedWallet.end(), hash, TxLessThan()); int lowerIndex = (lower - cachedWallet.begin()); int upperIndex = (upper - cachedWallet.begin()); diff --git a/src/qt/transactionview.cpp b/src/qt/transactionview.cpp index 14439942..41ea1b0e 100644 --- a/src/qt/transactionview.cpp +++ b/src/qt/transactionview.cpp @@ -259,20 +259,20 @@ void TransactionView::chooseDate(int idx) break; case Today: transactionProxyModel->setDateRange( - QDateTime(current), + current.startOfDay(), TransactionFilterProxy::MAX_DATE); break; case ThisWeek: { // Find last Monday QDate startOfWeek = current.addDays(-(current.dayOfWeek()-1)); transactionProxyModel->setDateRange( - QDateTime(startOfWeek), + startOfWeek.startOfDay(), TransactionFilterProxy::MAX_DATE); } break; case ThisMonth: transactionProxyModel->setDateRange( - QDateTime(QDate(current.year(), current.month(), 1)), + QDate(current.year(), current.month(), 1).startOfDay(), TransactionFilterProxy::MAX_DATE); break; case LastMonth: @@ -282,7 +282,7 @@ void TransactionView::chooseDate(int idx) break; case ThisYear: transactionProxyModel->setDateRange( - QDateTime(QDate(current.year(), 1, 1)), + QDate(current.year(), 1, 1).startOfDay(), TransactionFilterProxy::MAX_DATE); break; case Range: @@ -537,8 +537,8 @@ void TransactionView::dateRangeChanged() if(!transactionProxyModel) return; transactionProxyModel->setDateRange( - QDateTime(dateFrom->date()), - QDateTime(dateTo->date()).addDays(1)); + dateFrom->date().startOfDay(), + dateTo->date().startOfDay().addDays(1)); } void TransactionView::focusTransaction(const QModelIndex &idx) diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp index 2750ae2b..024e28dd 100644 --- a/src/qt/walletmodel.cpp +++ b/src/qt/walletmodel.cpp @@ -316,7 +316,6 @@ WalletModel::SendCoinsReturn WalletModel::sendCoins(WalletModelTransaction &tran { LOCK2(cs_main, wallet->cs_wallet); - CWalletTx *newTx = transaction.getTransaction(); CWalletTx wtx; diff --git a/src/ui_interface.h b/src/ui_interface.h index 0e674a3e..938bad14 100644 --- a/src/ui_interface.h +++ b/src/ui_interface.h @@ -7,8 +7,10 @@ #define BITCOIN_UI_INTERFACE_H #include +//temporary until they fix their own deprecated class +#define BOOST_ALLOW_DEPRECATED_HEADERS #include - +#undef BOOST_ALLOW_DEPRECATED_HEADERS #include #include From 0c4f5a32adfa5a0594d120ae81a7b91d56402504 Mon Sep 17 00:00:00 2001 From: vgulkevic Date: Mon, 16 Nov 2020 21:18:11 +0200 Subject: [PATCH 25/35] Fix more compile warnings --- configure.ac | 4 +- share/qt/extract_strings_qt.py | 2 +- src/Makefile.qt.include | 2 - src/addrman.h | 285 ++++++++++++++++----------------- src/blockparams.cpp | 2 +- src/chainparams.cpp | 2 - src/chainparamsseeds.h | 8 +- src/masternode.h | 7 - src/qt/forms/rpcconsole.ui | 2 +- src/serialize.h | 232 ++++++++++++++++++++------- 10 files changed, 319 insertions(+), 227 deletions(-) diff --git a/configure.ac b/configure.ac index 37280374..03ebe11b 100644 --- a/configure.ac +++ b/configure.ac @@ -401,12 +401,12 @@ if test x$use_hardening != xno; then AX_CHECK_LINK_FLAG([[-Wl,--dynamicbase]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--dynamicbase"]) AX_CHECK_LINK_FLAG([[-Wl,--nxcompat]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--nxcompat"]) + AX_CHECK_LINK_FLAG([[-Wl,--high-entropy-va]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--high-entropy-va"]) AX_CHECK_LINK_FLAG([[-Wl,-z,relro]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,relro"]) AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,now"]) 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],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fPIE"]) + AX_CHECK_COMPILE_FLAG([-fPIE],[PIE_FLAGS="-fPIE"]) AX_CHECK_LINK_FLAG([[-pie]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -pie"]) fi diff --git a/share/qt/extract_strings_qt.py b/share/qt/extract_strings_qt.py index 49bb7af7..72807a9e 100755 --- a/share/qt/extract_strings_qt.py +++ b/share/qt/extract_strings_qt.py @@ -6,7 +6,7 @@ from subprocess import Popen, PIPE import glob -OUT_CPP="../src/qt/bitcoinstrings.cpp" +OUT_CPP="qt/bitcoinstrings.cpp" EMPTY=['""'] def parse_po(text): diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index a7d035e8..1c0d3104 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -127,7 +127,6 @@ QT_MOC_CPP = \ qt/moc_blockbrowser.cpp \ qt/plugins/mrichtexteditor/moc_mrichtextedit.cpp \ qt/moc_qvalidatedtextedit.cpp \ - qt/moc_flowlayout.cpp \ qt/moc_clientmodel.cpp \ qt/moc_guiutil.cpp \ qt/moc_optionsmodel.cpp \ @@ -138,7 +137,6 @@ QT_MOC_CPP = \ qt/moc_trafficgraphwidget.cpp \ qt/moc_transactiondesc.cpp \ qt/moc_transactiondescdialog.cpp \ - qt/moc_bitcoinamountfield.cpp \ qt/moc_transactionfilterproxy.cpp \ qt/moc_transactionview.cpp \ qt/moc_walletmodel.cpp \ diff --git a/src/addrman.h b/src/addrman.h index 16e91485..b0a0930c 100644 --- a/src/addrman.h +++ b/src/addrman.h @@ -7,7 +7,9 @@ #include "netbase.h" #include "protocol.h" +#include "random.h" #include "sync.h" +#include "timedata.h" #include "util.h" #include @@ -15,8 +17,6 @@ #include #include -#include - /** Extended statistics about a CAddress */ class CAddrInfo : public CAddress { @@ -47,11 +47,11 @@ class CAddrInfo : public CAddress public: IMPLEMENT_SERIALIZE( - CAddress* pthis = (CAddress*)(this); - READWRITE(*pthis); - READWRITE(source); - READWRITE(nLastSuccess); - READWRITE(nAttempts); + CAddress* pthis = (CAddress*)(this); + READWRITE(*pthis); + READWRITE(source); + READWRITE(nLastSuccess); + READWRITE(nAttempts); ) void Init() @@ -245,149 +245,142 @@ class CAddrMan void Connected_(const CService &addr, int64_t nTime); public: + // serialized format: + // * version byte (currently 0) + // * nKey + // * nNew + // * nTried + // * number of "new" buckets + // * all nNew addrinfos in vvNew + // * all nTried addrinfos in vvTried + // * for each bucket: + // * number of elements + // * for each element: index + // + // Notice that vvTried, mapAddr and vVector are never encoded explicitly; + // they are instead reconstructed from the other information. + // + // vvNew is serialized, but only used if ADDRMAN_UNKOWN_BUCKET_COUNT didn't change, + // otherwise it is reconstructed as well. + // + // This format is more complex, but significantly smaller (at most 1.5 MiB), and supports + // changes to the ADDRMAN_ parameters without breaking the on-disk structure. + // + // We don't use IMPLEMENT_SERIALIZE since the serialization and deserialization code has + // very little in common. + template + void Serialize(Stream &s, int nType, int nVersionDummy) const + { + LOCK(cs); + + unsigned char nVersion = 0; + s << nVersion; + s << nKey; + s << nNew; + s << nTried; + + int nUBuckets = ADDRMAN_NEW_BUCKET_COUNT; + s << nUBuckets; + std::map mapUnkIds; + int nIds = 0; + for (std::map::const_iterator it = mapInfo.begin(); it != mapInfo.end(); it++) { + if (nIds == nNew) break; // this means nNew was wrong, oh ow + mapUnkIds[(*it).first] = nIds; + const CAddrInfo &info = (*it).second; + if (info.nRefCount) { + s << info; + nIds++; + } + } + nIds = 0; + for (std::map::const_iterator it = mapInfo.begin(); it != mapInfo.end(); it++) { + if (nIds == nTried) break; // this means nTried was wrong, oh ow + const CAddrInfo &info = (*it).second; + if (info.fInTried) { + s << info; + nIds++; + } + } + for (std::vector >::const_iterator it = vvNew.begin(); it != vvNew.end(); it++) { + const std::set &vNew = (*it); + int nSize = vNew.size(); + s << nSize; + for (std::set::const_iterator it2 = vNew.begin(); it2 != vNew.end(); it2++) { + int nIndex = mapUnkIds[*it2]; + s << nIndex; + } + } + } - - - - - - - - - - IMPLEMENT_SERIALIZE - (({ - // serialized format: - // * version byte (currently 0) - // * nKey - // * nNew - // * nTried - // * number of "new" buckets - // * all nNew addrinfos in vvNew - // * all nTried addrinfos in vvTried - // * for each bucket: - // * number of elements - // * for each element: index - // - // Notice that vvTried, mapAddr and vVector are never encoded explicitly; - // they are instead reconstructed from the other information. - // - // vvNew is serialized, but only used if ADDRMAN_UNKOWN_BUCKET_COUNT didn't change, - // otherwise it is reconstructed as well. - // - // This format is more complex, but significantly smaller (at most 1.5 MiB), and supports - // changes to the ADDRMAN_ parameters without breaking the on-disk structure. - { - LOCK(cs); - unsigned char nVersion = 0; - READWRITE(nVersion); - READWRITE(nKey); - READWRITE(nNew); - READWRITE(nTried); - - CAddrMan *am = const_cast(this); - if (fWrite) - { - int nUBuckets = ADDRMAN_NEW_BUCKET_COUNT; - READWRITE(nUBuckets); - std::map mapUnkIds; - int nIds = 0; - for (std::map::iterator it = am->mapInfo.begin(); it != am->mapInfo.end(); it++) - { - if (nIds == nNew) break; // this means nNew was wrong, oh ow - mapUnkIds[(*it).first] = nIds; - CAddrInfo &info = (*it).second; - if (info.nRefCount) - { - READWRITE(info); - nIds++; - } - } - nIds = 0; - for (std::map::iterator it = am->mapInfo.begin(); it != am->mapInfo.end(); it++) - { - if (nIds == nTried) break; // this means nTried was wrong, oh ow - CAddrInfo &info = (*it).second; - if (info.fInTried) - { - READWRITE(info); - nIds++; - } - } - for (std::vector >::iterator it = am->vvNew.begin(); it != am->vvNew.end(); it++) - { - const std::set &vNew = (*it); - int nSize = vNew.size(); - READWRITE(nSize); - for (std::set::iterator it2 = vNew.begin(); it2 != vNew.end(); it2++) - { - int nIndex = mapUnkIds[*it2]; - READWRITE(nIndex); - } - } + template + void Unserialize(Stream& s, int nType, int nVersionDummy) + { + LOCK(cs); + + unsigned char nVersion; + s >> nVersion; + s >> nKey; + s >> nNew; + s >> nTried; + + int nUBuckets = 0; + s >> nUBuckets; + nIdCount = 0; + mapInfo.clear(); + mapAddr.clear(); + vRandom.clear(); + vvTried = std::vector >(ADDRMAN_TRIED_BUCKET_COUNT, std::vector(0)); + vvNew = std::vector >(ADDRMAN_NEW_BUCKET_COUNT, std::set()); + for (int n = 0; n < nNew; n++) { + CAddrInfo &info = mapInfo[n]; + s >> info; + mapAddr[info] = n; + info.nRandomPos = vRandom.size(); + vRandom.push_back(n); + if (nUBuckets != ADDRMAN_NEW_BUCKET_COUNT) { + vvNew[info.GetNewBucket(nKey)].insert(n); + info.nRefCount++; + } + } + nIdCount = nNew; + int nLost = 0; + for (int n = 0; n < nTried; n++) { + CAddrInfo info; + s >> info; + std::vector &vTried = vvTried[info.GetTriedBucket(nKey)]; + if (vTried.size() < ADDRMAN_TRIED_BUCKET_SIZE) { + info.nRandomPos = vRandom.size(); + info.fInTried = true; + vRandom.push_back(nIdCount); + mapInfo[nIdCount] = info; + mapAddr[info] = nIdCount; + vTried.push_back(nIdCount); + nIdCount++; } else { - int nUBuckets = 0; - READWRITE(nUBuckets); - am->nIdCount = 0; - am->mapInfo.clear(); - am->mapAddr.clear(); - am->vRandom.clear(); - am->vvTried = std::vector >(ADDRMAN_TRIED_BUCKET_COUNT, std::vector(0)); - am->vvNew = std::vector >(ADDRMAN_NEW_BUCKET_COUNT, std::set()); - for (int n = 0; n < am->nNew; n++) - { - CAddrInfo &info = am->mapInfo[n]; - READWRITE(info); - am->mapAddr[info] = n; - info.nRandomPos = vRandom.size(); - am->vRandom.push_back(n); - if (nUBuckets != ADDRMAN_NEW_BUCKET_COUNT) - { - am->vvNew[info.GetNewBucket(am->nKey)].insert(n); - info.nRefCount++; - } - } - am->nIdCount = am->nNew; - int nLost = 0; - for (int n = 0; n < am->nTried; n++) - { - CAddrInfo info; - READWRITE(info); - std::vector &vTried = am->vvTried[info.GetTriedBucket(am->nKey)]; - if (vTried.size() < ADDRMAN_TRIED_BUCKET_SIZE) - { - info.nRandomPos = vRandom.size(); - info.fInTried = true; - am->vRandom.push_back(am->nIdCount); - am->mapInfo[am->nIdCount] = info; - am->mapAddr[info] = am->nIdCount; - vTried.push_back(am->nIdCount); - am->nIdCount++; - } else { - nLost++; - } - } - am->nTried -= nLost; - for (int b = 0; b < nUBuckets; b++) - { - std::set &vNew = am->vvNew[b]; - int nSize = 0; - READWRITE(nSize); - for (int n = 0; n < nSize; n++) - { - int nIndex = 0; - READWRITE(nIndex); - CAddrInfo &info = am->mapInfo[nIndex]; - if (nUBuckets == ADDRMAN_NEW_BUCKET_COUNT && info.nRefCount < ADDRMAN_NEW_BUCKETS_PER_ADDRESS) - { - info.nRefCount++; - vNew.insert(nIndex); - } - } + nLost++; + } + } + nTried -= nLost; + for (int b = 0; b < nUBuckets; b++) { + std::set &vNew = vvNew[b]; + int nSize = 0; + s >> nSize; + for (int n = 0; n < nSize; n++) { + int nIndex = 0; + s >> nIndex; + CAddrInfo &info = mapInfo[nIndex]; + if (nUBuckets == ADDRMAN_NEW_BUCKET_COUNT && info.nRefCount < ADDRMAN_NEW_BUCKETS_PER_ADDRESS) { + info.nRefCount++; + vNew.insert(nIndex); } } } - });) + } + + unsigned int GetSerializeSize(int nType, int nVersion) const + { + return (CSizeComputer(nType, nVersion) << *this).size(); + } CAddrMan() : vRandom(0), vvTried(ADDRMAN_TRIED_BUCKET_COUNT, std::vector(0)), vvNew(ADDRMAN_NEW_BUCKET_COUNT, std::set()) { @@ -429,7 +422,7 @@ class CAddrMan Check(); } if (fRet) - LogPrint("addrman", "Added %s from %s: %i tried, %i new\n", addr.ToStringIPPort(), source.ToString(), nTried, nNew); + LogPrint("addrman", "Added %s from %s: %i tried, %i new\n", addr.ToStringIPPort().c_str(), source.ToString(), nTried, nNew); return fRet; } diff --git a/src/blockparams.cpp b/src/blockparams.cpp index a37958ce..fee75f9c 100644 --- a/src/blockparams.cpp +++ b/src/blockparams.cpp @@ -579,7 +579,7 @@ int64_t GetMasternodePayment(int nHeight, int64_t blockValue) { seesawRollover = seesawArcend * seesawEpoch; LogPrint("creation", "GetMasternodePayment(): seesawRollover=%lu\n", seesawRollover); - seesawInterval =- seesawRollover; + seesawInterval = -seesawRollover; LogPrint("creation", "GetMasternodePayment(): seesawInterval=%lu\n", seesawInterval); } else diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 26345d68..53567d6f 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -8,8 +8,6 @@ #include "chainparams.h" #include "main.h" #include "util.h" -// TODO: Verify the requirement of below link -// #include "base58.h" #include diff --git a/src/chainparamsseeds.h b/src/chainparamsseeds.h index c4dfc004..37967f60 100644 --- a/src/chainparamsseeds.h +++ b/src/chainparamsseeds.h @@ -5,12 +5,8 @@ // Each line contains a 16-byte IPv6 address and a port. // IPv4 as well as onion addresses are wrapped inside a IPv6 address accordingly. -static SeedSpec6 pnSeed6_main[] = { +static SeedSpec6 pnSeed6_main[]; -}; - -static const unsigned int pnTestnetSeed[] = { - -}; +static const unsigned int pnTestnetSeed[]; #endif diff --git a/src/masternode.h b/src/masternode.h index 53448520..179b9054 100644 --- a/src/masternode.h +++ b/src/masternode.h @@ -200,13 +200,6 @@ class CMasternode { isOldNode = status; } - - inline uint64_t SliceHash(uint256& hash, int slice) - { - uint64_t n = 0; - memcpy(&n, &hash+slice*64, 64); - return n; - } void Check(); diff --git a/src/qt/forms/rpcconsole.ui b/src/qt/forms/rpcconsole.ui index 9455fc9d..9a82b272 100644 --- a/src/qt/forms/rpcconsole.ui +++ b/src/qt/forms/rpcconsole.ui @@ -1250,7 +1250,7 @@ - + Connection Time diff --git a/src/serialize.h b/src/serialize.h index 3ab67892..9eb3a7cf 100644 --- a/src/serialize.h +++ b/src/serialize.h @@ -1,26 +1,27 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2009-2012 The Bitcoin developers +// Copyright (c) 2009-2013 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_SERIALIZE_H #define BITCOIN_SERIALIZE_H -#include -#include +#include "allocators.h" + +#include +#include +#include +#include #include #include -#include -#include #include -#include -#include +#include +#include +#include +#include -#include #include - -#include "allocators.h" -#include "version.h" +#include class CAutoFile; class CDataStream; @@ -36,18 +37,7 @@ inline T& REF(const T& val) return const_cast(val); } -/** - * Used to acquire a non-const pointer "this" to generate bodies - * of const serialization operations from a template - */ -template -inline T* NCONST_PTR(const T* val) -{ - return const_cast(val); -} - -/** - * Get begin pointer of vector (non-const version). +/** Get begin pointer of vector (non-const version). * @note These functions avoid the undefined case of indexing into an empty * vector, as well as that of indexing after the end of the vector. */ @@ -75,11 +65,10 @@ inline const T* end_ptr(const std::vector& v) return v.empty() ? NULL : (&v[0] + v.size()); } - ///////////////////////////////////////////////////////////////// // // Templates for serializing to anything that looks like a stream, -// i.e. anything that supports .read(char*, size_t) and .write(char*, size_t) +// i.e. anything that supports .read(char*, int) and .write(char*, int) // enum @@ -88,7 +77,6 @@ enum SER_NETWORK = (1 << 0), SER_DISK = (1 << 1), SER_GETHASH = (1 << 2), - // modifiers SER_SKIPSIG = (1 << 16), SER_BLOCKHEADERONLY = (1 << 17), @@ -133,29 +121,9 @@ enum } #define READWRITE(obj) (nSerSize += ::SerReadWrite(s, (obj), nType, nVersion, ser_action)) -#define READWRITES(obj) (::SerReadWrite(s, (obj), nType, nVersion, ser_action)) -/** - * Implement three methods for serializable objects. These are actually wrappers over - * "SerializationOp" template, which implements the body of each class' serialization - * code. Adding "ADD_SERIALIZE_METHODS" in the body of the class causes these wrappers to be - * added as members. - */ -#define ADD_SERIALIZE_METHODS \ - size_t GetSerializeSize(int nType, int nVersion) const { \ - CSizeComputer s(nType, nVersion); \ - NCONST_PTR(this)->SerializationOp(s, CSerActionSerialize(), nType, nVersion);\ - return s.size(); \ - } \ - template \ - void Serialize(Stream& s, int nType, int nVersion) const { \ - NCONST_PTR(this)->SerializationOp(s, CSerActionSerialize(), nType, nVersion);\ - } \ - template \ - void Unserialize(Stream& s, int nType, int nVersion) { \ - SerializationOp(s, CSerActionUnserialize(), nType, nVersion); \ - } + @@ -294,7 +262,7 @@ uint64_t ReadCompactSize(Stream& is) uint64_t xSize; READDATA(is, xSize); nSizeRet = xSize; - if (nSizeRet < 0x100000000ULL) + if (nSizeRet < 0x100000000LLu) throw std::ios_base::failure("non-canonical ReadCompactSize()"); } if (nSizeRet > (uint64_t)MAX_SIZE) @@ -381,6 +349,12 @@ class CFlatData char* pend; public: CFlatData(void* pbeginIn, void* pendIn) : pbegin((char*)pbeginIn), pend((char*)pendIn) { } + template + explicit CFlatData(std::vector &v) + { + pbegin = (char*)begin_ptr(v); + pend = (char*)end_ptr(v); + } char* begin() { return pbegin; } const char* begin() const { return pbegin; } char* end() { return pend; } @@ -818,14 +792,8 @@ void Unserialize(Stream& is, std::set& m, int nType, int nVersion) // Support for IMPLEMENT_SERIALIZE and READWRITE macro // class CSerActionGetSerializeSize { }; -struct CSerActionSerialize -{ - bool ForRead() const { return false; } -}; -struct CSerActionUnserialize -{ - bool ForRead() const { return true; } -}; +class CSerActionSerialize { }; +class CSerActionUnserialize { }; template inline unsigned int SerReadWrite(Stream& s, const T& obj, int nType, int nVersion, CSerActionGetSerializeSize ser_action) @@ -876,7 +844,7 @@ class CSizeComputer CSizeComputer(int nTypeIn, int nVersionIn) : nSize(0), nType(nTypeIn), nVersion(nVersionIn) {} - CSizeComputer& write(const char *psz, size_t nSize) + CSizeComputer& write(const char *psz, int nSize) { this->nSize += nSize; return *this; @@ -1105,9 +1073,10 @@ class CDataStream void ReadVersion() { *this >> nVersion; } void WriteVersion() { *this << nVersion; } - CDataStream& read(char* pch, size_t nSize) + CDataStream& read(char* pch, int nSize) { // Read from the beginning of the buffer + assert(nSize >= 0); unsigned int nReadPosNext = nReadPos + nSize; if (nReadPosNext >= vch.size()) { @@ -1144,9 +1113,10 @@ class CDataStream return (*this); } - CDataStream& write(const char* pch, size_t nSize) + CDataStream& write(const char* pch, int nSize) { // Write to the end of the buffer + assert(nSize >= 0); vch.insert(vch.end(), pch, pch + nSize); return (*this); } @@ -1312,4 +1282,148 @@ class CAutoFile } }; +/** Wrapper around a FILE* that implements a ring buffer to + * deserialize from. It guarantees the ability to rewind + * a given number of bytes. */ +class CBufferedFile +{ +private: + FILE *src; // source file + uint64_t nSrcPos; // how many bytes have been read from source + uint64_t nReadPos; // how many bytes have been read from this + uint64_t nReadLimit; // up to which position we're allowed to read + uint64_t nRewind; // how many bytes we guarantee to rewind + std::vector vchBuf; // the buffer + + short state; + short exceptmask; + +protected: + void setstate(short bits, const char *psz) { + state |= bits; + if (state & exceptmask) + throw std::ios_base::failure(psz); + } + + // read data from the source to fill the buffer + bool Fill() { + unsigned int pos = nSrcPos % vchBuf.size(); + unsigned int readNow = vchBuf.size() - pos; + unsigned int nAvail = vchBuf.size() - (nSrcPos - nReadPos) - nRewind; + if (nAvail < readNow) + readNow = nAvail; + if (readNow == 0) + return false; + size_t read = fread((void*)&vchBuf[pos], 1, readNow, src); + if (read == 0) { + setstate(std::ios_base::failbit, feof(src) ? "CBufferedFile::Fill : end of file" : "CBufferedFile::Fill : fread failed"); + return false; + } else { + nSrcPos += read; + return true; + } + } + +public: + int nType; + int nVersion; + + CBufferedFile(FILE *fileIn, uint64_t nBufSize, uint64_t nRewindIn, int nTypeIn, int nVersionIn) : + src(fileIn), nSrcPos(0), nReadPos(0), nReadLimit((uint64_t)(-1)), nRewind(nRewindIn), vchBuf(nBufSize, 0), + state(0), exceptmask(std::ios_base::badbit | std::ios_base::failbit), nType(nTypeIn), nVersion(nVersionIn) { + } + + // check whether no error occurred + bool good() const { + return state == 0; + } + + // check whether we're at the end of the source file + bool eof() const { + return nReadPos == nSrcPos && feof(src); + } + + // read a number of bytes + CBufferedFile& read(char *pch, size_t nSize) { + if (nSize + nReadPos > nReadLimit) + throw std::ios_base::failure("Read attempted past buffer limit"); + if (nSize + nRewind > vchBuf.size()) + throw std::ios_base::failure("Read larger than buffer size"); + while (nSize > 0) { + if (nReadPos == nSrcPos) + Fill(); + unsigned int pos = nReadPos % vchBuf.size(); + size_t nNow = nSize; + if (nNow + pos > vchBuf.size()) + nNow = vchBuf.size() - pos; + if (nNow + nReadPos > nSrcPos) + nNow = nSrcPos - nReadPos; + memcpy(pch, &vchBuf[pos], nNow); + nReadPos += nNow; + pch += nNow; + nSize -= nNow; + } + return (*this); + } + + // return the current reading position + uint64_t GetPos() { + return nReadPos; + } + + // rewind to a given reading position + bool SetPos(uint64_t nPos) { + nReadPos = nPos; + if (nReadPos + nRewind < nSrcPos) { + nReadPos = nSrcPos - nRewind; + return false; + } else if (nReadPos > nSrcPos) { + nReadPos = nSrcPos; + return false; + } else { + return true; + } + } + + bool Seek(uint64_t nPos) { + long nLongPos = nPos; + if (nPos != (uint64_t)nLongPos) + return false; + if (fseek(src, nLongPos, SEEK_SET)) + return false; + nLongPos = ftell(src); + nSrcPos = nLongPos; + nReadPos = nLongPos; + state = 0; + return true; + } + + // prevent reading beyond a certain position + // no argument removes the limit + bool SetLimit(uint64_t nPos = (uint64_t)(-1)) { + if (nPos < nReadPos) + return false; + nReadLimit = nPos; + return true; + } + + template + CBufferedFile& operator>>(T& obj) { + // Unserialize from this stream + ::Unserialize(*this, obj, nType, nVersion); + return (*this); + } + + // search for a given byte in the stream, and remain positioned on it + void FindByte(char ch) { + while (true) { + if (nReadPos == nSrcPos) + Fill(); + if (vchBuf[nReadPos % vchBuf.size()] == ch) + break; + nReadPos++; + } + } +}; + #endif From b84a49a2e227f6e4ef7c6a5421bc7305eaeea6c5 Mon Sep 17 00:00:00 2001 From: crytpoplissken Date: Mon, 16 Nov 2020 12:53:54 -0800 Subject: [PATCH 26/35] Create .gitignore --- doc/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/.gitignore diff --git a/doc/.gitignore b/doc/.gitignore new file mode 100644 index 00000000..cef6e7b6 --- /dev/null +++ b/doc/.gitignore @@ -0,0 +1 @@ +Doxyfile \ No newline at end of file From 59ebe789d07144945e6f9f7204ec5597d0c4c90f Mon Sep 17 00:00:00 2001 From: vgulkevic Date: Tue, 17 Nov 2020 00:32:30 +0200 Subject: [PATCH 27/35] Removing bignum.h --- configure.ac | 54 ++- src/MakeFile.am | 10 +- src/Makefile.test.include | 1 - src/alert.cpp | 1 + src/attributes.h | 22 + src/bignum.h | 741 ------------------------------ src/blockparams.cpp | 12 +- src/blockparams.h | 1 - src/chainparams.cpp | 13 +- src/chainparams.h | 9 +- src/config/bitcoin-config.h | 3 + src/config/bitcoin-config.h.in | 3 + src/fork.h | 2 - src/genesis.h | 2 - src/hash.h | 1 + src/kernel.cpp | 8 +- src/main.cpp | 24 +- src/main.h | 2 +- src/masternode-pos.cpp | 4 - src/masternode-pos.h | 1 - src/masternodeman.h | 1 - src/miner.cpp | 5 +- src/mining.h | 2 - src/net.cpp | 8 +- src/net.h | 2 +- src/prevector.h | 527 ++++++++++++++++++++++ src/protocol.h | 1 + src/qt/transactiondesc.cpp | 1 + src/qt/transactionrecord.cpp | 1 + src/random.cpp | 139 ++++++ src/random.h | 49 ++ src/rpcmining.cpp | 9 +- src/rpcmisc.cpp | 1 + src/rpcnet.cpp | 1 + src/rpcwallet.cpp | 1 + src/script.cpp | 2 +- src/script.h | 387 +++++++--------- src/serialize.h | 30 ++ src/span.h | 222 +++++++++ src/spork.cpp | 1 - src/spork.h | 2 - src/test/bignum_tests.cpp | 125 ----- src/timedata.cpp | 91 ++++ src/timedata.h | 17 + src/txdb-leveldb.cpp | 10 +- src/txdb-leveldb.h | 4 +- src/uint256.cpp | 357 +++++++++++++++ src/uint256.h | 803 ++++++--------------------------- src/util.cpp | 179 +------- src/util.h | 42 -- src/wallet.cpp | 1 + 51 files changed, 1883 insertions(+), 2052 deletions(-) create mode 100644 src/attributes.h delete mode 100644 src/bignum.h create mode 100644 src/prevector.h create mode 100644 src/random.cpp create mode 100644 src/random.h create mode 100644 src/span.h delete mode 100644 src/test/bignum_tests.cpp create mode 100644 src/timedata.cpp create mode 100644 src/timedata.h create mode 100644 src/uint256.cpp diff --git a/configure.ac b/configure.ac index 03ebe11b..d1bb3964 100644 --- a/configure.ac +++ b/configure.ac @@ -646,12 +646,7 @@ AC_ARG_WITH([daemon], BITCOIN_QT_INIT if test x$use_pkgconfig = xyes; then - - if test x"$PKG_CONFIG" = "x"; then - AC_MSG_ERROR(pkg-config not found.) - fi - - : #NOP + : dnl m4_ifdef( [PKG_CHECK_MODULES], [ @@ -661,6 +656,22 @@ if test x$use_pkgconfig = xyes; then if test x$use_qr != xno; then BITCOIN_QT_CHECK([PKG_CHECK_MODULES([QR], [libqrencode], [have_qrencode=yes], [have_qrencode=no])]) fi + if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests != xnononono; then + PKG_CHECK_MODULES([EVENT], [libevent],, [AC_MSG_ERROR(libevent not found.)]) + if test x$TARGET_OS != xwindows; then + PKG_CHECK_MODULES([EVENT_PTHREADS], [libevent_pthreads],, [AC_MSG_ERROR(libevent_pthreads not found.)]) + fi + fi + + if test "x$use_zmq" = "xyes"; then + PKG_CHECK_MODULES([ZMQ],[libzmq >= 4], + [AC_DEFINE([ENABLE_ZMQ],[1],[Define to 1 to enable ZMQ functions])], + [AC_DEFINE([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions]) + AC_MSG_WARN([libzmq version 4.x or greater not found, disabling]) + use_zmq=no]) + else + AC_DEFINE_UNQUOTED([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions]) + fi ] ) else @@ -670,6 +681,37 @@ else AC_CHECK_HEADER([openssl/ssl.h],, AC_MSG_ERROR(libssl headers missing),) AC_CHECK_LIB([ssl], [main],SSL_LIBS=-lssl, AC_MSG_ERROR(libssl missing)) + if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests != xnononono; then + AC_CHECK_HEADER([event2/event.h],, AC_MSG_ERROR(libevent headers missing),) + AC_CHECK_LIB([event],[main],EVENT_LIBS=-levent,AC_MSG_ERROR(libevent missing)) + if test x$TARGET_OS != xwindows; then + AC_CHECK_LIB([event_pthreads],[main],EVENT_PTHREADS_LIBS=-levent_pthreads,AC_MSG_ERROR(libevent_pthreads missing)) + fi + fi + + if test "x$use_zmq" = "xyes"; then + AC_CHECK_HEADER([zmq.h], + [AC_DEFINE([ENABLE_ZMQ],[1],[Define to 1 to enable ZMQ functions])], + [AC_MSG_WARN([zmq.h not found, disabling zmq support]) + use_zmq=no + AC_DEFINE([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions])]) + AC_CHECK_LIB([zmq],[zmq_ctx_shutdown],ZMQ_LIBS=-lzmq, + [AC_MSG_WARN([libzmq >= 4.0 not found, disabling zmq support]) + use_zmq=no + AC_DEFINE([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions])]) + else + AC_DEFINE_UNQUOTED([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions]) + fi + + if test "x$use_zmq" = "xyes"; then + dnl Assume libzmq was built for static linking + case $host in + *mingw*) + ZMQ_CFLAGS="$ZMQ_CFLAGS -DZMQ_STATIC" + ;; + esac + fi + BITCOIN_QT_CHECK(AC_CHECK_LIB([protobuf] ,[main],[PROTOBUF_LIBS=-lprotobuf], BITCOIN_QT_FAIL(libprotobuf not found))) if test x$use_qr != xno; then BITCOIN_QT_CHECK([AC_CHECK_LIB([qrencode], [main],[QR_LIBS=-lqrencode], [have_qrencode=no])]) diff --git a/src/MakeFile.am b/src/MakeFile.am index 0f58e8c6..1b3e666a 100644 --- a/src/MakeFile.am +++ b/src/MakeFile.am @@ -74,8 +74,8 @@ BITCOIN_CORE_H = \ addrman.h \ alert.h \ allocators.h \ + attributes.h \ base58.h \ - bignum.h \ blockparams.h \ blocksizecalculator.h \ chain.h \ @@ -92,6 +92,7 @@ BITCOIN_CORE_H = \ fork.h \ genesis.h \ hash.h \ + prevector.h \ init.h \ instantx.h \ kernel.h \ @@ -100,6 +101,7 @@ BITCOIN_CORE_H = \ limitedmap.h \ main.h \ protocol.h \ + random.h \ masternode-payments.h \ masternode.h \ masternodeconfig.h \ @@ -111,7 +113,6 @@ BITCOIN_CORE_H = \ net.h \ netbase.h \ pbkdf2.h \ - protocol.h \ pubkey.h \ rpcclient.h \ rpcprotocol.h \ @@ -119,12 +120,14 @@ BITCOIN_CORE_H = \ rpcvelocity.h \ script.h \ serialize.h \ + span.h \ smessage.h \ spork.h \ stealth.h \ support/cleanse.h \ sync.h \ threadsafety.h \ + timedata.h \ tinyformat.h \ txdb.h \ txmempool.h \ @@ -184,6 +187,7 @@ libbitcoin_server_a_SOURCES = \ smessage.cpp \ webwalletconnector.cpp \ stealth.cpp \ + timedata.cpp \ support/cleanse.cpp \ txmempool.cpp \ $(JSON_H) \ @@ -261,6 +265,8 @@ libbitcoin_util_a_SOURCES = \ chainparams.cpp \ clientversion.cpp \ rpcprotocol.cpp \ + random.cpp \ + uint256.cpp \ sync.cpp \ util.cpp \ utilstrencodings.cpp \ diff --git a/src/Makefile.test.include b/src/Makefile.test.include index 0a1a2394..d8febe57 100644 --- a/src/Makefile.test.include +++ b/src/Makefile.test.include @@ -33,7 +33,6 @@ RAW_TEST_FILES = test/data/alertTests.raw GENERATED_TEST_FILES = $(JSON_TEST_FILES:.json=.json.h) $(RAW_TEST_FILES:.raw=.raw.h) BITCOIN_TESTS =\ - test/bignum.h \ test/alert_tests.cpp \ test/allocator_tests.cpp \ test/base32_tests.cpp \ diff --git a/src/alert.cpp b/src/alert.cpp index c6fd900c..24d722da 100644 --- a/src/alert.cpp +++ b/src/alert.cpp @@ -8,6 +8,7 @@ #include "chainparams.h" #include "pubkey.h" #include "net.h" +#include "timedata.h" #include "ui_interface.h" #include "util.h" diff --git a/src/attributes.h b/src/attributes.h new file mode 100644 index 00000000..45099bd8 --- /dev/null +++ b/src/attributes.h @@ -0,0 +1,22 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2018 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_ATTRIBUTES_H +#define BITCOIN_ATTRIBUTES_H + +#if defined(__has_cpp_attribute) +# if __has_cpp_attribute(nodiscard) +# define NODISCARD [[nodiscard]] +# endif +#endif +#ifndef NODISCARD +# if defined(_MSC_VER) && _MSC_VER >= 1700 +# define NODISCARD _Check_return_ +# else +# define NODISCARD __attribute__((warn_unused_result)) +# endif +#endif + +#endif // BITCOIN_ATTRIBUTES_H diff --git a/src/bignum.h b/src/bignum.h deleted file mode 100644 index 72c542e1..00000000 --- a/src/bignum.h +++ /dev/null @@ -1,741 +0,0 @@ -// Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2009-2012 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying -// file COPYING or http://www.opensource.org/licenses/mit-license.php. - -#ifndef BITCOIN_BIGNUM_H -#define BITCOIN_BIGNUM_H - -#include "serialize.h" -#include "uint256.h" -#include "version.h" - -#ifdef WIN32 -#include -#endif - -#include - -#include -#include - -#include - -/** Errors thrown by the bignum class */ -class bignum_error : public std::runtime_error -{ -public: - explicit bignum_error(const std::string& str) : std::runtime_error(str) {} -}; - - -/** RAII encapsulated BN_CTX (OpenSSL bignum context) */ -class CAutoBN_CTX -{ -protected: - BN_CTX* pctx; - BN_CTX* operator=(BN_CTX* pnew) { return pctx = pnew; } - -public: - CAutoBN_CTX() - { - pctx = BN_CTX_new(); - if (pctx == NULL) - throw bignum_error("CAutoBN_CTX : BN_CTX_new() returned NULL"); - } - - ~CAutoBN_CTX() - { - if (pctx != NULL) - BN_CTX_free(pctx); - } - - operator BN_CTX*() { return pctx; } - BN_CTX& operator*() { return *pctx; } - BN_CTX** operator&() { return &pctx; } - bool operator!() { return (pctx == NULL); } -}; - - -/** C++ wrapper for BIGNUM (OpenSSL bignum) */ -class CBigNum -{ - BIGNUM* bn; - -public: - CBigNum() - : bn(BN_new()) {} - - CBigNum(const CBigNum& b) - : CBigNum() - { - if (!BN_copy(bn, b.bn)) - { - BN_clear_free(bn); - throw bignum_error("CBigNum::CBigNum(const CBigNum&) : BN_copy failed"); - } - } - - CBigNum& operator=(const CBigNum& b) - { - if (!BN_copy(bn, b.bn)) - throw bignum_error("CBigNum::operator= : BN_copy failed"); - return (*this); - } - - ~CBigNum() - { - BN_clear_free(bn); - } - - //CBigNum(char n) is not portable. Use 'signed char' or 'unsigned char'. - CBigNum(signed char n) :CBigNum() { if (n >= 0) setulong(n); else setint64(n); } - CBigNum(short n) :CBigNum() { if (n >= 0) setulong(n); else setint64(n); } - CBigNum(int n) :CBigNum() { if (n >= 0) setulong(n); else setint64(n); } - CBigNum(long n) :CBigNum() { if (n >= 0) setulong(n); else setint64(n); } - CBigNum(long long n) :CBigNum() { setint64(n); } - CBigNum(unsigned char n) :CBigNum() { setulong(n); } - CBigNum(unsigned short n) :CBigNum() { setulong(n); } - CBigNum(unsigned int n) :CBigNum() { setulong(n); } - CBigNum(unsigned long n) :CBigNum() { setulong(n); } - CBigNum(unsigned long long n) :CBigNum() { setuint64(n); } - explicit CBigNum(uint256 n) :CBigNum() { setuint256(n); } - - explicit CBigNum(const std::vector& vch) - : CBigNum() - { - setvch(vch); - } - - /** Generates a cryptographically secure random number between zero and range exclusive - * i.e. 0 < returned number < range - * @param range The upper bound on the number. - * @return - */ - static CBigNum randBignum(const CBigNum& range) { - CBigNum ret; - if(!BN_rand_range(ret.bn, range.bn)){ - throw bignum_error("CBigNum:rand element : BN_rand_range failed"); - } - return ret; - } - - /** Generates a cryptographically secure random k-bit number - * @param k The bit length of the number. - * @return - */ - static CBigNum RandKBitBigum(const uint32_t k){ - CBigNum ret; - if(!BN_rand(ret.bn, k, -1, 0)){ - throw bignum_error("CBigNum:rand element : BN_rand failed"); - } - return ret; - } - - /**Returns the size in bits of the underlying bignum. - * - * @return the size - */ - int bitSize() const{ - return BN_num_bits(bn); - } - - - void setulong(unsigned long n) - { - if (!BN_set_word(bn, n)) - throw bignum_error("CBigNum conversion from unsigned long : BN_set_word failed"); - } - - unsigned long getulong() const - { - return BN_get_word(bn); - } - - unsigned int getuint() const - { - return BN_get_word(bn); - } - - int getint() const - { - unsigned long n = BN_get_word(bn); - if (!BN_is_negative(bn)) - return (n > (unsigned long)std::numeric_limits::max() ? std::numeric_limits::max() : n); - else - return (n > (unsigned long)std::numeric_limits::max() ? std::numeric_limits::min() : -(int)n); - } - - void setint64(int64_t sn) - { - unsigned char pch[sizeof(sn) + 6]; - unsigned char* p = pch + 4; - bool fNegative; - uint64_t n; - - if (sn < (int64_t)0) - { - // Since the minimum signed integer cannot be represented as positive so long as its type is signed, and it's not well-defined what happens if you make it unsigned before negating it, we instead increment the negative integer by 1, convert it, then increment the (now positive) unsigned integer by 1 to compensate - n = -(sn + 1); - ++n; - fNegative = true; - } else { - n = sn; - fNegative = false; - } - - bool fLeadingZeroes = true; - for (int i = 0; i < 8; i++) - { - unsigned char c = (n >> 56) & 0xff; - n <<= 8; - if (fLeadingZeroes) - { - if (c == 0) - continue; - if (c & 0x80) - *p++ = (fNegative ? 0x80 : 0); - else if (fNegative) - c |= 0x80; - fLeadingZeroes = false; - } - *p++ = c; - } - unsigned int nSize = p - (pch + 4); - pch[0] = (nSize >> 24) & 0xff; - pch[1] = (nSize >> 16) & 0xff; - pch[2] = (nSize >> 8) & 0xff; - pch[3] = (nSize) & 0xff; - BN_mpi2bn(pch, p - pch, bn); - } - - uint64_t getuint64() - { - unsigned int nSize = BN_bn2mpi(bn, NULL); - if (nSize < 4) - return 0; - std::vector vch(nSize); - BN_bn2mpi(bn, &vch[0]); - if (vch.size() > 4) - vch[4] &= 0x7f; - uint64_t n = 0; - for (unsigned int i = 0, j = vch.size()-1; i < sizeof(n) && j >= 4; i++, j--) - ((unsigned char*)&n)[i] = vch[j]; - return n; - } - - void setuint64(uint64_t n) - { - unsigned char pch[sizeof(n) + 6]; - unsigned char* p = pch + 4; - bool fLeadingZeroes = true; - for (int i = 0; i < 8; i++) - { - unsigned char c = (n >> 56) & 0xff; - n <<= 8; - if (fLeadingZeroes) - { - if (c == 0) - continue; - if (c & 0x80) - *p++ = 0; - fLeadingZeroes = false; - } - *p++ = c; - } - unsigned int nSize = p - (pch + 4); - pch[0] = (nSize >> 24) & 0xff; - pch[1] = (nSize >> 16) & 0xff; - pch[2] = (nSize >> 8) & 0xff; - pch[3] = (nSize) & 0xff; - BN_mpi2bn(pch, p - pch, bn); - } - - void setuint256(uint256 n) - { - unsigned char pch[sizeof(n) + 6]; - unsigned char* p = pch + 4; - bool fLeadingZeroes = true; - unsigned char* pbegin = (unsigned char*)&n; - unsigned char* psrc = pbegin + sizeof(n); - while (psrc != pbegin) - { - unsigned char c = *(--psrc); - if (fLeadingZeroes) - { - if (c == 0) - continue; - if (c & 0x80) - *p++ = 0; - fLeadingZeroes = false; - } - *p++ = c; - } - unsigned int nSize = p - (pch + 4); - pch[0] = (nSize >> 24) & 0xff; - pch[1] = (nSize >> 16) & 0xff; - pch[2] = (nSize >> 8) & 0xff; - pch[3] = (nSize >> 0) & 0xff; - BN_mpi2bn(pch, p - pch, bn); - } - - uint256 getuint256() const - { - unsigned int nSize = BN_bn2mpi(bn, NULL); - if (nSize < 4) - return 0; - std::vector vch(nSize); - BN_bn2mpi(bn, &vch[0]); - if (vch.size() > 4) - vch[4] &= 0x7f; - uint256 n = 0; - for (unsigned int i = 0, j = vch.size()-1; i < sizeof(n) && j >= 4; i++, j--) - ((unsigned char*)&n)[i] = vch[j]; - return n; - } - - - void setvch(const std::vector& vch) - { - std::vector vch2(vch.size() + 4); - unsigned int nSize = vch.size(); - // BIGNUM's byte stream format expects 4 bytes of - // big endian size data info at the front - vch2[0] = (nSize >> 24) & 0xff; - vch2[1] = (nSize >> 16) & 0xff; - vch2[2] = (nSize >> 8) & 0xff; - vch2[3] = (nSize >> 0) & 0xff; - // swap data to big endian - reverse_copy(vch.begin(), vch.end(), vch2.begin() + 4); - BN_mpi2bn(&vch2[0], vch2.size(), bn); - } - - std::vector getvch() const - { - unsigned int nSize = BN_bn2mpi(bn, NULL); - if (nSize <= 4) - return std::vector(); - std::vector vch(nSize); - BN_bn2mpi(bn, &vch[0]); - vch.erase(vch.begin(), vch.begin() + 4); - reverse(vch.begin(), vch.end()); - return vch; - } - - CBigNum& SetCompact(unsigned int nCompact) - { - unsigned int nSize = nCompact >> 24; - std::vector vch(4 + nSize); - vch[3] = nSize; - if (nSize >= 1) vch[4] = (nCompact >> 16) & 0xff; - if (nSize >= 2) vch[5] = (nCompact >> 8) & 0xff; - if (nSize >= 3) vch[6] = (nCompact >> 0) & 0xff; - BN_mpi2bn(&vch[0], vch.size(), bn); - return *this; - } - - unsigned int GetCompact() const - { - unsigned int nSize = BN_bn2mpi(bn, NULL); - std::vector vch(nSize); - nSize -= 4; - BN_bn2mpi(bn, &vch[0]); - unsigned int nCompact = nSize << 24; - if (nSize >= 1) nCompact |= (vch[4] << 16); - if (nSize >= 2) nCompact |= (vch[5] << 8); - if (nSize >= 3) nCompact |= (vch[6] << 0); - return nCompact; - } - - void SetHex(const std::string& str) - { - // skip 0x - const char* psz = str.c_str(); - while (isspace(*psz)) - psz++; - bool fNegative = false; - if (*psz == '-') - { - fNegative = true; - psz++; - } - if (psz[0] == '0' && tolower(psz[1]) == 'x') - psz += 2; - while (isspace(*psz)) - psz++; - - // hex string to bignum - *this = 0; - int n; - while ((n = HexDigit(*psz)) != -1) - { - *this <<= 4; - *this += n; - ++psz; - } - if (fNegative) - BN_set_negative(bn, 1); - } - - std::string ToString(int nBase=10) const - { - CAutoBN_CTX pctx; - CBigNum bnBase = nBase; - CBigNum bn0 = 0; - std::string str; - CBigNum bn = *this; - BN_set_negative(bn.bn, false); - CBigNum dv; - CBigNum rem; - if (BN_cmp(bn.bn, bn0.bn) == 0) - return "0"; - while (BN_cmp(bn.bn, bn0.bn) > 0) - { - if (!BN_div(dv.bn, rem.bn, bn.bn, bnBase.bn, pctx)) - throw bignum_error("CBigNum::ToString() : BN_div failed"); - bn = dv; - unsigned int c = rem.getulong(); - str += "0123456789abcdef"[c]; - } - if (BN_is_negative(this->bn)) - str += "-"; - reverse(str.begin(), str.end()); - return str; - } - - std::string GetHex() const - { - return ToString(16); - } - - unsigned int GetSerializeSize(int nType=0, int nVersion=PROTOCOL_VERSION) const - { - return ::GetSerializeSize(getvch(), nType, nVersion); - } - - template - void Serialize(Stream& s, int nType=0, int nVersion=PROTOCOL_VERSION) const - { - ::Serialize(s, getvch(), nType, nVersion); - } - - template - void Unserialize(Stream& s, int nType=0, int nVersion=PROTOCOL_VERSION) - { - std::vector vch; - ::Unserialize(s, vch, nType, nVersion); - setvch(vch); - } - - /** - * exponentiation with an int. this^e - * @param e the exponent as an int - * @return - */ - CBigNum pow(const int e) const { - return this->pow(CBigNum(e)); - } - - /** - * exponentiation this^e - * @param e the exponent - * @return - */ - CBigNum pow(const CBigNum& e) const { - CAutoBN_CTX pctx; - CBigNum ret; - if (!BN_exp(ret.bn, bn, e.bn, pctx)) - throw bignum_error("CBigNum::pow : BN_exp failed"); - return ret; - } - - /** - * modular multiplication: (this * b) mod m - * @param b operand - * @param m modulus - */ - CBigNum mul_mod(const CBigNum& b, const CBigNum& m) const { - CAutoBN_CTX pctx; - CBigNum ret; - if (!BN_mod_mul(ret.bn, bn, b.bn, m.bn, pctx)) - throw bignum_error("CBigNum::mul_mod : BN_mod_mul failed"); - - return ret; - } - - /** - * modular exponentiation: this^e mod n - * @param e exponent - * @param m modulus - */ - CBigNum pow_mod(const CBigNum& e, const CBigNum& m) const { - CAutoBN_CTX pctx; - CBigNum ret; - if(BN_is_negative(e.bn)){ - // g^-x = (g^-1)^x - CBigNum inv = this->inverse(m); - CBigNum posE(e); - BN_set_negative(posE.bn, !BN_is_negative(e.bn)); - if (!BN_mod_exp(ret.bn, inv.bn, posE.bn, m.bn, pctx)) - throw bignum_error("CBigNum::pow_mod: BN_mod_exp failed on negative exponent"); - }else - if (!BN_mod_exp(ret.bn, bn, e.bn, m.bn, pctx)) - throw bignum_error("CBigNum::pow_mod : BN_mod_exp failed"); - - return ret; - } - - /** - * Calculates the inverse of this element mod m. - * i.e. i such this*i = 1 mod m - * @param m the modu - * @return the inverse - */ - CBigNum inverse(const CBigNum& m) const { - CAutoBN_CTX pctx; - CBigNum ret; - if (!BN_mod_inverse(ret.bn, bn, m.bn, pctx)) - throw bignum_error("CBigNum::inverse*= :BN_mod_inverse"); - return ret; - } - - /** - * Generates a random (safe) prime of numBits bits - * @param numBits the number of bits - * @param safe true for a safe prime - * @return the prime - */ - static CBigNum generatePrime(const unsigned int numBits, bool safe = false) { - CBigNum ret; - if(!BN_generate_prime_ex(ret.bn, numBits, (safe == true), NULL, NULL, NULL)) - throw bignum_error("CBigNum::generatePrime*= :BN_generate_prime_ex"); - return ret; - } - - /** - * Calculates the greatest common divisor (GCD) of two numbers. - * @param m the second element - * @return the GCD - */ - CBigNum gcd( const CBigNum& b) const{ - CAutoBN_CTX pctx; - CBigNum ret; - if (!BN_gcd(ret.bn, bn, b.bn, pctx)) - throw bignum_error("CBigNum::gcd*= :BN_gcd"); - return ret; - } - - /** - * Miller-Rabin primality test on this element - * @param checks: optional, the number of Miller-Rabin tests to run - * default causes error rate of 2^-80. - * @return true if prime - */ - bool isPrime(const int checks=BN_prime_checks) const { - CAutoBN_CTX pctx; -#if OPENSSL_VERSION_NUMBER >= 0x10100000L - int ret = BN_is_prime_ex(bn, checks, pctx, NULL); -#else - int ret = BN_is_prime(bn, checks, NULL, pctx, NULL); -#endif - if(ret < 0){ - throw bignum_error("CBigNum::isPrime :BN_is_prime"); - } - return ret; - } - - bool isOne() const { - return BN_is_one(bn); - } - - - bool operator!() const - { - return BN_is_zero(bn); - } - - CBigNum& operator+=(const CBigNum& b) - { - if (!BN_add(bn, bn, b.bn)) - throw bignum_error("CBigNum::operator+= : BN_add failed"); - return *this; - } - - CBigNum& operator-=(const CBigNum& b) - { - if (!BN_sub(bn, bn, b.bn)) - throw bignum_error("CBigNum::operator-= : BN_sub failed"); - return *this; - } - - CBigNum& operator*=(const CBigNum& b) - { - CAutoBN_CTX pctx; - if (!BN_mul(bn, bn, b.bn, pctx)) - throw bignum_error("CBigNum::operator*= : BN_mul failed"); - return *this; - } - - CBigNum& operator/=(const CBigNum& b) - { - CAutoBN_CTX pctx; - if (!BN_div(bn, NULL, bn, b.bn, pctx)) - throw bignum_error("CBigNum::operator/= : BN_div failed"); - return *this; - } - - CBigNum& operator%=(const CBigNum& b) - { - CAutoBN_CTX pctx; - if (!BN_div(NULL, bn, bn, b.bn, pctx)) - throw bignum_error("CBigNum::operator%= : BN_div failed"); - return *this; - } - - CBigNum& operator<<=(unsigned int shift) - { - if (!BN_lshift(bn, bn, shift)) - throw bignum_error("CBigNum:operator<<= : BN_lshift failed"); - return *this; - } - - CBigNum& operator>>=(unsigned int shift) - { - // Note: BN_rshift segfaults on 64-bit if 2^shift is greater than the number - // if built on ubuntu 9.04 or 9.10, probably depends on version of OpenSSL - CBigNum a = 1; - a <<= shift; - if (BN_cmp(a.bn, bn) > 0) - { - *this = 0; - return *this; - } - - if (!BN_rshift(bn, bn, shift)) - throw bignum_error("CBigNum:operator>>= : BN_rshift failed"); - return *this; - } - - - CBigNum& operator++() - { - // prefix operator - if (!BN_add(bn, bn, BN_value_one())) - throw bignum_error("CBigNum::operator++ : BN_add failed"); - return *this; - } - - const CBigNum operator++(int) - { - // postfix operator - const CBigNum ret = *this; - ++(*this); - return ret; - } - - CBigNum& operator--() - { - // prefix operator - CBigNum r; - if (!BN_sub(r.bn, bn, BN_value_one())) - throw bignum_error("CBigNum::operator-- : BN_sub failed"); - *this = r; - return *this; - } - - const CBigNum operator--(int) - { - // postfix operator - const CBigNum ret = *this; - --(*this); - return ret; - } - - - const BIGNUM* to_bignum() const { - return bn; - } - BIGNUM* to_bignum() { - return bn; - } -}; - - - -inline const CBigNum operator+(const CBigNum& a, const CBigNum& b) -{ - CBigNum r; - if (!BN_add(r.to_bignum(), a.to_bignum(), b.to_bignum())) - throw bignum_error("CBigNum::operator+ : BN_add failed"); - return r; -} - -inline const CBigNum operator-(const CBigNum& a, const CBigNum& b) -{ - CBigNum r; - if (!BN_sub(r.to_bignum(), a.to_bignum(), b.to_bignum())) - throw bignum_error("CBigNum::operator- : BN_sub failed"); - return r; -} - -inline const CBigNum operator-(const CBigNum& a) -{ - CBigNum r(a); - BN_set_negative(r.to_bignum(), !BN_is_negative(r.to_bignum())); - return r; -} - -inline const CBigNum operator*(const CBigNum& a, const CBigNum& b) -{ - CAutoBN_CTX pctx; - CBigNum r; - if (!BN_mul(r.to_bignum(), a.to_bignum(), b.to_bignum(), pctx)) - throw bignum_error("CBigNum::operator* : BN_mul failed"); - return r; -} - -inline const CBigNum operator/(const CBigNum& a, const CBigNum& b) -{ - CAutoBN_CTX pctx; - CBigNum r; - if (!BN_div(r.to_bignum(), NULL, a.to_bignum(), b.to_bignum(), pctx)) - throw bignum_error("CBigNum::operator/ : BN_div failed"); - return r; -} - -inline const CBigNum operator%(const CBigNum& a, const CBigNum& b) -{ - CAutoBN_CTX pctx; - CBigNum r; - if (!BN_nnmod(r.to_bignum(), a.to_bignum(), b.to_bignum(), pctx)) - throw bignum_error("CBigNum::operator% : BN_div failed"); - return r; -} - -inline const CBigNum operator<<(const CBigNum& a, unsigned int shift) -{ - CBigNum r; - if (!BN_lshift(r.to_bignum(), a.to_bignum(), shift)) - throw bignum_error("CBigNum:operator<< : BN_lshift failed"); - return r; -} - -inline const CBigNum operator>>(const CBigNum& a, unsigned int shift) -{ - CBigNum r = a; - r >>= shift; - return r; -} - -inline bool operator==(const CBigNum& a, const CBigNum& b) { return (BN_cmp(a.to_bignum(), b.to_bignum()) == 0); } -inline bool operator!=(const CBigNum& a, const CBigNum& b) { return (BN_cmp(a.to_bignum(), b.to_bignum()) != 0); } -inline bool operator<=(const CBigNum& a, const CBigNum& b) { return (BN_cmp(a.to_bignum(), b.to_bignum()) <= 0); } -inline bool operator>=(const CBigNum& a, const CBigNum& b) { return (BN_cmp(a.to_bignum(), b.to_bignum()) >= 0); } -inline bool operator<(const CBigNum& a, const CBigNum& b) { return (BN_cmp(a.to_bignum(), b.to_bignum()) < 0); } -inline bool operator>(const CBigNum& a, const CBigNum& b) { return (BN_cmp(a.to_bignum(), b.to_bignum()) > 0); } - -inline std::ostream& operator<<(std::ostream &strm, const CBigNum &b) { return strm << b.ToString(10); } - -typedef CBigNum Bignum; - -#endif diff --git a/src/blockparams.cpp b/src/blockparams.cpp index fee75f9c..3eb3f6b7 100644 --- a/src/blockparams.cpp +++ b/src/blockparams.cpp @@ -49,8 +49,8 @@ double VRFup3 = 2; double TerminalAverage = 0; double TerminalFactor = 10000; double debugTerminalAverage = 0; -CBigNum newBN = 0; -CBigNum oldBN = 0; +uint256 newBN = 0; +uint256 oldBN = 0; int64_t VLrate1 = 0; int64_t VLrate2 = 0; int64_t VLrate3 = 0; @@ -82,9 +82,9 @@ bool fDryRun; bool fCRVreset; const CBlockIndex* pindexPrev = 0; const CBlockIndex* BlockVelocityType = 0; -CBigNum bnVelocity = 0; -CBigNum bnOld; -CBigNum bnNew; +uint256 bnVelocity = 0; +uint256 bnOld; +uint256 bnNew; std::string difType (""); unsigned int retarget = DIFF_VRX; // Default with VRX @@ -146,8 +146,6 @@ void VRXdebug() LogPrintf("Terminal-Velocity 4th multiplier set to: %f: \n",VLF4); LogPrintf("Terminal-Velocity 5th multiplier set to: %f: \n",VLF5); LogPrintf("Terminal-Velocity averaged a final multiplier of: %f: \n",TerminalAverage); - LogPrintf("Prior Terminal-Velocity: %u\n", oldBN); - LogPrintf("New Terminal-Velocity: %u\n", newBN); return; } diff --git a/src/blockparams.h b/src/blockparams.h index 83175d7c..1b9a5251 100644 --- a/src/blockparams.h +++ b/src/blockparams.h @@ -9,7 +9,6 @@ #include "net.h" #include "chain.h" -#include "bignum.h" #include "base58.h" #define START_MASTERNODE_PAYMENTS_TESTNET 9993058800 // OFF (NOT TOGGLED) diff --git a/src/chainparams.cpp b/src/chainparams.cpp index 53567d6f..fe599b1f 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -6,6 +6,7 @@ #include "assert.h" #include "chainparams.h" +#include "random.h" #include "main.h" #include "util.h" @@ -54,13 +55,13 @@ class CMainParams : public CChainParams { vAlertPubKey = ParseHex("01b88735a49f1996be6b659c91a94fbfebeb5d517698712acdbef262f7c2f81f85d131a669df3be611393f454852a2d08c6314bba5ca3cbe5616262da3b1a6afed"); nDefaultPort = 18092; nRPCPort = 18094; - bnProofOfWorkLimit = CBigNum(~uint256(0) >> 14); - bnProofOfStakeLimit = CBigNum(~uint256(0) >> 16); + bnProofOfWorkLimit = ~uint256(0) >> 14; + bnProofOfStakeLimit = ~uint256(0) >> 16; const char* pszTimestamp = "Elon Musk Wants to Embed AI-on-a-Chip Into Every Human Brain | JP Buntinx | January 18, 2019 | News, Technology | TheMerkle"; std::vector vin; vin.resize(1); - vin[0].scriptSig = CScript() << 0 << CBigNum(42) << vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); + vin[0].scriptSig = CScript() << 0 << 42 << vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); std::vector vout; vout.resize(1); vout[0].nValue = 1 * COIN; @@ -138,8 +139,8 @@ class CTestNetParams : public CMainParams { pchMessageStart[1] = 0xbc; pchMessageStart[2] = 0x1c; pchMessageStart[3] = 0xf4; - bnProofOfWorkLimit = CBigNum(~uint256(0) >> 12); - bnProofOfStakeLimit = CBigNum(~uint256(0) >> 14); + bnProofOfWorkLimit = ~uint256(0) >> 12; + bnProofOfStakeLimit = ~uint256(0) >> 14; vAlertPubKey = ParseHex("00f88735a49f1996be6b659c91a94fbfebeb5d517698712acdbef262f7c2f81f85d131a669df3be611393f454852a2d08c6314bba5ca3cbe5616262da3b1a6afed"); nDefaultPort = 28092; nRPCPort = 28094; @@ -188,7 +189,7 @@ class CRegTestParams : public CTestNetParams { pchMessageStart[1] = 0xbb; pchMessageStart[2] = 0x0a; pchMessageStart[3] = 0xa9; - bnProofOfWorkLimit = CBigNum(~uint256(0) >> 1); + bnProofOfWorkLimit = ~uint256(0) >> 1; genesis.nTime = timeRegNetGenesis; genesis.nBits = bnProofOfWorkLimit.GetCompact(); genesis.nNonce = 8; diff --git a/src/chainparams.h b/src/chainparams.h index ae082a57..d933b716 100644 --- a/src/chainparams.h +++ b/src/chainparams.h @@ -6,7 +6,6 @@ #ifndef BITCOIN_CHAIN_PARAMS_H #define BITCOIN_CHAIN_PARAMS_H -#include "bignum.h" #include "uint256.h" #include "util.h" @@ -58,8 +57,8 @@ class CChainParams const MessageStartChars& MessageStart() const { return pchMessageStart; } const vector& AlertKey() const { return vAlertPubKey; } int GetDefaultPort() const { return nDefaultPort; } - const CBigNum& ProofOfWorkLimit() const { return bnProofOfWorkLimit; } - const CBigNum& ProofOfStakeLimit() const { return bnProofOfStakeLimit; } + const uint256& ProofOfWorkLimit() const { return bnProofOfWorkLimit; } + const uint256& ProofOfStakeLimit() const { return bnProofOfStakeLimit; } virtual const CBlock& GenesisBlock() const = 0; virtual bool RequireRPCPassword() const { return true; } const string& DataDir() const { return strDataDir; } @@ -82,8 +81,8 @@ class CChainParams vector vAlertPubKey; int nDefaultPort; int nRPCPort; - CBigNum bnProofOfWorkLimit; - CBigNum bnProofOfStakeLimit; + uint256 bnProofOfWorkLimit; + uint256 bnProofOfStakeLimit; string strDataDir; vector vSeeds; std::vector base58Prefixes[MAX_BASE58_TYPES]; diff --git a/src/config/bitcoin-config.h b/src/config/bitcoin-config.h index 101cae67..1b085472 100644 --- a/src/config/bitcoin-config.h +++ b/src/config/bitcoin-config.h @@ -29,6 +29,9 @@ /* Define to 1 to enable wallet functions */ #define ENABLE_WALLET 1 +/* Define to 1 to enable ZMQ functions */ +#define ENABLE_ZMQ 0 + /* parameter and return value type for __fdelt_chk */ /* #undef FDELT_TYPE */ diff --git a/src/config/bitcoin-config.h.in b/src/config/bitcoin-config.h.in index 600260e6..d5d768cb 100644 --- a/src/config/bitcoin-config.h.in +++ b/src/config/bitcoin-config.h.in @@ -28,6 +28,9 @@ /* Define to 1 to enable wallet functions */ #undef ENABLE_WALLET +/* Define to 1 to enable ZMQ functions */ +#undef ENABLE_ZMQ + /* parameter and return value type for __fdelt_chk */ #undef FDELT_TYPE diff --git a/src/fork.h b/src/fork.h index 36e93e68..c142cfda 100644 --- a/src/fork.h +++ b/src/fork.h @@ -6,8 +6,6 @@ #ifndef BITCOIN_FORK_H #define BITCOIN_FORK_H -#include "bignum.h" - /** Reserve Phase start block */ static const int64_t nReservePhaseStart = 1; /** Masternode/Devops Payment Update 1 **/ diff --git a/src/genesis.h b/src/genesis.h index ff8f83bf..a625e377 100644 --- a/src/genesis.h +++ b/src/genesis.h @@ -7,8 +7,6 @@ #ifndef BITCOIN_GENESIS_H #define BITCOIN_GENESIS_H -#include "bignum.h" - /** Genesis Start Time */ static const unsigned int timeGenesisBlock = 1547848800; // Friday, January 18, 2019 10:00:00 PM /** Genesis TestNet Start Time */ diff --git a/src/hash.h b/src/hash.h index 45e39834..b7b84046 100644 --- a/src/hash.h +++ b/src/hash.h @@ -13,6 +13,7 @@ #include "crypto/common/ripemd160.h" #include "crypto/common/sha256.h" +#include "version.h" #include diff --git a/src/kernel.cpp b/src/kernel.cpp index f9eab52f..556299fe 100644 --- a/src/kernel.cpp +++ b/src/kernel.cpp @@ -233,15 +233,15 @@ bool CheckStakeKernelHash(CBlockIndex* pindexPrev, unsigned int nBits, unsigned return error("CheckStakeKernelHash() : nTime violation"); // Base target - CBigNum bnTarget; + uint256 bnTarget; bnTarget.SetCompact(nBits); // Weighted target int64_t nValueIn = txPrev.vout[prevout.n].nValue; - CBigNum bnWeight = CBigNum(nValueIn); + uint256 bnWeight = uint256(nValueIn); bnTarget *= bnWeight; - targetProofOfStake = bnTarget.getuint256(); + targetProofOfStake = bnTarget; uint64_t nStakeModifier = pindexPrev->nStakeModifier; uint256 bnStakeModifierV2 = pindexPrev->bnStakeModifierV2; @@ -268,7 +268,7 @@ bool CheckStakeKernelHash(CBlockIndex* pindexPrev, unsigned int nBits, unsigned } // Now check if proof-of-stake hash meets target protocol - if (CBigNum(hashProofOfStake) > bnTarget){ + if (hashProofOfStake > bnTarget){ return false; } diff --git a/src/main.cpp b/src/main.cpp index 45f3db00..dfb1b08b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1460,7 +1460,7 @@ const CBlockIndex* GetLastBlockIndex(const CBlockIndex* pindex, bool fProofOfSta bool CheckProofOfWork(uint256 hash, unsigned int nBits) { - CBigNum bnTarget; + uint256 bnTarget; bnTarget.SetCompact(nBits); // Check range @@ -1468,7 +1468,7 @@ bool CheckProofOfWork(uint256 hash, unsigned int nBits) return error("CheckProofOfWork() : nBits below minimum work"); // Check proof of work matches claimed amount - if (hash > bnTarget.getuint256()) + if (hash > bnTarget) return error("CheckProofOfWork() : hash doesn't match nBits"); return true; @@ -1495,7 +1495,7 @@ void static InvalidChainFound(CBlockIndex* pindexNew) if (pindexNew->nChainTrust > nBestInvalidTrust) { nBestInvalidTrust = pindexNew->nChainTrust; - CTxDB().WriteBestInvalidTrust(CBigNum(nBestInvalidTrust)); + CTxDB().WriteBestInvalidTrust(nBestInvalidTrust); } uint256 nBestInvalidBlockTrust = pindexNew->nChainTrust - pindexNew->pprev->nChainTrust; @@ -1503,11 +1503,11 @@ void static InvalidChainFound(CBlockIndex* pindexNew) LogPrintf("InvalidChainFound: invalid block=%s height=%d trust=%s blocktrust=%d date=%s\n", pindexNew->GetBlockHash().ToString(), pindexNew->nHeight, - CBigNum(pindexNew->nChainTrust).ToString(), nBestInvalidBlockTrust.Get64(), + pindexNew->nChainTrust.ToString(), nBestInvalidBlockTrust.Get64(), DateTimeStrFormat("%x %H:%M:%S", pindexNew->GetBlockTime())); LogPrintf("InvalidChainFound: current best=%s height=%d trust=%s blocktrust=%d date=%s\n", hashBestChain.ToString(), nBestHeight, - CBigNum(pindexBest->nChainTrust).ToString(), + pindexBest->nChainTrust.ToString(), nBestBlockTrust.Get64(), DateTimeStrFormat("%x %H:%M:%S", pindexBest->GetBlockTime())); } @@ -2305,7 +2305,7 @@ bool CBlock::SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew) LogPrintf("SetBestChain: new best=%s height=%d trust=%s blocktrust=%d date=%s\n", hashBestChain.ToString(), nBestHeight, - CBigNum(nBestChainTrust).ToString(), + nBestChainTrust.ToString(), nBestBlockTrust.Get64(), DateTimeStrFormat("%x %H:%M:%S", pindexBest->GetBlockTime())); @@ -2347,7 +2347,7 @@ bool CBlock::SetBestChain(CTxDB& txdb, CBlockIndex* pindexNew) // age (trust score) of competing branches. bool CTransaction::GetCoinAge(CTxDB& txdb, const CBlockIndex* pindexPrev, uint64_t& nCoinAge) const { - CBigNum bnCentSecond = 0; // coin age in the unit of cent-seconds + uint256 bnCentSecond = 0; // coin age in the unit of cent-seconds nCoinAge = 0; if (IsCoinBase()) @@ -2371,14 +2371,14 @@ bool CTransaction::GetCoinAge(CTxDB& txdb, const CBlockIndex* pindexPrev, uint64 } int64_t nValueIn = txPrev.vout[txin.prevout.n].nValue; - bnCentSecond += CBigNum(nValueIn) * (nTime-txPrev.nTime) / CENT; + bnCentSecond += nValueIn * (nTime-txPrev.nTime) / CENT; LogPrint("coinage", "coin age nValueIn=%d nTimeDiff=%d bnCentSecond=%s\n", nValueIn, nTime - txPrev.nTime, bnCentSecond.ToString()); } - CBigNum bnCoinDay = bnCentSecond * CENT / COIN / (24 * 60 * 60); + uint256 bnCoinDay = bnCentSecond * CENT / COIN / (24 * 60 * 60); LogPrint("coinage", "coin age bnCoinDay=%s\n", bnCoinDay.ToString()); - nCoinAge = bnCoinDay.getuint64(); + nCoinAge = bnCoinDay.Get64(); return true; } @@ -2967,13 +2967,13 @@ bool CBlock::AcceptBlock() /* Calculates trust score for a block given */ uint256 CBlockIndex::GetBlockTrust() const { - CBigNum bnTarget; + uint256 bnTarget; bnTarget.SetCompact(nBits); if (bnTarget <= 0) return 0; - return ((CBigNum(1)<<256) / (bnTarget+1)).getuint256(); + return ((uint256(1)<<256) / (bnTarget+1)); } void PushGetBlocks(CNode* pnode, CBlockIndex* pindexBegin, uint256 hashEnd) diff --git a/src/main.h b/src/main.h index 08f2fd69..5ca50c47 100644 --- a/src/main.h +++ b/src/main.h @@ -11,7 +11,6 @@ #include "clientversion.h" #include "chain.h" -#include "bignum.h" #include "sync.h" #include "txmempool.h" #include "net.h" @@ -21,6 +20,7 @@ #include "fork.h" #include "genesis.h" #include "mining.h" +#include "timedata.h" #include diff --git a/src/masternode-pos.cpp b/src/masternode-pos.cpp index 972ac333..8d889c7d 100644 --- a/src/masternode-pos.cpp +++ b/src/masternode-pos.cpp @@ -1,7 +1,3 @@ - - - -#include "bignum.h" #include "sync.h" #include "net.h" #include "key.h" diff --git a/src/masternode-pos.h b/src/masternode-pos.h index 411ef536..31be713e 100644 --- a/src/masternode-pos.h +++ b/src/masternode-pos.h @@ -6,7 +6,6 @@ #ifndef MASTERNODE_POS_H #define MASTERNODE_POS_H -#include "bignum.h" #include "sync.h" #include "net.h" #include "key.h" diff --git a/src/masternodeman.h b/src/masternodeman.h index ee226141..52e090d2 100644 --- a/src/masternodeman.h +++ b/src/masternodeman.h @@ -6,7 +6,6 @@ #ifndef MASTERNODEMAN_H #define MASTERNODEMAN_H -#include "bignum.h" #include "sync.h" #include "net.h" #include "key.h" diff --git a/src/miner.cpp b/src/miner.cpp index df1d77f6..3ef85c44 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -493,7 +493,7 @@ void IncrementExtraNonce(CBlock* pblock, CBlockIndex* pindexPrev, unsigned int& ++nExtraNonce; unsigned int nHeight = pindexPrev->nHeight+1; // Height first in coinbase required for block.version=2 - pblock->vtx[0].vin[0].scriptSig = (CScript() << nHeight << CBigNum(nExtraNonce)) + COINBASE_FLAGS; + pblock->vtx[0].vin[0].scriptSig = (CScript() << nHeight << uint256(nExtraNonce)) + COINBASE_FLAGS; assert(pblock->vtx[0].vin[0].scriptSig.size() <= 100); pblock->hashMerkleRoot = pblock->BuildMerkleTree(); @@ -550,7 +550,8 @@ bool CheckWork(CBlock* pblock, CWallet& wallet, CReserveKey& reservekey) { uint256 hashBlock = pblock->GetHash(); uint256 hashProof = pblock->GetPoWHash(); - uint256 hashTarget = CBigNum().SetCompact(pblock->nBits).getuint256(); + uint256 hashTarget; + hashTarget.SetCompact(pblock->nBits); if(!pblock->IsProofOfWork()) return error("CheckWork() : %s is not a proof-of-work block", hashBlock.GetHex()); diff --git a/src/mining.h b/src/mining.h index 7888861e..9b45bf7d 100644 --- a/src/mining.h +++ b/src/mining.h @@ -7,8 +7,6 @@ #ifndef BITCOIN_MINING_H #define BITCOIN_MINING_H -#include "bignum.h" - /** Minimum nCoinAge required to stake PoS */ static const unsigned int nStakeMinAge = 2 / 60; // 30 minutes /** Time to elapse before new modifier is computed */ diff --git a/src/net.cpp b/src/net.cpp index 4db0c02e..28b7619b 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -2250,14 +2250,12 @@ bool CAddrDB::Read(CAddrMan& addr) return error("CAddrman::Read() : open failed"); // use file size to size memory buffer - int64_t fileSize = boost::filesystem::file_size(pathAddr); - int64_t dataSize = fileSize - sizeof(uint256); + uint64_t fileSize = boost::filesystem::file_size(pathAddr); + uint64_t dataSize = 0; // Don't try to resize to a negative number if file is small if (fileSize >= sizeof(uint256)) dataSize = fileSize - sizeof(uint256); - if ( dataSize < 0 ) - dataSize = 0; - vector vchData; + std::vector vchData; vchData.resize(dataSize); uint256 hashIn; diff --git a/src/net.h b/src/net.h index bad1d408..c931bfbb 100644 --- a/src/net.h +++ b/src/net.h @@ -12,6 +12,7 @@ #include "mruset.h" #include "netbase.h" #include "protocol.h" +#include "random.h" #include "sync.h" #include "uint256.h" #include "util.h" @@ -29,7 +30,6 @@ #define BOOST_ALLOW_DEPRECATED_HEADERS #include #undef BOOST_ALLOW_DEPRECATED_HEADERS -#include class CAddrMan; class CBlockIndex; diff --git a/src/prevector.h b/src/prevector.h new file mode 100644 index 00000000..d307495f --- /dev/null +++ b/src/prevector.h @@ -0,0 +1,527 @@ +// Copyright (c) 2015-2018 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_PREVECTOR_H +#define BITCOIN_PREVECTOR_H + +#include +#include +#include +#include + +#include +#include +#include + +#pragma pack(push, 1) +/** Implements a drop-in replacement for std::vector which stores up to N + * elements directly (without heap allocation). The types Size and Diff are + * used to store element counts, and can be any unsigned + signed type. + * + * Storage layout is either: + * - Direct allocation: + * - Size _size: the number of used elements (between 0 and N) + * - T direct[N]: an array of N elements of type T + * (only the first _size are initialized). + * - Indirect allocation: + * - Size _size: the number of used elements plus N + 1 + * - Size capacity: the number of allocated elements + * - T* indirect: a pointer to an array of capacity elements of type T + * (only the first _size are initialized). + * + * The data type T must be movable by memmove/realloc(). Once we switch to C++, + * move constructors can be used instead. + */ +template +class prevector { +public: + typedef Size size_type; + typedef Diff difference_type; + typedef T value_type; + typedef value_type& reference; + typedef const value_type& const_reference; + typedef value_type* pointer; + typedef const value_type* const_pointer; + + class iterator { + T* ptr; + public: + typedef Diff difference_type; + typedef T value_type; + typedef T* pointer; + typedef T& reference; + typedef std::random_access_iterator_tag iterator_category; + iterator(T* ptr_) : ptr(ptr_) {} + T& operator*() const { return *ptr; } + T* operator->() const { return ptr; } + T& operator[](size_type pos) { return ptr[pos]; } + const T& operator[](size_type pos) const { return ptr[pos]; } + iterator& operator++() { ptr++; return *this; } + iterator& operator--() { ptr--; return *this; } + iterator operator++(int) { iterator copy(*this); ++(*this); return copy; } + iterator operator--(int) { iterator copy(*this); --(*this); return copy; } + difference_type friend operator-(iterator a, iterator b) { return (&(*a) - &(*b)); } + iterator operator+(size_type n) { return iterator(ptr + n); } + iterator& operator+=(size_type n) { ptr += n; return *this; } + iterator operator-(size_type n) { return iterator(ptr - n); } + iterator& operator-=(size_type n) { ptr -= n; return *this; } + bool operator==(iterator x) const { return ptr == x.ptr; } + bool operator!=(iterator x) const { return ptr != x.ptr; } + bool operator>=(iterator x) const { return ptr >= x.ptr; } + bool operator<=(iterator x) const { return ptr <= x.ptr; } + bool operator>(iterator x) const { return ptr > x.ptr; } + bool operator<(iterator x) const { return ptr < x.ptr; } + }; + + class reverse_iterator { + T* ptr; + public: + typedef Diff difference_type; + typedef T value_type; + typedef T* pointer; + typedef T& reference; + typedef std::bidirectional_iterator_tag iterator_category; + reverse_iterator(T* ptr_) : ptr(ptr_) {} + T& operator*() { return *ptr; } + const T& operator*() const { return *ptr; } + T* operator->() { return ptr; } + const T* operator->() const { return ptr; } + reverse_iterator& operator--() { ptr++; return *this; } + reverse_iterator& operator++() { ptr--; return *this; } + reverse_iterator operator++(int) { reverse_iterator copy(*this); ++(*this); return copy; } + reverse_iterator operator--(int) { reverse_iterator copy(*this); --(*this); return copy; } + bool operator==(reverse_iterator x) const { return ptr == x.ptr; } + bool operator!=(reverse_iterator x) const { return ptr != x.ptr; } + }; + + class const_iterator { + const T* ptr; + public: + typedef Diff difference_type; + typedef const T value_type; + typedef const T* pointer; + typedef const T& reference; + typedef std::random_access_iterator_tag iterator_category; + const_iterator(const T* ptr_) : ptr(ptr_) {} + const_iterator(iterator x) : ptr(&(*x)) {} + const T& operator*() const { return *ptr; } + const T* operator->() const { return ptr; } + const T& operator[](size_type pos) const { return ptr[pos]; } + const_iterator& operator++() { ptr++; return *this; } + const_iterator& operator--() { ptr--; return *this; } + const_iterator operator++(int) { const_iterator copy(*this); ++(*this); return copy; } + const_iterator operator--(int) { const_iterator copy(*this); --(*this); return copy; } + difference_type friend operator-(const_iterator a, const_iterator b) { return (&(*a) - &(*b)); } + const_iterator operator+(size_type n) { return const_iterator(ptr + n); } + const_iterator& operator+=(size_type n) { ptr += n; return *this; } + const_iterator operator-(size_type n) { return const_iterator(ptr - n); } + const_iterator& operator-=(size_type n) { ptr -= n; return *this; } + bool operator==(const_iterator x) const { return ptr == x.ptr; } + bool operator!=(const_iterator x) const { return ptr != x.ptr; } + bool operator>=(const_iterator x) const { return ptr >= x.ptr; } + bool operator<=(const_iterator x) const { return ptr <= x.ptr; } + bool operator>(const_iterator x) const { return ptr > x.ptr; } + bool operator<(const_iterator x) const { return ptr < x.ptr; } + }; + + class const_reverse_iterator { + const T* ptr; + public: + typedef Diff difference_type; + typedef const T value_type; + typedef const T* pointer; + typedef const T& reference; + typedef std::bidirectional_iterator_tag iterator_category; + const_reverse_iterator(const T* ptr_) : ptr(ptr_) {} + const_reverse_iterator(reverse_iterator x) : ptr(&(*x)) {} + const T& operator*() const { return *ptr; } + const T* operator->() const { return ptr; } + const_reverse_iterator& operator--() { ptr++; return *this; } + const_reverse_iterator& operator++() { ptr--; return *this; } + const_reverse_iterator operator++(int) { const_reverse_iterator copy(*this); ++(*this); return copy; } + const_reverse_iterator operator--(int) { const_reverse_iterator copy(*this); --(*this); return copy; } + bool operator==(const_reverse_iterator x) const { return ptr == x.ptr; } + bool operator!=(const_reverse_iterator x) const { return ptr != x.ptr; } + }; + +private: + size_type _size = 0; + union direct_or_indirect { + char direct[sizeof(T) * N]; + struct { + size_type capacity; + char* indirect; + }; + } _union = {}; + + T* direct_ptr(difference_type pos) { return reinterpret_cast(_union.direct) + pos; } + const T* direct_ptr(difference_type pos) const { return reinterpret_cast(_union.direct) + pos; } + T* indirect_ptr(difference_type pos) { return reinterpret_cast(_union.indirect) + pos; } + const T* indirect_ptr(difference_type pos) const { return reinterpret_cast(_union.indirect) + pos; } + bool is_direct() const { return _size <= N; } + + void change_capacity(size_type new_capacity) { + if (new_capacity <= N) { + if (!is_direct()) { + T* indirect = indirect_ptr(0); + T* src = indirect; + T* dst = direct_ptr(0); + memcpy(dst, src, size() * sizeof(T)); + free(indirect); + _size -= N + 1; + } + } else { + if (!is_direct()) { + /* FIXME: Because malloc/realloc here won't call new_handler if allocation fails, assert + success. These should instead use an allocator or new/delete so that handlers + are called as necessary, but performance would be slightly degraded by doing so. */ + _union.indirect = static_cast(realloc(_union.indirect, ((size_t)sizeof(T)) * new_capacity)); + assert(_union.indirect); + _union.capacity = new_capacity; + } else { + char* new_indirect = static_cast(malloc(((size_t)sizeof(T)) * new_capacity)); + assert(new_indirect); + T* src = direct_ptr(0); + T* dst = reinterpret_cast(new_indirect); + memcpy(dst, src, size() * sizeof(T)); + _union.indirect = new_indirect; + _union.capacity = new_capacity; + _size += N + 1; + } + } + } + + T* item_ptr(difference_type pos) { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); } + const T* item_ptr(difference_type pos) const { return is_direct() ? direct_ptr(pos) : indirect_ptr(pos); } + + void fill(T* dst, ptrdiff_t count, const T& value = T{}) { + std::fill_n(dst, count, value); + } + + template + void fill(T* dst, InputIterator first, InputIterator last) { + while (first != last) { + new(static_cast(dst)) T(*first); + ++dst; + ++first; + } + } + +public: + void assign(size_type n, const T& val) { + clear(); + if (capacity() < n) { + change_capacity(n); + } + _size += n; + fill(item_ptr(0), n, val); + } + + template + void assign(InputIterator first, InputIterator last) { + size_type n = last - first; + clear(); + if (capacity() < n) { + change_capacity(n); + } + _size += n; + fill(item_ptr(0), first, last); + } + + prevector() {} + + explicit prevector(size_type n) { + resize(n); + } + + explicit prevector(size_type n, const T& val) { + change_capacity(n); + _size += n; + fill(item_ptr(0), n, val); + } + + template + prevector(InputIterator first, InputIterator last) { + size_type n = last - first; + change_capacity(n); + _size += n; + fill(item_ptr(0), first, last); + } + + prevector(const prevector& other) { + size_type n = other.size(); + change_capacity(n); + _size += n; + fill(item_ptr(0), other.begin(), other.end()); + } + + prevector(prevector&& other) { + swap(other); + } + + prevector& operator=(const prevector& other) { + if (&other == this) { + return *this; + } + assign(other.begin(), other.end()); + return *this; + } + + prevector& operator=(prevector&& other) { + swap(other); + return *this; + } + + size_type size() const { + return is_direct() ? _size : _size - N - 1; + } + + bool empty() const { + return size() == 0; + } + + iterator begin() { return iterator(item_ptr(0)); } + const_iterator begin() const { return const_iterator(item_ptr(0)); } + iterator end() { return iterator(item_ptr(size())); } + const_iterator end() const { return const_iterator(item_ptr(size())); } + + reverse_iterator rbegin() { return reverse_iterator(item_ptr(size() - 1)); } + const_reverse_iterator rbegin() const { return const_reverse_iterator(item_ptr(size() - 1)); } + reverse_iterator rend() { return reverse_iterator(item_ptr(-1)); } + const_reverse_iterator rend() const { return const_reverse_iterator(item_ptr(-1)); } + + size_t capacity() const { + if (is_direct()) { + return N; + } else { + return _union.capacity; + } + } + + T& operator[](size_type pos) { + return *item_ptr(pos); + } + + const T& operator[](size_type pos) const { + return *item_ptr(pos); + } + + void resize(size_type new_size) { + size_type cur_size = size(); + if (cur_size == new_size) { + return; + } + if (cur_size > new_size) { + erase(item_ptr(new_size), end()); + return; + } + if (new_size > capacity()) { + change_capacity(new_size); + } + ptrdiff_t increase = new_size - cur_size; + fill(item_ptr(cur_size), increase); + _size += increase; + } + + void reserve(size_type new_capacity) { + if (new_capacity > capacity()) { + change_capacity(new_capacity); + } + } + + void shrink_to_fit() { + change_capacity(size()); + } + + void clear() { + resize(0); + } + + iterator insert(iterator pos, const T& value) { + size_type p = pos - begin(); + size_type new_size = size() + 1; + if (capacity() < new_size) { + change_capacity(new_size + (new_size >> 1)); + } + T* ptr = item_ptr(p); + memmove(ptr + 1, ptr, (size() - p) * sizeof(T)); + _size++; + new(static_cast(ptr)) T(value); + return iterator(ptr); + } + + void insert(iterator pos, size_type count, const T& value) { + size_type p = pos - begin(); + size_type new_size = size() + count; + if (capacity() < new_size) { + change_capacity(new_size + (new_size >> 1)); + } + T* ptr = item_ptr(p); + memmove(ptr + count, ptr, (size() - p) * sizeof(T)); + _size += count; + fill(item_ptr(p), count, value); + } + + template + void insert(iterator pos, InputIterator first, InputIterator last) { + size_type p = pos - begin(); + difference_type count = last - first; + size_type new_size = size() + count; + if (capacity() < new_size) { + change_capacity(new_size + (new_size >> 1)); + } + T* ptr = item_ptr(p); + memmove(ptr + count, ptr, (size() - p) * sizeof(T)); + _size += count; + fill(ptr, first, last); + } + + inline void resize_uninitialized(size_type new_size) { + // resize_uninitialized changes the size of the prevector but does not initialize it. + // If size < new_size, the added elements must be initialized explicitly. + if (capacity() < new_size) { + change_capacity(new_size); + _size += new_size - size(); + return; + } + if (new_size < size()) { + erase(item_ptr(new_size), end()); + } else { + _size += new_size - size(); + } + } + + iterator erase(iterator pos) { + return erase(pos, pos + 1); + } + + iterator erase(iterator first, iterator last) { + // Erase is not allowed to the change the object's capacity. That means + // that when starting with an indirectly allocated prevector with + // size and capacity > N, the result may be a still indirectly allocated + // prevector with size <= N and capacity > N. A shrink_to_fit() call is + // necessary to switch to the (more efficient) directly allocated + // representation (with capacity N and size <= N). + iterator p = first; + char* endp = (char*)&(*end()); + if (!std::is_trivially_destructible::value) { + while (p != last) { + (*p).~T(); + _size--; + ++p; + } + } else { + _size -= last - p; + } + memmove(&(*first), &(*last), endp - ((char*)(&(*last)))); + return first; + } + + void push_back(const T& value) { + size_type new_size = size() + 1; + if (capacity() < new_size) { + change_capacity(new_size + (new_size >> 1)); + } + new(item_ptr(size())) T(value); + _size++; + } + + void pop_back() { + erase(end() - 1, end()); + } + + T& front() { + return *item_ptr(0); + } + + const T& front() const { + return *item_ptr(0); + } + + T& back() { + return *item_ptr(size() - 1); + } + + const T& back() const { + return *item_ptr(size() - 1); + } + + void swap(prevector& other) { + std::swap(_union, other._union); + std::swap(_size, other._size); + } + + ~prevector() { + if (!std::is_trivially_destructible::value) { + clear(); + } + if (!is_direct()) { + free(_union.indirect); + _union.indirect = nullptr; + } + } + + bool operator==(const prevector& other) const { + if (other.size() != size()) { + return false; + } + const_iterator b1 = begin(); + const_iterator b2 = other.begin(); + const_iterator e1 = end(); + while (b1 != e1) { + if ((*b1) != (*b2)) { + return false; + } + ++b1; + ++b2; + } + return true; + } + + bool operator!=(const prevector& other) const { + return !(*this == other); + } + + bool operator<(const prevector& other) const { + if (size() < other.size()) { + return true; + } + if (size() > other.size()) { + return false; + } + const_iterator b1 = begin(); + const_iterator b2 = other.begin(); + const_iterator e1 = end(); + while (b1 != e1) { + if ((*b1) < (*b2)) { + return true; + } + if ((*b2) < (*b1)) { + return false; + } + ++b1; + ++b2; + } + return false; + } + + size_t allocated_memory() const { + if (is_direct()) { + return 0; + } else { + return ((size_t)(sizeof(T))) * _union.capacity; + } + } + + value_type* data() { + return item_ptr(0); + } + + const value_type* data() const { + return item_ptr(0); + } +}; +#pragma pack(pop) + +#endif // BITCOIN_PREVECTOR_H diff --git a/src/protocol.h b/src/protocol.h index df6d4d62..b8e7e323 100644 --- a/src/protocol.h +++ b/src/protocol.h @@ -15,6 +15,7 @@ #include "netbase.h" #include #include "uint256.h" +#include "version.h" /** Message header. * (4) message start. diff --git a/src/qt/transactiondesc.cpp b/src/qt/transactiondesc.cpp index 424db94c..8d8fb0bf 100644 --- a/src/qt/transactiondesc.cpp +++ b/src/qt/transactiondesc.cpp @@ -8,6 +8,7 @@ #include "paymentserver.h" #include "transactionrecord.h" #include "util.h" +#include "timedata.h" #include "ui_interface.h" #include "wallet.h" #include "txdb.h" diff --git a/src/qt/transactionrecord.cpp b/src/qt/transactionrecord.cpp index 907f7a54..e99e502f 100644 --- a/src/qt/transactionrecord.cpp +++ b/src/qt/transactionrecord.cpp @@ -1,6 +1,7 @@ #include "transactionrecord.h" #include "base58.h" +#include "timedata.h" #include "util.h" #include "wallet.h" #include "mnengine.h" diff --git a/src/random.cpp b/src/random.cpp new file mode 100644 index 00000000..0d20d205 --- /dev/null +++ b/src/random.cpp @@ -0,0 +1,139 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "random.h" + +#ifdef WIN32 +#include "compat.h" // for Windows API +#endif +#include "util.h" // for LogPrint() + +#ifndef WIN32 +#include +#endif + +#include +#include +#include + +static inline int64_t GetPerformanceCounter() +{ + int64_t nCounter = 0; +#ifdef WIN32 + QueryPerformanceCounter((LARGE_INTEGER*)&nCounter); +#else + timeval t; + gettimeofday(&t, NULL); + nCounter = (int64_t)(t.tv_sec * 1000000 + t.tv_usec); +#endif + return nCounter; +} + +void RandAddSeed() +{ + // Seed with CPU performance counter + int64_t nCounter = GetPerformanceCounter(); + RAND_add(&nCounter, sizeof(nCounter), 1.5); + OPENSSL_cleanse((void*)&nCounter, sizeof(nCounter)); +} + +void RandAddSeedPerfmon() +{ + RandAddSeed(); + + // This can take up to 2 seconds, so only do it every 10 minutes + static int64_t nLastPerfmon; + if (GetTime() < nLastPerfmon + 10 * 60) + return; + nLastPerfmon = GetTime(); + +#ifdef WIN32 + // Don't need this on Linux, OpenSSL automatically uses /dev/urandom + // Seed with the entire set of perfmon data + std::vector vData(250000,0); + long ret = 0; + unsigned long nSize = 0; + const size_t nMaxSize = 10000000; // Bail out at more than 10MB of performance data + while (true) + { + nSize = vData.size(); + ret = RegQueryValueExA(HKEY_PERFORMANCE_DATA, "Global", NULL, NULL, begin_ptr(vData), &nSize); + if (ret != ERROR_MORE_DATA || vData.size() >= nMaxSize) + break; + vData.resize(std::max((vData.size()*3)/2, nMaxSize)); // Grow size of buffer exponentially + } + RegCloseKey(HKEY_PERFORMANCE_DATA); + if (ret == ERROR_SUCCESS) + { + RAND_add(begin_ptr(vData), nSize, nSize/100.0); + OPENSSL_cleanse(begin_ptr(vData), nSize); + LogPrint("rand", "%s: %lu bytes\n", __func__, nSize); + } else { + static bool warned = false; // Warn only once + if (!warned) + { + LogPrintf("%s: Warning: RegQueryValueExA(HKEY_PERFORMANCE_DATA) failed with code %i\n", __func__, ret); + warned = true; + } + } +#endif +} + +bool GetRandBytes(unsigned char *buf, int num) +{ + if (RAND_bytes(buf, num) != 1) { + LogPrintf("%s: OpenSSL RAND_bytes() failed with error: %s\n", __func__, ERR_error_string(ERR_get_error(), NULL)); + return false; + } + return true; +} + +uint64_t GetRand(uint64_t nMax) +{ + if (nMax == 0) + return 0; + + // The range of the random source must be a multiple of the modulus + // to give every possible output value an equal possibility + uint64_t nRange = (std::numeric_limits::max() / nMax) * nMax; + uint64_t nRand = 0; + do { + GetRandBytes((unsigned char*)&nRand, sizeof(nRand)); + } while (nRand >= nRange); + return (nRand % nMax); +} + +int GetRandInt(int nMax) +{ + return GetRand(nMax); +} + +uint256 GetRandHash() +{ + uint256 hash; + GetRandBytes((unsigned char*)&hash, sizeof(hash)); + return hash; +} + +uint32_t insecure_rand_Rz = 11; +uint32_t insecure_rand_Rw = 11; +void seed_insecure_rand(bool fDeterministic) +{ + // The seed values have some unlikely fixed points which we avoid. + if(fDeterministic) + { + insecure_rand_Rz = insecure_rand_Rw = 11; + } else { + uint32_t tmp; + do { + GetRandBytes((unsigned char*)&tmp, 4); + } while(tmp == 0 || tmp == 0x9068ffffU); + insecure_rand_Rz = tmp; + do { + GetRandBytes((unsigned char*)&tmp, 4); + } while(tmp == 0 || tmp == 0x464fffffU); + insecure_rand_Rw = tmp; + } +} diff --git a/src/random.h b/src/random.h new file mode 100644 index 00000000..a599b084 --- /dev/null +++ b/src/random.h @@ -0,0 +1,49 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_RANDOM_H +#define BITCOIN_RANDOM_H + +#include "uint256.h" + +#include + +/** + * Seed OpenSSL PRNG with additional entropy data + */ +void RandAddSeed(); +void RandAddSeedPerfmon(); + +/** + * Functions to gather random data via the OpenSSL PRNG + */ +bool GetRandBytes(unsigned char *buf, int num); +uint64_t GetRand(uint64_t nMax); +int GetRandInt(int nMax); +uint256 GetRandHash(); + +/** + * Seed insecure_rand using the random pool. + * @param Deterministic Use a determinstic seed + */ +void seed_insecure_rand(bool fDeterministic = false); + +/** + * MWC RNG of George Marsaglia + * This is intended to be fast. It has a period of 2^59.3, though the + * least significant 16 bits only have a period of about 2^30.1. + * + * @return random value + */ +extern uint32_t insecure_rand_Rz; +extern uint32_t insecure_rand_Rw; +static inline uint32_t insecure_rand(void) +{ + insecure_rand_Rz = 36969 * (insecure_rand_Rz & 65535) + (insecure_rand_Rz >> 16); + insecure_rand_Rw = 18000 * (insecure_rand_Rw & 65535) + (insecure_rand_Rw >> 16); + return (insecure_rand_Rw << 16) + insecure_rand_Rz; +} + +#endif // BITCOIN_RANDOM_H diff --git a/src/rpcmining.cpp b/src/rpcmining.cpp index 979ccebf..583ae620 100644 --- a/src/rpcmining.cpp +++ b/src/rpcmining.cpp @@ -328,7 +328,8 @@ Value getworkex(const Array& params, bool fHelp) char phash1[64]; FormatHashBuffers(pblock, pmidstate, pdata, phash1); - uint256 hashTarget = CBigNum().SetCompact(pblock->nBits).getuint256(); + uint256 hashTarget; + hashTarget.SetCompact(pblock->nBits); CTransaction coinbaseTx = pblock->vtx[0]; std::vector merkle = pblock->GetMerkleBranch(0); @@ -470,7 +471,8 @@ Value getwork(const Array& params, bool fHelp) char phash1[64]; FormatHashBuffers(pblock, pmidstate, pdata, phash1); - uint256 hashTarget = CBigNum().SetCompact(pblock->nBits).getuint256(); + uint256 hashTarget; + hashTarget.SetCompact(pblock->nBits); Object result; result.push_back(Pair("midstate", HexStr(BEGIN(pmidstate), END(pmidstate)))); // deprecated @@ -644,7 +646,8 @@ Value getblocktemplate(const Array& params, bool fHelp) Object aux; aux.push_back(Pair("flags", HexStr(COINBASE_FLAGS.begin(), COINBASE_FLAGS.end()))); - uint256 hashTarget = CBigNum().SetCompact(pblock->nBits).getuint256(); + uint256 hashTarget; + hashTarget.SetCompact(pblock->nBits); static Array aMutable; if (aMutable.empty()) diff --git a/src/rpcmisc.cpp b/src/rpcmisc.cpp index 6f572a05..1d4bd397 100644 --- a/src/rpcmisc.cpp +++ b/src/rpcmisc.cpp @@ -11,6 +11,7 @@ #include "net.h" #include "netbase.h" #include "rpcserver.h" +#include "timedata.h" #include "util.h" #include "stealth.h" #include "spork.h" diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp index 06529153..bb107997 100644 --- a/src/rpcnet.cpp +++ b/src/rpcnet.cpp @@ -12,6 +12,7 @@ #include "netbase.h" #include "protocol.h" #include "sync.h" +#include "timedata.h" #include "ui_interface.h" #include "util.h" diff --git a/src/rpcwallet.cpp b/src/rpcwallet.cpp index c1a5906f..5c765c65 100644 --- a/src/rpcwallet.cpp +++ b/src/rpcwallet.cpp @@ -11,6 +11,7 @@ #include "init.h" #include "net.h" #include "netbase.h" +#include "timedata.h" #include "util.h" #include "wallet.h" #include "walletdb.h" diff --git a/src/script.cpp b/src/script.cpp index ac68014c..81c0404a 100644 --- a/src/script.cpp +++ b/src/script.cpp @@ -3,6 +3,7 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#include "random.h" #include #include #include @@ -12,7 +13,6 @@ using namespace boost; #include "script.h" #include "keystore.h" -#include "bignum.h" #include "pubkey.h" #include "main.h" #include "sync.h" diff --git a/src/script.h b/src/script.h index 5bde7f7a..cc84e718 100644 --- a/src/script.h +++ b/src/script.h @@ -15,7 +15,6 @@ #include #include "keystore.h" -#include "bignum.h" #include "util.h" #include "stealth.h" @@ -29,6 +28,157 @@ class BaseSignatureChecker; static const unsigned int MAX_SCRIPT_ELEMENT_SIZE = 520; // bytes static const unsigned int MAX_OP_RETURN_RELAY = 40; // bytes +class scriptnum_error : public std::runtime_error +{ +public: + explicit scriptnum_error(const std::string& str) : std::runtime_error(str) {} +}; + +class CScriptNum +{ +/** + * Numeric opcodes (OP_1ADD, etc) are restricted to operating on 4-byte integers. + * The semantics are subtle, though: operands must be in the range [-2^31 +1...2^31 -1], + * but results may overflow (and are valid as long as they are not used in a subsequent + * numeric operation). CScriptNum enforces those semantics by storing results as + * an int64 and allowing out-of-range values to be returned as a vector of bytes but + * throwing an exception if arithmetic is done or the result is interpreted as an integer. + */ +public: + + explicit CScriptNum(const int64_t& n) + { + m_value = n; + } + + explicit CScriptNum(const std::vector& vch) + { + if (vch.size() > nMaxNumSize) + throw scriptnum_error("CScriptNum(const std::vector&) : overflow"); + m_value = set_vch(vch); + } + + inline bool operator==(const int64_t& rhs) const { return m_value == rhs; } + inline bool operator!=(const int64_t& rhs) const { return m_value != rhs; } + inline bool operator<=(const int64_t& rhs) const { return m_value <= rhs; } + inline bool operator< (const int64_t& rhs) const { return m_value < rhs; } + inline bool operator>=(const int64_t& rhs) const { return m_value >= rhs; } + inline bool operator> (const int64_t& rhs) const { return m_value > rhs; } + + inline bool operator==(const CScriptNum& rhs) const { return operator==(rhs.m_value); } + inline bool operator!=(const CScriptNum& rhs) const { return operator!=(rhs.m_value); } + inline bool operator<=(const CScriptNum& rhs) const { return operator<=(rhs.m_value); } + inline bool operator< (const CScriptNum& rhs) const { return operator< (rhs.m_value); } + inline bool operator>=(const CScriptNum& rhs) const { return operator>=(rhs.m_value); } + inline bool operator> (const CScriptNum& rhs) const { return operator> (rhs.m_value); } + + inline CScriptNum operator+( const int64_t& rhs) const { return CScriptNum(m_value + rhs);} + inline CScriptNum operator-( const int64_t& rhs) const { return CScriptNum(m_value - rhs);} + inline CScriptNum operator+( const CScriptNum& rhs) const { return operator+(rhs.m_value); } + inline CScriptNum operator-( const CScriptNum& rhs) const { return operator-(rhs.m_value); } + + inline CScriptNum& operator+=( const CScriptNum& rhs) { return operator+=(rhs.m_value); } + inline CScriptNum& operator-=( const CScriptNum& rhs) { return operator-=(rhs.m_value); } + + inline CScriptNum operator-() const + { + assert(m_value != std::numeric_limits::min()); + return CScriptNum(-m_value); + } + + inline CScriptNum& operator=( const int64_t& rhs) + { + m_value = rhs; + return *this; + } + + inline CScriptNum& operator+=( const int64_t& rhs) + { + assert(rhs == 0 || (rhs > 0 && m_value <= std::numeric_limits::max() - rhs) || + (rhs < 0 && m_value >= std::numeric_limits::min() - rhs)); + m_value += rhs; + return *this; + } + + inline CScriptNum& operator-=( const int64_t& rhs) + { + assert(rhs == 0 || (rhs > 0 && m_value >= std::numeric_limits::min() + rhs) || + (rhs < 0 && m_value <= std::numeric_limits::max() + rhs)); + m_value -= rhs; + return *this; + } + + int getint() const + { + if (m_value > std::numeric_limits::max()) + return std::numeric_limits::max(); + else if (m_value < std::numeric_limits::min()) + return std::numeric_limits::min(); + return m_value; + } + + std::vector getvch() const + { + return serialize(m_value); + } + + static std::vector serialize(const int64_t& value) + { + if(value == 0) + return std::vector(); + + std::vector result; + const bool neg = value < 0; + uint64_t absvalue = neg ? -value : value; + + while(absvalue) + { + result.push_back(absvalue & 0xff); + absvalue >>= 8; + } + + +// - If the most significant byte is >= 0x80 and the value is positive, push a +// new zero-byte to make the significant byte < 0x80 again. + +// - If the most significant byte is >= 0x80 and the value is negative, push a +// new 0x80 byte that will be popped off when converting to an integral. + +// - If the most significant byte is < 0x80 and the value is negative, add +// 0x80 to it, since it will be subtracted and interpreted as a negative when +// converting to an integral. + + if (result.back() & 0x80) + result.push_back(neg ? 0x80 : 0); + else if (neg) + result.back() |= 0x80; + + return result; + } + + static const size_t nMaxNumSize = 4; + +private: + static int64_t set_vch(const std::vector& vch) + { + if (vch.empty()) + return 0; + + int64_t result = 0; + for (size_t i = 0; i != vch.size(); ++i) + result |= static_cast(vch[i]) << 8*i; + + // If the input vector's most significant byte is 0x80, remove it from + // the result's msb and return a negative. + if (vch.back() & 0x80) + return -((int64_t)(result & ~(0x80ULL << (8 * (vch.size() - 1))))); + + return result; + } + + int64_t m_value; +}; + template std::vector ToByteVector(const T& in) { @@ -349,7 +499,7 @@ const char* GetOpName(opcodetype opcode); inline std::string ValueString(const std::vector& vch) { if (vch.size() <= 4) - return strprintf("%d", CBigNum(vch).getint()); + return strprintf("%d", CScriptNum(vch).getint()); else return HexStr(vch); } @@ -366,174 +516,7 @@ inline std::string StackString(const std::vector >& v return str; } -class scriptnum_error : public std::runtime_error -{ -public: - explicit scriptnum_error(const std::string& str) : std::runtime_error(str) {} -}; -class CScriptNum -{ -/** - * Numeric opcodes (OP_1ADD, etc) are restricted to operating on 4-byte integers. - * The semantics are subtle, though: operands must be in the range [-2^31 +1...2^31 -1], - * but results may overflow (and are valid as long as they are not used in a subsequent - * numeric operation). CScriptNum enforces those semantics by storing results as - * an int64 and allowing out-of-range values to be returned as a vector of bytes but - * throwing an exception if arithmetic is done or the result is interpreted as an integer. - */ -public: - - explicit CScriptNum(const int64_t& n) - { - m_value = n; - } - - explicit CScriptNum(const std::vector& vch, bool fRequireMinimal) - { - if (vch.size() > nMaxNumSize) { - throw scriptnum_error("script number overflow"); - } - if (fRequireMinimal && vch.size() > 0) { - // Check that the number is encoded with the minimum possible - // number of bytes. - // - // If the most-significant-byte - excluding the sign bit - is zero - // then we're not minimal. Note how this test also rejects the - // negative-zero encoding, 0x80. - if ((vch.back() & 0x7f) == 0) { - // One exception: if there's more than one byte and the most - // significant bit of the second-most-significant-byte is set - // it would conflict with the sign bit. An example of this case - // is +-255, which encode to 0xff00 and 0xff80 respectively. - // (big-endian). - if (vch.size() <= 1 || (vch[vch.size() - 2] & 0x80) == 0) { - throw scriptnum_error("non-minimally encoded script number"); - } - } - } - m_value = set_vch(vch); - } - - inline bool operator==(const int64_t& rhs) const { return m_value == rhs; } - inline bool operator!=(const int64_t& rhs) const { return m_value != rhs; } - inline bool operator<=(const int64_t& rhs) const { return m_value <= rhs; } - inline bool operator< (const int64_t& rhs) const { return m_value < rhs; } - inline bool operator>=(const int64_t& rhs) const { return m_value >= rhs; } - inline bool operator> (const int64_t& rhs) const { return m_value > rhs; } - - inline bool operator==(const CScriptNum& rhs) const { return operator==(rhs.m_value); } - inline bool operator!=(const CScriptNum& rhs) const { return operator!=(rhs.m_value); } - inline bool operator<=(const CScriptNum& rhs) const { return operator<=(rhs.m_value); } - inline bool operator< (const CScriptNum& rhs) const { return operator< (rhs.m_value); } - inline bool operator>=(const CScriptNum& rhs) const { return operator>=(rhs.m_value); } - inline bool operator> (const CScriptNum& rhs) const { return operator> (rhs.m_value); } - - inline CScriptNum operator+( const int64_t& rhs) const { return CScriptNum(m_value + rhs);} - inline CScriptNum operator-( const int64_t& rhs) const { return CScriptNum(m_value - rhs);} - inline CScriptNum operator+( const CScriptNum& rhs) const { return operator+(rhs.m_value); } - inline CScriptNum operator-( const CScriptNum& rhs) const { return operator-(rhs.m_value); } - - inline CScriptNum& operator+=( const CScriptNum& rhs) { return operator+=(rhs.m_value); } - inline CScriptNum& operator-=( const CScriptNum& rhs) { return operator-=(rhs.m_value); } - - inline CScriptNum operator-() const - { - assert(m_value != std::numeric_limits::min()); - return CScriptNum(-m_value); - } - - inline CScriptNum& operator=( const int64_t& rhs) - { - m_value = rhs; - return *this; - } - - inline CScriptNum& operator+=( const int64_t& rhs) - { - assert(rhs == 0 || (rhs > 0 && m_value <= std::numeric_limits::max() - rhs) || - (rhs < 0 && m_value >= std::numeric_limits::min() - rhs)); - m_value += rhs; - return *this; - } - - inline CScriptNum& operator-=( const int64_t& rhs) - { - assert(rhs == 0 || (rhs > 0 && m_value >= std::numeric_limits::min() + rhs) || - (rhs < 0 && m_value <= std::numeric_limits::max() + rhs)); - m_value -= rhs; - return *this; - } - - int getint() const - { - if (m_value > std::numeric_limits::max()) - return std::numeric_limits::max(); - else if (m_value < std::numeric_limits::min()) - return std::numeric_limits::min(); - return m_value; - } - - std::vector getvch() const - { - return serialize(m_value); - } - - static std::vector serialize(const int64_t& value) - { - if(value == 0) - return std::vector(); - - std::vector result; - const bool neg = value < 0; - uint64_t absvalue = neg ? -value : value; - - while(absvalue) - { - result.push_back(absvalue & 0xff); - absvalue >>= 8; - } - -// - If the most significant byte is >= 0x80 and the value is positive, push a -// new zero-byte to make the significant byte < 0x80 again. - -// - If the most significant byte is >= 0x80 and the value is negative, push a -// new 0x80 byte that will be popped off when converting to an integral. - -// - If the most significant byte is < 0x80 and the value is negative, add -// 0x80 to it, since it will be subtracted and interpreted as a negative when -// converting to an integral. - - if (result.back() & 0x80) - result.push_back(neg ? 0x80 : 0); - else if (neg) - result.back() |= 0x80; - - return result; - } - - static const size_t nMaxNumSize = 4; - -private: - static int64_t set_vch(const std::vector& vch) - { - if (vch.empty()) - return 0; - - int64_t result = 0; - for (size_t i = 0; i != vch.size(); ++i) - result |= static_cast(vch[i]) << 8*i; - - // If the input vector's most significant byte is 0x80, remove it from - // the result's msb and return a negative. - if (vch.back() & 0x80) - return -((int64_t)(result & ~(0x80ULL << (8 * (vch.size() - 1))))); - - return result; - } - - int64_t m_value; -}; @@ -550,22 +533,7 @@ class CScript : public std::vector } else { - CBigNum bn(n); - *this << bn.getvch(); - } - return *this; - } - - CScript& push_uint64(uint64_t n) - { - if (n >= 1 && n <= 16) - { - push_back(n + (OP_1 - 1)); - } - else - { - CBigNum bn(n); - *this << bn.getvch(); + *this << CScriptNum::serialize(n); } return *this; } @@ -591,36 +559,15 @@ class CScript : public std::vector return ret; } - - //explicit CScript(char b) is not portable. Use 'signed char' or 'unsigned char'. - explicit CScript(signed char b) { operator<<(b); } - explicit CScript(short b) { operator<<(b); } - explicit CScript(int b) { operator<<(b); } - explicit CScript(long b) { operator<<(b); } - explicit CScript(long long b) { operator<<(b); } - explicit CScript(unsigned char b) { operator<<(b); } - explicit CScript(unsigned int b) { operator<<(b); } - explicit CScript(unsigned short b) { operator<<(b); } - explicit CScript(unsigned long b) { operator<<(b); } - explicit CScript(unsigned long long b) { operator<<(b); } + CScript(int64_t b) { operator<<(b); } explicit CScript(opcodetype b) { operator<<(b); } explicit CScript(const uint256& b) { operator<<(b); } - explicit CScript(const CBigNum& b) { operator<<(b); } + explicit CScript(const CScriptNum& b) { operator<<(b); } explicit CScript(const std::vector& b) { operator<<(b); } - //CScript& operator<<(char b) is not portable. Use 'signed char' or 'unsigned char'. - CScript& operator<<(signed char b) { return push_int64(b); } - CScript& operator<<(short b) { return push_int64(b); } - CScript& operator<<(int b) { return push_int64(b); } - CScript& operator<<(long b) { return push_int64(b); } - CScript& operator<<(long long b) { return push_int64(b); } - CScript& operator<<(unsigned char b) { return push_uint64(b); } - CScript& operator<<(unsigned int b) { return push_uint64(b); } - CScript& operator<<(unsigned short b) { return push_uint64(b); } - CScript& operator<<(unsigned long b) { return push_uint64(b); } - CScript& operator<<(unsigned long long b) { return push_uint64(b); } + CScript& operator<<(int64_t b) { return push_int64(b); } CScript& operator<<(opcodetype opcode) { @@ -652,7 +599,7 @@ class CScript : public std::vector return *this; } - CScript& operator<<(const CBigNum& b) + CScript& operator<<(const CScriptNum& b) { *this << b.getvch(); return *this; @@ -696,19 +643,19 @@ class CScript : public std::vector bool GetOp(iterator& pc, opcodetype& opcodeRet, std::vector& vchRet) { - // Wrapper so it can be called with either iterator or const_iterator - const_iterator pc2 = pc; - bool fRet = GetOp2(pc2, opcodeRet, &vchRet); - pc = begin() + (pc2 - begin()); - return fRet; + // Wrapper so it can be called with either iterator or const_iterator + const_iterator pc2 = pc; + bool fRet = GetOp2(pc2, opcodeRet, &vchRet); + pc = begin() + (pc2 - begin()); + return fRet; } bool GetOp(iterator& pc, opcodetype& opcodeRet) { - const_iterator pc2 = pc; - bool fRet = GetOp2(pc2, opcodeRet, NULL); - pc = begin() + (pc2 - begin()); - return fRet; + const_iterator pc2 = pc; + bool fRet = GetOp2(pc2, opcodeRet, NULL); + pc = begin() + (pc2 - begin()); + return fRet; } bool GetOp(const_iterator& pc, opcodetype& opcodeRet, std::vector& vchRet) const @@ -997,7 +944,7 @@ CScript GetScriptForDestination(const CTxDestination& dest); CScript GetScriptForMultisig(int nRequired, const std::vector& keys); bool Solver(const CKeyStore& keystore, const CScript& scriptPubKey, uint256 hash, int nHashType, - CScript& scriptSigRet, txnouttype& whichTypeRet); + CScript& scriptSigRet, txnouttype& whichTypeRet); //uint256 SignatureHash(const CScript &scriptCode, const CTransaction& txTo, unsigned int nIn, int nHashType); diff --git a/src/serialize.h b/src/serialize.h index 9eb3a7cf..30ce7507 100644 --- a/src/serialize.h +++ b/src/serialize.h @@ -37,6 +37,16 @@ inline T& REF(const T& val) return const_cast(val); } +/** + * Used to acquire a non-const pointer "this" to generate bodies + * of const serialization operations from a template + */ +template +inline T* NCONST_PTR(const T* val) +{ + return const_cast(val); +} + /** Get begin pointer of vector (non-const version). * @note These functions avoid the undefined case of indexing into an empty * vector, as well as that of indexing after the end of the vector. @@ -123,6 +133,26 @@ enum #define READWRITE(obj) (nSerSize += ::SerReadWrite(s, (obj), nType, nVersion, ser_action)) +/** + * Implement three methods for serializable objects. These are actually wrappers over + * "SerializationOp" template, which implements the body of each class' serialization + * code. Adding "ADD_SERIALIZE_METHODS" in the body of the class causes these wrappers to be + * added as members. + */ +#define ADD_SERIALIZE_METHODS \ + size_t GetSerializeSize(int nType, int nVersion) const { \ + CSizeComputer s(nType, nVersion); \ + NCONST_PTR(this)->SerializationOp(s, CSerActionSerialize(), nType, nVersion);\ + return s.size(); \ + } \ + template \ + void Serialize(Stream& s, int nType, int nVersion) const { \ + NCONST_PTR(this)->SerializationOp(s, CSerActionSerialize(), nType, nVersion);\ + } \ + template \ + void Unserialize(Stream& s, int nType, int nVersion) { \ + SerializationOp(s, CSerActionUnserialize(), nType, nVersion); \ + } diff --git a/src/span.h b/src/span.h new file mode 100644 index 00000000..04a6ec5b --- /dev/null +++ b/src/span.h @@ -0,0 +1,222 @@ +// Copyright (c) 2018-2020 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_SPAN_H +#define BITCOIN_SPAN_H + +#include +#include +#include +#include + +#ifdef DEBUG +#define CONSTEXPR_IF_NOT_DEBUG +#define ASSERT_IF_DEBUG(x) assert((x)) +#else +#define CONSTEXPR_IF_NOT_DEBUG constexpr +#define ASSERT_IF_DEBUG(x) +#endif + +/** A Span is an object that can refer to a contiguous sequence of objects. + * + * It implements a subset of C++20's std::span. + * + * Things to be aware of when writing code that deals with Spans: + * + * - Similar to references themselves, Spans are subject to reference lifetime + * issues. The user is responsible for making sure the objects pointed to by + * a Span live as long as the Span is used. For example: + * + * std::vector vec{1,2,3,4}; + * Span sp(vec); + * vec.push_back(5); + * printf("%i\n", sp.front()); // UB! + * + * may exhibit undefined behavior, as increasing the size of a vector may + * invalidate references. + * + * - One particular pitfall is that Spans can be constructed from temporaries, + * but this is unsafe when the Span is stored in a variable, outliving the + * temporary. For example, this will compile, but exhibits undefined behavior: + * + * Span sp(std::vector{1, 2, 3}); + * printf("%i\n", sp.front()); // UB! + * + * The lifetime of the vector ends when the statement it is created in ends. + * Thus the Span is left with a dangling reference, and using it is undefined. + * + * - Due to Span's automatic creation from range-like objects (arrays, and data + * types that expose a data() and size() member function), functions that + * accept a Span as input parameter can be called with any compatible + * range-like object. For example, this works: +* + * void Foo(Span arg); + * + * Foo(std::vector{1, 2, 3}); // Works + * + * This is very useful in cases where a function truly does not care about the + * container, and only about having exactly a range of elements. However it + * may also be surprising to see automatic conversions in this case. + * + * When a function accepts a Span with a mutable element type, it will not + * accept temporaries; only variables or other references. For example: + * + * void FooMut(Span arg); + * + * FooMut(std::vector{1, 2, 3}); // Does not compile + * std::vector baz{1, 2, 3}; + * FooMut(baz); // Works + * + * This is similar to how functions that take (non-const) lvalue references + * as input cannot accept temporaries. This does not work either: + * + * void FooVec(std::vector& arg); + * FooVec(std::vector{1, 2, 3}); // Does not compile + * + * The idea is that if a function accepts a mutable reference, a meaningful + * result will be present in that variable after the call. Passing a temporary + * is useless in that context. + */ +template +class Span +{ + C* m_data; + std::size_t m_size; + +public: + constexpr Span() noexcept : m_data(nullptr), m_size(0) {} + + /** Construct a span from a begin pointer and a size. + * + * This implements a subset of the iterator-based std::span constructor in C++20, + * which is hard to implement without std::address_of. + */ + template ::value, int>::type = 0> + constexpr Span(T* begin, std::size_t size) noexcept : m_data(begin), m_size(size) {} + + /** Construct a span from a begin and end pointer. + * + * This implements a subset of the iterator-based std::span constructor in C++20, + * which is hard to implement without std::address_of. + */ + template ::value, int>::type = 0> + CONSTEXPR_IF_NOT_DEBUG Span(T* begin, T* end) noexcept : m_data(begin), m_size(end - begin) + { + ASSERT_IF_DEBUG(end >= begin); + } + + /** Implicit conversion of spans between compatible types. + * + * Specifically, if a pointer to an array of type O can be implicitly converted to a pointer to an array of type + * C, then permit implicit conversion of Span to Span. This matches the behavior of the corresponding + * C++20 std::span constructor. + * + * For example this means that a Span can be converted into a Span. + */ + template ::value, int>::type = 0> + constexpr Span(const Span& other) noexcept : m_data(other.m_data), m_size(other.m_size) {} + + /** Default copy constructor. */ + constexpr Span(const Span&) noexcept = default; + + /** Default assignment operator. */ + Span& operator=(const Span& other) noexcept = default; + + /** Construct a Span from an array. This matches the corresponding C++20 std::span constructor. */ + template + constexpr Span(C (&a)[N]) noexcept : m_data(a), m_size(N) {} + + /** Construct a Span for objects with .data() and .size() (std::string, std::array, std::vector, ...). + * + * This implements a subset of the functionality provided by the C++20 std::span range-based constructor. + * + * To prevent surprises, only Spans for constant value types are supported when passing in temporaries. + * Note that this restriction does not exist when converting arrays or other Spans (see above). + */ + template ::value || std::is_lvalue_reference::value) && std::is_convertible().data())>::type (*)[], C (*)[]>::value && std::is_convertible().size()), std::size_t>::value, int>::type = 0> + constexpr Span(V&& v) noexcept : m_data(v.data()), m_size(v.size()) {} + + constexpr C* data() const noexcept { return m_data; } + constexpr C* begin() const noexcept { return m_data; } + constexpr C* end() const noexcept { return m_data + m_size; } + CONSTEXPR_IF_NOT_DEBUG C& front() const noexcept + { + ASSERT_IF_DEBUG(size() > 0); + return m_data[0]; + } + CONSTEXPR_IF_NOT_DEBUG C& back() const noexcept + { + ASSERT_IF_DEBUG(size() > 0); + return m_data[m_size - 1]; + } + constexpr std::size_t size() const noexcept { return m_size; } + constexpr bool empty() const noexcept { return size() == 0; } + CONSTEXPR_IF_NOT_DEBUG C& operator[](std::size_t pos) const noexcept + { + ASSERT_IF_DEBUG(size() > pos); + return m_data[pos]; + } + CONSTEXPR_IF_NOT_DEBUG Span subspan(std::size_t offset) const noexcept + { + ASSERT_IF_DEBUG(size() >= offset); + return Span(m_data + offset, m_size - offset); + } + CONSTEXPR_IF_NOT_DEBUG Span subspan(std::size_t offset, std::size_t count) const noexcept + { + ASSERT_IF_DEBUG(size() >= offset + count); + return Span(m_data + offset, count); + } + CONSTEXPR_IF_NOT_DEBUG Span first(std::size_t count) const noexcept + { + ASSERT_IF_DEBUG(size() >= count); + return Span(m_data, count); + } + CONSTEXPR_IF_NOT_DEBUG Span last(std::size_t count) const noexcept + { + ASSERT_IF_DEBUG(size() >= count); + return Span(m_data + m_size - count, count); + } + + friend constexpr bool operator==(const Span& a, const Span& b) noexcept { return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin()); } + friend constexpr bool operator!=(const Span& a, const Span& b) noexcept { return !(a == b); } + friend constexpr bool operator<(const Span& a, const Span& b) noexcept { return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end()); } + friend constexpr bool operator<=(const Span& a, const Span& b) noexcept { return !(b < a); } + friend constexpr bool operator>(const Span& a, const Span& b) noexcept { return (b < a); } + friend constexpr bool operator>=(const Span& a, const Span& b) noexcept { return !(a < b); } + + template friend class Span; +}; + +// MakeSpan helps constructing a Span of the right type automatically. +/** MakeSpan for arrays: */ +template Span
constexpr MakeSpan(A (&a)[N]) { return Span(a, N); } +/** MakeSpan for temporaries / rvalue references, only supporting const output. */ +template constexpr auto MakeSpan(V&& v) -> typename std::enable_if::value, Span::type>>::type { return std::forward(v); } +/** MakeSpan for (lvalue) references, supporting mutable output. */ +template constexpr auto MakeSpan(V& v) -> Span::type> { return v; } + +/** Pop the last element off a span, and return a reference to that element. */ +template +T& SpanPopBack(Span& span) +{ + size_t size = span.size(); + ASSERT_IF_DEBUG(size > 0); + T& back = span[size - 1]; + span = Span(span.data(), size - 1); + return back; +} + +// Helper functions to safely cast to unsigned char pointers. +inline unsigned char* UCharCast(char* c) { return (unsigned char*)c; } +inline unsigned char* UCharCast(unsigned char* c) { return c; } +inline const unsigned char* UCharCast(const char* c) { return (unsigned char*)c; } +inline const unsigned char* UCharCast(const unsigned char* c) { return c; } + +// Helper function to safely convert a Span to a Span<[const] unsigned char>. +template constexpr auto UCharSpanCast(Span s) -> Span::type> { return {UCharCast(s.data()), s.size()}; } + +/** Like MakeSpan, but for (const) unsigned char member types only. Only works for (un)signed char containers. */ +template constexpr auto MakeUCharSpan(V&& v) -> decltype(UCharSpanCast(MakeSpan(std::forward(v)))) { return UCharSpanCast(MakeSpan(std::forward(v))); } + +#endif diff --git a/src/spork.cpp b/src/spork.cpp index 4a8f145b..4cef13aa 100644 --- a/src/spork.cpp +++ b/src/spork.cpp @@ -4,7 +4,6 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. -#include "bignum.h" #include "sync.h" #include "net.h" #include "key.h" diff --git a/src/spork.h b/src/spork.h index c638902f..98ee5895 100644 --- a/src/spork.h +++ b/src/spork.h @@ -5,7 +5,6 @@ #ifndef SPORK_H #define SPORK_H -#include "bignum.h" #include "sync.h" #include "net.h" #include "key.h" @@ -49,7 +48,6 @@ using namespace boost; class CSporkMessage; class CSporkManager; -#include "bignum.h" #include "net.h" #include "key.h" #include "util.h" diff --git a/src/test/bignum_tests.cpp b/src/test/bignum_tests.cpp deleted file mode 100644 index 74468187..00000000 --- a/src/test/bignum_tests.cpp +++ /dev/null @@ -1,125 +0,0 @@ -#include -#include - -#include "bignum.h" -#include "util.h" - -BOOST_AUTO_TEST_SUITE(bignum_tests) - -// Unfortunately there's no standard way of preventing a function from being -// inlined, so we define a macro for it. -// -// You should use it like this: -// NOINLINE void function() {...} -#if defined(__GNUC__) -// This also works and will be defined for any compiler implementing GCC -// extensions, such as Clang and ICC. -#define NOINLINE __attribute__((noinline)) -#elif defined(_MSC_VER) -#define NOINLINE __declspec(noinline) -#else -// We give out a warning because it impacts the correctness of one bignum test. -#warning You should define NOINLINE for your compiler. -#define NOINLINE -#endif - -// For the following test case, it is useful to use additional tools. -// -// The simplest one to use is the compiler flag -ftrapv, which detects integer -// overflows and similar errors. However, due to optimizations and compilers -// taking advantage of undefined behavior sometimes it may not actually detect -// anything. -// -// You can also use compiler-based stack protection to possibly detect possible -// stack buffer overruns. -// -// For more accurate diagnostics, you can use an undefined arithmetic operation -// detector such as the clang-based tool: -// -// "IOC: An Integer Overflow Checker for C/C++" -// -// Available at: http://embed.cs.utah.edu/ioc/ -// -// It might also be useful to use Google's AddressSanitizer to detect -// stack buffer overruns, which valgrind can't currently detect. - -// Let's force this code not to be inlined, in order to actually -// test a generic version of the function. This increases the chance -// that -ftrapv will detect overflows. -NOINLINE void mysetint64(CBigNum& num, int64 n) -{ - num.setint64(n); -} - -// For each number, we do 2 tests: one with inline code, then we reset the -// value to 0, then the second one with a non-inlined function. -BOOST_AUTO_TEST_CASE(bignum_setint64) -{ - int64 n; - - { - n = 0; - CBigNum num(n); - BOOST_CHECK(num.ToString() == "0"); - num.setulong(0); - BOOST_CHECK(num.ToString() == "0"); - mysetint64(num, n); - BOOST_CHECK(num.ToString() == "0"); - } - { - n = 1; - CBigNum num(n); - BOOST_CHECK(num.ToString() == "1"); - num.setulong(0); - BOOST_CHECK(num.ToString() == "0"); - mysetint64(num, n); - BOOST_CHECK(num.ToString() == "1"); - } - { - n = -1; - CBigNum num(n); - BOOST_CHECK(num.ToString() == "-1"); - num.setulong(0); - BOOST_CHECK(num.ToString() == "0"); - mysetint64(num, n); - BOOST_CHECK(num.ToString() == "-1"); - } - { - n = 5; - CBigNum num(n); - BOOST_CHECK(num.ToString() == "5"); - num.setulong(0); - BOOST_CHECK(num.ToString() == "0"); - mysetint64(num, n); - BOOST_CHECK(num.ToString() == "5"); - } - { - n = -5; - CBigNum num(n); - BOOST_CHECK(num.ToString() == "-5"); - num.setulong(0); - BOOST_CHECK(num.ToString() == "0"); - mysetint64(num, n); - BOOST_CHECK(num.ToString() == "-5"); - } - { - n = std::numeric_limits::min(); - CBigNum num(n); - BOOST_CHECK(num.ToString() == "-9223372036854775808"); - num.setulong(0); - BOOST_CHECK(num.ToString() == "0"); - mysetint64(num, n); - BOOST_CHECK(num.ToString() == "-9223372036854775808"); - } - { - n = std::numeric_limits::max(); - CBigNum num(n); - BOOST_CHECK(num.ToString() == "9223372036854775807"); - num.setulong(0); - BOOST_CHECK(num.ToString() == "0"); - mysetint64(num, n); - BOOST_CHECK(num.ToString() == "9223372036854775807"); - } -} - -BOOST_AUTO_TEST_SUITE_END() diff --git a/src/timedata.cpp b/src/timedata.cpp new file mode 100644 index 00000000..8a095d26 --- /dev/null +++ b/src/timedata.cpp @@ -0,0 +1,91 @@ +// Copyright (c) 2014 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "timedata.h" + +#include "netbase.h" +#include "sync.h" +#include "ui_interface.h" +#include "util.h" + +#include + +using namespace std; + +static CCriticalSection cs_nTimeOffset; +static int64_t nTimeOffset = 0; + +// +// "Never go to sea with two chronometers; take one or three." +// Our three time sources are: +// - System clock +// - Median of other nodes clocks +// - The user (asking the user to fix the system clock if the first two disagree) +// +// +int64_t GetTimeOffset() +{ + LOCK(cs_nTimeOffset); + return nTimeOffset; +} + +int64_t GetAdjustedTime() +{ + return GetTime() + GetTimeOffset(); +} + +void AddTimeData(const CNetAddr& ip, int64_t nTime) +{ + int64_t nOffsetSample = nTime - GetTime(); + + LOCK(cs_nTimeOffset); + // Ignore duplicates + static set setKnown; + if (!setKnown.insert(ip).second) + return; + + // Add data + static CMedianFilter vTimeOffsets(200,0); + vTimeOffsets.input(nOffsetSample); + LogPrintf("Added time data, samples %d, offset %+d (%+d minutes)\n", vTimeOffsets.size(), nOffsetSample, nOffsetSample/60); + if (vTimeOffsets.size() >= 5 && vTimeOffsets.size() % 2 == 1) + { + int64_t nMedian = vTimeOffsets.median(); + std::vector vSorted = vTimeOffsets.sorted(); + // Only let other nodes change our time by so much + if (abs64(nMedian) < 70 * 60) + { + nTimeOffset = nMedian; + } + else + { + nTimeOffset = 0; + + static bool fDone; + if (!fDone) + { + // If nobody has a time different than ours but within 5 minutes of ours, give a warning + bool fMatch = false; + BOOST_FOREACH(int64_t nOffset, vSorted) + if (nOffset != 0 && abs64(nOffset) < 5 * 60) + fMatch = true; + + if (!fMatch) + { + fDone = true; + string strMessage = _("Warning: Please check that your computer's date and time are correct! If your clock is wrong Bitcoin will not work properly."); + strMiscWarning = strMessage; + LogPrintf("*** %s\n", strMessage); + uiInterface.ThreadSafeMessageBox(strMessage, "", CClientUIInterface::MSG_WARNING); + } + } + } + if (fDebug) { + BOOST_FOREACH(int64_t n, vSorted) + LogPrintf("%+d ", n); + LogPrintf("| "); + } + LogPrintf("nTimeOffset = %+d (%+d minutes)\n", nTimeOffset, nTimeOffset/60); + } +} diff --git a/src/timedata.h b/src/timedata.h new file mode 100644 index 00000000..0e7bdc2c --- /dev/null +++ b/src/timedata.h @@ -0,0 +1,17 @@ +// Copyright (c) 2014 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_TIMEDATA_H +#define BITCOIN_TIMEDATA_H + +#include + +class CNetAddr; + +/* Functions to keep track of adjusted P2P time */ +int64_t GetTimeOffset(); +int64_t GetAdjustedTime(); +void AddTimeData(const CNetAddr& ip, int64_t nTime); + +#endif diff --git a/src/txdb-leveldb.cpp b/src/txdb-leveldb.cpp index 46187f1f..4de4991e 100644 --- a/src/txdb-leveldb.cpp +++ b/src/txdb-leveldb.cpp @@ -295,12 +295,12 @@ bool CTxDB::WriteHashBestChain(uint256 hashBestChain) return Write(string("hashBestChain"), hashBestChain); } -bool CTxDB::ReadBestInvalidTrust(CBigNum& bnBestInvalidTrust) +bool CTxDB::ReadBestInvalidTrust(uint256 bnBestInvalidTrust) { return Read(string("bnBestInvalidTrust"), bnBestInvalidTrust); } -bool CTxDB::WriteBestInvalidTrust(CBigNum bnBestInvalidTrust) +bool CTxDB::WriteBestInvalidTrust(uint256 bnBestInvalidTrust) { return Write(string("bnBestInvalidTrust"), bnBestInvalidTrust); } @@ -428,13 +428,13 @@ bool CTxDB::LoadBlockIndex() nBestChainTrust = pindexBest->nChainTrust; LogPrintf("LoadBlockIndex(): hashBestChain=%s height=%d trust=%s date=%s\n", - hashBestChain.ToString(), nBestHeight, CBigNum(nBestChainTrust).ToString(), + hashBestChain.ToString(), nBestHeight, nBestChainTrust.ToString(), DateTimeStrFormat("%x %H:%M:%S", pindexBest->GetBlockTime())); // Load bnBestInvalidTrust, OK if it doesn't exist - CBigNum bnBestInvalidTrust; + uint256 bnBestInvalidTrust; ReadBestInvalidTrust(bnBestInvalidTrust); - nBestInvalidTrust = bnBestInvalidTrust.getuint256(); + nBestInvalidTrust = bnBestInvalidTrust; // Verify blocks in the best chain int nCheckLevel = GetArg("-checklevel", 1); diff --git a/src/txdb-leveldb.h b/src/txdb-leveldb.h index a2e74559..0751c2e6 100644 --- a/src/txdb-leveldb.h +++ b/src/txdb-leveldb.h @@ -197,8 +197,8 @@ class CTxDB bool WriteBlockIndex(const CDiskBlockIndex& blockindex); bool ReadHashBestChain(uint256& hashBestChain); bool WriteHashBestChain(uint256 hashBestChain); - bool ReadBestInvalidTrust(CBigNum& bnBestInvalidTrust); - bool WriteBestInvalidTrust(CBigNum bnBestInvalidTrust); + bool ReadBestInvalidTrust(uint256 bnBestInvalidTrust); + bool WriteBestInvalidTrust(uint256 bnBestInvalidTrust); bool LoadBlockIndex(); private: bool LoadBlockIndexGuts(); diff --git a/src/uint256.cpp b/src/uint256.cpp new file mode 100644 index 00000000..79406f24 --- /dev/null +++ b/src/uint256.cpp @@ -0,0 +1,357 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2014 The Bitcoin developers +// Distributed under the MIT/X11 software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "uint256.h" + +#include "utilstrencodings.h" + +#include +#include + +template +base_uint::base_uint(const std::string& str) +{ + SetHex(str); +} + +template +base_uint::base_uint(const std::vector& vch) +{ + if (vch.size() != sizeof(pn)) + throw uint_error("Converting vector of wrong size to base_uint"); + memcpy(pn, &vch[0], sizeof(pn)); +} + +template +base_uint& base_uint::operator<<=(unsigned int shift) +{ + base_uint a(*this); + for (int i = 0; i < WIDTH; i++) + pn[i] = 0; + int k = shift / 32; + shift = shift % 32; + for (int i = 0; i < WIDTH; i++) { + if (i + k + 1 < WIDTH && shift != 0) + pn[i + k + 1] |= (a.pn[i] >> (32 - shift)); + if (i + k < WIDTH) + pn[i + k] |= (a.pn[i] << shift); + } + return *this; +} + +template +base_uint& base_uint::operator>>=(unsigned int shift) +{ + base_uint a(*this); + for (int i = 0; i < WIDTH; i++) + pn[i] = 0; + int k = shift / 32; + shift = shift % 32; + for (int i = 0; i < WIDTH; i++) { + if (i - k - 1 >= 0 && shift != 0) + pn[i - k - 1] |= (a.pn[i] << (32 - shift)); + if (i - k >= 0) + pn[i - k] |= (a.pn[i] >> shift); + } + return *this; +} + +template +base_uint& base_uint::operator*=(uint32_t b32) +{ + uint64_t carry = 0; + for (int i = 0; i < WIDTH; i++) { + uint64_t n = carry + (uint64_t)b32 * pn[i]; + pn[i] = n & 0xffffffff; + carry = n >> 32; + } + return *this; +} + +template +base_uint& base_uint::operator*=(const base_uint& b) +{ + base_uint a = *this; + *this = 0; + for (int j = 0; j < WIDTH; j++) { + uint64_t carry = 0; + for (int i = 0; i + j < WIDTH; i++) { + uint64_t n = carry + pn[i + j] + (uint64_t)a.pn[j] * b.pn[i]; + pn[i + j] = n & 0xffffffff; + carry = n >> 32; + } + } + return *this; +} + +template +base_uint& base_uint::operator/=(const base_uint& b) +{ + base_uint div = b; // make a copy, so we can shift. + base_uint num = *this; // make a copy, so we can subtract. + *this = 0; // the quotient. + int num_bits = num.bits(); + int div_bits = div.bits(); + if (div_bits == 0) + throw uint_error("Division by zero"); + if (div_bits > num_bits) // the result is certainly 0. + return *this; + int shift = num_bits - div_bits; + div <<= shift; // shift so that div and nun align. + while (shift >= 0) { + if (num >= div) { + num -= div; + pn[shift / 32] |= (1 << (shift & 31)); // set a bit of the result. + } + div >>= 1; // shift back. + shift--; + } + // num now contains the remainder of the division. + return *this; +} + +template +int base_uint::CompareTo(const base_uint& b) const +{ + for (int i = WIDTH - 1; i >= 0; i--) { + if (pn[i] < b.pn[i]) + return -1; + if (pn[i] > b.pn[i]) + return 1; + } + return 0; +} + +template +bool base_uint::EqualTo(uint64_t b) const +{ + for (int i = WIDTH - 1; i >= 2; i--) { + if (pn[i]) + return false; + } + if (pn[1] != (b >> 32)) + return false; + if (pn[0] != (b & 0xfffffffful)) + return false; + return true; +} + +template +double base_uint::getdouble() const +{ + double ret = 0.0; + double fact = 1.0; + for (int i = 0; i < WIDTH; i++) { + ret += fact * pn[i]; + fact *= 4294967296.0; + } + return ret; +} + +template +std::string base_uint::GetHex() const +{ + char psz[sizeof(pn) * 2 + 1]; + for (unsigned int i = 0; i < sizeof(pn); i++) + sprintf(psz + i * 2, "%02x", ((unsigned char*)pn)[sizeof(pn) - i - 1]); + return std::string(psz, psz + sizeof(pn) * 2); +} + +template +void base_uint::SetHex(const char* psz) +{ + memset(pn, 0, sizeof(pn)); + + // skip leading spaces + while (isspace(*psz)) + psz++; + + // skip 0x + if (psz[0] == '0' && tolower(psz[1]) == 'x') + psz += 2; + + // hex string to uint + const char* pbegin = psz; + while (::HexDigit(*psz) != -1) + psz++; + psz--; + unsigned char* p1 = (unsigned char*)pn; + unsigned char* pend = p1 + WIDTH * 4; + while (psz >= pbegin && p1 < pend) { + *p1 = ::HexDigit(*psz--); + if (psz >= pbegin) { + *p1 |= ((unsigned char)::HexDigit(*psz--) << 4); + p1++; + } + } +} + +template +void base_uint::SetHex(const std::string& str) +{ + SetHex(str.c_str()); +} + +template +std::string base_uint::ToString() const +{ + return (GetHex()); +} + +template +unsigned int base_uint::bits() const +{ + for (int pos = WIDTH - 1; pos >= 0; pos--) { + if (pn[pos]) { + for (int bits = 31; bits > 0; bits--) { + if (pn[pos] & 1 << bits) + return 32 * pos + bits + 1; + } + return 32 * pos + 1; + } + } + return 0; +} + +// Explicit instantiations for base_uint<160> +template base_uint<160>::base_uint(const std::string&); +template base_uint<160>::base_uint(const std::vector&); +template base_uint<160>& base_uint<160>::operator<<=(unsigned int); +template base_uint<160>& base_uint<160>::operator>>=(unsigned int); +template base_uint<160>& base_uint<160>::operator*=(uint32_t b32); +template base_uint<160>& base_uint<160>::operator*=(const base_uint<160>& b); +template base_uint<160>& base_uint<160>::operator/=(const base_uint<160>& b); +template int base_uint<160>::CompareTo(const base_uint<160>&) const; +template bool base_uint<160>::EqualTo(uint64_t) const; +template double base_uint<160>::getdouble() const; +template std::string base_uint<160>::GetHex() const; +template std::string base_uint<160>::ToString() const; +template void base_uint<160>::SetHex(const char*); +template void base_uint<160>::SetHex(const std::string&); +template unsigned int base_uint<160>::bits() const; + +// Explicit instantiations for base_uint<256> +template base_uint<256>::base_uint(const std::string&); +template base_uint<256>::base_uint(const std::vector&); +template base_uint<256>& base_uint<256>::operator<<=(unsigned int); +template base_uint<256>& base_uint<256>::operator>>=(unsigned int); +template base_uint<256>& base_uint<256>::operator*=(uint32_t b32); +template base_uint<256>& base_uint<256>::operator*=(const base_uint<256>& b); +template base_uint<256>& base_uint<256>::operator/=(const base_uint<256>& b); +template int base_uint<256>::CompareTo(const base_uint<256>&) const; +template bool base_uint<256>::EqualTo(uint64_t) const; +template double base_uint<256>::getdouble() const; +template std::string base_uint<256>::GetHex() const; +template std::string base_uint<256>::ToString() const; +template void base_uint<256>::SetHex(const char*); +template void base_uint<256>::SetHex(const std::string&); +template unsigned int base_uint<256>::bits() const; + +// This implementation directly uses shifts instead of going +// through an intermediate MPI representation. +uint256& uint256::SetCompact(uint32_t nCompact, bool* pfNegative, bool* pfOverflow) +{ + int nSize = nCompact >> 24; + uint32_t nWord = nCompact & 0x007fffff; + if (nSize <= 3) { + nWord >>= 8 * (3 - nSize); + *this = nWord; + } else { + *this = nWord; + *this <<= 8 * (nSize - 3); + } + if (pfNegative) + *pfNegative = nWord != 0 && (nCompact & 0x00800000) != 0; + if (pfOverflow) + *pfOverflow = nWord != 0 && ((nSize > 34) || + (nWord > 0xff && nSize > 33) || + (nWord > 0xffff && nSize > 32)); + return *this; +} + +uint32_t uint256::GetCompact(bool fNegative) const +{ + int nSize = (bits() + 7) / 8; + uint32_t nCompact = 0; + if (nSize <= 3) { + nCompact = GetLow64() << 8 * (3 - nSize); + } else { + uint256 bn = *this >> 8 * (nSize - 3); + nCompact = bn.GetLow64(); + } + // The 0x00800000 bit denotes the sign. + // Thus, if it is already set, divide the mantissa by 256 and increase the exponent. + if (nCompact & 0x00800000) { + nCompact >>= 8; + nSize++; + } + assert((nCompact & ~0x007fffff) == 0); + assert(nSize < 256); + nCompact |= nSize << 24; + nCompact |= (fNegative && (nCompact & 0x007fffff) ? 0x00800000 : 0); + return nCompact; +} + +static void inline HashMix(uint32_t& a, uint32_t& b, uint32_t& c) +{ + // Taken from lookup3, by Bob Jenkins. + a -= c; + a ^= ((c << 4) | (c >> 28)); + c += b; + b -= a; + b ^= ((a << 6) | (a >> 26)); + a += c; + c -= b; + c ^= ((b << 8) | (b >> 24)); + b += a; + a -= c; + a ^= ((c << 16) | (c >> 16)); + c += b; + b -= a; + b ^= ((a << 19) | (a >> 13)); + a += c; + c -= b; + c ^= ((b << 4) | (b >> 28)); + b += a; +} + +static void inline HashFinal(uint32_t& a, uint32_t& b, uint32_t& c) +{ + // Taken from lookup3, by Bob Jenkins. + c ^= b; + c -= ((b << 14) | (b >> 18)); + a ^= c; + a -= ((c << 11) | (c >> 21)); + b ^= a; + b -= ((a << 25) | (a >> 7)); + c ^= b; + c -= ((b << 16) | (b >> 16)); + a ^= c; + a -= ((c << 4) | (c >> 28)); + b ^= a; + b -= ((a << 14) | (a >> 18)); + c ^= b; + c -= ((b << 24) | (b >> 8)); +} + +uint64_t uint256::GetHash(const uint256& salt) const +{ + uint32_t a, b, c; + a = b = c = 0xdeadbeef + (WIDTH << 2); + + a += pn[0] ^ salt.pn[0]; + b += pn[1] ^ salt.pn[1]; + c += pn[2] ^ salt.pn[2]; + HashMix(a, b, c); + a += pn[3] ^ salt.pn[3]; + b += pn[4] ^ salt.pn[4]; + c += pn[5] ^ salt.pn[5]; + HashMix(a, b, c); + a += pn[6] ^ salt.pn[6]; + b += pn[7] ^ salt.pn[7]; + HashFinal(a, b, c); + + return ((((uint64_t)b) << 32) | c); +} diff --git a/src/uint256.h b/src/uint256.h index 19318680..0289fc9b 100644 --- a/src/uint256.h +++ b/src/uint256.h @@ -1,37 +1,67 @@ // Copyright (c) 2009-2010 Satoshi Nakamoto -// Copyright (c) 2009-2012 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2009-2014 The Bitcoin developers +// Copyright (c) 2014-2015 The Dash developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_UINT256_H #define BITCOIN_UINT256_H +#include +#include +#include +#include #include #include -#include #include #include extern const signed char p_util_hexdigit[256]; // defined in util.cpp -inline int Testuint256AdHoc(std::vector vArg); - -inline signed char HexDigit(char c) -{ - return p_util_hexdigit[(unsigned char)c]; -} +class uint_error : public std::runtime_error { +public: + explicit uint_error(const std::string& str) : std::runtime_error(str) {} +}; -/** Base class without constructors for uint256 and uint160. - * This makes the compiler let u use it in a union. - */ +/** Template base class for unsigned big integers. */ template class base_uint { protected: enum { WIDTH=BITS/32 }; - unsigned int pn[WIDTH]; + uint32_t pn[WIDTH]; public: + base_uint() + { + for (int i = 0; i < WIDTH; i++) + pn[i] = 0; + } + + base_uint(const base_uint& b) + { + for (int i = 0; i < WIDTH; i++) + pn[i] = b.pn[i]; + } + + base_uint& operator=(const base_uint& b) + { + for (int i = 0; i < WIDTH; i++) + pn[i] = b.pn[i]; + return *this; + } + + base_uint(uint64_t b) + { + pn[0] = (unsigned int)b; + pn[1] = (unsigned int)(b >> 32); + for (int i = 2; i < WIDTH; i++) + pn[i] = 0; + } + + explicit base_uint(const std::string& str); + explicit base_uint(const std::vector& vch); + bool operator!() const { for (int i = 0; i < WIDTH; i++) @@ -57,16 +87,7 @@ class base_uint return ret; } - double getdouble() const - { - double ret = 0.0; - double fact = 1.0; - for (int i = 0; i < WIDTH; i++) { - ret += fact * pn[i]; - fact *= 4294967296.0; - } - return ret; - } + double getdouble() const; base_uint& operator=(uint64_t b) { @@ -112,39 +133,8 @@ class base_uint return *this; } - base_uint& operator<<=(unsigned int shift) - { - base_uint a(*this); - for (int i = 0; i < WIDTH; i++) - pn[i] = 0; - int k = shift / 32; - shift = shift % 32; - for (int i = 0; i < WIDTH; i++) - { - if (i+k+1 < WIDTH && shift != 0) - pn[i+k+1] |= (a.pn[i] >> (32-shift)); - if (i+k < WIDTH) - pn[i+k] |= (a.pn[i] << shift); - } - return *this; - } - - base_uint& operator>>=(unsigned int shift) - { - base_uint a(*this); - for (int i = 0; i < WIDTH; i++) - pn[i] = 0; - int k = shift / 32; - shift = shift % 32; - for (int i = 0; i < WIDTH; i++) - { - if (i-k-1 >= 0 && shift != 0) - pn[i-k-1] |= (a.pn[i] << (32-shift)); - if (i-k >= 0) - pn[i-k] |= (a.pn[i] >> shift); - } - return *this; - } + base_uint& operator<<=(unsigned int shift); + base_uint& operator>>=(unsigned int shift); base_uint& operator+=(const base_uint& b) { @@ -180,6 +170,9 @@ class base_uint return *this; } + base_uint& operator*=(uint32_t b32); + base_uint& operator*=(const base_uint& b); + base_uint& operator/=(const base_uint& b); base_uint& operator++() { @@ -202,7 +195,7 @@ class base_uint { // prefix operator int i = 0; - while (--pn[i] == -1 && i < WIDTH-1) + while (--pn[i] == (uint32_t)-1 && i < WIDTH-1) i++; return *this; } @@ -215,134 +208,32 @@ class base_uint return ret; } - - friend inline bool operator<(const base_uint& a, const base_uint& b) - { - for (int i = base_uint::WIDTH-1; i >= 0; i--) - { - if (a.pn[i] < b.pn[i]) - return true; - else if (a.pn[i] > b.pn[i]) - return false; - } - return false; - } - - friend inline bool operator<=(const base_uint& a, const base_uint& b) - { - for (int i = base_uint::WIDTH-1; i >= 0; i--) - { - if (a.pn[i] < b.pn[i]) - return true; - else if (a.pn[i] > b.pn[i]) - return false; - } - return true; - } - - friend inline bool operator>(const base_uint& a, const base_uint& b) - { - for (int i = base_uint::WIDTH-1; i >= 0; i--) - { - if (a.pn[i] > b.pn[i]) - return true; - else if (a.pn[i] < b.pn[i]) - return false; - } - return false; - } - - friend inline bool operator>=(const base_uint& a, const base_uint& b) - { - for (int i = base_uint::WIDTH-1; i >= 0; i--) - { - if (a.pn[i] > b.pn[i]) - return true; - else if (a.pn[i] < b.pn[i]) - return false; - } - return true; - } - - friend inline bool operator==(const base_uint& a, const base_uint& b) - { - for (int i = 0; i < base_uint::WIDTH; i++) - if (a.pn[i] != b.pn[i]) - return false; - return true; - } - - friend inline bool operator==(const base_uint& a, uint64_t b) - { - if (a.pn[0] != (unsigned int)b) - return false; - if (a.pn[1] != (unsigned int)(b >> 32)) - return false; - for (int i = 2; i < base_uint::WIDTH; i++) - if (a.pn[i] != 0) - return false; - return true; - } - - friend inline bool operator!=(const base_uint& a, const base_uint& b) - { - return (!(a == b)); - } - - friend inline bool operator!=(const base_uint& a, uint64_t b) - { - return (!(a == b)); - } - - - - std::string GetHex() const - { - char psz[sizeof(pn)*2 + 1]; - for (unsigned int i = 0; i < sizeof(pn); i++) - sprintf(psz + i*2, "%02x", ((unsigned char*)pn)[sizeof(pn) - i - 1]); - return std::string(psz, psz + sizeof(pn)*2); - } - - void SetHex(const char* psz) - { - memset(pn,0,sizeof(pn)); - - // skip leading spaces - while (isspace(*psz)) - psz++; - - // skip 0x - if (psz[0] == '0' && tolower(psz[1]) == 'x') - psz += 2; - - // hex string to uint - const char* pbegin = psz; - while (::HexDigit(*psz) != -1) - psz++; - psz--; - unsigned char* p1 = (unsigned char*)pn; - unsigned char* pend = p1 + WIDTH * 4; - while (psz >= pbegin && p1 < pend) - { - *p1 = ::HexDigit(*psz--); - if (psz >= pbegin) - { - *p1 |= ((unsigned char)::HexDigit(*psz--) << 4); - p1++; - } - } - } - - void SetHex(const std::string& str) - { - SetHex(str.c_str()); - } - - std::string ToString() const - { - return (GetHex()); - } + int CompareTo(const base_uint& b) const; + bool EqualTo(uint64_t b) const; + + friend inline const base_uint operator+(const base_uint& a, const base_uint& b) { return base_uint(a) += b; } + friend inline const base_uint operator-(const base_uint& a, const base_uint& b) { return base_uint(a) -= b; } + friend inline const base_uint operator*(const base_uint& a, const base_uint& b) { return base_uint(a) *= b; } + friend inline const base_uint operator/(const base_uint& a, const base_uint& b) { return base_uint(a) /= b; } + friend inline const base_uint operator|(const base_uint& a, const base_uint& b) { return base_uint(a) |= b; } + friend inline const base_uint operator&(const base_uint& a, const base_uint& b) { return base_uint(a) &= b; } + friend inline const base_uint operator^(const base_uint& a, const base_uint& b) { return base_uint(a) ^= b; } + friend inline const base_uint operator>>(const base_uint& a, int shift) { return base_uint(a) >>= shift; } + friend inline const base_uint operator<<(const base_uint& a, int shift) { return base_uint(a) <<= shift; } + friend inline const base_uint operator*(const base_uint& a, uint32_t b) { return base_uint(a) *= b; } + friend inline bool operator==(const base_uint& a, const base_uint& b) { return memcmp(a.pn, b.pn, sizeof(a.pn)) == 0; } + friend inline bool operator!=(const base_uint& a, const base_uint& b) { return memcmp(a.pn, b.pn, sizeof(a.pn)) != 0; } + friend inline bool operator>(const base_uint& a, const base_uint& b) { return a.CompareTo(b) > 0; } + friend inline bool operator<(const base_uint& a, const base_uint& b) { return a.CompareTo(b) < 0; } + friend inline bool operator>=(const base_uint& a, const base_uint& b) { return a.CompareTo(b) >= 0; } + friend inline bool operator<=(const base_uint& a, const base_uint& b) { return a.CompareTo(b) <= 0; } + friend inline bool operator==(const base_uint& a, uint64_t b) { return a.EqualTo(b); } + friend inline bool operator!=(const base_uint& a, uint64_t b) { return !a.EqualTo(b); } + + std::string GetHex() const; + void SetHex(const char* psz); + void SetHex(const std::string& str); + std::string ToString() const; unsigned char* begin() { @@ -356,15 +247,15 @@ class base_uint const unsigned char* begin() const { - return (unsigned char*)&pn[0]; + return (unsigned char*)&pn[0]; } const unsigned char* end() const { - return (unsigned char*)&pn[WIDTH]; + return (unsigned char*)&pn[WIDTH]; } - unsigned int size() + unsigned int size() const { return sizeof(pn); } @@ -373,6 +264,17 @@ class base_uint { return pn[2*n] | (uint64_t)pn[2*n+1] << 32; } + /** + * Returns the position of the highest bit set plus one, or zero if the + * value is zero. + */ + unsigned int bits() const; + + uint64_t GetLow64() const + { + assert(WIDTH >= 2); + return pn[0] | (uint64_t)pn[1] << 32; + } unsigned int GetSerializeSize(int nType, int nVersion) const { @@ -394,310 +296,60 @@ class base_uint friend class uint160; friend class uint256; friend class uint512; - friend inline int Testuint256AdHoc(std::vector vArg); }; -typedef base_uint<160> base_uint160; -typedef base_uint<256> base_uint256; -typedef base_uint<512> base_uint512; - -// -// uint160 and uint256 could be implemented as templates, but to keep -// compile errors and debugging cleaner, they're copy and pasted. -// - - - -////////////////////////////////////////////////////////////////////////////// -// -// uint160 -// - -/** 160-bit unsigned integer */ -class uint160 : public base_uint160 -{ +/** 160-bit unsigned big integer. */ +class uint160 : public base_uint<160> { public: - typedef base_uint160 basetype; - - uint160() - { - for (int i = 0; i < WIDTH; i++) - pn[i] = 0; - } - - uint160(const basetype& b) - { - for (int i = 0; i < WIDTH; i++) - pn[i] = b.pn[i]; - } - - uint160& operator=(const basetype& b) - { - for (int i = 0; i < WIDTH; i++) - pn[i] = b.pn[i]; - return *this; - } - - uint160(uint64_t b) - { - pn[0] = (unsigned int)b; - pn[1] = (unsigned int)(b >> 32); - for (int i = 2; i < WIDTH; i++) - pn[i] = 0; - } - - uint160& operator=(uint64_t b) - { - pn[0] = (unsigned int)b; - pn[1] = (unsigned int)(b >> 32); - for (int i = 2; i < WIDTH; i++) - pn[i] = 0; - return *this; - } - - explicit uint160(const std::string& str) - { - SetHex(str); - } - - explicit uint160(const std::vector& vch) - { - if (vch.size() == sizeof(pn)) - memcpy(pn, &vch[0], sizeof(pn)); - else - *this = 0; - } + uint160() {} + uint160(const base_uint<160>& b) : base_uint<160>(b) {} + uint160(uint64_t b) : base_uint<160>(b) {} + explicit uint160(const std::string& str) : base_uint<160>(str) {} + explicit uint160(const std::vector& vch) : base_uint<160>(vch) {} }; -inline bool operator==(const uint160& a, uint64_t b) { return (base_uint160)a == b; } -inline bool operator!=(const uint160& a, uint64_t b) { return (base_uint160)a != b; } -inline const uint160 operator<<(const base_uint160& a, unsigned int shift) { return uint160(a) <<= shift; } -inline const uint160 operator>>(const base_uint160& a, unsigned int shift) { return uint160(a) >>= shift; } -inline const uint160 operator<<(const uint160& a, unsigned int shift) { return uint160(a) <<= shift; } -inline const uint160 operator>>(const uint160& a, unsigned int shift) { return uint160(a) >>= shift; } - -inline const uint160 operator^(const base_uint160& a, const base_uint160& b) { return uint160(a) ^= b; } -inline const uint160 operator&(const base_uint160& a, const base_uint160& b) { return uint160(a) &= b; } -inline const uint160 operator|(const base_uint160& a, const base_uint160& b) { return uint160(a) |= b; } -inline const uint160 operator+(const base_uint160& a, const base_uint160& b) { return uint160(a) += b; } -inline const uint160 operator-(const base_uint160& a, const base_uint160& b) { return uint160(a) -= b; } - -inline bool operator<(const base_uint160& a, const uint160& b) { return (base_uint160)a < (base_uint160)b; } -inline bool operator<=(const base_uint160& a, const uint160& b) { return (base_uint160)a <= (base_uint160)b; } -inline bool operator>(const base_uint160& a, const uint160& b) { return (base_uint160)a > (base_uint160)b; } -inline bool operator>=(const base_uint160& a, const uint160& b) { return (base_uint160)a >= (base_uint160)b; } -inline bool operator==(const base_uint160& a, const uint160& b) { return (base_uint160)a == (base_uint160)b; } -inline bool operator!=(const base_uint160& a, const uint160& b) { return (base_uint160)a != (base_uint160)b; } -inline const uint160 operator^(const base_uint160& a, const uint160& b) { return (base_uint160)a ^ (base_uint160)b; } -inline const uint160 operator&(const base_uint160& a, const uint160& b) { return (base_uint160)a & (base_uint160)b; } -inline const uint160 operator|(const base_uint160& a, const uint160& b) { return (base_uint160)a | (base_uint160)b; } -inline const uint160 operator+(const base_uint160& a, const uint160& b) { return (base_uint160)a + (base_uint160)b; } -inline const uint160 operator-(const base_uint160& a, const uint160& b) { return (base_uint160)a - (base_uint160)b; } - -inline bool operator<(const uint160& a, const base_uint160& b) { return (base_uint160)a < (base_uint160)b; } -inline bool operator<=(const uint160& a, const base_uint160& b) { return (base_uint160)a <= (base_uint160)b; } -inline bool operator>(const uint160& a, const base_uint160& b) { return (base_uint160)a > (base_uint160)b; } -inline bool operator>=(const uint160& a, const base_uint160& b) { return (base_uint160)a >= (base_uint160)b; } -inline bool operator==(const uint160& a, const base_uint160& b) { return (base_uint160)a == (base_uint160)b; } -inline bool operator!=(const uint160& a, const base_uint160& b) { return (base_uint160)a != (base_uint160)b; } -inline const uint160 operator^(const uint160& a, const base_uint160& b) { return (base_uint160)a ^ (base_uint160)b; } -inline const uint160 operator&(const uint160& a, const base_uint160& b) { return (base_uint160)a & (base_uint160)b; } -inline const uint160 operator|(const uint160& a, const base_uint160& b) { return (base_uint160)a | (base_uint160)b; } -inline const uint160 operator+(const uint160& a, const base_uint160& b) { return (base_uint160)a + (base_uint160)b; } -inline const uint160 operator-(const uint160& a, const base_uint160& b) { return (base_uint160)a - (base_uint160)b; } - -inline bool operator<(const uint160& a, const uint160& b) { return (base_uint160)a < (base_uint160)b; } -inline bool operator<=(const uint160& a, const uint160& b) { return (base_uint160)a <= (base_uint160)b; } -inline bool operator>(const uint160& a, const uint160& b) { return (base_uint160)a > (base_uint160)b; } -inline bool operator>=(const uint160& a, const uint160& b) { return (base_uint160)a >= (base_uint160)b; } -inline bool operator==(const uint160& a, const uint160& b) { return (base_uint160)a == (base_uint160)b; } -inline bool operator!=(const uint160& a, const uint160& b) { return (base_uint160)a != (base_uint160)b; } -inline const uint160 operator^(const uint160& a, const uint160& b) { return (base_uint160)a ^ (base_uint160)b; } -inline const uint160 operator&(const uint160& a, const uint160& b) { return (base_uint160)a & (base_uint160)b; } -inline const uint160 operator|(const uint160& a, const uint160& b) { return (base_uint160)a | (base_uint160)b; } -inline const uint160 operator+(const uint160& a, const uint160& b) { return (base_uint160)a + (base_uint160)b; } -inline const uint160 operator-(const uint160& a, const uint160& b) { return (base_uint160)a - (base_uint160)b; } - - - - - - -////////////////////////////////////////////////////////////////////////////// -// -// uint256 -// - -/** 256-bit unsigned integer */ -class uint256 : public base_uint256 -{ +/** 256-bit unsigned big integer. */ +class uint256 : public base_uint<256> { public: - typedef base_uint256 basetype; - - uint256() - { - for (int i = 0; i < WIDTH; i++) - pn[i] = 0; - } - - uint256(const basetype& b) - { - for (int i = 0; i < WIDTH; i++) - pn[i] = b.pn[i]; - } - - uint256& operator=(const basetype& b) - { - for (int i = 0; i < WIDTH; i++) - pn[i] = b.pn[i]; - return *this; - } - - uint256(uint64_t b) - { - pn[0] = (unsigned int)b; - pn[1] = (unsigned int)(b >> 32); - for (int i = 2; i < WIDTH; i++) - pn[i] = 0; - } - - uint256& operator=(uint64_t b) - { - pn[0] = (unsigned int)b; - pn[1] = (unsigned int)(b >> 32); - for (int i = 2; i < WIDTH; i++) - pn[i] = 0; - return *this; - } - - explicit uint256(const std::string& str) - { - SetHex(str); - } - - explicit uint256(const std::vector& vch) - { - if (vch.size() == sizeof(pn)) - memcpy(pn, &vch[0], sizeof(pn)); - else - *this = 0; - } + uint256() {} + uint256(const base_uint<256>& b) : base_uint<256>(b) {} + uint256(uint64_t b) : base_uint<256>(b) {} + explicit uint256(const std::string& str) : base_uint<256>(str) {} + explicit uint256(const std::vector& vch) : base_uint<256>(vch) {} + + /** + * The "compact" format is a representation of a whole + * number N using an unsigned 32bit number similar to a + * floating point format. + * The most significant 8 bits are the unsigned exponent of base 256. + * This exponent can be thought of as "number of bytes of N". + * The lower 23 bits are the mantissa. + * Bit number 24 (0x800000) represents the sign of N. + * N = (-1^sign) * mantissa * 256^(exponent-3) + * + * Satoshi's original implementation used BN_bn2mpi() and BN_mpi2bn(). + * MPI uses the most significant bit of the first byte as sign. + * Thus 0x1234560000 is compact (0x05123456) + * and 0xc0de000000 is compact (0x0600c0de) + * + * Bitcoin only uses this "compact" format for encoding difficulty + * targets, which are unsigned 256bit quantities. Thus, all the + * complexities of the sign bit and using base 256 are probably an + * implementation accident. + */ + uint256& SetCompact(uint32_t nCompact, bool *pfNegative = NULL, bool *pfOverflow = NULL); + uint32_t GetCompact(bool fNegative = false) const; + uint64_t GetHash(const uint256& salt) const; }; -inline bool operator==(const uint256& a, uint64_t b) { return (base_uint256)a == b; } -inline bool operator!=(const uint256& a, uint64_t b) { return (base_uint256)a != b; } -inline const uint256 operator<<(const base_uint256& a, unsigned int shift) { return uint256(a) <<= shift; } -inline const uint256 operator>>(const base_uint256& a, unsigned int shift) { return uint256(a) >>= shift; } -inline const uint256 operator<<(const uint256& a, unsigned int shift) { return uint256(a) <<= shift; } -inline const uint256 operator>>(const uint256& a, unsigned int shift) { return uint256(a) >>= shift; } - -inline const uint256 operator^(const base_uint256& a, const base_uint256& b) { return uint256(a) ^= b; } -inline const uint256 operator&(const base_uint256& a, const base_uint256& b) { return uint256(a) &= b; } -inline const uint256 operator|(const base_uint256& a, const base_uint256& b) { return uint256(a) |= b; } -inline const uint256 operator+(const base_uint256& a, const base_uint256& b) { return uint256(a) += b; } -inline const uint256 operator-(const base_uint256& a, const base_uint256& b) { return uint256(a) -= b; } - -inline bool operator<(const base_uint256& a, const uint256& b) { return (base_uint256)a < (base_uint256)b; } -inline bool operator<=(const base_uint256& a, const uint256& b) { return (base_uint256)a <= (base_uint256)b; } -inline bool operator>(const base_uint256& a, const uint256& b) { return (base_uint256)a > (base_uint256)b; } -inline bool operator>=(const base_uint256& a, const uint256& b) { return (base_uint256)a >= (base_uint256)b; } -inline bool operator==(const base_uint256& a, const uint256& b) { return (base_uint256)a == (base_uint256)b; } -inline bool operator!=(const base_uint256& a, const uint256& b) { return (base_uint256)a != (base_uint256)b; } -inline const uint256 operator^(const base_uint256& a, const uint256& b) { return (base_uint256)a ^ (base_uint256)b; } -inline const uint256 operator&(const base_uint256& a, const uint256& b) { return (base_uint256)a & (base_uint256)b; } -inline const uint256 operator|(const base_uint256& a, const uint256& b) { return (base_uint256)a | (base_uint256)b; } -inline const uint256 operator+(const base_uint256& a, const uint256& b) { return (base_uint256)a + (base_uint256)b; } -inline const uint256 operator-(const base_uint256& a, const uint256& b) { return (base_uint256)a - (base_uint256)b; } - -inline bool operator<(const uint256& a, const base_uint256& b) { return (base_uint256)a < (base_uint256)b; } -inline bool operator<=(const uint256& a, const base_uint256& b) { return (base_uint256)a <= (base_uint256)b; } -inline bool operator>(const uint256& a, const base_uint256& b) { return (base_uint256)a > (base_uint256)b; } -inline bool operator>=(const uint256& a, const base_uint256& b) { return (base_uint256)a >= (base_uint256)b; } -inline bool operator==(const uint256& a, const base_uint256& b) { return (base_uint256)a == (base_uint256)b; } -inline bool operator!=(const uint256& a, const base_uint256& b) { return (base_uint256)a != (base_uint256)b; } -inline const uint256 operator^(const uint256& a, const base_uint256& b) { return (base_uint256)a ^ (base_uint256)b; } -inline const uint256 operator&(const uint256& a, const base_uint256& b) { return (base_uint256)a & (base_uint256)b; } -inline const uint256 operator|(const uint256& a, const base_uint256& b) { return (base_uint256)a | (base_uint256)b; } -inline const uint256 operator+(const uint256& a, const base_uint256& b) { return (base_uint256)a + (base_uint256)b; } -inline const uint256 operator-(const uint256& a, const base_uint256& b) { return (base_uint256)a - (base_uint256)b; } - -inline bool operator<(const uint256& a, const uint256& b) { return (base_uint256)a < (base_uint256)b; } -inline bool operator<=(const uint256& a, const uint256& b) { return (base_uint256)a <= (base_uint256)b; } -inline bool operator>(const uint256& a, const uint256& b) { return (base_uint256)a > (base_uint256)b; } -inline bool operator>=(const uint256& a, const uint256& b) { return (base_uint256)a >= (base_uint256)b; } -inline bool operator==(const uint256& a, const uint256& b) { return (base_uint256)a == (base_uint256)b; } -inline bool operator!=(const uint256& a, const uint256& b) { return (base_uint256)a != (base_uint256)b; } -inline const uint256 operator^(const uint256& a, const uint256& b) { return (base_uint256)a ^ (base_uint256)b; } -inline const uint256 operator&(const uint256& a, const uint256& b) { return (base_uint256)a & (base_uint256)b; } -inline const uint256 operator|(const uint256& a, const uint256& b) { return (base_uint256)a | (base_uint256)b; } -inline const uint256 operator+(const uint256& a, const uint256& b) { return (base_uint256)a + (base_uint256)b; } -inline const uint256 operator-(const uint256& a, const uint256& b) { return (base_uint256)a - (base_uint256)b; } - - - - - - - -////////////////////////////////////////////////////////////////////////////// -// -// uint512 -// - -/** 512-bit unsigned integer */ -class uint512 : public base_uint512 -{ +/** 512-bit unsigned big integer. */ +class uint512 : public base_uint<512> { public: - typedef base_uint512 basetype; - - uint512() - { - for (int i = 0; i < WIDTH; i++) - pn[i] = 0; - } - - uint512(const basetype& b) - { - for (int i = 0; i < WIDTH; i++) - pn[i] = b.pn[i]; - } - - uint512& operator=(const basetype& b) - { - for (int i = 0; i < WIDTH; i++) - pn[i] = b.pn[i]; - return *this; - } - - uint512(uint64_t b) - { - pn[0] = (unsigned int)b; - pn[1] = (unsigned int)(b >> 32); - for (int i = 2; i < WIDTH; i++) - pn[i] = 0; - } - - uint512& operator=(uint64_t b) - { - pn[0] = (unsigned int)b; - pn[1] = (unsigned int)(b >> 32); - for (int i = 2; i < WIDTH; i++) - pn[i] = 0; - return *this; - } - - explicit uint512(const std::string& str) - { - SetHex(str); - } - - explicit uint512(const std::vector& vch) - { - if (vch.size() == sizeof(pn)) - memcpy(pn, &vch[0], sizeof(pn)); - else - *this = 0; - } + uint512() {} + uint512(const base_uint<512>& b) : base_uint<512>(b) {} + uint512(uint64_t b) : base_uint<512>(b) {} + explicit uint512(const std::string& str) : base_uint<512>(str) {} + explicit uint512(const std::vector& vch) : base_uint<512>(vch) {} uint256 trim256() const { @@ -709,187 +361,4 @@ class uint512 : public base_uint512 } }; -inline bool operator==(const uint512& a, uint64_t b) { return (base_uint512)a == b; } -inline bool operator!=(const uint512& a, uint64_t b) { return (base_uint512)a != b; } -inline const uint512 operator<<(const base_uint512& a, unsigned int shift) { return uint512(a) <<= shift; } -inline const uint512 operator>>(const base_uint512& a, unsigned int shift) { return uint512(a) >>= shift; } -inline const uint512 operator<<(const uint512& a, unsigned int shift) { return uint512(a) <<= shift; } -inline const uint512 operator>>(const uint512& a, unsigned int shift) { return uint512(a) >>= shift; } - -inline const uint512 operator^(const base_uint512& a, const base_uint512& b) { return uint512(a) ^= b; } -inline const uint512 operator&(const base_uint512& a, const base_uint512& b) { return uint512(a) &= b; } -inline const uint512 operator|(const base_uint512& a, const base_uint512& b) { return uint512(a) |= b; } -inline const uint512 operator+(const base_uint512& a, const base_uint512& b) { return uint512(a) += b; } -inline const uint512 operator-(const base_uint512& a, const base_uint512& b) { return uint512(a) -= b; } - -inline bool operator<(const base_uint512& a, const uint512& b) { return (base_uint512)a < (base_uint512)b; } -inline bool operator<=(const base_uint512& a, const uint512& b) { return (base_uint512)a <= (base_uint512)b; } -inline bool operator>(const base_uint512& a, const uint512& b) { return (base_uint512)a > (base_uint512)b; } -inline bool operator>=(const base_uint512& a, const uint512& b) { return (base_uint512)a >= (base_uint512)b; } -inline bool operator==(const base_uint512& a, const uint512& b) { return (base_uint512)a == (base_uint512)b; } -inline bool operator!=(const base_uint512& a, const uint512& b) { return (base_uint512)a != (base_uint512)b; } -inline const uint512 operator^(const base_uint512& a, const uint512& b) { return (base_uint512)a ^ (base_uint512)b; } -inline const uint512 operator&(const base_uint512& a, const uint512& b) { return (base_uint512)a & (base_uint512)b; } -inline const uint512 operator|(const base_uint512& a, const uint512& b) { return (base_uint512)a | (base_uint512)b; } -inline const uint512 operator+(const base_uint512& a, const uint512& b) { return (base_uint512)a + (base_uint512)b; } -inline const uint512 operator-(const base_uint512& a, const uint512& b) { return (base_uint512)a - (base_uint512)b; } - -inline bool operator<(const uint512& a, const base_uint512& b) { return (base_uint512)a < (base_uint512)b; } -inline bool operator<=(const uint512& a, const base_uint512& b) { return (base_uint512)a <= (base_uint512)b; } -inline bool operator>(const uint512& a, const base_uint512& b) { return (base_uint512)a > (base_uint512)b; } -inline bool operator>=(const uint512& a, const base_uint512& b) { return (base_uint512)a >= (base_uint512)b; } -inline bool operator==(const uint512& a, const base_uint512& b) { return (base_uint512)a == (base_uint512)b; } -inline bool operator!=(const uint512& a, const base_uint512& b) { return (base_uint512)a != (base_uint512)b; } -inline const uint512 operator^(const uint512& a, const base_uint512& b) { return (base_uint512)a ^ (base_uint512)b; } -inline const uint512 operator&(const uint512& a, const base_uint512& b) { return (base_uint512)a & (base_uint512)b; } -inline const uint512 operator|(const uint512& a, const base_uint512& b) { return (base_uint512)a | (base_uint512)b; } -inline const uint512 operator+(const uint512& a, const base_uint512& b) { return (base_uint512)a + (base_uint512)b; } -inline const uint512 operator-(const uint512& a, const base_uint512& b) { return (base_uint512)a - (base_uint512)b; } - -inline bool operator<(const uint512& a, const uint512& b) { return (base_uint512)a < (base_uint512)b; } -inline bool operator<=(const uint512& a, const uint512& b) { return (base_uint512)a <= (base_uint512)b; } -inline bool operator>(const uint512& a, const uint512& b) { return (base_uint512)a > (base_uint512)b; } -inline bool operator>=(const uint512& a, const uint512& b) { return (base_uint512)a >= (base_uint512)b; } -inline bool operator==(const uint512& a, const uint512& b) { return (base_uint512)a == (base_uint512)b; } -inline bool operator!=(const uint512& a, const uint512& b) { return (base_uint512)a != (base_uint512)b; } -inline const uint512 operator^(const uint512& a, const uint512& b) { return (base_uint512)a ^ (base_uint512)b; } -inline const uint512 operator&(const uint512& a, const uint512& b) { return (base_uint512)a & (base_uint512)b; } -inline const uint512 operator|(const uint512& a, const uint512& b) { return (base_uint512)a | (base_uint512)b; } -inline const uint512 operator+(const uint512& a, const uint512& b) { return (base_uint512)a + (base_uint512)b; } -inline const uint512 operator-(const uint512& a, const uint512& b) { return (base_uint512)a - (base_uint512)b; } - -#ifdef TEST_UINT256 - -inline int Testuint256AdHoc(std::vector vArg) -{ - uint256 g(0); - - - LogPrintf("%s\n", g.ToString()); - g--; LogPrintf("g--\n"); - LogPrintf("%s\n", g.ToString()); - g--; LogPrintf("g--\n"); - LogPrintf("%s\n", g.ToString()); - g++; LogPrintf("g++\n"); - LogPrintf("%s\n", g.ToString()); - g++; LogPrintf("g++\n"); - LogPrintf("%s\n", g.ToString()); - g++; LogPrintf("g++\n"); - LogPrintf("%s\n", g.ToString()); - g++; LogPrintf("g++\n"); - LogPrintf("%s\n", g.ToString()); - - - - uint256 a(7); - LogPrintf("a=7\n"); - LogPrintf("%s\n", a.ToString()); - - uint256 b; - LogPrintf("b undefined\n"); - LogPrintf("%s\n", b.ToString()); - int c = 3; - - a = c; - a.pn[3] = 15; - LogPrintf("%s\n", a.ToString()); - uint256 k(c); - - a = 5; - a.pn[3] = 15; - LogPrintf("%s\n", a.ToString()); - b = 1; - b <<= 52; - - a |= b; - - a ^= 0x500; - - LogPrintf("a %s\n", a.ToString()); - - a = a | b | (uint256)0x1000; - - - LogPrintf("a %s\n", a.ToString()); - LogPrintf("b %s\n", b.ToString()); - - a = 0xfffffffe; - a.pn[4] = 9; - - LogPrintf("%s\n", a.ToString()); - a++; - LogPrintf("%s\n", a.ToString()); - a++; - LogPrintf("%s\n", a.ToString()); - a++; - LogPrintf("%s\n", a.ToString()); - a++; - LogPrintf("%s\n", a.ToString()); - - a--; - LogPrintf("%s\n", a.ToString()); - a--; - LogPrintf("%s\n", a.ToString()); - a--; - LogPrintf("%s\n", a.ToString()); - uint256 d = a--; - LogPrintf("%s\n", d.ToString()); - LogPrintf("%s\n", a.ToString()); - a--; - LogPrintf("%s\n", a.ToString()); - a--; - LogPrintf("%s\n", a.ToString()); - - d = a; - - LogPrintf("%s\n", d.ToString()); - for (int i = uint256::WIDTH-1; i >= 0; i--) LogPrintf("%08x", d.pn[i]); LogPrintf("\n"); - - uint256 neg = d; - neg = ~neg; - LogPrintf("%s\n", neg.ToString()); - - - uint256 e = uint256("0xABCDEF123abcdef12345678909832180000011111111"); - LogPrintf("\n"); - LogPrintf("%s\n", e.ToString()); - - - LogPrintf("\n"); - uint256 x1 = uint256("0xABCDEF123abcdef12345678909832180000011111111"); - uint256 x2; - LogPrintf("%s\n", x1.ToString()); - for (int i = 0; i < 270; i += 4) - { - x2 = x1 << i; - LogPrintf("%s\n", x2.ToString()); - } - - LogPrintf("\n"); - LogPrintf("%s\n", x1.ToString()); - for (int i = 0; i < 270; i += 4) - { - x2 = x1; - x2 >>= i; - LogPrintf("%s\n", x2.ToString()); - } - - - for (int i = 0; i < 100; i++) - { - uint256 k = (~uint256(0) >> i); - LogPrintf("%s\n", k.ToString()); - } - - for (int i = 0; i < 100; i++) - { - uint256 k = (~uint256(0) << i); - LogPrintf("%s\n", k.ToString()); - } - - return (0); -} - -#endif - -#endif +#endif // BITCOIN_UINT256_H diff --git a/src/util.cpp b/src/util.cpp index 3f2215be..f7e9bc2d 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -11,10 +11,10 @@ #include "chainparams.h" #include "sync.h" +#include "random.h" #include "ui_interface.h" #include "uint256.h" #include "version.h" -#include "netbase.h" #include "allocators.h" #include @@ -28,17 +28,6 @@ #include // for to_lower() #include #include // for startswith() and endswith() - -// Work around clang compilation problem in Boost 1.46: -// /usr/include/boost/program_options/detail/config_file.hpp:163:17: error: call to function 'to_internal' that is neither visible in the template definition nor found by argument-dependent lookup -// See also: http://stackoverflow.com/questions/10020179/compilation-fail-in-boost-librairies-program-options -// http://clang.debian.net/status.php?version=3.0&key=CANNOT_FIND_FUNCTION -namespace boost { - namespace program_options { - std::string to_internal(const std::string&); - } -} - #include #include #include @@ -47,7 +36,6 @@ namespace boost { #include #include #include -#include #include #ifdef WIN32 @@ -165,49 +153,6 @@ class CInit } instance_of_cinit; -bool GetRandBytes(unsigned char *buf, int num) -{ - if (RAND_bytes(buf, num) == 0) { - LogPrint("rand", "%s : OpenSSL RAND_bytes() failed with error: %s\n", __func__, ERR_error_string(ERR_get_error(), NULL)); - return false; - } - return true; -} - -void RandAddSeed() -{ - // Seed with CPU performance counter - int64_t nCounter = GetPerformanceCounter(); - RAND_add(&nCounter, sizeof(nCounter), 1.5); - memset(&nCounter, 0, sizeof(nCounter)); -} - -void RandAddSeedPerfmon() -{ - RandAddSeed(); - - // This can take up to 2 seconds, so only do it every 10 minutes - static int64_t nLastPerfmon; - if (GetTime() < nLastPerfmon + 10 * 60) - return; - nLastPerfmon = GetTime(); - -#ifdef WIN32 - // Don't need this on Linux, OpenSSL automatically uses /dev/urandom - // Seed with the entire set of perfmon data - unsigned char pdata[250000]; - memset(pdata, 0, sizeof(pdata)); - unsigned long nSize = sizeof(pdata); - long ret = RegQueryValueExA(HKEY_PERFORMANCE_DATA, "Global", NULL, NULL, pdata, &nSize); - RegCloseKey(HKEY_PERFORMANCE_DATA); - if (ret == ERROR_SUCCESS) - { - RAND_add(pdata, nSize, nSize/100.0); - OPENSSL_cleanse(pdata, nSize); - LogPrint("rand", "RandAddSeed() %lu bytes\n", nSize); - } -#endif -} unsigned char static HexVal(unsigned char c) { @@ -237,32 +182,6 @@ std::string Hex2Ascii(const std::string& in) return out; } -uint64_t GetRand(uint64_t nMax) -{ - if (nMax == 0) - return 0; - - // The range of the random source must be a multiple of the modulus - // to give every possible output value an equal possibility - uint64_t nRange = (std::numeric_limits::max() / nMax) * nMax; - uint64_t nRand = 0; - do { - GetRandBytes((unsigned char*)&nRand, sizeof(nRand)); - } while (nRand >= nRange); - return (nRand % nMax); -} - -int GetRandInt(int nMax) -{ - return GetRand(nMax); -} - -uint256 GetRandHash() -{ - uint256 hash; - GetRandBytes((unsigned char*)&hash, sizeof(hash)); - return hash; -} // LogPrintf() has been broken a couple of times now // by well-meaning people adding mutexes in the most straightforward way. @@ -1358,13 +1277,6 @@ void ShrinkDebugFile() fclose(file); } -// -// "Never go to sea with two chronometers; take one or three." -// Our three time sources are: -// - System clock -// - Median of other nodes clocks -// - The user (asking the user to fix the system clock if the first two disagree) -// static int64_t nMockTime = 0; // For unit testing int64_t GetTime() @@ -1379,95 +1291,6 @@ void SetMockTime(int64_t nMockTimeIn) nMockTime = nMockTimeIn; } -static CCriticalSection cs_nTimeOffset; -static int64_t nTimeOffset = 0; - -int64_t GetTimeOffset() -{ - LOCK(cs_nTimeOffset); - return nTimeOffset; -} - -int64_t GetAdjustedTime() -{ - return GetTime() + GetTimeOffset(); -} - -void AddTimeData(const CNetAddr& ip, int64_t nTime) -{ - int64_t nOffsetSample = nTime - GetTime(); - - LOCK(cs_nTimeOffset); - // Ignore duplicates - static set setKnown; - if (!setKnown.insert(ip).second) - return; - - // Add data - static CMedianFilter vTimeOffsets(200,0); - vTimeOffsets.input(nOffsetSample); - LogPrintf("Added time data, samples %d, offset %+d (%+d minutes)\n", vTimeOffsets.size(), nOffsetSample, nOffsetSample/60); - if (vTimeOffsets.size() >= 5 && vTimeOffsets.size() % 2 == 1) - { - int64_t nMedian = vTimeOffsets.median(); - std::vector vSorted = vTimeOffsets.sorted(); - // Only let other nodes change our time by so much - if (abs64(nMedian) < 70 * 60) - { - nTimeOffset = nMedian; - } - else - { - nTimeOffset = 0; - - static bool fDone; - if (!fDone) - { - // If nobody has a time different than ours but within 5 minutes of ours, give a warning - bool fMatch = false; - BOOST_FOREACH(int64_t nOffset, vSorted) - if (nOffset != 0 && abs64(nOffset) < 5 * 60) - fMatch = true; - - if (!fMatch) - { - fDone = true; - string strMessage = _("Warning: Please check that your computer's date and time are correct! If your clock is wrong DigitalNote will not work properly."); - strMiscWarning = strMessage; - LogPrintf("*** %s\n", strMessage); - uiInterface.ThreadSafeMessageBox(strMessage, "", CClientUIInterface::MSG_WARNING); - } - } - } - if (fDebug) { - BOOST_FOREACH(int64_t n, vSorted) - LogPrintf("%+d ", n); - LogPrintf("| "); - } - LogPrintf("nTimeOffset = %+d (%+d minutes)\n", nTimeOffset, nTimeOffset/60); - } -} -uint32_t insecure_rand_Rz = 11; -uint32_t insecure_rand_Rw = 11; -void seed_insecure_rand(bool fDeterministic) -{ - //The seed values have some unlikely fixed points which we avoid. - if(fDeterministic) - { - insecure_rand_Rz = insecure_rand_Rw = 11; - } else { - uint32_t tmp; - do{ - GetRandBytes((unsigned char*)&tmp,4); - }while(tmp==0 || tmp==0x9068ffffU); - insecure_rand_Rz=tmp; - do{ - GetRandBytes((unsigned char*)&tmp,4); - }while(tmp==0 || tmp==0x464fffffU); - insecure_rand_Rw=tmp; - } -} - #ifdef WIN32 boost::filesystem::path GetSpecialFolderPath(int nFolder, bool fCreate) { diff --git a/src/util.h b/src/util.h index 72c3aa63..05a01dee 100644 --- a/src/util.h +++ b/src/util.h @@ -45,7 +45,6 @@ #include -class CNetAddr; class uint256; static const int64_t COIN = 100000000; @@ -272,15 +271,8 @@ std::string getTimeString(int64_t timestamp, char *buffer, size_t nBuffer); std::string bytesReadable(uint64_t nBytes); void ShrinkDebugFile(); -bool GetRandBytes(unsigned char* buf, int num); -int GetRandInt(int nMax); -uint64_t GetRand(uint64_t nMax); -uint256 GetRandHash(); int64_t GetTime(); void SetMockTime(int64_t nMockTimeIn); -int64_t GetAdjustedTime(); -int64_t GetTimeOffset(); -void AddTimeData(const CNetAddr& ip, int64_t nTime); void runCommand(std::string strCommand); long hex2long(const char *hexString); @@ -386,18 +378,6 @@ inline std::string HexStr(const T& vch, bool fSpaces=false) return HexStr(vch.begin(), vch.end(), fSpaces); } -inline int64_t GetPerformanceCounter() -{ - int64_t nCounter = 0; -#ifdef WIN32 - QueryPerformanceCounter((LARGE_INTEGER*)&nCounter); -#else - timeval t; - gettimeofday(&t, NULL); - nCounter = (int64_t) t.tv_sec * 1000000 + t.tv_usec; -#endif - return nCounter; -} inline int64_t GetTimeMillis() { @@ -481,28 +461,6 @@ bool SoftSetArg(const std::string& strArg, const std::string& strValue); */ bool SoftSetBoolArg(const std::string& strArg, bool fValue); -/** - * MWC RNG of George Marsaglia - * This is intended to be fast. It has a period of 2^59.3, though the - * least significant 16 bits only have a period of about 2^30.1. - * - * @return random value - */ -extern uint32_t insecure_rand_Rz; -extern uint32_t insecure_rand_Rw; -static inline uint32_t insecure_rand(void) -{ - insecure_rand_Rz=36969*(insecure_rand_Rz&65535)+(insecure_rand_Rz>>16); - insecure_rand_Rw=18000*(insecure_rand_Rw&65535)+(insecure_rand_Rw>>16); - return (insecure_rand_Rw<<16)+insecure_rand_Rz; -} - -/** - * Seed insecure_rand using the random pool. - * @param Deterministic Use a determinstic seed - */ -void seed_insecure_rand(bool fDeterministic=false); - /** * Timing-attack-resistant comparison. * Takes time proportional to length diff --git a/src/wallet.cpp b/src/wallet.cpp index 7b799e37..a190c584 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -9,6 +9,7 @@ #include "coincontrol.h" #include "kernel.h" #include "net.h" +#include "timedata.h" #include "util.h" #include "txdb.h" #include "ui_interface.h" From 265097b96d557450f70267aba6155a0387e507d8 Mon Sep 17 00:00:00 2001 From: crytpoplissken Date: Mon, 16 Nov 2020 20:24:41 -0800 Subject: [PATCH 28/35] [BUILD] Add List Config at End of Configure --- configure.ac | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index d1bb3964..a07404eb 100644 --- a/configure.ac +++ b/configure.ac @@ -937,4 +937,30 @@ case $host in mv libtool-2 libtool chmod 755 libtool ;; -esac \ No newline at end of file +esac + +echo +echo "Options used to compile and link:" +echo " with wallet = $enable_wallet" +echo " with gui / qt = $bitcoin_enable_qt" +if test x$bitcoin_enable_qt != xno; then + echo " with qr = $use_qr" +fi +echo " with zmq = $use_zmq" +echo " with test = $use_tests" +dnl echo " with bench = $use_bench" +echo " with upnp = $use_upnp" +echo " debug enabled = $enable_debug" +echo " werror = $enable_werror" +echo +echo " target os = $TARGET_OS" +echo " build os = $BUILD_OS" +echo +echo " CC = $CC" +echo " CFLAGS = $CFLAGS" +echo " CPPFLAGS = $CPPFLAGS" +echo " CXX = $CXX" +echo " CXXFLAGS = $CXXFLAGS" +echo " LDFLAGS = $LDFLAGS" +echo " ARFLAGS = $ARFLAGS" +echo From ce5de715154f26a1164a8254c6301b599880161b Mon Sep 17 00:00:00 2001 From: vgulkevic Date: Tue, 17 Nov 2020 08:00:04 +0200 Subject: [PATCH 29/35] Update configure with changes from upstream --- Makefile.am | 10 +- build-aux/m4/ax_boost_base.m4 | 262 +-- build-aux/m4/ax_boost_filesystem.m4 | 7 +- build-aux/m4/ax_boost_system.m4 | 10 +- build-aux/m4/ax_boost_thread.m4 | 179 +- build-aux/m4/ax_boost_unit_test_framework.m4 | 13 +- build-aux/m4/ax_check_compile_flag.m4 | 506 +----- build-aux/m4/ax_check_link_flag.m4 | 13 +- build-aux/m4/ax_check_preproc_flag.m4 | 12 +- build-aux/m4/ax_cxx_compile_stdcxx.m4 | 995 ++++++++++- build-aux/m4/ax_gcc_func_attribute.m4 | 11 +- build-aux/m4/ax_pthread.m4 | 423 +++-- build-aux/m4/bitcoin_find_bdb48.m4 | 138 +- build-aux/m4/bitcoin_qt.m4 | 427 +++-- build-aux/m4/bitcoin_subdir_to_include.m4 | 4 + configure.ac | 1617 ++++++++++++++---- contrib/devtools/split-debug.sh.in | 10 + doc/{Doxyfile => Doxyfile.in} | 0 libtool | 2 +- src/config/bitcoin-config.h | 184 +- src/config/bitcoin-config.h.in | 182 +- src/miner.cpp | 31 +- src/rpcmining.cpp | 15 +- src/rpcserver.cpp | 3 +- src/rpcserver.h | 2 - src/rpcsmessage.cpp | 153 -- src/websocketpp/common/functional.hpp | 6 +- 27 files changed, 3434 insertions(+), 1781 deletions(-) create mode 100644 contrib/devtools/split-debug.sh.in rename doc/{Doxyfile => Doxyfile.in} (100%) diff --git a/Makefile.am b/Makefile.am index 97437761..aa4aa649 100644 --- a/Makefile.am +++ b/Makefile.am @@ -168,11 +168,11 @@ cov: test_bitcoin.coverage/.dirstamp total.coverage/.dirstamp endif -if USE_COMPARISON_TOOL -check-local: - $(MKDIR_P) qa/tmp - @qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool $(COMPARISON_TOOL_REORG_TESTS) 2>&1 -endif +#if USE_COMPARISON_TOOL +#check-local: +# $(MKDIR_P) qa/tmp +# @qa/pull-tester/run-bitcoind-for-test.sh $(JAVA) -jar $(JAVA_COMPARISON_TOOL) qa/tmp/compTool $(COMPARISON_TOOL_REORG_TESTS) 2>&1 +#endif EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/rpc-tests.sh qa/pull-tester/run-bitcoin-cli qa/rpc-tests $(DIST_DOCS) $(WINDOWS_PACKAGING) $(OSX_PACKAGING) diff --git a/build-aux/m4/ax_boost_base.m4 b/build-aux/m4/ax_boost_base.m4 index 3f24d5dd..2ae33f71 100644 --- a/build-aux/m4/ax_boost_base.m4 +++ b/build-aux/m4/ax_boost_base.m4 @@ -1,5 +1,5 @@ # =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_boost_base.html +# https://www.gnu.org/software/autoconf-archive/ax_boost_base.html # =========================================================================== # # SYNOPSIS @@ -33,7 +33,15 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 23 +#serial 48 + +# example boost program (need to pass version) +m4_define([_AX_BOOST_BASE_PROGRAM], + [AC_LANG_PROGRAM([[ +#include +]],[[ +(void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($1))])); +]])]) AC_DEFUN([AX_BOOST_BASE], [ @@ -44,110 +52,123 @@ AC_ARG_WITH([boost], or disable it (ARG=no) @<:@ARG=yes@:>@ ])], [ - if test "$withval" = "no"; then - want_boost="no" - elif test "$withval" = "yes"; then - want_boost="yes" - ac_boost_path="" - else - want_boost="yes" - ac_boost_path="$withval" - fi + AS_CASE([$withval], + [no],[want_boost="no";_AX_BOOST_BASE_boost_path=""], + [yes],[want_boost="yes";_AX_BOOST_BASE_boost_path=""], + [want_boost="yes";_AX_BOOST_BASE_boost_path="$withval"]) ], [want_boost="yes"]) AC_ARG_WITH([boost-libdir], - AS_HELP_STRING([--with-boost-libdir=LIB_DIR], - [Force given directory for boost libraries. Note that this will override library path detection, so use this parameter only if default library detection fails and you know exactly where your boost libraries are located.]), - [ - if test -d "$withval" - then - ac_boost_lib_path="$withval" - else - AC_MSG_ERROR(--with-boost-libdir expected directory name) - fi - ], - [ac_boost_lib_path=""] -) + [AS_HELP_STRING([--with-boost-libdir=LIB_DIR], + [Force given directory for boost libraries. + Note that this will override library path detection, + so use this parameter only if default library detection fails + and you know exactly where your boost libraries are located.])], + [ + AS_IF([test -d "$withval"], + [_AX_BOOST_BASE_boost_lib_path="$withval"], + [AC_MSG_ERROR([--with-boost-libdir expected directory name])]) + ], + [_AX_BOOST_BASE_boost_lib_path=""]) -if test "x$want_boost" = "xyes"; then - boost_lib_version_req=ifelse([$1], ,1.20.0,$1) - boost_lib_version_req_shorten=`expr $boost_lib_version_req : '\([[0-9]]*\.[[0-9]]*\)'` - boost_lib_version_req_major=`expr $boost_lib_version_req : '\([[0-9]]*\)'` - boost_lib_version_req_minor=`expr $boost_lib_version_req : '[[0-9]]*\.\([[0-9]]*\)'` - boost_lib_version_req_sub_minor=`expr $boost_lib_version_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` - if test "x$boost_lib_version_req_sub_minor" = "x" ; then - boost_lib_version_req_sub_minor="0" - fi - WANT_BOOST_VERSION=`expr $boost_lib_version_req_major \* 100000 \+ $boost_lib_version_req_minor \* 100 \+ $boost_lib_version_req_sub_minor` - AC_MSG_CHECKING(for boostlib >= $boost_lib_version_req) +BOOST_LDFLAGS="" +BOOST_CPPFLAGS="" +AS_IF([test "x$want_boost" = "xyes"], + [_AX_BOOST_BASE_RUNDETECT([$1],[$2],[$3])]) +AC_SUBST(BOOST_CPPFLAGS) +AC_SUBST(BOOST_LDFLAGS) +]) + + +# convert a version string in $2 to numeric and affect to polymorphic var $1 +AC_DEFUN([_AX_BOOST_BASE_TONUMERICVERSION],[ + AS_IF([test "x$2" = "x"],[_AX_BOOST_BASE_TONUMERICVERSION_req="1.20.0"],[_AX_BOOST_BASE_TONUMERICVERSION_req="$2"]) + _AX_BOOST_BASE_TONUMERICVERSION_req_shorten=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([[0-9]]*\.[[0-9]]*\)'` + _AX_BOOST_BASE_TONUMERICVERSION_req_major=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([[0-9]]*\)'` + AS_IF([test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_major" = "x"], + [AC_MSG_ERROR([You should at least specify libboost major version])]) + _AX_BOOST_BASE_TONUMERICVERSION_req_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[[0-9]]*\.\([[0-9]]*\)'` + AS_IF([test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_minor" = "x"], + [_AX_BOOST_BASE_TONUMERICVERSION_req_minor="0"]) + _AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` + AS_IF([test "X$_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor" = "X"], + [_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor="0"]) + _AX_BOOST_BASE_TONUMERICVERSION_RET=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req_major \* 100000 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_minor \* 100 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor` + AS_VAR_SET($1,$_AX_BOOST_BASE_TONUMERICVERSION_RET) +]) + +dnl Run the detection of boost should be run only if $want_boost +AC_DEFUN([_AX_BOOST_BASE_RUNDETECT],[ + _AX_BOOST_BASE_TONUMERICVERSION(WANT_BOOST_VERSION,[$1]) succeeded=no + + AC_REQUIRE([AC_CANONICAL_HOST]) dnl On 64-bit systems check for system libraries in both lib64 and lib. dnl The former is specified by FHS, but e.g. Debian does not adhere to dnl this (as it rises problems for generic multi-arch support). dnl The last entry in the list is chosen by default when no libraries dnl are found, e.g. when only header-only libraries are installed! - libsubdirs="lib" - ax_arch=`uname -m` - case $ax_arch in - x86_64) - libsubdirs="lib64 libx32 lib lib64" - ;; - ppc64|s390x|sparc64|aarch64) - libsubdirs="lib64 lib lib64" - ;; - esac + AS_CASE([${host_cpu}], + [x86_64],[libsubdirs="lib64 libx32 lib lib64"], + [mips*64*],[libsubdirs="lib64 lib32 lib lib64"], + [ppc64|powerpc64|s390x|sparc64|aarch64|ppc64le|powerpc64le|riscv64],[libsubdirs="lib64 lib lib64"], + [libsubdirs="lib"] + ) dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give dnl them priority over the other paths since, if libs are found there, they dnl are almost assuredly the ones desired. - AC_REQUIRE([AC_CANONICAL_HOST]) - libsubdirs="lib/${host_cpu}-${host_os} $libsubdirs" - - case ${host_cpu} in - i?86) - libsubdirs="lib/i386-${host_os} $libsubdirs" - ;; - esac - - dnl some arches may advertise a cpu type that doesn't line up with their - dnl prefix's cpu type. For example, uname may report armv7l while libs are - dnl installed to /usr/lib/arm-linux-gnueabihf. Try getting the compiler's - dnl value for an extra chance of finding the correct path. - libsubdirs="lib/`$CXX -dumpmachine 2>/dev/null` $libsubdirs" + AS_CASE([${host_cpu}], + [i?86],[multiarch_libsubdir="lib/i386-${host_os}"], + [armv7l],[multiarch_libsubdir="lib/arm-${host_os}"], + [multiarch_libsubdir="lib/${host_cpu}-${host_os}"] + ) dnl first we check the system location for boost libraries dnl this location ist chosen if boost libraries are installed with the --layout=system option dnl or if you install boost with RPM - if test "$ac_boost_path" != ""; then - BOOST_CPPFLAGS="-I$ac_boost_path/include" - for ac_boost_path_tmp in $libsubdirs; do - if test -d "$ac_boost_path"/"$ac_boost_path_tmp" ; then - BOOST_LDFLAGS="-L$ac_boost_path/$ac_boost_path_tmp" - break - fi - done - elif test "$cross_compiling" != yes; then - for ac_boost_path_tmp in /usr /usr/local /opt /opt/local ; do - if test -d "$ac_boost_path_tmp/include/boost" && test -r "$ac_boost_path_tmp/include/boost"; then - for libsubdir in $libsubdirs ; do - if ls "$ac_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi + AS_IF([test "x$_AX_BOOST_BASE_boost_path" != "x"],[ + AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) includes in "$_AX_BOOST_BASE_boost_path/include"]) + AS_IF([test -d "$_AX_BOOST_BASE_boost_path/include" && test -r "$_AX_BOOST_BASE_boost_path/include"],[ + AC_MSG_RESULT([yes]) + BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include" + for _AX_BOOST_BASE_boost_path_tmp in $multiarch_libsubdir $libsubdirs; do + AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) lib path in "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"]) + AS_IF([test -d "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" && test -r "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" ],[ + AC_MSG_RESULT([yes]) + BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"; + break; + ], + [AC_MSG_RESULT([no])]) + done],[ + AC_MSG_RESULT([no])]) + ],[ + if test X"$cross_compiling" = Xyes; then + search_libsubdirs=$multiarch_libsubdir + else + search_libsubdirs="$multiarch_libsubdir $libsubdirs" + fi + for _AX_BOOST_BASE_boost_path_tmp in /usr /usr/local /opt /opt/local ; do + if test -d "$_AX_BOOST_BASE_boost_path_tmp/include/boost" && test -r "$_AX_BOOST_BASE_boost_path_tmp/include/boost" ; then + for libsubdir in $search_libsubdirs ; do + if ls "$_AX_BOOST_BASE_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done - BOOST_LDFLAGS="-L$ac_boost_path_tmp/$libsubdir" - BOOST_CPPFLAGS="-I$ac_boost_path_tmp/include" + BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path_tmp/$libsubdir" + BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path_tmp/include" break; fi done - fi + ]) dnl overwrite ld flags if we have required special directory with dnl --with-boost-libdir parameter - if test "$ac_boost_lib_path" != ""; then - BOOST_LDFLAGS="-L$ac_boost_lib_path" - fi + AS_IF([test "x$_AX_BOOST_BASE_boost_lib_path" != "x"], + [BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_lib_path"]) + AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION)]) CPPFLAGS_SAVED="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" export CPPFLAGS @@ -158,19 +179,11 @@ if test "x$want_boost" = "xyes"; then AC_REQUIRE([AC_PROG_CXX]) AC_LANG_PUSH(C++) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - @%:@include - ]], [[ - #if BOOST_VERSION >= $WANT_BOOST_VERSION - // Everything is okay - #else - # error Boost version is too old - #endif - ]])],[ + AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[ AC_MSG_RESULT(yes) succeeded=yes found_system=yes - ],[: + ],[ ]) AC_LANG_POP([C++]) @@ -178,30 +191,50 @@ if test "x$want_boost" = "xyes"; then 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 - if test "x$succeeded" != "xyes"; then + if test "x$succeeded" != "xyes" ; then + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" + BOOST_CPPFLAGS= + if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then + BOOST_LDFLAGS= + fi _version=0 - if test "$ac_boost_path" != ""; then - if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then - for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do - _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` + if test -n "$_AX_BOOST_BASE_boost_path" ; then + if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path"; then + for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do + _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` - if test "$V_CHECK" = "1" ; then + if test "x$V_CHECK" = "x1" ; then _version=$_version_tmp fi VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` - BOOST_CPPFLAGS="-I$ac_boost_path/include/boost-$VERSION_UNDERSCORE" + BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include/boost-$VERSION_UNDERSCORE" done + dnl if nothing found search for layout used in Windows distributions + if test -z "$BOOST_CPPFLAGS"; then + if test -d "$_AX_BOOST_BASE_boost_path/boost" && test -r "$_AX_BOOST_BASE_boost_path/boost"; then + BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path" + fi + fi + dnl if we found something and BOOST_LDFLAGS was unset before + dnl (because "$_AX_BOOST_BASE_boost_lib_path" = ""), set it here. + if test -n "$BOOST_CPPFLAGS" && test -z "$BOOST_LDFLAGS"; then + for libsubdir in $libsubdirs ; do + if ls "$_AX_BOOST_BASE_boost_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi + done + BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$libsubdir" + fi fi else - if test "$cross_compiling" != yes; then - for ac_boost_path in /usr /usr/local /opt /opt/local ; do - if test -d "$ac_boost_path" && test -r "$ac_boost_path"; then - for i in `ls -d $ac_boost_path/include/boost-* 2>/dev/null`; do - _version_tmp=`echo $i | sed "s#$ac_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` + if test "x$cross_compiling" != "xyes" ; then + for _AX_BOOST_BASE_boost_path in /usr /usr/local /opt /opt/local ; do + if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path" ; then + for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do + _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` V_CHECK=`expr $_version_tmp \> $_version` - if test "$V_CHECK" = "1" ; then + if test "x$V_CHECK" = "x1" ; then _version=$_version_tmp - best_path=$ac_boost_path + best_path=$_AX_BOOST_BASE_boost_path fi done fi @@ -209,7 +242,7 @@ if test "x$want_boost" = "xyes"; then VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE" - if test "$ac_boost_lib_path" = ""; then + if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then for libsubdir in $libsubdirs ; do if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done @@ -217,7 +250,7 @@ if test "x$want_boost" = "xyes"; then fi fi - if test "x$BOOST_ROOT" != "x"; then + if test -n "$BOOST_ROOT" ; then for libsubdir in $libsubdirs ; do if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi done @@ -226,7 +259,7 @@ if test "x$want_boost" = "xyes"; then stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'` stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'` V_CHECK=`expr $stage_version_shorten \>\= $_version` - if test "$V_CHECK" = "1" -a "$ac_boost_lib_path" = "" ; then + if test "x$V_CHECK" = "x1" && test -z "$_AX_BOOST_BASE_boost_lib_path" ; then AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT) BOOST_CPPFLAGS="-I$BOOST_ROOT" BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir" @@ -241,34 +274,24 @@ if test "x$want_boost" = "xyes"; then export LDFLAGS AC_LANG_PUSH(C++) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - @%:@include - ]], [[ - #if BOOST_VERSION >= $WANT_BOOST_VERSION - // Everything is okay - #else - # error Boost version is too old - #endif - ]])],[ + AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[ AC_MSG_RESULT(yes) succeeded=yes found_system=yes - ],[: + ],[ ]) AC_LANG_POP([C++]) fi - if test "$succeeded" != "yes" ; then - if test "$_version" = "0" ; then - AC_MSG_NOTICE([[We could not detect the boost libraries (version $boost_lib_version_req_shorten or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation.]]) + if test "x$succeeded" != "xyes" ; then + if test "x$_version" = "x0" ; then + AC_MSG_NOTICE([[We could not detect the boost libraries (version $1 or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation.]]) else AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).]) fi # execute ACTION-IF-NOT-FOUND (if present): ifelse([$3], , :, [$3]) else - AC_SUBST(BOOST_CPPFLAGS) - AC_SUBST(BOOST_LDFLAGS) AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available]) # execute ACTION-IF-FOUND (if present): ifelse([$2], , :, [$2]) @@ -276,6 +299,5 @@ if test "x$want_boost" = "xyes"; then CPPFLAGS="$CPPFLAGS_SAVED" LDFLAGS="$LDFLAGS_SAVED" -fi ]) diff --git a/build-aux/m4/ax_boost_filesystem.m4 b/build-aux/m4/ax_boost_filesystem.m4 index f5c9d564..12f7bc5e 100644 --- a/build-aux/m4/ax_boost_filesystem.m4 +++ b/build-aux/m4/ax_boost_filesystem.m4 @@ -1,5 +1,5 @@ # =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_boost_filesystem.html +# https://www.gnu.org/software/autoconf-archive/ax_boost_filesystem.html # =========================================================================== # # SYNOPSIS @@ -31,7 +31,7 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 26 +#serial 28 AC_DEFUN([AX_BOOST_FILESYSTEM], [ @@ -80,7 +80,6 @@ AC_DEFUN([AX_BOOST_FILESYSTEM], if test "x$ax_cv_boost_filesystem" = "xyes"; then AC_DEFINE(HAVE_BOOST_FILESYSTEM,,[define if the Boost::Filesystem library is available]) BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` - ax_lib= if test "x$ax_boost_user_filesystem_lib" = "x"; then for libextension in `ls -r $BOOSTLIBDIR/libboost_filesystem* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'` ; do ax_lib=${libextension} @@ -105,7 +104,7 @@ AC_DEFUN([AX_BOOST_FILESYSTEM], fi if test "x$ax_lib" = "x"; then - AC_MSG_ERROR(Could not find a version of the boost_filesystem library!) + AC_MSG_ERROR(Could not find a version of the Boost::Filesystem library!) fi if test "x$link_filesystem" != "xyes"; then AC_MSG_ERROR(Could not link against $ax_lib !) diff --git a/build-aux/m4/ax_boost_system.m4 b/build-aux/m4/ax_boost_system.m4 index 9c78280f..323e2a67 100644 --- a/build-aux/m4/ax_boost_system.m4 +++ b/build-aux/m4/ax_boost_system.m4 @@ -1,5 +1,5 @@ # =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_boost_system.html +# https://www.gnu.org/software/autoconf-archive/ax_boost_system.html # =========================================================================== # # SYNOPSIS @@ -31,7 +31,7 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 17 +#serial 20 AC_DEFUN([AX_BOOST_SYSTEM], [ @@ -68,9 +68,10 @@ AC_DEFUN([AX_BOOST_SYSTEM], ax_cv_boost_system, [AC_LANG_PUSH([C++]) CXXFLAGS_SAVE=$CXXFLAGS + CXXFLAGS= AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], - [[boost::system::system_category]])], + [[boost::system::error_category *a = 0;]])], ax_cv_boost_system=yes, ax_cv_boost_system=no) CXXFLAGS=$CXXFLAGS_SAVE AC_LANG_POP([C++]) @@ -83,7 +84,6 @@ AC_DEFUN([AX_BOOST_SYSTEM], LDFLAGS_SAVE=$LDFLAGS if test "x$ax_boost_user_system_lib" = "x"; then - ax_lib= for libextension in `ls -r $BOOSTLIBDIR/libboost_system* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'` ; do ax_lib=${libextension} AC_CHECK_LIB($ax_lib, exit, @@ -108,7 +108,7 @@ AC_DEFUN([AX_BOOST_SYSTEM], fi if test "x$ax_lib" = "x"; then - AC_MSG_ERROR(Could not find a version of the boost_system library!) + AC_MSG_ERROR(Could not find a version of the Boost::System library!) fi if test "x$link_system" = "xno"; then AC_MSG_ERROR(Could not link against $ax_lib !) diff --git a/build-aux/m4/ax_boost_thread.m4 b/build-aux/m4/ax_boost_thread.m4 index 9f0bd0b2..75e80e6e 100644 --- a/build-aux/m4/ax_boost_thread.m4 +++ b/build-aux/m4/ax_boost_thread.m4 @@ -1,5 +1,5 @@ # =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_boost_thread.html +# https://www.gnu.org/software/autoconf-archive/ax_boost_thread.html # =========================================================================== # # SYNOPSIS @@ -30,73 +30,96 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 27 +#serial 33 AC_DEFUN([AX_BOOST_THREAD], [ - AC_ARG_WITH([boost-thread], - AS_HELP_STRING([--with-boost-thread@<:@=special-lib@:>@], - [use the Thread library from boost - it is possible to specify a certain library for the linker - e.g. --with-boost-thread=boost_thread-gcc-mt ]), + AC_ARG_WITH([boost-thread], + AS_HELP_STRING([--with-boost-thread@<:@=special-lib@:>@], + [use the Thread library from boost - + it is possible to specify a certain library for the linker + e.g. --with-boost-thread=boost_thread-gcc-mt ]), [ - if test "$withval" = "no"; then - want_boost="no" - elif test "$withval" = "yes"; then + if test "$withval" = "yes"; then want_boost="yes" ax_boost_user_thread_lib="" else - want_boost="yes" - ax_boost_user_thread_lib="$withval" - fi + want_boost="yes" + ax_boost_user_thread_lib="$withval" + fi ], [want_boost="yes"] - ) + ) - if test "x$want_boost" = "xyes"; then + if test "x$want_boost" = "xyes"; then AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([AC_CANONICAL_BUILD]) - CPPFLAGS_SAVED="$CPPFLAGS" - CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" - export CPPFLAGS + CPPFLAGS_SAVED="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" + export CPPFLAGS - LDFLAGS_SAVED="$LDFLAGS" - LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" - export LDFLAGS + LDFLAGS_SAVED="$LDFLAGS" + LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" + export LDFLAGS AC_CACHE_CHECK(whether the Boost::Thread library is available, - ax_cv_boost_thread, + ax_cv_boost_thread, [AC_LANG_PUSH([C++]) - CXXFLAGS_SAVE=$CXXFLAGS + CXXFLAGS_SAVE=$CXXFLAGS + + case "x$host_os" in + xsolaris ) + CXXFLAGS="-pthreads $CXXFLAGS" + break; + ;; + xmingw32 ) + CXXFLAGS="-mthreads $CXXFLAGS" + break; + ;; + *android* ) + break; + ;; + * ) + CXXFLAGS="-pthread $CXXFLAGS" + break; + ;; + esac - if test "x$host_os" = "xsolaris" ; then - CXXFLAGS="-pthreads $CXXFLAGS" - elif test "x$host_os" = "xmingw32" ; then - CXXFLAGS="-mthreads $CXXFLAGS" - else - CXXFLAGS="-pthread $CXXFLAGS" - fi - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], - [[boost::thread_group thrds; - return 0;]])], - ax_cv_boost_thread=yes, ax_cv_boost_thread=no) - CXXFLAGS=$CXXFLAGS_SAVE + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM( + [[@%:@include ]], + [[boost::thread_group thrds; + return 0;]])], + ax_cv_boost_thread=yes, ax_cv_boost_thread=no) + CXXFLAGS=$CXXFLAGS_SAVE AC_LANG_POP([C++]) - ]) - if test "x$ax_cv_boost_thread" = "xyes"; then - if test "x$host_os" = "xsolaris" ; then - BOOST_CPPFLAGS="-pthreads $BOOST_CPPFLAGS" - elif test "x$host_os" = "xmingw32" ; then - BOOST_CPPFLAGS="-mthreads $BOOST_CPPFLAGS" - else - BOOST_CPPFLAGS="-pthread $BOOST_CPPFLAGS" - fi + ]) + if test "x$ax_cv_boost_thread" = "xyes"; then + case "x$host_os" in + xsolaris ) + BOOST_CPPFLAGS="-pthreads $BOOST_CPPFLAGS" + break; + ;; + xmingw32 ) + BOOST_CPPFLAGS="-mthreads $BOOST_CPPFLAGS" + break; + ;; + *android* ) + break; + ;; + * ) + BOOST_CPPFLAGS="-pthread $BOOST_CPPFLAGS" + break; + ;; + esac - AC_SUBST(BOOST_CPPFLAGS) + AC_SUBST(BOOST_CPPFLAGS) - AC_DEFINE(HAVE_BOOST_THREAD,,[define if the Boost::Thread library is available]) + AC_DEFINE(HAVE_BOOST_THREAD,, + [define if the Boost::Thread library is available]) BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` - LDFLAGS_SAVE=$LDFLAGS + LDFLAGS_SAVE=$LDFLAGS case "x$host_os" in *bsd* ) LDFLAGS="-pthread $LDFLAGS" @@ -104,47 +127,61 @@ AC_DEFUN([AX_BOOST_THREAD], ;; esac if test "x$ax_boost_user_thread_lib" = "x"; then - ax_lib= for libextension in `ls -r $BOOSTLIBDIR/libboost_thread* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'`; do ax_lib=${libextension} - AC_CHECK_LIB($ax_lib, exit, - [BOOST_THREAD_LIB="-l$ax_lib"; AC_SUBST(BOOST_THREAD_LIB) link_thread="yes"; break], + AC_CHECK_LIB($ax_lib, exit, + [link_thread="yes"; break], [link_thread="no"]) - done + done if test "x$link_thread" != "xyes"; then for libextension in `ls -r $BOOSTLIBDIR/boost_thread* 2>/dev/null | sed 's,.*/,,' | sed 's,\..*,,'`; do ax_lib=${libextension} - AC_CHECK_LIB($ax_lib, exit, - [BOOST_THREAD_LIB="-l$ax_lib"; AC_SUBST(BOOST_THREAD_LIB) link_thread="yes"; break], + AC_CHECK_LIB($ax_lib, exit, + [link_thread="yes"; break], [link_thread="no"]) - done + done fi else for ax_lib in $ax_boost_user_thread_lib boost_thread-$ax_boost_user_thread_lib; do - AC_CHECK_LIB($ax_lib, exit, - [BOOST_THREAD_LIB="-l$ax_lib"; AC_SUBST(BOOST_THREAD_LIB) link_thread="yes"; break], + AC_CHECK_LIB($ax_lib, exit, + [link_thread="yes"; break], [link_thread="no"]) done fi if test "x$ax_lib" = "x"; then - AC_MSG_ERROR(Could not find a version of the boost_thread library!) + AC_MSG_ERROR(Could not find a version of the Boost::Thread library!) fi - if test "x$link_thread" = "xno"; then - AC_MSG_ERROR(Could not link against $ax_lib !) - else - case "x$host_os" in - *bsd* ) - BOOST_LDFLAGS="-pthread $BOOST_LDFLAGS" - break; - ;; - esac - - fi - fi + if test "x$link_thread" = "xno"; then + AC_MSG_ERROR(Could not link against $ax_lib !) + else + BOOST_THREAD_LIB="-l$ax_lib" + case "x$host_os" in + *bsd* ) + BOOST_LDFLAGS="-pthread $BOOST_LDFLAGS" + break; + ;; + xsolaris ) + BOOST_THREAD_LIB="$BOOST_THREAD_LIB -lpthread" + break; + ;; + xmingw32 ) + break; + ;; + *android* ) + break; + ;; + * ) + BOOST_THREAD_LIB="$BOOST_THREAD_LIB -lpthread" + break; + ;; + esac + AC_SUBST(BOOST_THREAD_LIB) + fi + fi - CPPFLAGS="$CPPFLAGS_SAVED" - LDFLAGS="$LDFLAGS_SAVED" - fi + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" + fi ]) diff --git a/build-aux/m4/ax_boost_unit_test_framework.m4 b/build-aux/m4/ax_boost_unit_test_framework.m4 index 4efd1e2f..4cca32fc 100644 --- a/build-aux/m4/ax_boost_unit_test_framework.m4 +++ b/build-aux/m4/ax_boost_unit_test_framework.m4 @@ -1,6 +1,6 @@ -# ================================================================================ -# http://www.gnu.org/software/autoconf-archive/ax_boost_unit_test_framework.html -# ================================================================================ +# ================================================================================= +# https://www.gnu.org/software/autoconf-archive/ax_boost_unit_test_framework.html +# ================================================================================= # # SYNOPSIS # @@ -29,7 +29,7 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 19 +#serial 22 AC_DEFUN([AX_BOOST_UNIT_TEST_FRAMEWORK], [ @@ -66,7 +66,7 @@ AC_DEFUN([AX_BOOST_UNIT_TEST_FRAMEWORK], [AC_LANG_PUSH([C++]) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], [[using boost::unit_test::test_suite; - test_suite* test= BOOST_TEST_SUITE( "Unit test example 1" ); return 0;]])], + test_suite* test= BOOST_TEST_SUITE( "Unit test example 1" ); if (test == NULL) { return 1; } else { return 0; }]])], ax_cv_boost_unit_test_framework=yes, ax_cv_boost_unit_test_framework=no) AC_LANG_POP([C++]) ]) @@ -76,7 +76,6 @@ AC_DEFUN([AX_BOOST_UNIT_TEST_FRAMEWORK], if test "x$ax_boost_user_unit_test_framework_lib" = "x"; then saved_ldflags="${LDFLAGS}" - ax_lib= for monitor_library in `ls $BOOSTLIBDIR/libboost_unit_test_framework*.so* $BOOSTLIBDIR/libboost_unit_test_framework*.dylib* $BOOSTLIBDIR/libboost_unit_test_framework*.a* 2>/dev/null` ; do if test -r $monitor_library ; then libextension=`echo $monitor_library | sed 's,.*/,,' | sed -e 's;^lib\(boost_unit_test_framework.*\)\.so.*$;\1;' -e 's;^lib\(boost_unit_test_framework.*\)\.dylib.*$;\1;' -e 's;^lib\(boost_unit_test_framework.*\)\.a.*$;\1;'` @@ -125,7 +124,7 @@ AC_DEFUN([AX_BOOST_UNIT_TEST_FRAMEWORK], done fi if test "x$ax_lib" = "x"; then - AC_MSG_ERROR(Could not find a version of the boost_unit_test_framework library!) + AC_MSG_ERROR(Could not find a version of the Boost::Unit_Test_Framework library!) fi if test "x$link_unit_test_framework" != "xyes"; then AC_MSG_ERROR(Could not link against $ax_lib !) diff --git a/build-aux/m4/ax_check_compile_flag.m4 b/build-aux/m4/ax_check_compile_flag.m4 index f2c0263b..ca363971 100644 --- a/build-aux/m4/ax_check_compile_flag.m4 +++ b/build-aux/m4/ax_check_compile_flag.m4 @@ -1,466 +1,74 @@ # =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html +# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html # =========================================================================== # # SYNOPSIS # -# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional]) +# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) # # DESCRIPTION # -# Check for baseline language coverage in the compiler for the specified -# version of the C++ standard. If necessary, add switches to CXX and -# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard) -# or '14' (for the C++14 standard). +# Check whether the given FLAG works with the current language's compiler +# or gives an error. (Warnings, however, are ignored) # -# The second argument, if specified, indicates whether you insist on an -# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. -# -std=c++11). If neither is specified, you get whatever works, with -# preference for an extended mode. +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. # -# The third argument, if specified 'mandatory' or if left unspecified, -# indicates that baseline support for the specified C++ standard is -# required and that the macro should error out if no mode with that -# support is found. If specified 'optional', then configuration proceeds -# regardless, after defining HAVE_CXX${VERSION} if and only if a -# supporting mode is found. +# If EXTRA-FLAGS is defined, it is added to the current language's default +# flags (e.g. CFLAGS) when the check is done. The check is thus made with +# 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. +# +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. # # LICENSE # -# Copyright (c) 2008 Benjamin Kosnik -# Copyright (c) 2012 Zack Weinberg -# Copyright (c) 2013 Roy Stogner -# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov -# Copyright (c) 2015 Paul Norman -# Copyright (c) 2015 Moritz Klammler +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . # -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. #serial 4 -dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro -dnl (serial version number 13). - -AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl - m4_if([$1], [11], [], - [$1], [14], [], - [$1], [17], [m4_fatal([support for C++17 not yet implemented in AX_CXX_COMPILE_STDCXX])], - [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl - m4_if([$2], [], [], - [$2], [ext], [], - [$2], [noext], [], - [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl - m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true], - [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], - [$3], [optional], [ax_cxx_compile_cxx$1_required=false], - [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) - m4_if([$4], [], [ax_cxx_compile_cxx$1_try_default=true], - [$4], [default], [ax_cxx_compile_cxx$1_try_default=true], - [$4], [nodefault], [ax_cxx_compile_cxx$1_try_default=false], - [m4_fatal([invalid fourth argument `$4' to AX_CXX_COMPILE_STDCXX])]) - AC_LANG_PUSH([C++])dnl - ac_success=no - m4_if([$4], [nodefault], [], [dnl - AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, - ax_cv_cxx_compile_cxx$1, - [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], - [ax_cv_cxx_compile_cxx$1=yes], - [ax_cv_cxx_compile_cxx$1=no])]) - if test x$ax_cv_cxx_compile_cxx$1 = xyes; then - ac_success=yes - fi]) - m4_if([$2], [noext], [], [dnl - if test x$ac_success = xno; then - for switch in -std=gnu++$1 -std=gnu++0x; do - cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) - AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, - $cachevar, - [ac_save_CXX="$CXX" - CXX="$CXX $switch" - AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], - [eval $cachevar=yes], - [eval $cachevar=no]) - CXX="$ac_save_CXX"]) - if eval test x\$$cachevar = xyes; then - CXX="$CXX $switch" - if test -n "$CXXCPP" ; then - CXXCPP="$CXXCPP $switch" - fi - ac_success=yes - break - fi - done - fi]) - m4_if([$2], [ext], [], [dnl - if test x$ac_success = xno; then - dnl HP's aCC needs +std=c++11 according to: - dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf - dnl Cray's crayCC needs "-h std=c++11" - for switch in -std=c++$1 -std=c++0x +std=c++$1 "-h std=c++$1"; do - cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) - AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, - $cachevar, - [ac_save_CXX="$CXX" - CXX="$CXX $switch" - AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], - [eval $cachevar=yes], - [eval $cachevar=no]) - CXX="$ac_save_CXX"]) - if eval test x\$$cachevar = xyes; then - CXX="$CXX $switch" - if test -n "$CXXCPP" ; then - CXXCPP="$CXXCPP $switch" - fi - ac_success=yes - break - fi - done - fi]) - AC_LANG_POP([C++]) - if test x$ax_cxx_compile_cxx$1_required = xtrue; then - if test x$ac_success = xno; then - AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) - fi - fi - if test x$ac_success = xno; then - HAVE_CXX$1=0 - AC_MSG_NOTICE([No compiler with C++$1 support was found]) - else - HAVE_CXX$1=1 - AC_DEFINE(HAVE_CXX$1,1, - [define if the compiler supports basic C++$1 syntax]) - fi - AC_SUBST(HAVE_CXX$1) -]) - - -dnl Test body for checking C++11 support - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 -) - - -dnl Test body for checking C++14 support - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], - _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 - _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 -) - - -dnl Tests for new features in C++11 - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ -// If the compiler admits that it is not ready for C++11, why torture it? -// Hopefully, this will speed up the test. -#ifndef __cplusplus -#error "This is not a C++ compiler" -#elif __cplusplus < 201103L -#error "This is not a C++11 compiler" -#else -namespace cxx11 -{ - namespace test_static_assert - { - template - struct check - { - static_assert(sizeof(int) <= sizeof(T), "not big enough"); - }; - } - namespace test_final_override - { - struct Base - { - virtual void f() {} - }; - struct Derived : public Base - { - virtual void f() override {} - }; - } - namespace test_double_right_angle_brackets - { - template < typename T > - struct check {}; - typedef check single_type; - typedef check> double_type; - typedef check>> triple_type; - typedef check>>> quadruple_type; - } - namespace test_decltype - { - int - f() - { - int a = 1; - decltype(a) b = 2; - return a + b; - } - } - namespace test_type_deduction - { - template < typename T1, typename T2 > - struct is_same - { - static const bool value = false; - }; - template < typename T > - struct is_same - { - static const bool value = true; - }; - template < typename T1, typename T2 > - auto - add(T1 a1, T2 a2) -> decltype(a1 + a2) - { - return a1 + a2; - } - int - test(const int c, volatile int v) - { - static_assert(is_same::value == true, ""); - static_assert(is_same::value == false, ""); - static_assert(is_same::value == false, ""); - auto ac = c; - auto av = v; - auto sumi = ac + av + 'x'; - auto sumf = ac + av + 1.0; - static_assert(is_same::value == true, ""); - static_assert(is_same::value == true, ""); - static_assert(is_same::value == true, ""); - static_assert(is_same::value == false, ""); - static_assert(is_same::value == true, ""); - return (sumf > 0.0) ? sumi : add(c, v); - } - } - namespace test_noexcept - { - int f() { return 0; } - int g() noexcept { return 0; } - static_assert(noexcept(f()) == false, ""); - static_assert(noexcept(g()) == true, ""); - } - namespace test_constexpr - { - template < typename CharT > - unsigned long constexpr - strlen_c_r(const CharT *const s, const unsigned long acc) noexcept - { - return *s ? strlen_c_r(s + 1, acc + 1) : acc; - } - template < typename CharT > - unsigned long constexpr - strlen_c(const CharT *const s) noexcept - { - return strlen_c_r(s, 0UL); - } - static_assert(strlen_c("") == 0UL, ""); - static_assert(strlen_c("1") == 1UL, ""); - static_assert(strlen_c("example") == 7UL, ""); - static_assert(strlen_c("another\0example") == 7UL, ""); - } - namespace test_rvalue_references - { - template < int N > - struct answer - { - static constexpr int value = N; - }; - answer<1> f(int&) { return answer<1>(); } - answer<2> f(const int&) { return answer<2>(); } - answer<3> f(int&&) { return answer<3>(); } - void - test() - { - int i = 0; - const int c = 0; - static_assert(decltype(f(i))::value == 1, ""); - static_assert(decltype(f(c))::value == 2, ""); - static_assert(decltype(f(0))::value == 3, ""); - } - } - namespace test_uniform_initialization - { - struct test - { - static const int zero {}; - static const int one {1}; - }; - static_assert(test::zero == 0, ""); - static_assert(test::one == 1, ""); - } - namespace test_lambdas - { - void - test1() - { - auto lambda1 = [](){}; - auto lambda2 = lambda1; - lambda1(); - lambda2(); - } - int - test2() - { - auto a = [](int i, int j){ return i + j; }(1, 2); - auto b = []() -> int { return '0'; }(); - auto c = [=](){ return a + b; }(); - auto d = [&](){ return c; }(); - auto e = [a, &b](int x) mutable { - const auto identity = [](int y){ return y; }; - for (auto i = 0; i < a; ++i) - a += b--; - return x + identity(a + b); - }(0); - return a + b + c + d + e; - } - int - test3() - { - const auto nullary = [](){ return 0; }; - const auto unary = [](int x){ return x; }; - using nullary_t = decltype(nullary); - using unary_t = decltype(unary); - const auto higher1st = [](nullary_t f){ return f(); }; - const auto higher2nd = [unary](nullary_t f1){ - return [unary, f1](unary_t f2){ return f2(unary(f1())); }; - }; - return higher1st(nullary) + higher2nd(nullary)(unary); - } - } - namespace test_variadic_templates - { - template - struct sum; - template - struct sum - { - static constexpr auto value = N0 + sum::value; - }; - template <> - struct sum<> - { - static constexpr auto value = 0; - }; - static_assert(sum<>::value == 0, ""); - static_assert(sum<1>::value == 1, ""); - static_assert(sum<23>::value == 23, ""); - static_assert(sum<1, 2>::value == 3, ""); - static_assert(sum<5, 5, 11>::value == 21, ""); - static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); - } - // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae - // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function - // because of this. - namespace test_template_alias_sfinae - { - struct foo {}; - template - using member = typename T::member_type; - template - void func(...) {} - template - void func(member*) {} - void test(); - void test() { func(0); } - } -} // namespace cxx11 -#endif // __cplusplus >= 201103L -]]) - - -dnl Tests for new features in C++14 - -m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ -// If the compiler admits that it is not ready for C++14, why torture it? -// Hopefully, this will speed up the test. -#ifndef __cplusplus -#error "This is not a C++ compiler" -#elif __cplusplus < 201402L -#error "This is not a C++14 compiler" -#else -namespace cxx14 -{ - namespace test_polymorphic_lambdas - { - int - test() - { - const auto lambda = [](auto&&... args){ - const auto istiny = [](auto x){ - return (sizeof(x) == 1UL) ? 1 : 0; - }; - const int aretiny[] = { istiny(args)... }; - return aretiny[0]; - }; - return lambda(1, 1L, 1.0f, '1'); - } - } - namespace test_binary_literals - { - constexpr auto ivii = 0b0000000000101010; - static_assert(ivii == 42, "wrong value"); - } - namespace test_generalized_constexpr - { - template < typename CharT > - constexpr unsigned long - strlen_c(const CharT *const s) noexcept - { - auto length = 0UL; - for (auto p = s; *p; ++p) - ++length; - return length; - } - static_assert(strlen_c("") == 0UL, ""); - static_assert(strlen_c("x") == 1UL, ""); - static_assert(strlen_c("test") == 4UL, ""); - static_assert(strlen_c("another\0test") == 7UL, ""); - } - namespace test_lambda_init_capture - { - int - test() - { - auto x = 0; - const auto lambda1 = [a = x](int b){ return a + b; }; - const auto lambda2 = [a = lambda1(x)](){ return a; }; - return lambda2(); - } - } - namespace test_digit_seperators - { - constexpr auto ten_million = 100'000'000; - static_assert(ten_million == 100000000, ""); - } - namespace test_return_type_deduction - { - auto f(int& x) { return x; } - decltype(auto) g(int& x) { return x; } - template < typename T1, typename T2 > - struct is_same - { - static constexpr auto value = false; - }; - template < typename T > - struct is_same - { - static constexpr auto value = true; - }; - int - test() - { - auto x = 0; - static_assert(is_same::value, ""); - static_assert(is_same::value, ""); - return x; - } - } -} // namespace cxx14 -#endif // __cplusplus >= 201402L -]]) \ No newline at end of file +AC_DEFUN([AX_CHECK_COMPILE_FLAG], +[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 +AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ + ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS + _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" + AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) +AS_VAR_IF(CACHEVAR,yes, + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_COMPILE_FLAGS diff --git a/build-aux/m4/ax_check_link_flag.m4 b/build-aux/m4/ax_check_link_flag.m4 index e2d0d363..eb01a6ce 100644 --- a/build-aux/m4/ax_check_link_flag.m4 +++ b/build-aux/m4/ax_check_link_flag.m4 @@ -4,7 +4,7 @@ # # 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 # @@ -19,6 +19,8 @@ # EXTRA-FLAGS FLAG". This can for example be used to force the linker to # 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 # macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG. # @@ -53,18 +55,19 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 2 +#serial 4 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, [ ax_check_save_flags=$LDFLAGS 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,[no])]) LDFLAGS=$ax_check_save_flags]) -AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], +AS_VAR_IF(CACHEVAR,yes, [m4_default([$2], :)], [m4_default([$3], :)]) AS_VAR_POPDEF([CACHEVAR])dnl diff --git a/build-aux/m4/ax_check_preproc_flag.m4 b/build-aux/m4/ax_check_preproc_flag.m4 index b1cfef6b..ca1d5ee2 100644 --- a/build-aux/m4/ax_check_preproc_flag.m4 +++ b/build-aux/m4/ax_check_preproc_flag.m4 @@ -4,7 +4,7 @@ # # 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 # @@ -19,6 +19,8 @@ # "CPPFLAGS EXTRA-FLAGS FLAG". This can for example be used to force the # 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 # macro in sync with AX_CHECK_{COMPILE,LINK}_FLAG. # @@ -53,19 +55,19 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 2 +#serial 4 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 AC_CACHE_CHECK([whether _AC_LANG preprocessor accepts $1], CACHEVAR, [ ax_check_save_flags=$CPPFLAGS 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,[no])]) CPPFLAGS=$ax_check_save_flags]) -AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], +AS_VAR_IF(CACHEVAR,yes, [m4_default([$2], :)], [m4_default([$3], :)]) AS_VAR_POPDEF([CACHEVAR])dnl diff --git a/build-aux/m4/ax_cxx_compile_stdcxx.m4 b/build-aux/m4/ax_cxx_compile_stdcxx.m4 index c3a8d695..43087b2e 100644 --- a/build-aux/m4/ax_cxx_compile_stdcxx.m4 +++ b/build-aux/m4/ax_cxx_compile_stdcxx.m4 @@ -1,72 +1,951 @@ # =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html +# https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html # =========================================================================== # # SYNOPSIS # -# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS]) +# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional]) # # DESCRIPTION # -# Check whether the given FLAG works with the current language's compiler -# or gives an error. (Warnings, however, are ignored) +# Check for baseline language coverage in the compiler for the specified +# version of the C++ standard. If necessary, add switches to CXX and +# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard) +# or '14' (for the C++14 standard). # -# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on -# success/failure. +# The second argument, if specified, indicates whether you insist on an +# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. +# -std=c++11). If neither is specified, you get whatever works, with +# preference for an extended mode. # -# If EXTRA-FLAGS is defined, it is added to the current language's default -# flags (e.g. CFLAGS) when the check is done. The check is thus made with -# 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. -# -# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this -# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. +# The third argument, if specified 'mandatory' or if left unspecified, +# indicates that baseline support for the specified C++ standard is +# required and that the macro should error out if no mode with that +# support is found. If specified 'optional', then configuration proceeds +# regardless, after defining HAVE_CXX${VERSION} if and only if a +# supporting mode is found. # # LICENSE # -# Copyright (c) 2008 Guido U. Draheim -# Copyright (c) 2011 Maarten Bosmans -# -# This program is free software: you can redistribute it and/or modify it -# under the terms of the GNU General Public License as published by the -# Free Software Foundation, either version 3 of the License, or (at your -# option) any later version. -# -# This program is distributed in the hope that it will be useful, but -# WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General -# Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program. If not, see . +# Copyright (c) 2008 Benjamin Kosnik +# Copyright (c) 2012 Zack Weinberg +# Copyright (c) 2013 Roy Stogner +# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov +# Copyright (c) 2015 Paul Norman +# Copyright (c) 2015 Moritz Klammler +# Copyright (c) 2016, 2018 Krzesimir Nowak +# Copyright (c) 2019 Enji Cooper # -# As a special exception, the respective Autoconf Macro's copyright owner -# gives unlimited permission to copy, distribute and modify the configure -# scripts that are the output of Autoconf when processing the Macro. You -# need not follow the terms of the GNU General Public License when using -# or distributing such scripts, even though portions of the text of the -# Macro appear in them. The GNU General Public License (GPL) does govern -# all other use of the material that constitutes the Autoconf Macro. -# -# This special exception to the GPL applies to versions of the Autoconf -# Macro released by the Autoconf Archive. When you make and distribute a -# modified version of the Autoconf Macro, you may extend this special -# exception to the GPL to apply to your modified version as well. - -#serial 2 - -AC_DEFUN([AX_CHECK_COMPILE_FLAG], -[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX -AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl -AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ - ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS - _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], - [AS_VAR_SET(CACHEVAR,[yes])], - [AS_VAR_SET(CACHEVAR,[no])]) - _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) -AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], - [m4_default([$2], :)], - [m4_default([$3], :)]) -AS_VAR_POPDEF([CACHEVAR])dnl -])dnl AX_CHECK_COMPILE_FLAGS +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 11 + +dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro +dnl (serial version number 13). + +AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl + m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"], + [$1], [14], [ax_cxx_compile_alternatives="14 1y"], + [$1], [17], [ax_cxx_compile_alternatives="17 1z"], + [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl + m4_if([$2], [], [], + [$2], [ext], [], + [$2], [noext], [], + [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl + m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true], + [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], + [$3], [optional], [ax_cxx_compile_cxx$1_required=false], + [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) + AC_LANG_PUSH([C++])dnl + ac_success=no + + m4_if([$2], [noext], [], [dnl + if test x$ac_success = xno; then + for alternative in ${ax_cxx_compile_alternatives}; do + switch="-std=gnu++${alternative}" + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) + AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, + $cachevar, + [ac_save_CXX="$CXX" + CXX="$CXX $switch" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [eval $cachevar=yes], + [eval $cachevar=no]) + CXX="$ac_save_CXX"]) + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + fi]) + + m4_if([$2], [ext], [], [dnl + if test x$ac_success = xno; then + dnl HP's aCC needs +std=c++11 according to: + dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf + dnl Cray's crayCC needs "-h std=c++11" + for alternative in ${ax_cxx_compile_alternatives}; do + for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) + AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, + $cachevar, + [ac_save_CXX="$CXX" + CXX="$CXX $switch" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [eval $cachevar=yes], + [eval $cachevar=no]) + CXX="$ac_save_CXX"]) + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + if test x$ac_success = xyes; then + break + fi + done + fi]) + AC_LANG_POP([C++]) + if test x$ax_cxx_compile_cxx$1_required = xtrue; then + if test x$ac_success = xno; then + AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) + fi + fi + if test x$ac_success = xno; then + HAVE_CXX$1=0 + AC_MSG_NOTICE([No compiler with C++$1 support was found]) + else + HAVE_CXX$1=1 + AC_DEFINE(HAVE_CXX$1,1, + [define if the compiler supports basic C++$1 syntax]) + fi + AC_SUBST(HAVE_CXX$1) +]) + + +dnl Test body for checking C++11 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 +) + + +dnl Test body for checking C++14 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 +) + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 +) + +dnl Tests for new features in C++11 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ + +// If the compiler admits that it is not ready for C++11, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201103L + +#error "This is not a C++11 compiler" + +#else + +namespace cxx11 +{ + + namespace test_static_assert + { + + template + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + + } + + namespace test_final_override + { + + struct Base + { + virtual ~Base() {} + virtual void f() {} + }; + + struct Derived : public Base + { + virtual ~Derived() override {} + virtual void f() override {} + }; + + } + + namespace test_double_right_angle_brackets + { + + template < typename T > + struct check {}; + + typedef check single_type; + typedef check> double_type; + typedef check>> triple_type; + typedef check>>> quadruple_type; + + } + + namespace test_decltype + { + + int + f() + { + int a = 1; + decltype(a) b = 2; + return a + b; + } + + } + + namespace test_type_deduction + { + + template < typename T1, typename T2 > + struct is_same + { + static const bool value = false; + }; + + template < typename T > + struct is_same + { + static const bool value = true; + }; + + template < typename T1, typename T2 > + auto + add(T1 a1, T2 a2) -> decltype(a1 + a2) + { + return a1 + a2; + } + + int + test(const int c, volatile int v) + { + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == false, ""); + auto ac = c; + auto av = v; + auto sumi = ac + av + 'x'; + auto sumf = ac + av + 1.0; + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == true, ""); + return (sumf > 0.0) ? sumi : add(c, v); + } + + } + + namespace test_noexcept + { + + int f() { return 0; } + int g() noexcept { return 0; } + + static_assert(noexcept(f()) == false, ""); + static_assert(noexcept(g()) == true, ""); + + } + + namespace test_constexpr + { + + template < typename CharT > + unsigned long constexpr + strlen_c_r(const CharT *const s, const unsigned long acc) noexcept + { + return *s ? strlen_c_r(s + 1, acc + 1) : acc; + } + + template < typename CharT > + unsigned long constexpr + strlen_c(const CharT *const s) noexcept + { + return strlen_c_r(s, 0UL); + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("1") == 1UL, ""); + static_assert(strlen_c("example") == 7UL, ""); + static_assert(strlen_c("another\0example") == 7UL, ""); + + } + + namespace test_rvalue_references + { + + template < int N > + struct answer + { + static constexpr int value = N; + }; + + answer<1> f(int&) { return answer<1>(); } + answer<2> f(const int&) { return answer<2>(); } + answer<3> f(int&&) { return answer<3>(); } + + void + test() + { + int i = 0; + const int c = 0; + static_assert(decltype(f(i))::value == 1, ""); + static_assert(decltype(f(c))::value == 2, ""); + static_assert(decltype(f(0))::value == 3, ""); + } + + } + + namespace test_uniform_initialization + { + + struct test + { + static const int zero {}; + static const int one {1}; + }; + + static_assert(test::zero == 0, ""); + static_assert(test::one == 1, ""); + + } + + namespace test_lambdas + { + + void + test1() + { + auto lambda1 = [](){}; + auto lambda2 = lambda1; + lambda1(); + lambda2(); + } + + int + test2() + { + auto a = [](int i, int j){ return i + j; }(1, 2); + auto b = []() -> int { return '0'; }(); + auto c = [=](){ return a + b; }(); + auto d = [&](){ return c; }(); + auto e = [a, &b](int x) mutable { + const auto identity = [](int y){ return y; }; + for (auto i = 0; i < a; ++i) + a += b--; + return x + identity(a + b); + }(0); + return a + b + c + d + e; + } + + int + test3() + { + const auto nullary = [](){ return 0; }; + const auto unary = [](int x){ return x; }; + using nullary_t = decltype(nullary); + using unary_t = decltype(unary); + const auto higher1st = [](nullary_t f){ return f(); }; + const auto higher2nd = [unary](nullary_t f1){ + return [unary, f1](unary_t f2){ return f2(unary(f1())); }; + }; + return higher1st(nullary) + higher2nd(nullary)(unary); + } + + } + + namespace test_variadic_templates + { + + template + struct sum; + + template + struct sum + { + static constexpr auto value = N0 + sum::value; + }; + + template <> + struct sum<> + { + static constexpr auto value = 0; + }; + + static_assert(sum<>::value == 0, ""); + static_assert(sum<1>::value == 1, ""); + static_assert(sum<23>::value == 23, ""); + static_assert(sum<1, 2>::value == 3, ""); + static_assert(sum<5, 5, 11>::value == 21, ""); + static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); + + } + + // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae + // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function + // because of this. + namespace test_template_alias_sfinae + { + + struct foo {}; + + template + using member = typename T::member_type; + + template + void func(...) {} + + template + void func(member*) {} + + void test(); + + void test() { func(0); } + + } + +} // namespace cxx11 + +#endif // __cplusplus >= 201103L + +]]) + + +dnl Tests for new features in C++14 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ + +// If the compiler admits that it is not ready for C++14, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201402L + +#error "This is not a C++14 compiler" + +#else + +namespace cxx14 +{ + + namespace test_polymorphic_lambdas + { + + int + test() + { + const auto lambda = [](auto&&... args){ + const auto istiny = [](auto x){ + return (sizeof(x) == 1UL) ? 1 : 0; + }; + const int aretiny[] = { istiny(args)... }; + return aretiny[0]; + }; + return lambda(1, 1L, 1.0f, '1'); + } + + } + + namespace test_binary_literals + { + + constexpr auto ivii = 0b0000000000101010; + static_assert(ivii == 42, "wrong value"); + + } + + namespace test_generalized_constexpr + { + + template < typename CharT > + constexpr unsigned long + strlen_c(const CharT *const s) noexcept + { + auto length = 0UL; + for (auto p = s; *p; ++p) + ++length; + return length; + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("x") == 1UL, ""); + static_assert(strlen_c("test") == 4UL, ""); + static_assert(strlen_c("another\0test") == 7UL, ""); + + } + + namespace test_lambda_init_capture + { + + int + test() + { + auto x = 0; + const auto lambda1 = [a = x](int b){ return a + b; }; + const auto lambda2 = [a = lambda1(x)](){ return a; }; + return lambda2(); + } + + } + + namespace test_digit_separators + { + + constexpr auto ten_million = 100'000'000; + static_assert(ten_million == 100000000, ""); + + } + + namespace test_return_type_deduction + { + + auto f(int& x) { return x; } + decltype(auto) g(int& x) { return x; } + + template < typename T1, typename T2 > + struct is_same + { + static constexpr auto value = false; + }; + + template < typename T > + struct is_same + { + static constexpr auto value = true; + }; + + int + test() + { + auto x = 0; + static_assert(is_same::value, ""); + static_assert(is_same::value, ""); + return x; + } + + } + +} // namespace cxx14 + +#endif // __cplusplus >= 201402L + +]]) + + +dnl Tests for new features in C++17 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[ + +// If the compiler admits that it is not ready for C++17, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201703L + +#error "This is not a C++17 compiler" + +#else + +#include +#include +#include + +namespace cxx17 +{ + + namespace test_constexpr_lambdas + { + + constexpr int foo = [](){return 42;}(); + + } + + namespace test::nested_namespace::definitions + { + + } + + namespace test_fold_expression + { + + template + int multiply(Args... args) + { + return (args * ... * 1); + } + + template + bool all(Args... args) + { + return (args && ...); + } + + } + + namespace test_extended_static_assert + { + + static_assert (true); + + } + + namespace test_auto_brace_init_list + { + + auto foo = {5}; + auto bar {5}; + + static_assert(std::is_same, decltype(foo)>::value); + static_assert(std::is_same::value); + } + + namespace test_typename_in_template_template_parameter + { + + template typename X> struct D; + + } + + namespace test_fallthrough_nodiscard_maybe_unused_attributes + { + + int f1() + { + return 42; + } + + [[nodiscard]] int f2() + { + [[maybe_unused]] auto unused = f1(); + + switch (f1()) + { + case 17: + f1(); + [[fallthrough]]; + case 42: + f1(); + } + return f1(); + } + + } + + namespace test_extended_aggregate_initialization + { + + struct base1 + { + int b1, b2 = 42; + }; + + struct base2 + { + base2() { + b3 = 42; + } + int b3; + }; + + struct derived : base1, base2 + { + int d; + }; + + derived d1 {{1, 2}, {}, 4}; // full initialization + derived d2 {{}, {}, 4}; // value-initialized bases + + } + + namespace test_general_range_based_for_loop + { + + struct iter + { + int i; + + int& operator* () + { + return i; + } + + const int& operator* () const + { + return i; + } + + iter& operator++() + { + ++i; + return *this; + } + }; + + struct sentinel + { + int i; + }; + + bool operator== (const iter& i, const sentinel& s) + { + return i.i == s.i; + } + + bool operator!= (const iter& i, const sentinel& s) + { + return !(i == s); + } + + struct range + { + iter begin() const + { + return {0}; + } + + sentinel end() const + { + return {5}; + } + }; + + void f() + { + range r {}; + + for (auto i : r) + { + [[maybe_unused]] auto v = i; + } + } + + } + + namespace test_lambda_capture_asterisk_this_by_value + { + + struct t + { + int i; + int foo() + { + return [*this]() + { + return i; + }(); + } + }; + + } + + namespace test_enum_class_construction + { + + enum class byte : unsigned char + {}; + + byte foo {42}; + + } + + namespace test_constexpr_if + { + + template + int f () + { + if constexpr(cond) + { + return 13; + } + else + { + return 42; + } + } + + } + + namespace test_selection_statement_with_initializer + { + + int f() + { + return 13; + } + + int f2() + { + if (auto i = f(); i > 0) + { + return 3; + } + + switch (auto i = f(); i + 4) + { + case 17: + return 2; + + default: + return 1; + } + } + + } + + namespace test_template_argument_deduction_for_class_templates + { + + template + struct pair + { + pair (T1 p1, T2 p2) + : m1 {p1}, + m2 {p2} + {} + + T1 m1; + T2 m2; + }; + + void f() + { + [[maybe_unused]] auto p = pair{13, 42u}; + } + + } + + namespace test_non_type_auto_template_parameters + { + + template + struct B + {}; + + B<5> b1; + B<'a'> b2; + + } + + namespace test_structured_bindings + { + + int arr[2] = { 1, 2 }; + std::pair pr = { 1, 2 }; + + auto f1() -> int(&)[2] + { + return arr; + } + + auto f2() -> std::pair& + { + return pr; + } + + struct S + { + int x1 : 2; + volatile double y1; + }; + + S f3() + { + return {}; + } + + auto [ x1, y1 ] = f1(); + auto& [ xr1, yr1 ] = f1(); + auto [ x2, y2 ] = f2(); + auto& [ xr2, yr2 ] = f2(); + const auto [ x3, y3 ] = f3(); + + } + + namespace test_exception_spec_type_system + { + + struct Good {}; + struct Bad {}; + + void g1() noexcept; + void g2(); + + template + Bad + f(T*, T*); + + template + Good + f(T1*, T2*); + + static_assert (std::is_same_v); + + } + + namespace test_inline_variables + { + + template void f(T) + {} + + template inline T g(T) + { + return T{}; + } + + template<> inline void f<>(int) + {} + + template<> int g<>(int) + { + return 5; + } + + } + +} // namespace cxx17 + +#endif // __cplusplus < 201703L + +]]) diff --git a/build-aux/m4/ax_gcc_func_attribute.m4 b/build-aux/m4/ax_gcc_func_attribute.m4 index 9e4eaf7c..c788ca9b 100644 --- a/build-aux/m4/ax_gcc_func_attribute.m4 +++ b/build-aux/m4/ax_gcc_func_attribute.m4 @@ -31,6 +31,7 @@ # cold # const # constructor +# constructor_priority for constructor attribute with priority # deprecated # destructor # dllexport @@ -73,10 +74,11 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 2 +#serial 3 AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [ AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1]) + AC_CACHE_CHECK([for __attribute__(($1))], [ac_var], [ AC_LINK_IFELSE([AC_LANG_PROGRAM([ m4_case([$1], @@ -102,6 +104,9 @@ AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [ [const], [ int foo( void ) __attribute__(($1)); ], + [constructor_priority], [ + int foo( void ) __attribute__((__constructor__(65535/2))); + ], [constructor], [ int foo( void ) __attribute__(($1)); ], @@ -209,8 +214,10 @@ AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [ [AS_VAR_SET([ac_var], [yes])])], [AS_VAR_SET([ac_var], [no])]) ]) + AS_IF([test yes = AS_VAR_GET([ac_var])], [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_FUNC_ATTRIBUTE_$1), 1, [Define to 1 if the system has the `$1' function attribute])], []) + AS_VAR_POPDEF([ac_var]) -]) \ No newline at end of file +]) diff --git a/build-aux/m4/ax_pthread.m4 b/build-aux/m4/ax_pthread.m4 index d383ad5c..1598d077 100644 --- a/build-aux/m4/ax_pthread.m4 +++ b/build-aux/m4/ax_pthread.m4 @@ -1,5 +1,5 @@ # =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_pthread.html +# https://www.gnu.org/software/autoconf-archive/ax_pthread.html # =========================================================================== # # SYNOPSIS @@ -19,10 +19,10 @@ # 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, -# 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 # -# 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: # # LIBS="$PTHREAD_LIBS $LIBS" @@ -30,8 +30,8 @@ # CC="$PTHREAD_CC" # # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant -# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name -# (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to +# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). # # Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the # PTHREAD_PRIO_INHERIT symbol is defined when compiling with @@ -55,6 +55,7 @@ # # Copyright (c) 2008 Steven G. Johnson # Copyright (c) 2011 Daniel Richard G. +# Copyright (c) 2019 Marc Stevens # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the @@ -67,7 +68,7 @@ # Public License for more details. # # You should have received a copy of the GNU General Public License along -# with this program. If not, see . +# with this program. If not, see . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure @@ -82,35 +83,40 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 21 +#serial 27 AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) AC_DEFUN([AX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AC_PROG_SED]) AC_LANG_PUSH([C]) ax_pthread_ok=no # 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. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: -if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then - save_CFLAGS="$CFLAGS" +if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then + ax_pthread_save_CC="$CC" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"]) CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" - AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) - AC_TRY_LINK_FUNC([pthread_join], [ax_pthread_ok=yes]) + AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS]) + AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes]) AC_MSG_RESULT([$ax_pthread_ok]) - if test x"$ax_pthread_ok" = xno; then + if test "x$ax_pthread_ok" = "xno"; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" + CC="$ax_pthread_save_CC" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" fi # We must check for the threads library under a number of different @@ -118,12 +124,14 @@ fi # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). -# Create a list of thread flags to try. Items starting with a "-" are -# C compiler flags, and other items are library names, except for "none" -# 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. +# Create a list of thread flags to try. Items with a "," contain both +# C compiler flags (before ",") and linker flags (after ","). Other items +# starting with a "-" are C compiler flags, and remaining items are +# library names, except for "none" 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. -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 # individual items follow: @@ -132,82 +140,163 @@ ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mt # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) -# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) -# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) -# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) -# -pthreads: Solaris/gcc -# -mthreads: Mingw32/gcc, Lynx/gcc +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 +# (Note: HP C rejects this with "bad form for `-t' option") +# -pthreads: Solaris/gcc (Note: HP C also rejects) # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it -# doesn't hurt to check since this sometimes defines pthreads too; -# also defines -D_REENTRANT) -# ... -mt is also the pthreads flag for HP/aCC +# doesn't hurt to check since this sometimes defines pthreads and +# -D_REENTRANT too), HP C (must be checked before -lpthread, which +# 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 # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) -case ${host_os} in +case $host_os in + + freebsd*) + + # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) + # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) + + ax_pthread_flags="-kthread lthread $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. (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: + # 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,-lpthread pthread $ax_pthread_flags" + ;; +esac + +# Are we compiling with Clang? + +AC_CACHE_CHECK([whether $CC is Clang], + [ax_cv_PTHREAD_CLANG], + [ax_cv_PTHREAD_CLANG=no + # 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" + + +# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) + +# Note that for GCC and Clang -pthread generally implies -lpthread, +# except when -nostdlib is passed. +# This is problematic using libtool to build C++ shared libraries with pthread: +# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 +# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 +# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 +# To solve this, first try -pthread together with -lpthread for GCC + +AS_IF([test "x$GCC" = "xyes"], + [ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"]) + +# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first + +AS_IF([test "x$ax_pthread_clang" = "xyes"], + [ax_pthread_flags="-pthread,-lpthread -pthread"]) - ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" + +# The presence of a feature test macro requesting re-entrant function +# definitions is, on some systems, a strong hint that pthreads support is +# correctly enabled + +case $host_os in + darwin* | hpux* | linux* | osf* | solaris*) + ax_pthread_check_macro="_REENTRANT" ;; - darwin*) - ax_pthread_flags="-pthread $ax_pthread_flags" + aix*) + ax_pthread_check_macro="_THREAD_SAFE" ;; -esac -# Clang doesn't consider unrecognized options an error unless we specify -# -Werror. We throw in some extra Clang-specific options to ensure that -# this doesn't happen for GCC, which also accepts -Werror. + *) + ax_pthread_check_macro="--" + ;; +esac +AS_IF([test "x$ax_pthread_check_macro" = "x--"], + [ax_pthread_check_cond=0], + [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) -AC_MSG_CHECKING([if compiler needs -Werror to reject unknown flags]) -save_CFLAGS="$CFLAGS" -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 -for flag in $ax_pthread_flags; do +if test "x$ax_pthread_ok" = "xno"; then +for ax_pthread_try_flag in $ax_pthread_flags; do - case $flag in + case $ax_pthread_try_flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; + *,*) + PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` + PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` + AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"]) + ;; + -*) - AC_MSG_CHECKING([whether pthreads work with $flag]) - PTHREAD_CFLAGS="$flag" + 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]) - if test x"$ax_pthread_config" = xno; then continue; fi + 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$flag]) - PTHREAD_LIBS="-l$flag" + AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag]) + PTHREAD_LIBS="-l$ax_pthread_try_flag" ;; esac - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" LIBS="$PTHREAD_LIBS $LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS $ax_pthread_extra_flags" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we @@ -218,8 +307,18 @@ for flag in $ax_pthread_flags; do # 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 - static void routine(void *a) { a = 0; } +# if $ax_pthread_check_cond +# error "$ax_pthread_check_macro must be defined" +# endif + static void *some_global = NULL; + static void routine(void *a) + { + /* To avoid any unused-parameter or + unused-but-set-parameter warning. */ + some_global = a; + } static void *start_routine(void *a) { return a; }], [pthread_t th; pthread_attr_t attr; pthread_create(&th, 0, start_routine, 0); @@ -227,88 +326,164 @@ for flag in $ax_pthread_flags; do pthread_attr_init(&attr); pthread_cleanup_push(routine, 0); pthread_cleanup_pop(0) /* ; */])], - [ax_pthread_ok=yes], - []) + [ax_pthread_ok=yes], + []) - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" AC_MSG_RESULT([$ax_pthread_ok]) - if test "x$ax_pthread_ok" = xyes; then - break; - fi + AS_IF([test "x$ax_pthread_ok" = "xyes"], [break]) PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi + +# Clang needs special handling, because older versions handle the -pthread +# option in a rather... idiosyncratic way + +if test "x$ax_pthread_clang" = "xyes"; then + + # Clang takes -pthread; it has never supported any other flag + + # (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.) + + # 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 + + + # Various other checks: -if test "x$ax_pthread_ok" = xyes; then - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - save_CFLAGS="$CFLAGS" +if test "x$ax_pthread_ok" = "xyes"; then + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - AC_MSG_CHECKING([for joinable pthread attribute]) - attr_name=unknown - for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do - AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], - [int attr = $attr; return attr /* ; */])], - [attr_name=$attr; break], - []) - done - AC_MSG_RESULT([$attr_name]) - if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then - AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], [$attr_name], - [Define to necessary symbol if this constant - uses a non-standard name on your system.]) - fi - - AC_MSG_CHECKING([if more special flags are required for pthreads]) - flag=no - case ${host_os} in - aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";; - osf* | hpux*) flag="-D_REENTRANT";; - solaris*) - if test "$GCC" = "yes"; then - flag="-D_REENTRANT" - else - # TODO: What about Clang on Solaris? - flag="-mt -D_REENTRANT" - fi - ;; - esac - AC_MSG_RESULT([$flag]) - if test "x$flag" != xno; then - PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" - fi + AC_CACHE_CHECK([for joinable pthread attribute], + [ax_cv_PTHREAD_JOINABLE_ATTR], + [ax_cv_PTHREAD_JOINABLE_ATTR=unknown + for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [int attr = $ax_pthread_attr; return attr /* ; */])], + [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break], + []) + done + ]) + AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ + test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ + test "x$ax_pthread_joinable_attr_defined" != "xyes"], + [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_CACHE_CHECK([whether more special flags are required for pthreads], + [ax_cv_PTHREAD_SPECIAL_FLAGS], + [ax_cv_PTHREAD_SPECIAL_FLAGS=no + case $host_os in + solaris*) + ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" + ;; + esac + ]) + AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ + test "x$ax_pthread_special_flags_added" != "xyes"], + [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" + ax_pthread_special_flags_added=yes]) AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], - [ax_cv_PTHREAD_PRIO_INHERIT], [ - AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[int i = PTHREAD_PRIO_INHERIT;]])], - [ax_cv_PTHREAD_PRIO_INHERIT=yes], - [ax_cv_PTHREAD_PRIO_INHERIT=no]) + [ax_cv_PTHREAD_PRIO_INHERIT], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[int i = PTHREAD_PRIO_INHERIT; + return i;]])], + [ax_cv_PTHREAD_PRIO_INHERIT=yes], + [ax_cv_PTHREAD_PRIO_INHERIT=no]) ]) - AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"], - [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])]) + AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ + 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="$save_CFLAGS" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" # More AIX lossage: compile with *_r variant - if test "x$GCC" != xyes; then + if test "x$GCC" != "xyes"; then case $host_os in aix*) 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], - [#handle absolute path differently from PATH based program lookup - AS_CASE(["x$CC"], - [x/*], - [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])], - [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$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], + [#handle absolute path differently from PATH based program lookup + AS_CASE(["x$CC"], + [x/*], + [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])], + [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])]) ;; esac fi @@ -321,7 +496,7 @@ AC_SUBST([PTHREAD_CFLAGS]) AC_SUBST([PTHREAD_CC]) # 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]) : else diff --git a/build-aux/m4/bitcoin_find_bdb48.m4 b/build-aux/m4/bitcoin_find_bdb48.m4 index 89eb866b..eceac90a 100644 --- a/build-aux/m4/bitcoin_find_bdb48.m4 +++ b/build-aux/m4/bitcoin_find_bdb48.m4 @@ -1,66 +1,78 @@ +dnl Copyright (c) 2013-2015 The Bitcoin Core developers +dnl Distributed under the MIT software license, see the accompanying + dnl file COPYING or http://www.opensource.org/licenses/mit-license.php. + AC_DEFUN([BITCOIN_FIND_BDB48],[ - AC_MSG_CHECKING([for Berkeley DB C++ headers]) - BDB_CPPFLAGS= - BDB_LIBS= - bdbpath=X - bdb48path=X - bdbdirlist= - for _vn in 4.8 48 4 5 ''; do - for _pfx in b lib ''; do - bdbdirlist="$bdbdirlist ${_pfx}db${_vn}" - done - done - for searchpath in $bdbdirlist ''; do - test -n "${searchpath}" && searchpath="${searchpath}/" - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include <${searchpath}db_cxx.h> - ]],[[ - #if !((DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 8) || DB_VERSION_MAJOR > 4) - #error "failed to find bdb 4.8+" - #endif - ]])],[ - if test "x$bdbpath" = "xX"; then +AC_ARG_VAR(BDB_CFLAGS, [C compiler flags for BerkeleyDB, bypasses autodetection]) +AC_ARG_VAR(BDB_LIBS, [Linker flags for BerkeleyDB, bypasses autodetection]) + +if test "x$BDB_CFLAGS" = "x"; then + AC_MSG_CHECKING([for Berkeley DB C++ headers]) +BDB_CPPFLAGS= +bdbpath=X +bdb48path=X +bdbdirlist= +for _vn in 4.8 48 4 5 5.3 ''; do +for _pfx in b lib ''; do +bdbdirlist="$bdbdirlist ${_pfx}db${_vn}" +done + done +for searchpath in $bdbdirlist ''; do +test -n "${searchpath}" && searchpath="${searchpath}/" +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include <${searchpath}db_cxx.h> +]],[[ +#if !((DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 8) || DB_VERSION_MAJOR > 4) +#error "failed to find bdb 4.8+" +#endif +]])],[ +if test "x$bdbpath" = "xX"; then bdbpath="${searchpath}" - fi - ],[ - continue - ]) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include <${searchpath}db_cxx.h> - ]],[[ - #if !(DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR == 8) - #error "failed to find bdb 4.8" - #endif - ]])],[ - bdb48path="${searchpath}" - break - ],[]) - done - if test "x$bdbpath" = "xX"; then - AC_MSG_RESULT([no]) - AC_MSG_ERROR(libdb_cxx headers missing) - elif test "x$bdb48path" = "xX"; then - 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_MSG_WARN([Found Berkeley DB other than 4.8; wallets opened by this build will not be portable!]) - ],[ - AC_MSG_ERROR([Found Berkeley DB other than 4.8, required for portable wallets (--with-incompatible-bdb to ignore or --disable-wallet to disable wallet functionality)]) - ]) - else - BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdb48path}],db_cxx) - bdbpath="${bdb48path}" - fi - AC_SUBST(BDB_CPPFLAGS) +fi +],[ +continue +]) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include <${searchpath}db_cxx.h> +]],[[ +#if !(DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR == 8) +#error "failed to find bdb 4.8" +#endif +]])],[ +bdb48path="${searchpath}" +break +],[]) +done +if test "x$bdbpath" = "xX"; then + AC_MSG_RESULT([no]) +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 + 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_MSG_WARN([Found Berkeley DB other than 4.8; wallets opened by this build will not be portable!]) +],[ +AC_MSG_ERROR([Found Berkeley DB other than 4.8, required for portable wallets (--with-incompatible-bdb to ignore or --disable-wallet to disable wallet functionality)]) +]) +else +BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdb48path}],db_cxx) +bdbpath="${bdb48path}" +fi +else +BDB_CPPFLAGS=${BDB_CFLAGS} +fi + AC_SUBST(BDB_CPPFLAGS) - # TODO: Ideally this could find the library version and make sure it matches the headers being used - for searchlib in db_cxx-4.8 db_cxx; do - AC_CHECK_LIB([$searchlib],[main],[ - BDB_LIBS="-l${searchlib}" - break - ]) - done - 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)]) - fi - AC_SUBST(BDB_LIBS) -]) \ No newline at end of file +if test "x$BDB_LIBS" = "x"; then +# TODO: Ideally this could find the library version and make sure it matches the headers being used +for searchlib in db_cxx-4.8 db_cxx db4_cxx; do +AC_CHECK_LIB([$searchlib],[main],[ +BDB_LIBS="-l${searchlib}" +break +]) +done +if test "x$BDB_LIBS" = "x"; then + 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) +]) diff --git a/build-aux/m4/bitcoin_qt.m4 b/build-aux/m4/bitcoin_qt.m4 index ae1e8d19..6c766583 100644 --- a/build-aux/m4/bitcoin_qt.m4 +++ b/build-aux/m4/bitcoin_qt.m4 @@ -1,18 +1,23 @@ +dnl Copyright (c) 2013-2016 The Bitcoin Core developers +dnl Distributed under the MIT software license, see the accompanying +dnl file COPYING or http://www.opensource.org/licenses/mit-license.php. + dnl Helper for cases where a qt dependency is not met. dnl Output: If qt version is auto, set bitcoin_enable_qt to false. Else, exit. AC_DEFUN([BITCOIN_QT_FAIL],[ - if test "x$bitcoin_qt_want_version" = "xauto" && test x$bitcoin_qt_force != xyes; then - if test x$bitcoin_enable_qt != xno; then + if test "x$bitcoin_qt_want_version" = xauto && test "x$bitcoin_qt_force" != xyes; then + if test "x$bitcoin_enable_qt" != xno; then AC_MSG_WARN([$1; bitcoin-qt frontend will not be built]) fi bitcoin_enable_qt=no + bitcoin_enable_qt_test=no else AC_MSG_ERROR([$1]) fi ]) AC_DEFUN([BITCOIN_QT_CHECK],[ - if test "x$bitcoin_enable_qt" != "xno" && test x$bitcoin_qt_want_version != xno; then + if test "x$bitcoin_enable_qt" != xno && test "x$bitcoin_qt_want_version" != xno; then true $1 else @@ -30,12 +35,12 @@ dnl Inputs: $4: If "yes", don't fail if $2 is not found. dnl Output: $1 is set to the path of $2 if found. $2 are searched in order. AC_DEFUN([BITCOIN_QT_PATH_PROGS],[ BITCOIN_QT_CHECK([ - if test "x$3" != "x"; then + if test "x$3" != x; then AC_PATH_PROGS($1,$2,,$3) else AC_PATH_PROGS($1,$2) fi - if test "x$$1" = "x" && test "x$4" != "xyes"; then + if test "x$$1" = x && test "x$4" != xyes; then BITCOIN_QT_FAIL([$1 not found]) fi ]) @@ -48,114 +53,150 @@ dnl CAUTION: Do not use this inside of a conditional. AC_DEFUN([BITCOIN_QT_INIT],[ dnl enable qt support AC_ARG_WITH([gui], - [AS_HELP_STRING([--with-gui@<:@=no|qt4|qt5|auto@:>@], - [build bitcoin-qt GUI (default=auto, qt4 tried first)])], + [AS_HELP_STRING([--with-gui@<:@=no|qt5|auto@:>@], + [build bitcoin-qt GUI (default=auto)])], [ bitcoin_qt_want_version=$withval - if test x$bitcoin_qt_want_version = xyes; then + if test "x$bitcoin_qt_want_version" = xyes; then bitcoin_qt_force=yes bitcoin_qt_want_version=auto fi ], [bitcoin_qt_want_version=auto]) + AC_ARG_WITH([qt-incdir],[AS_HELP_STRING([--with-qt-incdir=INC_DIR],[specify qt include path (overridden by pkgconfig)])], [qt_include_path=$withval], []) AC_ARG_WITH([qt-libdir],[AS_HELP_STRING([--with-qt-libdir=LIB_DIR],[specify qt lib path (overridden by pkgconfig)])], [qt_lib_path=$withval], []) AC_ARG_WITH([qt-plugindir],[AS_HELP_STRING([--with-qt-plugindir=PLUGIN_DIR],[specify qt plugin path (overridden by pkgconfig)])], [qt_plugin_path=$withval], []) AC_ARG_WITH([qt-translationdir],[AS_HELP_STRING([--with-qt-translationdir=PLUGIN_DIR],[specify qt translation path (overridden by pkgconfig)])], [qt_translation_path=$withval], []) AC_ARG_WITH([qt-bindir],[AS_HELP_STRING([--with-qt-bindir=BIN_DIR],[specify qt bin path])], [qt_bin_path=$withval], []) + AC_ARG_WITH([qtdbus], [AS_HELP_STRING([--with-qtdbus], - [enable DBus support (default is yes if qt is enabled and QtDBus is found)])], + [enable DBus support (default is yes if qt is enabled and QtDBus is found, except on Android)])], [use_dbus=$withval], [use_dbus=auto]) + + dnl Android doesn't support D-Bus and certainly doesn't use it for notifications + case $host in + *android*) + if test "x$use_dbus" != xyes; then + use_dbus=no + fi + ;; + esac + AC_SUBST(QT_TRANSLATION_DIR,$qt_translation_path) ]) -dnl Find the appropriate version of Qt libraries and includes. -dnl Inputs: $1: Whether or not pkg-config should be used. yes|no. Default: yes. -dnl Inputs: $2: If $1 is "yes" and --with-gui=auto, which qt version should be -dnl tried first. -dnl Outputs: See _BITCOIN_QT_FIND_LIBS_* +dnl Find Qt libraries and includes. +dnl +dnl BITCOIN_QT_CONFIGURE([MINIMUM-VERSION]) +dnl +dnl Outputs: See _BITCOIN_QT_FIND_LIBS dnl Outputs: Sets variables for all qt-related tools. dnl Outputs: bitcoin_enable_qt, bitcoin_enable_qt_dbus, bitcoin_enable_qt_test AC_DEFUN([BITCOIN_QT_CONFIGURE],[ - use_pkgconfig=$1 - if test x$use_pkgconfig = x; then - use_pkgconfig=yes - fi - if test x$use_pkgconfig = xyes; then - BITCOIN_QT_CHECK([_BITCOIN_QT_FIND_LIBS_WITH_PKGCONFIG([$2])]) - else - BITCOIN_QT_CHECK([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG]) - fi + qt_version=">= $1" + qt_lib_prefix="Qt5" + BITCOIN_QT_CHECK([_BITCOIN_QT_FIND_LIBS]) + dnl This is ugly and complicated. Yuck. Works as follows: - dnl We can't discern whether Qt4 builds are static or not. For Qt5, we can - dnl check a header to find out. When Qt is built statically, some plugins must - dnl be linked into the final binary as well. These plugins have changed between - dnl Qt4 and Qt5. With Qt5, languages moved into core and the WindowsIntegration - dnl plugin was added. Since we can't tell if Qt4 is static or not, it is - dnl assumed for windows builds. + dnl For Qt5, we can check a header to find out whether Qt is build + dnl statically. When Qt is built statically, some plugins must be linked into + dnl the final binary as well. + dnl With Qt5, languages moved into core and the WindowsIntegration plugin was + dnl added. dnl _BITCOIN_QT_CHECK_STATIC_PLUGINS does a quick link-check and appends the dnl results to QT_LIBS. BITCOIN_QT_CHECK([ TEMP_CPPFLAGS=$CPPFLAGS - CPPFLAGS=$QT_INCLUDES - if test x$bitcoin_qt_got_major_vers = x5; then - _BITCOIN_QT_IS_STATIC - if test x$bitcoin_cv_static_qt = xyes; then - AC_DEFINE(QT_STATICPLUGIN, 1, [Define this symbol if qt plugins are static]) - if test x$qt_plugin_path != x; then - QT_LIBS="$QT_LIBS -L$qt_plugin_path/accessible" - QT_LIBS="$QT_LIBS -L$qt_plugin_path/platforms" - fi - if test x$use_pkgconfig = xyes; then - PKG_CHECK_MODULES([QTPLATFORM], [Qt5PlatformSupport], [QT_LIBS="$QTPLATFORM_LIBS $QT_LIBS"]) - fi - _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(AccessibleFactory)], [-lqtaccessiblewidgets]) - if test x$TARGET_OS = xwindows; then - _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)],[-lqwindows]) - AC_DEFINE(QT_QPA_PLATFORM_WINDOWS, 1, [Define this symbol if the qt platform is windows]) - elif test x$TARGET_OS = xlinux; then - PKG_CHECK_MODULES([X11XCB], [x11-xcb], [QT_LIBS="$X11XCB_LIBS $QT_LIBS"]) - _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QXcbIntegrationPlugin)],[-lqxcb -lxcb-static]) - AC_DEFINE(QT_QPA_PLATFORM_XCB, 1, [Define this symbol if the qt platform is xcb]) - elif test x$TARGET_OS = xdarwin; then - if test x$use_pkgconfig = xyes; then - PKG_CHECK_MODULES([QTPRINT], [Qt5PrintSupport], [QT_LIBS="$QTPRINT_LIBS $QT_LIBS"]) - fi - AX_CHECK_LINK_FLAG([[-framework IOKit]],[QT_LIBS="$QT_LIBS -framework IOKit"],[AC_MSG_ERROR(could not iokit framework)]) - _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin)],[-lqcocoa]) - AC_DEFINE(QT_QPA_PLATFORM_COCOA, 1, [Define this symbol if the qt platform is cocoa]) - fi + TEMP_CXXFLAGS=$CXXFLAGS + CPPFLAGS="$QT_INCLUDES $CPPFLAGS" + CXXFLAGS="$PIC_FLAGS $CXXFLAGS" + _BITCOIN_QT_IS_STATIC + if test "x$bitcoin_cv_static_qt" = xyes; then + _BITCOIN_QT_FIND_STATIC_PLUGINS + AC_DEFINE(QT_STATICPLUGIN, 1, [Define this symbol if qt plugins are static]) + if test "x$TARGET_OS" != xandroid; then + _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QMinimalIntegrationPlugin)],[-lqminimal]) + AC_DEFINE(QT_QPA_PLATFORM_MINIMAL, 1, [Define this symbol if the minimal qt platform exists]) fi - else - if test x$TARGET_OS = xwindows; then - AC_DEFINE(QT_STATICPLUGIN, 1, [Define this symbol if qt plugins are static]) - if test x$qt_plugin_path != x; then - QT_LIBS="$QT_LIBS -L$qt_plugin_path/accessible" - QT_LIBS="$QT_LIBS -L$qt_plugin_path/codecs" - fi - _BITCOIN_QT_CHECK_STATIC_PLUGINS([ - Q_IMPORT_PLUGIN(qcncodecs) - Q_IMPORT_PLUGIN(qjpcodecs) - Q_IMPORT_PLUGIN(qtwcodecs) - Q_IMPORT_PLUGIN(qkrcodecs) - Q_IMPORT_PLUGIN(AccessibleFactory)], - [-lqcncodecs -lqjpcodecs -lqtwcodecs -lqkrcodecs -lqtaccessiblewidgets]) + if test "x$TARGET_OS" = xwindows; then + _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin)],[-lqwindows]) + AC_DEFINE(QT_QPA_PLATFORM_WINDOWS, 1, [Define this symbol if the qt platform is windows]) + elif test "x$TARGET_OS" = xlinux; then + _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QXcbIntegrationPlugin)],[-lqxcb -lxcb-static]) + AC_DEFINE(QT_QPA_PLATFORM_XCB, 1, [Define this symbol if the qt platform is xcb]) + elif test "x$TARGET_OS" = xdarwin; then + AX_CHECK_LINK_FLAG([[-framework IOKit]],[QT_LIBS="$QT_LIBS -framework IOKit"],[AC_MSG_ERROR(could not iokit framework)]) + _BITCOIN_QT_CHECK_STATIC_PLUGINS([Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin)],[-lqcocoa]) + AC_DEFINE(QT_QPA_PLATFORM_COCOA, 1, [Define this symbol if the qt platform is cocoa]) + elif test "x$TARGET_OS" = xandroid; then + QT_LIBS="-Wl,--export-dynamic,--undefined=JNI_OnLoad -lqtforandroid -ljnigraphics -landroid -lqtfreetype -lQt5EglSupport $QT_LIBS" + AC_DEFINE(QT_QPA_PLATFORM_ANDROID, 1, [Define this symbol if the qt platform is android]) fi fi CPPFLAGS=$TEMP_CPPFLAGS + CXXFLAGS=$TEMP_CXXFLAGS ]) - if test x$use_pkgconfig$qt_bin_path = xyes; then - if test x$bitcoin_qt_got_major_vers = x5; then - qt_bin_path="`$PKG_CONFIG --variable=host_bins Qt5Core 2>/dev/null`" - fi + + if test "x$qt_bin_path" = x; then + qt_bin_path="`$PKG_CONFIG --variable=host_bins Qt5Core 2>/dev/null`" 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([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([LRELEASE], [lrelease-qt${bitcoin_qt_got_major_vers} lrelease${bitcoin_qt_got_major_vers} lrelease], $qt_bin_path) - BITCOIN_QT_PATH_PROGS([LUPDATE], [lupdate-qt${bitcoin_qt_got_major_vers} lupdate${bitcoin_qt_got_major_vers} lupdate],$qt_bin_path, yes) + + 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 + #ifndef QT_VERSION + # include + #endif + ]], + [[ + #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 + #ifndef QT_VERSION + # include + #endif + ]], + [[ + #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-qt5 moc5 moc], $qt_bin_path) + BITCOIN_QT_PATH_PROGS([UIC], [uic-qt5 uic5 uic], $qt_bin_path) + BITCOIN_QT_PATH_PROGS([RCC], [rcc-qt5 rcc5 rcc], $qt_bin_path) + BITCOIN_QT_PATH_PROGS([LRELEASE], [lrelease-qt5 lrelease5 lrelease], $qt_bin_path) + BITCOIN_QT_PATH_PROGS([LUPDATE], [lupdate-qt5 lupdate5 lupdate],$qt_bin_path, yes) + MOC_DEFS='-DHAVE_CONFIG_H -I$(srcdir)' case $host in *darwin*) @@ -170,28 +211,36 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[ AX_CHECK_LINK_FLAG([[-mwindows]],[QT_LDFLAGS="$QT_LDFLAGS -mwindows"],[AC_MSG_WARN(-mwindows linker support not detected)]) ]) esac + + 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_enable_qt=yes bitcoin_enable_qt_test=yes - if test x$have_qt_test = xno; then + if test "x$have_qt_test" = xno; then bitcoin_enable_qt_test=no fi bitcoin_enable_qt_dbus=no - if test x$use_dbus != xno && test x$have_qt_dbus = xyes; then + if test "x$use_dbus" != xno && test "x$have_qt_dbus" = xyes; then bitcoin_enable_qt_dbus=yes fi - if test x$use_dbus = xyes && test x$have_qt_dbus = xno; then - AC_MSG_ERROR("libQtDBus not found. Install libQtDBus or remove --with-qtdbus.") + if test "x$use_dbus" = xyes && test "x$have_qt_dbus" = xno; then + AC_MSG_ERROR([libQtDBus not found. Install libQtDBus or remove --with-qtdbus.]) fi - if test x$LUPDATE = x; then - AC_MSG_WARN("lupdate is required to update qt translations") + if test "x$LUPDATE" = x; then + AC_MSG_WARN([lupdate is required to update qt translations]) fi ],[ bitcoin_enable_qt=no ]) - AC_MSG_RESULT([$bitcoin_enable_qt (Qt${bitcoin_qt_got_major_vers})]) + if test x$bitcoin_enable_qt = xyes; then + AC_MSG_RESULT([$bitcoin_enable_qt ($qt_lib_prefix)]) + else + AC_MSG_RESULT([$bitcoin_enable_qt]) + fi + + AC_SUBST(QT_PIE_FLAGS) AC_SUBST(QT_INCLUDES) AC_SUBST(QT_LIBS) AC_SUBST(QT_LDFLAGS) @@ -199,7 +248,7 @@ AC_DEFUN([BITCOIN_QT_CONFIGURE],[ AC_SUBST(QT_DBUS_LIBS) AC_SUBST(QT_TEST_INCLUDES) AC_SUBST(QT_TEST_LIBS) - AC_SUBST(QT_SELECT, qt${bitcoin_qt_got_major_vers}) + AC_SUBST(QT_SELECT, qt5) AC_SUBST(MOC_DEFS) ]) @@ -207,46 +256,26 @@ dnl All macros below are internal and should _not_ be used from the main dnl configure.ac. dnl ---- -dnl Internal. Check if the included version of Qt is Qt5. -dnl Requires: INCLUDES must be populated as necessary. -dnl Output: bitcoin_cv_qt5=yes|no -AC_DEFUN([_BITCOIN_QT_CHECK_QT5],[ - AC_CACHE_CHECK(for Qt 5, bitcoin_cv_qt5,[ - AC_COMPILE_IFELSE([AC_LANG_PROGRAM( - [[#include ]], - [[ - #if QT_VERSION < 0x050000 - choke me - #else - return 0; - #endif - ]])], - [bitcoin_cv_qt5=yes], - [bitcoin_cv_qt5=no]) -])]) - dnl Internal. Check if the linked version of Qt was built as static libs. -dnl Requires: Qt5. This check cannot determine if Qt4 is static. +dnl Requires: Qt5. dnl Requires: INCLUDES and LIBS must be populated as necessary. dnl Output: bitcoin_cv_static_qt=yes|no -dnl Output: Defines QT_STATICPLUGIN if plugins are static. AC_DEFUN([_BITCOIN_QT_IS_STATIC],[ AC_CACHE_CHECK(for static Qt, bitcoin_cv_static_qt,[ - AC_COMPILE_IFELSE([AC_LANG_PROGRAM( - [[#include ]], - [[ - #if defined(QT_STATIC) - return 0; - #else - choke me - #endif - ]])], - [bitcoin_cv_static_qt=yes], - [bitcoin_cv_static_qt=no]) - ]) - if test xbitcoin_cv_static_qt = xyes; then - AC_DEFINE(QT_STATICPLUGIN, 1, [Define this symbol for static Qt plugins]) - fi + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #ifndef QT_VERSION + # include + #endif + ]], + [[ + #if !defined(QT_STATIC) + choke + #endif + ]])], + [bitcoin_cv_static_qt=yes], + [bitcoin_cv_static_qt=no]) + ]) ]) dnl Internal. Check if the link-requirements for static plugins are met. @@ -268,129 +297,61 @@ AC_DEFUN([_BITCOIN_QT_CHECK_STATIC_PLUGINS],[ LIBS="$CHECK_STATIC_PLUGINS_TEMP_LIBS" ]) -dnl Internal. Find Qt libraries using pkg-config. -dnl Inputs: bitcoin_qt_want_version (from --with-gui=). The version to check -dnl first. -dnl Inputs: $1: If bitcoin_qt_want_version is "auto", check for this version -dnl first. -dnl Outputs: All necessary QT_* variables are set. -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. -AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITH_PKGCONFIG],[ - m4_ifdef([PKG_CHECK_MODULES],[ - auto_priority_version=$1 - if test x$auto_priority_version = x; then - auto_priority_version=qt5 - fi - if test x$bitcoin_qt_want_version = xqt5 || ( test x$bitcoin_qt_want_version = xauto && test x$auto_priority_version = xqt5 ); then - QT_LIB_PREFIX=Qt5 - bitcoin_qt_got_major_vers=5 - else - QT_LIB_PREFIX=Qt - bitcoin_qt_got_major_vers=4 - fi - qt5_modules="Qt5Core Qt5Gui Qt5Network Qt5Widgets Qt5PrintSupport" - qt4_modules="QtCore QtGui QtNetwork QtPrintSupport" - BITCOIN_QT_CHECK([ - if test x$bitcoin_qt_want_version = xqt5 || ( test x$bitcoin_qt_want_version = xauto && test x$auto_priority_version = xqt5 ); then - PKG_CHECK_MODULES([QT], [$qt5_modules], [QT_INCLUDES="$QT_CFLAGS"; have_qt=yes],[have_qt=no]) - elif test x$bitcoin_qt_want_version = xqt4 || ( test x$bitcoin_qt_want_version = xauto && test x$auto_priority_version = xqt4 ); then - PKG_CHECK_MODULES([QT], [$qt4_modules], [QT_INCLUDES="$QT_CFLAGS"; have_qt=yes], [have_qt=no]) - fi - 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$auto_priority_version = x$qt5; 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]) - 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]) - fi +dnl Internal. Find paths necessary for linking qt static plugins +dnl Inputs: qt_plugin_path. optional. +dnl Outputs: QT_LIBS is appended +AC_DEFUN([_BITCOIN_QT_FIND_STATIC_PLUGINS],[ + if test "x$qt_plugin_path" != x; then + QT_LIBS="$QT_LIBS -L$qt_plugin_path/platforms" + if test -d "$qt_plugin_path/accessible"; then + QT_LIBS="$QT_LIBS -L$qt_plugin_path/accessible" fi - if test x$have_qt != xyes; then - have_qt=no - BITCOIN_QT_FAIL([Qt dependencies not found]) + if test -d "$qt_plugin_path/platforms/android"; then + QT_LIBS="$QT_LIBS -L$qt_plugin_path/platforms/android -lqtfreetype -lEGL" fi - ]) - BITCOIN_QT_CHECK([ - PKG_CHECK_MODULES([QT_TEST], [${QT_LIB_PREFIX}Test], [QT_TEST_INCLUDES="$QT_TEST_CFLAGS"; have_qt_test=yes], [have_qt_test=no]) - if test x$use_dbus != xno; then - PKG_CHECK_MODULES([QT_DBUS], [${QT_LIB_PREFIX}DBus], [QT_DBUS_INCLUDES="$QT_DBUS_CFLAGS"; have_qt_dbus=yes], [have_qt_dbus=no]) + PKG_CHECK_MODULES([QTFONTDATABASE], [Qt5FontDatabaseSupport], [QT_LIBS="-lQt5FontDatabaseSupport $QT_LIBS"]) + PKG_CHECK_MODULES([QTEVENTDISPATCHER], [Qt5EventDispatcherSupport], [QT_LIBS="-lQt5EventDispatcherSupport $QT_LIBS"]) + PKG_CHECK_MODULES([QTTHEME], [Qt5ThemeSupport], [QT_LIBS="-lQt5ThemeSupport $QT_LIBS"]) + PKG_CHECK_MODULES([QTDEVICEDISCOVERY], [Qt5DeviceDiscoverySupport], [QT_LIBS="-lQt5DeviceDiscoverySupport $QT_LIBS"]) + PKG_CHECK_MODULES([QTACCESSIBILITY], [Qt5AccessibilitySupport], [QT_LIBS="-lQt5AccessibilitySupport $QT_LIBS"]) + PKG_CHECK_MODULES([QTFB], [Qt5FbSupport], [QT_LIBS="-lQt5FbSupport $QT_LIBS"]) + if test "x$TARGET_OS" = xlinux; then + PKG_CHECK_MODULES([QTXCBQPA], [Qt5XcbQpa], [QT_LIBS="$QTXCBQPA_LIBS $QT_LIBS"]) + elif test "x$TARGET_OS" = xdarwin; then + PKG_CHECK_MODULES([QTCLIPBOARD], [Qt5ClipboardSupport], [QT_LIBS="-lQt5ClipboardSupport $QT_LIBS"]) + PKG_CHECK_MODULES([QTGRAPHICS], [Qt5GraphicsSupport], [QT_LIBS="-lQt5GraphicsSupport $QT_LIBS"]) + PKG_CHECK_MODULES([QTCGL], [Qt5CglSupport], [QT_LIBS="-lQt5CglSupport $QT_LIBS"]) fi - ]) - ]) - true; dnl + fi ]) -dnl Internal. Find Qt libraries without using pkg-config. Version is deduced -dnl from the discovered headers. -dnl Inputs: bitcoin_qt_want_version (from --with-gui=). The version to use. -dnl If "auto", the version will be discovered by _BITCOIN_QT_CHECK_QT5. +dnl Internal. Find Qt libraries using pkg-config. dnl Outputs: All necessary QT_* variables are set. -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. -AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[ - TEMP_CPPFLAGS="$CPPFLAGS" - TEMP_LIBS="$LIBS" +AC_DEFUN([_BITCOIN_QT_FIND_LIBS],[ BITCOIN_QT_CHECK([ - if test x$qt_include_path != x; then - QT_INCLUDES="-I$qt_include_path -I$qt_include_path/QtCore -I$qt_include_path/QtGui -I$qt_include_path/QtWidgets -I$qt_include_path/QtPrintSupport -I$qt_include_path/QtNetwork -I$qt_include_path/QtTest -I$qt_include_path/QtDBus" - CPPFLAGS="$QT_INCLUDES $CPPFLAGS" - fi + PKG_CHECK_MODULES([QT_CORE], [${qt_lib_prefix}Core $qt_version], [], + [BITCOIN_QT_FAIL([${qt_lib_prefix}Core $qt_version not found])]) ]) - BITCOIN_QT_CHECK([AC_CHECK_HEADER([QtPlugin],,BITCOIN_QT_FAIL(QtCore headers missing))]) - BITCOIN_QT_CHECK([AC_CHECK_HEADER([QApplication],, BITCOIN_QT_FAIL(QtGui headers missing))]) - BITCOIN_QT_CHECK([AC_CHECK_HEADER([QLocalSocket],, BITCOIN_QT_FAIL(QtNetwork headers missing))]) BITCOIN_QT_CHECK([ - if test x$bitcoin_qt_want_version = xauto; then - _BITCOIN_QT_CHECK_QT5 - fi - if test x$bitcoin_cv_qt5 = xyes || test x$bitcoin_qt_want_version = xqt5; then - QT_LIB_PREFIX=Qt5 - bitcoin_qt_got_major_vers=5 - else - QT_LIB_PREFIX=Qt - bitcoin_qt_got_major_vers=4 - fi + PKG_CHECK_MODULES([QT_GUI], [${qt_lib_prefix}Gui $qt_version], [], + [BITCOIN_QT_FAIL([${qt_lib_prefix}Gui $qt_version not found])]) ]) BITCOIN_QT_CHECK([ - LIBS= - if test x$qt_lib_path != x; then - LIBS="$LIBS -L$qt_lib_path" - fi - if test x$TARGET_OS = xwindows; then - AC_CHECK_LIB([imm32], [main],, BITCOIN_QT_FAIL(libimm32 not found)) - fi + PKG_CHECK_MODULES([QT_WIDGETS], [${qt_lib_prefix}Widgets $qt_version], [], + [BITCOIN_QT_FAIL([${qt_lib_prefix}Widgets $qt_version not found])]) ]) - BITCOIN_QT_CHECK(AC_CHECK_LIB([z] ,[main],,AC_MSG_WARN([zlib not found. Assuming qt has it built-in]))) - BITCOIN_QT_CHECK(AC_CHECK_LIB([png] ,[main],,AC_MSG_WARN([libpng not found. Assuming qt has it built-in]))) - BITCOIN_QT_CHECK(AC_CHECK_LIB([jpeg] ,[main],,AC_MSG_WARN([libjpeg not found. Assuming qt has it built-in]))) - BITCOIN_QT_CHECK(AC_CHECK_LIB([pcre16] ,[main],,AC_MSG_WARN([libpcre16 not found. Assuming qt has it built-in]))) - BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Core] ,[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXCore not found))) - BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Gui] ,[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXGui not found))) - BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}PrintSupport] ,[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXPrintSupport not found))) - BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Network],[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXNetwork not found))) - if test x$bitcoin_qt_got_major_vers = x5; then - BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Widgets],[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXWidgets not found))) - fi - QT_LIBS="$LIBS" - LIBS="$TEMP_LIBS" BITCOIN_QT_CHECK([ - LIBS= - if test x$qt_lib_path != x; then - LIBS="-L$qt_lib_path" - fi - AC_CHECK_LIB([${QT_LIB_PREFIX}Test], [main],, have_qt_test=no) - AC_CHECK_HEADER([QTest],, have_qt_test=no) - QT_TEST_LIBS="$LIBS" - if test x$use_dbus != xno; then - LIBS= - if test x$qt_lib_path != x; then - LIBS="-L$qt_lib_path" - fi - AC_CHECK_LIB([${QT_LIB_PREFIX}DBus], [main],, have_qt_dbus=no) - AC_CHECK_HEADER([QtDBus],, have_qt_dbus=no) - QT_DBUS_LIBS="$LIBS" + PKG_CHECK_MODULES([QT_NETWORK], [${qt_lib_prefix}Network $qt_version], [], + [BITCOIN_QT_FAIL([${qt_lib_prefix}Network $qt_version not found])]) + ]) + QT_INCLUDES="$QT_CORE_CFLAGS $QT_GUI_CFLAGS $QT_WIDGETS_CFLAGS $QT_NETWORK_CFLAGS" + QT_LIBS="$QT_CORE_LIBS $QT_GUI_LIBS $QT_WIDGETS_LIBS $QT_NETWORK_LIBS" + + BITCOIN_QT_CHECK([ + PKG_CHECK_MODULES([QT_TEST], [${qt_lib_prefix}Test $qt_version], [QT_TEST_INCLUDES="$QT_TEST_CFLAGS"; have_qt_test=yes], [have_qt_test=no]) + if test "x$use_dbus" != xno; then + PKG_CHECK_MODULES([QT_DBUS], [${qt_lib_prefix}DBus $qt_version], [QT_DBUS_INCLUDES="$QT_DBUS_CFLAGS"; have_qt_dbus=yes], [have_qt_dbus=no]) fi ]) - CPPFLAGS="$TEMP_CPPFLAGS" - LIBS="$TEMP_LIBS" ]) diff --git a/build-aux/m4/bitcoin_subdir_to_include.m4 b/build-aux/m4/bitcoin_subdir_to_include.m4 index 66f106c7..7841042a 100644 --- a/build-aux/m4/bitcoin_subdir_to_include.m4 +++ b/build-aux/m4/bitcoin_subdir_to_include.m4 @@ -1,3 +1,7 @@ +dnl Copyright (c) 2013-2014 The Bitcoin Core developers +dnl Distributed under the MIT software license, see the accompanying +dnl file COPYING or http://www.opensource.org/licenses/mit-license.php. + dnl BITCOIN_SUBDIR_TO_INCLUDE([CPPFLAGS-VARIABLE-NAME],[SUBDIRECTORY-NAME],[HEADER-FILE]) dnl SUBDIRECTORY-NAME must end with a path separator AC_DEFUN([BITCOIN_SUBDIR_TO_INCLUDE],[ diff --git a/configure.ac b/configure.ac index a07404eb..3015e23c 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,3 @@ -dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N) AC_PREREQ([2.69]) define(_CLIENT_VERSION_MAJOR, 1) define(_CLIENT_VERSION_MINOR, 0) @@ -12,6 +11,24 @@ AC_CONFIG_HEADERS([src/config/bitcoin-config.h]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIR([build-aux/m4]) +m4_ifndef([PKG_PROG_PKG_CONFIG], [AC_MSG_ERROR([PKG_PROG_PKG_CONFIG macro not found. Please install pkg-config and re-run autogen.sh])]) +PKG_PROG_PKG_CONFIG +if test "x$PKG_CONFIG" = x; then + AC_MSG_ERROR([pkg-config not found]) +fi + +BITCOIN_DAEMON_NAME=bitcoind +BITCOIN_GUI_NAME=bitcoin-qt +BITCOIN_CLI_NAME=bitcoin-cli +BITCOIN_TX_NAME=bitcoin-tx +BITCOIN_WALLET_TOOL_NAME=bitcoin-wallet + +dnl Unless the user specified ARFLAGS, force it to be cr +AC_ARG_VAR(ARFLAGS, [Flags for the archiver, defaults to if not set]) +if test "x${ARFLAGS+set}" != "xset"; then + ARFLAGS="cr" +fi + AC_CANONICAL_HOST AH_TOP([#ifndef BITCOIN_CONFIG_H]) @@ -22,14 +39,14 @@ dnl faketime breaks configure and is only needed for make. Disable it here. unset FAKETIME dnl Automake init set-up and checks -AM_INIT_AUTOMAKE([no-define subdir-objects foreign]) +AM_INIT_AUTOMAKE([1.13 no-define subdir-objects foreign]) dnl faketime messes with timestamps and causes configure to be re-run. dnl --disable-maintainer-mode can be used to bypass this. AM_MAINTAINER_MODE([enable]) dnl make the compilation flags quiet unless V=1 is used -m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) +AM_SILENT_RULES([yes]) dnl Compiler checks (here before libtool). if test "x${CXXFLAGS+set}" = "xset"; then @@ -38,7 +55,6 @@ else CXXFLAGS_overridden=no fi AC_PROG_CXX -m4_ifdef([AC_PROG_OBJCXX],[AC_PROG_OBJCXX]) dnl By default, libtool for mingw refuses to link static libs into a dll for dnl fear of mixing pic/non-pic objects, and import/export complications. Since @@ -48,6 +64,36 @@ case $host in lt_cv_deplibs_check_method="pass_all" ;; esac + +AC_ARG_ENABLE([c++17], + [AS_HELP_STRING([--enable-c++17], + [enable compilation in c++17 mode (disabled by default)])], + [use_cxx17=$enableval], + [use_cxx17=no]) + +dnl Require C++11 or C++17 compiler (no GNU extensions) +if test "x$use_cxx17" = xyes -o "x$enable_fuzz" = xyes ; then + AX_CXX_COMPILE_STDCXX([17], [noext], [mandatory]) +else + AX_CXX_COMPILE_STDCXX([11], [noext], [mandatory]) +fi + +dnl Check if -latomic is required for +CHECK_ATOMIC + +dnl Unless the user specified OBJCXX, force it to be the same as CXX. This ensures +dnl that we get the same -std flags for both. +m4_ifdef([AC_PROG_OBJCXX],[ +if test "x${OBJCXX+set}" = "x"; then + OBJCXX="${CXX}" +fi +AC_PROG_OBJCXX +]) + +dnl Since libtool 1.5.2 (released 2004-01-25), on Linux libtool no longer +dnl sets RPATH for any directories in the dynamic linker search path. +dnl See more: https://wiki.debian.org/RpathIssue +LT_PREREQ([1.5.2]) dnl Libtool init checks. LT_INIT([pic-only]) @@ -56,31 +102,35 @@ AC_PATH_TOOL(AR, ar) AC_PATH_TOOL(RANLIB, ranlib) AC_PATH_TOOL(STRIP, strip) AC_PATH_TOOL(GCOV, gcov) +AC_PATH_TOOL(LLVM_COV, llvm-cov) AC_PATH_PROG(LCOV, lcov) -AC_PATH_PROG(JAVA, java) +dnl Python 3.5 is specified in .python-version and should be used if available, see doc/dependencies.md +AC_PATH_PROGS([PYTHON], [python3.5 python3.6 python3.7 python3.8 python3 python]) AC_PATH_PROG(GENHTML, genhtml) AC_PATH_PROG([GIT], [git]) AC_PATH_PROG(CCACHE,ccache) AC_PATH_PROG(XGETTEXT,xgettext) AC_PATH_PROG(HEXDUMP,hexdump) +AC_PATH_TOOL(READELF, readelf) +AC_PATH_TOOL(CPPFILT, c++filt) +AC_PATH_TOOL(OBJCOPY, objcopy) +AC_PATH_PROG(DOXYGEN, doxygen) +AM_CONDITIONAL([HAVE_DOXYGEN], [test -n "$DOXYGEN"]) -# This m4 will only be used if a system copy cannot be found. This is helpful -# on systems where autotools are installed but the pkg-config macros are not in -# a default location. It is currently used for building on OSX where autotools -# are preinstalled but pkg-config comes from macports or homebrew. It should -# probably be removed when building on <= 10.6 is no longer supported. -m4_include([pkg.m4]) - -dnl pkg-config check. -PKG_PROG_PKG_CONFIG +AC_ARG_VAR(PYTHONPATH, Augments the default search path for python module files) -# Enable wallet AC_ARG_ENABLE([wallet], - [AS_HELP_STRING([--enable-wallet], - [enable wallet (default is yes)])], + [AS_HELP_STRING([--disable-wallet], + [disable wallet (enabled by default)])], [enable_wallet=$enableval], [enable_wallet=yes]) +AC_ARG_WITH([sqlite], + [AS_HELP_STRING([--with-sqlite=yes|no|auto], + [enable sqlite wallet support (default: auto, i.e., enabled if wallet is enabled and sqlite is found)])], + [use_sqlite=$withval], + [use_sqlite=auto]) + AC_ARG_WITH([miniupnpc], [AS_HELP_STRING([--with-miniupnpc], [enable UPNP (default is yes if libminiupnpc is found)])], @@ -94,19 +144,30 @@ AC_ARG_ENABLE([upnp-default], [use_upnp_default=no]) AC_ARG_ENABLE(tests, - AS_HELP_STRING([--enable-tests],[compile tests (default is yes)]), + AS_HELP_STRING([--disable-tests],[do not compile tests (default is to compile)]), [use_tests=$enableval], [use_tests=yes]) -AC_ARG_WITH([comparison-tool], - AS_HELP_STRING([--with-comparison-tool],[path to java comparison tool (requires --enable-tests)]), - [use_comparison_tool=$withval], - [use_comparison_tool=no]) +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, + AS_HELP_STRING([--disable-bench],[do not compile benchmarks (default is to compile)]), + [use_bench=$enableval], + [use_bench=yes]) + +AC_ARG_ENABLE([extended-functional-tests], + AS_HELP_STRING([--enable-extended-functional-tests],[enable expensive functional tests when using lcov (default no)]), + [use_extended_functional_tests=$enableval], + [use_extended_functional_tests=no]) -AC_ARG_ENABLE([comparison-tool-reorg-tests], - AS_HELP_STRING([--enable-comparison-tool-reorg-tests],[enable expensive reorg tests in the comparison tool (default no)]), - [use_comparison_tool_reorg_tests=$enableval], - [use_comparison_tool_reorg_tests=no]) +AC_ARG_ENABLE([fuzz], + AS_HELP_STRING([--enable-fuzz], + [enable building of fuzz targets (default no). enabling this will disable all other targets]), + [enable_fuzz=$enableval], + [enable_fuzz=no]) AC_ARG_WITH([qrencode], [AS_HELP_STRING([--with-qrencode], @@ -115,94 +176,435 @@ AC_ARG_WITH([qrencode], [use_qr=auto]) AC_ARG_ENABLE([hardening], - [AS_HELP_STRING([--enable-hardening], - [attempt to harden the resulting executables (default is yes)])], + [AS_HELP_STRING([--disable-hardening], + [do not attempt to harden the resulting executables (default is to harden when possible)])], [use_hardening=$enableval], - [use_hardening=yes]) + [use_hardening=auto]) AC_ARG_ENABLE([reduce-exports], [AS_HELP_STRING([--enable-reduce-exports], - [attempt to reduce exported symbols in the resulting executables (default is yes)])], + [attempt to reduce exported symbols in the resulting executables (default is no)])], [use_reduce_exports=$enableval], - [use_reduce_exports=auto]) + [use_reduce_exports=no]) AC_ARG_ENABLE([ccache], - [AS_HELP_STRING([--enable-ccache], - [use ccache for building (default is yes if ccache is found)])], + [AS_HELP_STRING([--disable-ccache], + [do not use ccache for building (default is to use if found)])], [use_ccache=$enableval], [use_ccache=auto]) +dnl Suppress warnings from external headers (e.g. Boost, Qt). +dnl May be useful if warnings from external headers clutter the build output +dnl too much, so that it becomes difficult to spot Bitcoin Core warnings +dnl or if they cause a build failure with --enable-werror. +AC_ARG_ENABLE([suppress-external-warnings], + [AS_HELP_STRING([--enable-suppress-external-warnings], + [Suppress warnings from external headers (default is no)])], + [suppress_external_warnings=$enableval], + [suppress_external_warnings=no]) + AC_ARG_ENABLE([lcov], [AS_HELP_STRING([--enable-lcov], [enable lcov testing (default is no)])], - [use_lcov=yes], + [use_lcov=$enableval], [use_lcov=no]) +AC_ARG_ENABLE([lcov-branch-coverage], + [AS_HELP_STRING([--enable-lcov-branch-coverage], + [enable lcov testing branch coverage (default is no)])], + [use_lcov_branch=yes], + [use_lcov_branch=no]) + AC_ARG_ENABLE([glibc-back-compat], [AS_HELP_STRING([--enable-glibc-back-compat], - [enable backwards compatibility with glibc and libstdc++])], + [enable backwards compatibility with glibc])], [use_glibc_compat=$enableval], [use_glibc_compat=no]) -AC_ARG_WITH([protoc-bindir],[AS_HELP_STRING([--with-protoc-bindir=BIN_DIR],[specify protoc bin path])], [protoc_bin_path=$withval], []) +AC_ARG_ENABLE([threadlocal], + [AS_HELP_STRING([--enable-threadlocal], + [enable features that depend on the c++ thread_local keyword (currently just thread names in debug logs). (default is to enabled if there is platform support and glibc-back-compat is not enabled)])], + [use_thread_local=$enableval], + [use_thread_local=auto]) -# Enable debug +AC_ARG_ENABLE([asm], + [AS_HELP_STRING([--disable-asm], + [disable assembly routines (enabled by default)])], + [use_asm=$enableval], + [use_asm=yes]) + +if test "x$use_asm" = xyes; then + AC_DEFINE(USE_ASM, 1, [Define this symbol to build in assembly routines]) +fi + +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], + [AS_HELP_STRING([--disable-zmq], + [disable ZMQ notifications])], + [use_zmq=$enableval], + [use_zmq=yes]) + +AC_ARG_WITH([libmultiprocess], + [AS_HELP_STRING([--with-libmultiprocess=yes|no|auto], + [Build with libmultiprocess library. (default: auto, i.e. detect with pkg-config)])], + [with_libmultiprocess=$withval], + [with_libmultiprocess=auto]) + +AC_ARG_WITH([mpgen], + [AS_HELP_STRING([--with-mpgen=yes|no|auto|PREFIX], + [Build with libmultiprocess codegen tool. Useful to specify different libmultiprocess host system library and build system codegen tool prefixes when cross-compiling (default is host system libmultiprocess prefix)])], + [with_mpgen=$withval], + [with_mpgen=auto]) + +AC_ARG_ENABLE([multiprocess], + [AS_HELP_STRING([--enable-multiprocess], + [build multiprocess bitcoin-node, bitcoin-wallet, and bitcoin-gui executables in addition to monolithic bitcoind and bitcoin-qt executables. Requires libmultiprocess library. Experimental (default is no)])], + [enable_multiprocess=$enableval], + [enable_multiprocess=no]) + +AC_ARG_ENABLE(man, + [AS_HELP_STRING([--disable-man], + [do not install man pages (default is to install)])],, + enable_man=yes) +AM_CONDITIONAL(ENABLE_MAN, test "$enable_man" != no) + +dnl Enable debug AC_ARG_ENABLE([debug], [AS_HELP_STRING([--enable-debug], - [use debug compiler flags and macros (default is no)])], + [use compiler flags and macros suited for debugging (default is no)])], [enable_debug=$enableval], [enable_debug=no]) +dnl Enable different -fsanitize options +AC_ARG_WITH([sanitizers], + [AS_HELP_STRING([--with-sanitizers], + [comma separated list of extra sanitizers to build with (default is none enabled)])], + [use_sanitizers=$withval]) + +dnl Enable gprof profiling +AC_ARG_ENABLE([gprof], + [AS_HELP_STRING([--enable-gprof], + [use gprof profiling compiler flags (default is no)])], + [enable_gprof=$enableval], + [enable_gprof=no]) + +dnl Pass compiler & linker flags that make builds deterministic +AC_ARG_ENABLE([determinism], + [AS_HELP_STRING([--enable-determinism], + [Enable compilation flags that make builds deterministic (default is no)])], + [enable_determinism=$enableval], + [enable_determinism=no]) + +dnl Turn warnings into errors +AC_ARG_ENABLE([werror], + [AS_HELP_STRING([--enable-werror], + [Treat certain compiler warnings as errors (default is no)])], + [enable_werror=$enableval], + [enable_werror=no]) + +AC_LANG_PUSH([C++]) + +dnl Check for a flag to turn compiler warnings into errors. This is helpful for checks which may +dnl appear to succeed because by default they merely emit warnings when they fail. +dnl +dnl Note that this is not necessarily a check to see if -Werror is supported, but rather to see if +dnl a compile with -Werror can succeed. This is important because the compiler may already be +dnl warning about something unrelated, for example about some path issue. If that is the case, +dnl -Werror cannot be used because all of those warnings would be turned into errors. +AX_CHECK_COMPILE_FLAG([-Werror],[CXXFLAG_WERROR="-Werror"],[CXXFLAG_WERROR=""]) + +dnl Check for a flag to turn linker warnings into errors. When flags are passed to linkers via the +dnl compiler driver using a -Wl,-foo flag, linker warnings may be swallowed rather than bubbling up. +dnl See note above, the same applies here as well. +dnl +dnl LDFLAG_WERROR Should only be used when testing -Wl,* +case $host in + *darwin*) + AX_CHECK_LINK_FLAG([-Wl,-fatal_warnings],[LDFLAG_WERROR="-Wl,-fatal_warnings"],[LDFLAG_WERROR=""]) + ;; + *) + AX_CHECK_LINK_FLAG([-Wl,--fatal-warnings],[LDFLAG_WERROR="-Wl,--fatal-warnings"],[LDFLAG_WERROR=""]) + ;; +esac + if test "x$enable_debug" = xyes; then - if test "x$GCC" = xyes; then - CFLAGS="-g3 -O0 -DDEBUG" - fi + dnl Clear default -g -O2 flags + if test "x$CXXFLAGS_overridden" = xno; then + CXXFLAGS="" + fi - if test "x$GXX" = xyes; then - CXXFLAGS="-g3 -O0 -DDEBUG" - fi + dnl Disable all optimizations + AX_CHECK_COMPILE_FLAG([-O0], [[DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -O0"]],,[[$CXXFLAG_WERROR]]) + + dnl Prefer -g3, fall back to -g if that is unavailable. + AX_CHECK_COMPILE_FLAG( + [-g3], + [[DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -g3"]], + [AX_CHECK_COMPILE_FLAG([-g],[[DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -g"]],,[[$CXXFLAG_WERROR]])], + [[$CXXFLAG_WERROR]]) + + AX_CHECK_PREPROC_FLAG([-DDEBUG],[[DEBUG_CPPFLAGS="$DEBUG_CPPFLAGS -DDEBUG"]],,[[$CXXFLAG_WERROR]]) + AX_CHECK_PREPROC_FLAG([-DDEBUG_LOCKORDER],[[DEBUG_CPPFLAGS="$DEBUG_CPPFLAGS -DDEBUG_LOCKORDER"]],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-ftrapv],[DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -ftrapv"],,[[$CXXFLAG_WERROR]]) +fi + +if test x$use_sanitizers != x; then + dnl First check if the compiler accepts flags. If an incompatible pair like + dnl -fsanitize=address,thread is used here, this check will fail. This will also + dnl fail if a bad argument is passed, e.g. -fsanitize=undfeined + AX_CHECK_COMPILE_FLAG( + [[-fsanitize=$use_sanitizers]], + [[SANITIZER_CXXFLAGS=-fsanitize=$use_sanitizers]], + [AC_MSG_ERROR([compiler did not accept requested flags])]) + + dnl Some compilers (e.g. GCC) require additional libraries like libasan, + dnl libtsan, libubsan, etc. Make sure linking still works with the sanitize + dnl flag. This is a separate check so we can give a better error message when + dnl the sanitize flags are supported by the compiler but the actual sanitizer + dnl libs are missing. + AX_CHECK_LINK_FLAG( + [[-fsanitize=$use_sanitizers]], + [[SANITIZER_LDFLAGS=-fsanitize=$use_sanitizers]], + [AC_MSG_ERROR([linker did not accept requested flags, you are missing required libraries])], + [], + [AC_LANG_PROGRAM([[ + #include + #include + extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { return 0; } + __attribute__((weak)) // allow for libFuzzer linking + ]],[[]])]) +fi + +ERROR_CXXFLAGS= +if test "x$enable_werror" = "xyes"; then + if test "x$CXXFLAG_WERROR" = "x"; then + AC_MSG_ERROR("enable-werror set but -Werror is not usable") + fi + AX_CHECK_COMPILE_FLAG([-Werror=gnu],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=gnu"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Werror=vla],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=vla"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Werror=shadow-field],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=shadow-field"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Werror=switch],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=switch"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Werror=thread-safety],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=thread-safety"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Werror=range-loop-analysis],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=range-loop-analysis"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Werror=unused-variable],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=unused-variable"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Werror=date-time],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=date-time"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Werror=return-type],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=return-type"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Werror=conditional-uninitialized],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=conditional-uninitialized"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Werror=sign-compare],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=sign-compare"],,[[$CXXFLAG_WERROR]]) + dnl -Wsuggest-override is broken with GCC before 9.2 + dnl https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78010 + AX_CHECK_COMPILE_FLAG([-Werror=suggest-override],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=suggest-override"],,[[$CXXFLAG_WERROR]], + [AC_LANG_SOURCE([[struct A { virtual void f(); }; struct B : A { void f() final; };]])]) + AX_CHECK_COMPILE_FLAG([-Werror=unreachable-code-loop-increment],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=unreachable-code-loop-increment"],,[[$CXXFLAG_WERROR]]) fi -## TODO: Remove these hard-coded paths and flags. They are here for the sake of -## compatibility with the legacy buildsystem. -## if test "x$CXXFLAGS_overridden" = "xno"; then - CXXFLAGS="$CXXFLAGS -Wall -Wextra -Wformat -Wformat-security -Wno-unused-parameter" + AX_CHECK_COMPILE_FLAG([-Wall],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wall"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wextra],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wextra"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wgnu],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wgnu"],,[[$CXXFLAG_WERROR]]) + dnl some compilers will ignore -Wformat-security without -Wformat, so just combine the two here. + AX_CHECK_COMPILE_FLAG([-Wformat -Wformat-security],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wformat -Wformat-security"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wvla],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wvla"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wshadow-field],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wshadow-field"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wswitch],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wswitch"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wthread-safety],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wthread-safety"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wrange-loop-analysis],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wrange-loop-analysis"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wredundant-decls],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wredundant-decls"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wunused-variable],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wunused-variable"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wdate-time],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wdate-time"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wconditional-uninitialized],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wconditional-uninitialized"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wsign-compare],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wsign-compare"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wduplicated-branches],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wduplicated-branches"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wduplicated-cond],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wduplicated-cond"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wlogical-op],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wlogical-op"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Woverloaded-virtual],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Woverloaded-virtual"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wsuggest-override],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wsuggest-override"],,[[$CXXFLAG_WERROR]], + [AC_LANG_SOURCE([[struct A { virtual void f(); }; struct B : A { void f() final; };]])]) + AX_CHECK_COMPILE_FLAG([-Wunreachable-code-loop-increment],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wunreachable-code-loop-increment"],,[[$CXXFLAG_WERROR]]) + + dnl Some compilers (gcc) ignore unknown -Wno-* options, but warn about all + dnl unknown options if any other warning is produced. Test the -Wfoo case, and + dnl set the -Wno-foo case if it works. + AX_CHECK_COMPILE_FLAG([-Wunused-parameter],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-unused-parameter"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wself-assign],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-self-assign"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wunused-local-typedef],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-unused-local-typedef"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wdeprecated-register],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-deprecated-register"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wimplicit-fallthrough],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-implicit-fallthrough"],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-Wdeprecated-copy],[NOWARN_CXXFLAGS="$NOWARN_CXXFLAGS -Wno-deprecated-copy"],,[[$CXXFLAG_WERROR]]) fi -CPPFLAGS="$CPPFLAGS -DBOOST_SPIRIT_THREADSAFE -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS" -AC_LANG_PUSH([C++]) +dnl Don't allow extended (non-ASCII) symbols in identifiers. This is easier for code review. +AX_CHECK_COMPILE_FLAG([-fno-extended-identifiers],[[CXXFLAGS="$CXXFLAGS -fno-extended-identifiers"]],,[[$CXXFLAG_WERROR]]) + +enable_sse42=no +enable_sse41=no +enable_avx2=no +enable_shani=no + +if test "x$use_asm" = "xyes"; then + +dnl Check for optional instruction set support. Enabling these does _not_ imply that all code will +dnl be compiled with them, rather that specific objects/libs may use them after checking for runtime +dnl compatibility. + +dnl x86 +AX_CHECK_COMPILE_FLAG([-msse4.2],[[SSE42_CXXFLAGS="-msse4.2"]],,[[$CXXFLAG_WERROR]]) +AX_CHECK_COMPILE_FLAG([-msse4.1],[[SSE41_CXXFLAGS="-msse4.1"]],,[[$CXXFLAG_WERROR]]) +AX_CHECK_COMPILE_FLAG([-mavx -mavx2],[[AVX2_CXXFLAGS="-mavx -mavx2"]],,[[$CXXFLAG_WERROR]]) +AX_CHECK_COMPILE_FLAG([-msse4 -msha],[[SHANI_CXXFLAGS="-msse4 -msha"]],,[[$CXXFLAG_WERROR]]) + +TEMP_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $SSE42_CXXFLAGS" +AC_MSG_CHECKING(for SSE4.2 intrinsics) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #if defined(_MSC_VER) + #include + #elif defined(__GNUC__) && defined(__SSE4_2__) + #include + #endif + ]],[[ + uint64_t l = 0; + l = _mm_crc32_u8(l, 0); + l = _mm_crc32_u32(l, 0); + l = _mm_crc32_u64(l, 0); + return l; + ]])], + [ AC_MSG_RESULT(yes); enable_sse42=yes], + [ AC_MSG_RESULT(no)] +) +CXXFLAGS="$TEMP_CXXFLAGS" + +TEMP_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $SSE41_CXXFLAGS" +AC_MSG_CHECKING(for SSE4.1 intrinsics) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #include + ]],[[ + __m128i l = _mm_set1_epi32(0); + return _mm_extract_epi32(l, 3); + ]])], + [ AC_MSG_RESULT(yes); enable_sse41=yes; AC_DEFINE(ENABLE_SSE41, 1, [Define this symbol to build code that uses SSE4.1 intrinsics]) ], + [ AC_MSG_RESULT(no)] +) +CXXFLAGS="$TEMP_CXXFLAGS" + +TEMP_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $AVX2_CXXFLAGS" +AC_MSG_CHECKING(for AVX2 intrinsics) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #include + ]],[[ + __m256i l = _mm256_set1_epi32(0); + return _mm256_extract_epi32(l, 7); + ]])], + [ AC_MSG_RESULT(yes); enable_avx2=yes; AC_DEFINE(ENABLE_AVX2, 1, [Define this symbol to build code that uses AVX2 intrinsics]) ], + [ AC_MSG_RESULT(no)] +) +CXXFLAGS="$TEMP_CXXFLAGS" + +TEMP_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $SHANI_CXXFLAGS" +AC_MSG_CHECKING(for SHA-NI intrinsics) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #include + ]],[[ + __m128i i = _mm_set1_epi32(0); + __m128i j = _mm_set1_epi32(1); + __m128i k = _mm_set1_epi32(2); + return _mm_extract_epi32(_mm_sha256rnds2_epu32(i, i, k), 0); + ]])], + [ AC_MSG_RESULT(yes); enable_shani=yes; AC_DEFINE(ENABLE_SHANI, 1, [Define this symbol to build code that uses SHA-NI intrinsics]) ], + [ AC_MSG_RESULT(no)] +) +CXXFLAGS="$TEMP_CXXFLAGS" -use_pkgconfig=yes -case $host in - *mingw*) +# ARM +AX_CHECK_COMPILE_FLAG([-march=armv8-a+crc+crypto],[[ARM_CRC_CXXFLAGS="-march=armv8-a+crc+crypto"]],,[[$CXXFLAG_WERROR]]) + +TEMP_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $ARM_CRC_CXXFLAGS" +AC_MSG_CHECKING(for ARM CRC32 intrinsics) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #include + ]],[[ + __crc32cb(0, 0); __crc32ch(0, 0); __crc32cw(0, 0); __crc32cd(0, 0); + vmull_p64(0, 0); + ]])], + [ AC_MSG_RESULT(yes); enable_arm_crc=yes; ], + [ AC_MSG_RESULT(no)] +) +CXXFLAGS="$TEMP_CXXFLAGS" + +fi + +CPPFLAGS="$CPPFLAGS -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS" + +AC_ARG_WITH([utils], + [AS_HELP_STRING([--with-utils], + [build bitcoin-cli bitcoin-tx bitcoin-wallet (default=yes)])], + [build_bitcoin_utils=$withval], + [build_bitcoin_utils=yes]) + +AC_ARG_ENABLE([util-cli], + [AS_HELP_STRING([--enable-util-cli], + [build bitcoin-cli])], + [build_bitcoin_cli=$enableval], + [build_bitcoin_cli=$build_bitcoin_utils]) + +AC_ARG_ENABLE([util-tx], + [AS_HELP_STRING([--enable-util-tx], + [build bitcoin-tx])], + [build_bitcoin_tx=$enableval], + [build_bitcoin_tx=$build_bitcoin_utils]) + +AC_ARG_ENABLE([util-wallet], + [AS_HELP_STRING([--enable-util-wallet], + [build bitcoin-wallet])], + [build_bitcoin_wallet=$enableval], + [build_bitcoin_wallet=$build_bitcoin_utils]) + +AC_ARG_WITH([libs], + [AS_HELP_STRING([--with-libs], + [build libraries (default=yes)])], + [build_bitcoin_libs=$withval], + [build_bitcoin_libs=yes]) - #pkgconfig does more harm than good with MinGW - use_pkgconfig=no +AC_ARG_WITH([daemon], + [AS_HELP_STRING([--with-daemon], + [build bitcoind daemon (default=yes)])], + [build_bitcoind=$withval], + [build_bitcoind=yes]) +case $host in + *mingw*) TARGET_OS=windows - AC_CHECK_LIB([mingwthrd], [main],, AC_MSG_ERROR(lib missing)) - AC_CHECK_LIB([kernel32], [main],, AC_MSG_ERROR(lib missing)) - AC_CHECK_LIB([user32], [main],, AC_MSG_ERROR(lib missing)) - AC_CHECK_LIB([gdi32], [main],, AC_MSG_ERROR(lib missing)) - AC_CHECK_LIB([comdlg32], [main],, AC_MSG_ERROR(lib missing)) - AC_CHECK_LIB([winspool], [main],, AC_MSG_ERROR(lib missing)) - AC_CHECK_LIB([winmm], [main],, AC_MSG_ERROR(lib missing)) - AC_CHECK_LIB([shell32], [main],, AC_MSG_ERROR(lib missing)) - AC_CHECK_LIB([comctl32], [main],, AC_MSG_ERROR(lib missing)) - AC_CHECK_LIB([ole32], [main],, AC_MSG_ERROR(lib missing)) - AC_CHECK_LIB([oleaut32], [main],, AC_MSG_ERROR(lib missing)) - AC_CHECK_LIB([uuid], [main],, AC_MSG_ERROR(lib missing)) - AC_CHECK_LIB([rpcrt4], [main],, AC_MSG_ERROR(lib missing)) - AC_CHECK_LIB([advapi32], [main],, AC_MSG_ERROR(lib missing)) - AC_CHECK_LIB([ws2_32], [main],, AC_MSG_ERROR(lib missing)) - AC_CHECK_LIB([mswsock], [main],, AC_MSG_ERROR(lib missing)) - AC_CHECK_LIB([shlwapi], [main],, AC_MSG_ERROR(lib missing)) - AC_CHECK_LIB([iphlpapi], [main],, AC_MSG_ERROR(lib missing)) - AC_CHECK_LIB([crypt32], [main],, AC_MSG_ERROR(lib missing)) - - # -static is interpreted by libtool, where it has a different meaning. - # In libtool-speak, it's -all-static. + AC_CHECK_LIB([kernel32], [GetModuleFileNameA],, AC_MSG_ERROR(libkernel32 missing)) + AC_CHECK_LIB([user32], [main],, AC_MSG_ERROR(libuser32 missing)) + AC_CHECK_LIB([gdi32], [main],, AC_MSG_ERROR(libgdi32 missing)) + AC_CHECK_LIB([comdlg32], [main],, AC_MSG_ERROR(libcomdlg32 missing)) + AC_CHECK_LIB([winmm], [main],, AC_MSG_ERROR(libwinmm missing)) + AC_CHECK_LIB([shell32], [SHGetSpecialFolderPathW],, AC_MSG_ERROR(libshell32 missing)) + AC_CHECK_LIB([comctl32], [main],, AC_MSG_ERROR(libcomctl32 missing)) + AC_CHECK_LIB([ole32], [CoCreateInstance],, AC_MSG_ERROR(libole32 missing)) + AC_CHECK_LIB([oleaut32], [main],, AC_MSG_ERROR(liboleaut32 missing)) + AC_CHECK_LIB([uuid], [main],, AC_MSG_ERROR(libuuid missing)) + AC_CHECK_LIB([advapi32], [CryptAcquireContextW],, AC_MSG_ERROR(libadvapi32 missing)) + AC_CHECK_LIB([ws2_32], [WSAStartup],, AC_MSG_ERROR(libws2_32 missing)) + AC_CHECK_LIB([shlwapi], [PathRemoveFileSpecW],, AC_MSG_ERROR(libshlwapi missing)) + AC_CHECK_LIB([iphlpapi], [GetAdaptersAddresses],, AC_MSG_ERROR(libiphlpapi missing)) + + dnl -static is interpreted by libtool, where it has a different meaning. + dnl In libtool-speak, it's -all-static. AX_CHECK_LINK_FLAG([[-static]],[LIBTOOL_APP_LDFLAGS="$LIBTOOL_APP_LDFLAGS -all-static"]) AC_PATH_PROG([MAKENSIS], [makensis], none) @@ -215,17 +617,7 @@ case $host in AC_MSG_ERROR("windres not found") fi - CPPFLAGS="$CPPFLAGS -D_MT -DWIN32 -D_WINDOWS -DBOOST_THREAD_USE_LIB" - LEVELDB_TARGET_FLAGS="TARGET_OS=OS_WINDOWS_CROSSCOMPILE" - if test "x$CXXFLAGS_overridden" = "xno"; then - CXXFLAGS="$CXXFLAGS -w" - fi - case $host in - i?86-*) WINDOWS_BITS=32 ;; - x86_64-*) WINDOWS_BITS=64 ;; - *) AC_MSG_ERROR("Could not determine win32/win64 for installer") ;; - esac - AC_SUBST(WINDOWS_BITS) + CPPFLAGS="$CPPFLAGS -D_MT -DWIN32 -D_WINDOWS -DBOOST_THREAD_USE_LIB -D_WIN32_WINNT=0x0601 -D_WIN32_IE=0x0501 -DWIN32_LEAN_AND_MEAN" dnl libtool insists upon adding -nostdlib and a list of objects/libs to link against. dnl That breaks our ability to build dll's with static libgcc/libstdc++/libssp. Override @@ -235,23 +627,14 @@ case $host in archive_cmds_CXX="\$CC -shared \$libobjs \$deplibs \$compiler_flags -static -o \$output_objdir/\$soname \${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker \$lib" postdeps_CXX= + dnl We require Windows 7 (NT 6.1) or later + AX_CHECK_LINK_FLAG([[-Wl,--major-subsystem-version -Wl,6 -Wl,--minor-subsystem-version -Wl,1]],[LDFLAGS="$LDFLAGS -Wl,--major-subsystem-version -Wl,6 -Wl,--minor-subsystem-version -Wl,1"],,[[$LDFLAG_WERROR]]) ;; *darwin*) TARGET_OS=darwin - LEVELDB_TARGET_FLAGS="TARGET_OS=Darwin" if test x$cross_compiling != xyes; then BUILD_OS=darwin - AC_CHECK_PROG([PORT],port, port) - if test x$PORT = xport; then - dnl add default macports paths - CPPFLAGS="$CPPFLAGS -isystem /opt/local/include" - LIBS="$LIBS -L/opt/local/lib" - if test -d /opt/local/include/db48; then - CPPFLAGS="$CPPFLAGS -I/opt/local/include/db48" - LIBS="$LIBS -L/opt/local/lib/db48" - fi - fi - + AC_PATH_PROGS([RSVG_CONVERT], [rsvg-convert rsvg],rsvg-convert) AC_CHECK_PROG([BREW],brew, brew) if test x$BREW = xbrew; then dnl These Homebrew packages may be keg-only, meaning that they won't be found @@ -260,16 +643,12 @@ case $host in dnl It's safe to add these paths even if the functionality is disabled by dnl the user (--without-wallet or --without-gui for example). - openssl_prefix=`$BREW --prefix openssl 2>/dev/null` - bdb_prefix=`$BREW --prefix berkeley-db4 2>/dev/null` - qt5_prefix=`$BREW --prefix qt5 2>/dev/null` - if test x$openssl_prefix != x; then - PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH" - export PKG_CONFIG_PATH - fi - if test x$bdb_prefix != x; then - CPPFLAGS="$CPPFLAGS -I$bdb_prefix/include" - LIBS="$LIBS -L$bdb_prefix/lib" + bdb_prefix=$($BREW --prefix berkeley-db4 2>/dev/null) + qt5_prefix=$($BREW --prefix qt5 2>/dev/null) + if test x$bdb_prefix != x && test "x$BDB_CFLAGS" = "x" && test "x$BDB_LIBS" = "x"; then + dnl This must precede the call to BITCOIN_FIND_BDB48 below. + BDB_CFLAGS="-I$bdb_prefix/include" + BDB_LIBS="-L$bdb_prefix/lib -ldb_cxx-4.8" fi if test x$qt5_prefix != x; then PKG_CONFIG_PATH="$qt5_prefix/lib/pkgconfig:$PKG_CONFIG_PATH" @@ -282,9 +661,13 @@ case $host in BUILD_OS=darwin ;; *) + AC_PATH_TOOL([DSYMUTIL], [dsymutil], dsymutil) AC_PATH_TOOL([INSTALLNAMETOOL], [install_name_tool], install_name_tool) AC_PATH_TOOL([OTOOL], [otool], otool) 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 cross-builds because strip attempts to call a hard-coded ld, @@ -295,61 +678,80 @@ case $host in esac fi - AX_CHECK_LINK_FLAG([[-Wl,-headerpad_max_install_names]], [LDFLAGS="$LDFLAGS -Wl,-headerpad_max_install_names"]) - CPPFLAGS="$CPPFLAGS -DMAC_OSX" + AX_CHECK_LINK_FLAG([[-Wl,-headerpad_max_install_names]], [LDFLAGS="$LDFLAGS -Wl,-headerpad_max_install_names"],, [[$LDFLAG_WERROR]]) + CPPFLAGS="$CPPFLAGS -DMAC_OSX -DOBJC_OLD_DISPATCH_PROTOTYPES=0" + OBJCXXFLAGS="$CXXFLAGS" + ;; + *android*) + dnl make sure android stays above linux for hosts like *linux-android* + TARGET_OS=android ;; *linux*) TARGET_OS=linux ;; - *) - ;; esac -if test x$use_comparison_tool != xno; then - AC_SUBST(JAVA_COMPARISON_TOOL, $use_comparison_tool) -fi - -if test x$use_comparison_tool_reorg_tests != xno; then - if test x$use_comparison_tool = x; then - AC_MSG_ERROR("comparison tool reorg tests but comparison tool was not specified") - fi - AC_SUBST(COMPARISON_TOOL_REORG_TESTS, 1) -else - AC_SUBST(COMPARISON_TOOL_REORG_TESTS, 0) +if test x$use_extended_functional_tests != xno; then + AC_SUBST(EXTENDED_FUNCTIONAL_TESTS, --extended) fi if test x$use_lcov = xyes; then if test x$LCOV = x; then AC_MSG_ERROR("lcov testing requested but lcov not found") fi - if test x$GCOV = x; then - AC_MSG_ERROR("lcov testing requested but gcov not found") - fi - if test x$JAVA = x; then - AC_MSG_ERROR("lcov testing requested but java not found") + if test x$PYTHON = x; then + AC_MSG_ERROR("lcov testing requested but python not found") fi if test x$GENHTML = x; then AC_MSG_ERROR("lcov testing requested but genhtml not found") fi - if test x$use_comparison_tool = x; then - AC_MSG_ERROR("lcov testing requested but comparison tool was not specified") - fi - LCOV="$LCOV --gcov-tool=$GCOV" + + AC_MSG_CHECKING([whether compiler is Clang]) + AC_PREPROC_IFELSE([AC_LANG_SOURCE([[ + #if defined(__clang__) && defined(__llvm__) + // Compiler is Clang + #else + # error Compiler is not Clang + #endif + ]])],[ + AC_MSG_RESULT([yes]) + if test x$LLVM_COV = x; then + AC_MSG_ERROR([lcov testing requested but llvm-cov not found]) + fi + COV_TOOL="$LLVM_COV gcov" + ],[ + AC_MSG_RESULT([no]) + if test x$GCOV = x; then + AC_MSG_ERROR([lcov testing requested but gcov not found]) + fi + COV_TOOL="$GCOV" + ]) + AC_SUBST(COV_TOOL) + AC_SUBST(COV_TOOL_WRAPPER, "cov_tool_wrapper.sh") + LCOV="$LCOV --gcov-tool $(pwd)/$COV_TOOL_WRAPPER" + + AX_CHECK_LINK_FLAG([[--coverage]], [LDFLAGS="$LDFLAGS --coverage"], + [AC_MSG_ERROR("lcov testing requested but --coverage linker flag does not work")]) AX_CHECK_COMPILE_FLAG([--coverage],[CXXFLAGS="$CXXFLAGS --coverage"], [AC_MSG_ERROR("lcov testing requested but --coverage flag does not work")]) + CXXFLAGS="$CXXFLAGS -Og" +fi + +if test x$use_lcov_branch != xno; then + AC_SUBST(LCOV_OPTS, "$LCOV_OPTS --rc lcov_branch_coverage=1") fi -dnl Require little endian -AC_C_BIGENDIAN([AC_MSG_ERROR("Big Endian not supported")]) +dnl Check for endianness +AC_C_BIGENDIAN dnl Check for pthread compile/link requirements AX_PTHREAD -# The following macro will add the necessary defines to bitcoin-config.h, but -# they also need to be passed down to any subprojects. Pull the results out of -# the cache and add them to CPPFLAGS. +dnl The following macro will add the necessary defines to bitcoin-config.h, but +dnl they also need to be passed down to any subprojects. Pull the results out of +dnl the cache and add them to CPPFLAGS. AC_SYS_LARGEFILE -# detect POSIX or GNU variant of strerror_r +dnl detect POSIX or GNU variant of strerror_r AC_FUNC_STRERROR_R if test x$ac_cv_sys_file_offset_bits != x && @@ -364,89 +766,168 @@ if test x$ac_cv_sys_large_files != x && CPPFLAGS="$CPPFLAGS -D_LARGE_FILES=$ac_cv_sys_large_files" fi -AX_CHECK_LINK_FLAG([[-Wl,--large-address-aware]], [LDFLAGS="$LDFLAGS -Wl,--large-address-aware"]) - AX_GCC_FUNC_ATTRIBUTE([visibility]) AX_GCC_FUNC_ATTRIBUTE([dllexport]) AX_GCC_FUNC_ATTRIBUTE([dllimport]) if test x$use_glibc_compat != xno; then + AX_CHECK_LINK_FLAG([[-Wl,--wrap=__divmoddi4]], [COMPAT_LDFLAGS="$COMPAT_LDFLAGS -Wl,--wrap=__divmoddi4"]) + AX_CHECK_LINK_FLAG([[-Wl,--wrap=log2f]], [COMPAT_LDFLAGS="$COMPAT_LDFLAGS -Wl,--wrap=log2f"]) +else + AC_SEARCH_LIBS([clock_gettime],[rt]) +fi + +if test "x$enable_gprof" = xyes; then + dnl -pg is incompatible with -pie. Since hardening and profiling together doesn't make sense, + dnl we simply make them mutually exclusive here. Additionally, hardened toolchains may force + dnl -pie by default, in which case it needs to be turned off with -no-pie. - #__fdelt_chk's params and return type have changed from long unsigned int to long int. - # See which one is present here. - AC_MSG_CHECKING(__fdelt_chk type) - AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#ifdef _FORTIFY_SOURCE - #undef _FORTIFY_SOURCE - #endif - #define _FORTIFY_SOURCE 2 - #include - extern "C" long unsigned int __fdelt_warn(long unsigned int);]],[[]])], - [ fdelt_type="long unsigned int"], - [ fdelt_type="long int"]) - AC_MSG_RESULT($fdelt_type) - AC_DEFINE_UNQUOTED(FDELT_TYPE, $fdelt_type,[parameter and return value type for __fdelt_chk]) + if test x$use_hardening = xyes; then + AC_MSG_ERROR(gprof profiling is not compatible with hardening. Reconfigure with --disable-hardening or --disable-gprof) + fi + use_hardening=no + AX_CHECK_COMPILE_FLAG([-pg],[GPROF_CXXFLAGS="-pg"], + [AC_MSG_ERROR(gprof profiling requested but not available)], [[$CXXFLAG_WERROR]]) + + AX_CHECK_LINK_FLAG([[-no-pie]], [GPROF_LDFLAGS="-no-pie"]) + AX_CHECK_LINK_FLAG([[-pg]],[GPROF_LDFLAGS="$GPROF_LDFLAGS -pg"], + [AC_MSG_ERROR(gprof profiling requested but not available)], [[$GPROF_LDFLAGS]]) +fi +if test x$TARGET_OS != xwindows; then + dnl All windows code is PIC, forcing it on just adds useless compile warnings + AX_CHECK_COMPILE_FLAG([-fPIC],[PIC_FLAGS="-fPIC"]) fi +dnl All versions of gcc that we commonly use for building are subject to bug +dnl https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90348. To work around that, set +dnl -fstack-reuse=none for all gcc builds. (Only gcc understands this flag) +AX_CHECK_COMPILE_FLAG([-fstack-reuse=none],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fstack-reuse=none"]) if test x$use_hardening != xno; then + use_hardening=yes AX_CHECK_COMPILE_FLAG([-Wstack-protector],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wstack-protector"]) AX_CHECK_COMPILE_FLAG([-fstack-protector-all],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fstack-protector-all"]) - AX_CHECK_PREPROC_FLAG([-D_FORTIFY_SOURCE=2],[ - AX_CHECK_PREPROC_FLAG([-U_FORTIFY_SOURCE],[ - HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -U_FORTIFY_SOURCE" + AX_CHECK_COMPILE_FLAG([-fcf-protection=full],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fcf-protection=full"]) + + dnl stack-clash-protection does not work properly when building for Windows. + dnl We use the test case from https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90458 + dnl to determine if it can be enabled. + AX_CHECK_COMPILE_FLAG([-fstack-clash-protection],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fstack-clash-protection"],[],["-O0"], + [AC_LANG_SOURCE([[class D {public: unsigned char buf[32768];}; int main() {D d; return 0;}]])]) + + dnl When enable_debug is yes, all optimizations are disabled. + dnl However, FORTIFY_SOURCE requires that there is some level of optimization, otherwise it does nothing and just creates a compiler warning. + dnl Since FORTIFY_SOURCE is a no-op without optimizations, do not enable it when enable_debug is yes. + if test x$enable_debug != xyes; then + AX_CHECK_PREPROC_FLAG([-D_FORTIFY_SOURCE=2],[ + AX_CHECK_PREPROC_FLAG([-U_FORTIFY_SOURCE],[ + HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -U_FORTIFY_SOURCE" + ]) + HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -D_FORTIFY_SOURCE=2" ]) - HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -D_FORTIFY_SOURCE=2" - ]) - - AX_CHECK_LINK_FLAG([[-Wl,--dynamicbase]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--dynamicbase"]) - AX_CHECK_LINK_FLAG([[-Wl,--nxcompat]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--nxcompat"]) - AX_CHECK_LINK_FLAG([[-Wl,--high-entropy-va]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--high-entropy-va"]) - AX_CHECK_LINK_FLAG([[-Wl,-z,relro]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,relro"]) - AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,now"]) - - if test x$TARGET_OS != xwindows; then - AX_CHECK_COMPILE_FLAG([-fPIE],[PIE_FLAGS="-fPIE"]) - AX_CHECK_LINK_FLAG([[-pie]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -pie"]) fi + AX_CHECK_LINK_FLAG([[-Wl,--dynamicbase]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--dynamicbase"],, [[$LDFLAG_WERROR]]) + AX_CHECK_LINK_FLAG([[-Wl,--nxcompat]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--nxcompat"],, [[$LDFLAG_WERROR]]) + AX_CHECK_LINK_FLAG([[-Wl,--high-entropy-va]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--high-entropy-va"],, [[$LDFLAG_WERROR]]) + AX_CHECK_LINK_FLAG([[-Wl,-z,relro]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,relro"],, [[$LDFLAG_WERROR]]) + AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,now"],, [[$LDFLAG_WERROR]]) + AX_CHECK_LINK_FLAG([[-Wl,-z,separate-code]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,separate-code"],, [[$LDFLAG_WERROR]]) + AX_CHECK_LINK_FLAG([[-fPIE -pie]], [PIE_FLAGS="-fPIE"; HARDENED_LDFLAGS="$HARDENED_LDFLAGS -pie"],, [[$CXXFLAG_WERROR]]) + case $host in *mingw*) - AC_CHECK_LIB([ssp], [main],, AC_MSG_ERROR(lib missing)) + AC_CHECK_LIB([ssp], [main],, AC_MSG_ERROR(libssp missing)) ;; esac - - CXXFLAGS="$CXXFLAGS $HARDENED_CXXFLAGS" - CPPFLAGS="$CPPFLAGS $HARDENED_CPPFLAGS" - LDFLAGS="$LDFLAGS $HARDENED_LDFLAGS" - OBJCXXFLAGS="$CXXFLAGS" fi -dnl this flag screws up non-darwin gcc even when the check fails. special-case it. +dnl These flags are specific to ld64, and may cause issues with other linkers. +dnl For example: GNU ld will interpret -dead_strip as -de and then try and use +dnl "ad_strip" as the symbol for the entry point. if test x$TARGET_OS = xdarwin; then - AX_CHECK_LINK_FLAG([[-Wl,-dead_strip]], [LDFLAGS="$LDFLAGS -Wl,-dead_strip"]) + AX_CHECK_LINK_FLAG([[-Wl,-dead_strip]], [LDFLAGS="$LDFLAGS -Wl,-dead_strip"],, [[$LDFLAG_WERROR]]) + AX_CHECK_LINK_FLAG([[-Wl,-dead_strip_dylibs]], [LDFLAGS="$LDFLAGS -Wl,-dead_strip_dylibs"],, [[$LDFLAG_WERROR]]) + AX_CHECK_LINK_FLAG([[-Wl,-bind_at_load]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-bind_at_load"],, [[$LDFLAG_WERROR]]) fi -AC_CHECK_HEADERS([endian.h stdio.h stdlib.h unistd.h strings.h sys/types.h sys/stat.h sys/select.h sys/prctl.h]) -AC_SEARCH_LIBS([getaddrinfo_a], [anl], [AC_DEFINE(HAVE_GETADDRINFO_A, 1, [Define this symbol if you have getaddrinfo_a])]) -AC_SEARCH_LIBS([inet_pton], [nsl resolv], [AC_DEFINE(HAVE_INET_PTON, 1, [Define this symbol if you have inet_pton])]) +if test x$enable_determinism = xyes; then + if test x$TARGET_OS = xwindows; then + AX_CHECK_LINK_FLAG([[-Wl,--no-insert-timestamp]], [LDFLAGS="$LDFLAGS -Wl,--no-insert-timestamp"],, [[$LDFLAG_WERROR]]) + fi +fi + +AC_CHECK_HEADERS([endian.h sys/endian.h byteswap.h stdio.h stdlib.h unistd.h strings.h sys/types.h sys/stat.h sys/select.h sys/prctl.h sys/sysctl.h vm/vm_param.h sys/vmmeter.h sys/resources.h]) +AC_CHECK_DECLS([getifaddrs, freeifaddrs],,, + [#include + #include ] +) AC_CHECK_DECLS([strnlen]) -AC_CHECK_DECLS([le32toh, le64toh, htole32, htole64, be32toh, be64toh, htobe32, htobe64],,, +dnl Check for daemon(3), unrelated to --with-daemon (although used by it) +AC_CHECK_DECLS([daemon]) + +AC_CHECK_DECLS([le16toh, le32toh, le64toh, htole16, htole32, htole64, be16toh, be32toh, be64toh, htobe16, htobe32, htobe64],,, [#if HAVE_ENDIAN_H #include + #elif HAVE_SYS_ENDIAN_H + #include #endif]) -dnl Check for MSG_NOSIGNAL -AC_MSG_CHECKING(for MSG_NOSIGNAL) -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[ int f = MSG_NOSIGNAL; ]])], - [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_MSG_NOSIGNAL, 1,[Define this symbol if you have MSG_NOSIGNAL]) ], +AC_CHECK_DECLS([bswap_16, bswap_32, bswap_64],,, + [#if HAVE_BYTESWAP_H + #include + #endif]) + +AC_MSG_CHECKING(for __builtin_clzl) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[ + (void) __builtin_clzl(0); + ]])], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_BUILTIN_CLZL, 1, [Define this symbol if you have __builtin_clzl])], + [ AC_MSG_RESULT(no)] +) + +AC_MSG_CHECKING(for __builtin_clzll) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[ + (void) __builtin_clzll(0); + ]])], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_BUILTIN_CLZLL, 1, [Define this symbol if you have __builtin_clzll])], [ AC_MSG_RESULT(no)] ) -AC_SEARCH_LIBS([clock_gettime],[rt]) +dnl Check for malloc_info (for memory statistics information in getmemoryinfo) +AC_MSG_CHECKING(for getmemoryinfo) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ int f = malloc_info(0, NULL); ]])], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_MALLOC_INFO, 1,[Define this symbol if you have malloc_info]) ], + [ AC_MSG_RESULT(no)] +) + +dnl Check for mallopt(M_ARENA_MAX) (to set glibc arenas) +AC_MSG_CHECKING(for mallopt M_ARENA_MAX) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ mallopt(M_ARENA_MAX, 1); ]])], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_MALLOPT_ARENA_MAX, 1,[Define this symbol if you have mallopt with M_ARENA_MAX]) ], + [ AC_MSG_RESULT(no)] +) + +dnl Check for posix_fallocate +AC_MSG_CHECKING(for posix_fallocate) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + // same as in src/util/system.cpp + #ifdef __linux__ + #ifdef _POSIX_C_SOURCE + #undef _POSIX_C_SOURCE + #endif + #define _POSIX_C_SOURCE 200112L + #endif // __linux__ + #include ]], + [[ int f = posix_fallocate(0, 0, 0); ]])], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_POSIX_FALLOCATE, 1,[Define this symbol if you have posix_fallocate]) ], + [ AC_MSG_RESULT(no)] +) AC_MSG_CHECKING([for visibility attribute]) AC_LINK_IFELSE([AC_LANG_SOURCE([ @@ -460,24 +941,219 @@ AC_LINK_IFELSE([AC_LANG_SOURCE([ [ AC_MSG_RESULT(no) if test x$use_reduce_exports = xyes; then - AC_MSG_ERROR([Cannot find a working visibility attribute. Use --disable-reduced-exports.]) + AC_MSG_ERROR([Cannot find a working visibility attribute. Use --disable-reduce-exports.]) fi - AC_MSG_WARN([Cannot find a working visibility attribute. Disabling reduced exports.]) - use_reduce_exports=no ] ) -if test x$use_reduce_exports != xno; then +dnl thread_local is currently disabled when building with glibc back compat. +dnl Our minimum supported glibc is 2.17, however support for thread_local +dnl did not arrive in glibc until 2.18. +if test "x$use_thread_local" = xyes || { test "x$use_thread_local" = xauto && test "x$use_glibc_compat" = xno; }; then + TEMP_LDFLAGS="$LDFLAGS" + LDFLAGS="$TEMP_LDFLAGS $PTHREAD_CFLAGS" + AC_MSG_CHECKING([for thread_local support]) + AC_LINK_IFELSE([AC_LANG_SOURCE([ + #include + static thread_local int foo = 0; + static void run_thread() { foo++;} + int main(){ + for(int i = 0; i < 10; i++) { std::thread(run_thread).detach();} + return foo; + } + ])], + [ + case $host in + *mingw*) + dnl mingw32's implementation of thread_local has also been shown to behave + dnl erroneously under concurrent usage; see: + dnl https://gist.github.com/jamesob/fe9a872051a88b2025b1aa37bfa98605 + AC_MSG_RESULT(no) + ;; + *freebsd*) + dnl FreeBSD's implementation of thread_local is also buggy (per + dnl https://groups.google.com/d/msg/bsdmailinglist/22ncTZAbDp4/Dii_pII5AwAJ) + AC_MSG_RESULT(no) + ;; + *) + AC_DEFINE(HAVE_THREAD_LOCAL,1,[Define if thread_local is supported.]) + AC_MSG_RESULT(yes) + ;; + esac + ], + [ + AC_MSG_RESULT(no) + ] + ) + LDFLAGS="$TEMP_LDFLAGS" +fi + +dnl check for gmtime_r(), fallback to gmtime_s() if that is unavailable +dnl fail if neither are available. +AC_MSG_CHECKING(for gmtime_r) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ gmtime_r((const time_t *) nullptr, (struct tm *) nullptr); ]])], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_GMTIME_R, 1, [Define this symbol if gmtime_r is available]) ], + [ AC_MSG_RESULT(no); + AC_MSG_CHECKING(for gmtime_s); + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ gmtime_s((struct tm *) nullptr, (const time_t *) nullptr); ]])], + [ AC_MSG_RESULT(yes)], + [ AC_MSG_RESULT(no); AC_MSG_ERROR(Both gmtime_r and gmtime_s are unavailable) ] + ) + ] +) + +dnl Check for different ways of gathering OS randomness +AC_MSG_CHECKING(for Linux getrandom syscall) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include + #include + #include ]], + [[ syscall(SYS_getrandom, nullptr, 32, 0); ]])], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SYS_GETRANDOM, 1,[Define this symbol if the Linux getrandom system call is available]) ], + [ AC_MSG_RESULT(no)] +) + +AC_MSG_CHECKING(for getentropy) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ getentropy(nullptr, 32) ]])], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_GETENTROPY, 1,[Define this symbol if the BSD getentropy system call is available]) ], + [ AC_MSG_RESULT(no)] +) + +AC_MSG_CHECKING(for getentropy via random.h) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include + #include ]], + [[ getentropy(nullptr, 32) ]])], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_GETENTROPY_RAND, 1,[Define this symbol if the BSD getentropy system call is available with sys/random.h]) ], + [ AC_MSG_RESULT(no)] +) + +AC_MSG_CHECKING(for sysctl) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include + #include ]], + [[ #ifdef __linux__ + #error "Don't use sysctl on Linux, it's deprecated even when it works" + #endif + sysctl(nullptr, 2, nullptr, nullptr, nullptr, 0); ]])], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SYSCTL, 1,[Define this symbol if the BSD sysctl() is available]) ], + [ AC_MSG_RESULT(no)] +) + +AC_MSG_CHECKING(for sysctl KERN_ARND) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include + #include ]], + [[ #ifdef __linux__ + #error "Don't use sysctl on Linux, it's deprecated even when it works" + #endif + static int name[2] = {CTL_KERN, KERN_ARND}; + sysctl(name, 2, nullptr, nullptr, nullptr, 0); ]])], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_SYSCTL_ARND, 1,[Define this symbol if the BSD sysctl(KERN_ARND) is available]) ], + [ AC_MSG_RESULT(no)] +) + +AC_MSG_CHECKING(for if type char equals int8_t) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include + #include ]], + [[ static_assert(std::is_same::value, ""); ]])], + [ AC_MSG_RESULT(yes); AC_DEFINE(CHAR_EQUALS_INT8, 1,[Define this symbol if type char equals int8_t]) ], + [ AC_MSG_RESULT(no)] +) + +AC_MSG_CHECKING(for fdatasync) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ fdatasync(0); ]])], + [ AC_MSG_RESULT(yes); HAVE_FDATASYNC=1 ], + [ AC_MSG_RESULT(no); HAVE_FDATASYNC=0 ] +) +AC_DEFINE_UNQUOTED([HAVE_FDATASYNC], [$HAVE_FDATASYNC], [Define to 1 if fdatasync is available.]) + +AC_MSG_CHECKING(for F_FULLFSYNC) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ fcntl(0, F_FULLFSYNC, 0); ]])], + [ AC_MSG_RESULT(yes); HAVE_FULLFSYNC=1 ], + [ AC_MSG_RESULT(no); HAVE_FULLFSYNC=0 ] +) + +AC_MSG_CHECKING(for O_CLOEXEC) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ open("", O_CLOEXEC); ]])], + [ AC_MSG_RESULT(yes); HAVE_O_CLOEXEC=1 ], + [ AC_MSG_RESULT(no); HAVE_O_CLOEXEC=0 ] +) + +dnl crc32c platform checks +AC_MSG_CHECKING(for __builtin_prefetch) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[ + char data = 0; + const char* address = &data; + __builtin_prefetch(address, 0, 0); + ]])], + [ AC_MSG_RESULT(yes); HAVE_BUILTIN_PREFETCH=1 ], + [ AC_MSG_RESULT(no); HAVE_BUILTIN_PREFETCH=0 ] +) + +AC_MSG_CHECKING(for _mm_prefetch) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ + char data = 0; + const char* address = &data; + _mm_prefetch(address, _MM_HINT_NTA); + ]])], + [ AC_MSG_RESULT(yes); HAVE_MM_PREFETCH=1 ], + [ AC_MSG_RESULT(no); HAVE_MM_PREFETCH=0 ] +) + +AC_MSG_CHECKING(for strong getauxval support in the system headers) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #include + #include + ]], [[ + getauxval(AT_HWCAP); + ]])], + [ AC_MSG_RESULT(yes); HAVE_STRONG_GETAUXVAL=1 ], + [ AC_MSG_RESULT(no); HAVE_STRONG_GETAUXVAL=0 ] +) + +AC_MSG_CHECKING(for weak getauxval support in the compiler) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + unsigned long getauxval(unsigned long type) __attribute__((weak)); + #define AT_HWCAP 16 + ]], [[ + getauxval(AT_HWCAP); + ]])], + [ AC_MSG_RESULT(yes); HAVE_WEAK_GETAUXVAL=1 ], + [ AC_MSG_RESULT(no); HAVE_WEAK_GETAUXVAL=0 ] +) + +dnl Check for reduced exports +if test x$use_reduce_exports = xyes; then AX_CHECK_COMPILE_FLAG([-fvisibility=hidden],[RE_CXXFLAGS="-fvisibility=hidden"], - [ - if test x$use_reduce_exports = xyes; then - AC_MSG_ERROR([Cannot set default symbol visibility. Use --disable-reduced-exports.]) - fi - AC_MSG_WARN([Cannot set default symbol visibility. Disabling reduced exports.]) - use_reduce_exports=no - ]) + [AC_MSG_ERROR([Cannot set default symbol visibility. Use --disable-reduce-exports.])]) fi +AC_MSG_CHECKING([for std::system]) +AC_LINK_IFELSE( + [ AC_LANG_PROGRAM( + [[ #include ]], + [[ int nErr = std::system(""); ]] + )], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_STD__SYSTEM, 1, Define to 1 if std::system is available.)], + [ AC_MSG_RESULT(no) ] +) + +AC_MSG_CHECKING([for ::_wsystem]) +AC_LINK_IFELSE( + [ AC_LANG_PROGRAM( + [[ ]], + [[ int nErr = ::_wsystem(""); ]] + )], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_WSYSTEM, 1, Define to 1 if ::wsystem is available.)], + [ AC_MSG_RESULT(no) ] +) + +AC_DEFINE([HAVE_SYSTEM], [HAVE_STD__SYSTEM || HAVE_WSYSTEM], [std::system or ::wsystem]) + LEVELDB_CPPFLAGS= LIBLEVELDB= LIBMEMENV= @@ -486,30 +1162,155 @@ AC_SUBST(LEVELDB_CPPFLAGS) AC_SUBST(LIBLEVELDB) AC_SUBST(LIBMEMENV) +dnl SUPPRESSED_CPPFLAGS=SUPPRESS_WARNINGS([$SOME_CPPFLAGS]) +dnl Replace -I with -isystem in $SOME_CPPFLAGS to suppress warnings from +dnl headers from its include directories and return the result. +dnl See -isystem documentation: +dnl https://gcc.gnu.org/onlinedocs/gcc/Directory-Options.html +dnl https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-isystem-directory +dnl Do not change "-I/usr/include" to "-isystem /usr/include" because that +dnl is not necessary (/usr/include is already a system directory) and because +dnl it would break GCC's #include_next. +AC_DEFUN([SUPPRESS_WARNINGS], + [$(echo $1 |${SED} -E -e 's/(^| )-I/\1-isystem /g' -e 's;-isystem /usr/include([/ ]|$);-I/usr/include\1;g')]) + +dnl enable-fuzz should disable all other targets +if test "x$enable_fuzz" = "xyes"; then + AC_MSG_WARN(enable-fuzz will disable all other targets) + build_bitcoin_utils=no + build_bitcoin_cli=no + build_bitcoin_tx=no + build_bitcoin_wallet=no + build_bitcoind=no + build_bitcoin_libs=no + bitcoin_enable_qt=no + bitcoin_enable_qt_test=no + bitcoin_enable_qt_dbus=no + enable_wallet=no + use_bench=no + use_upnp=no + use_zmq=no + + AC_MSG_CHECKING([whether main function is needed]) + AX_CHECK_LINK_FLAG( + [[-fsanitize=$use_sanitizers]], + [AC_MSG_RESULT([no])], + [AC_MSG_RESULT([yes]) + CPPFLAGS="$CPPFLAGS -DPROVIDE_MAIN_FUNCTION"], + [], + [AC_LANG_PROGRAM([[ + #include + #include + extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { return 0; } + /* unterminated comment to remove the main function ... + ]],[[]])]) +else + BITCOIN_QT_INIT + + dnl sets $bitcoin_enable_qt, $bitcoin_enable_qt_test, $bitcoin_enable_qt_dbus + BITCOIN_QT_CONFIGURE([5.5.1]) + + dnl Keep a copy of the original $QT_INCLUDES and use it when invoking qt's moc + QT_INCLUDES_UNSUPPRESSED=$QT_INCLUDES + if test x$suppress_external_warnings != xno ; then + QT_INCLUDES=SUPPRESS_WARNINGS($QT_INCLUDES) + QT_DBUS_INCLUDES=SUPPRESS_WARNINGS($QT_DBUS_INCLUDES) + QT_TEST_INCLUDES=SUPPRESS_WARNINGS($QT_TEST_INCLUDES) + fi +fi + if test x$enable_wallet != xno; then dnl Check for libdb_cxx only if wallet enabled BITCOIN_FIND_BDB48 + if test x$suppress_external_warnings != xno ; then + BDB_CPPFLAGS=SUPPRESS_WARNINGS($BDB_CPPFLAGS) + fi + + dnl Check for sqlite3 + if test "x$use_sqlite" != "xno"; then + PKG_CHECK_MODULES([SQLITE], [sqlite3 >= 3.7.17], [have_sqlite=yes], [have_sqlite=no]) + fi + AC_MSG_CHECKING([whether to build wallet with support for sqlite]) + if test "x$use_sqlite" = "xno"; then + use_sqlite=no + elif test "x$have_sqlite" = "xno"; then + if test "x$use_sqlite" = "xyes"; then + AC_MSG_ERROR([sqlite support requested but cannot be built. Use --without-sqlite]) + fi + use_sqlite=no + else + if test x$use_sqlite != xno; then + AC_DEFINE([USE_SQLITE],[1],[Define if sqlite support should be compiled in]) + use_sqlite=yes + fi + fi + AC_MSG_RESULT([$use_sqlite]) fi dnl Check for libminiupnpc (optional) if test x$use_upnp != xno; then AC_CHECK_HEADERS( [miniupnpc/miniwget.h miniupnpc/miniupnpc.h miniupnpc/upnpcommands.h miniupnpc/upnperrors.h], - [AC_CHECK_LIB([miniupnpc], [main],[MINIUPNPC_LIBS=-lminiupnpc], [have_miniupnpc=no])], + [AC_CHECK_LIB([miniupnpc], [upnpDiscover], [MINIUPNPC_LIBS=-lminiupnpc], [have_miniupnpc=no])], [have_miniupnpc=no] ) +dnl The minimum supported miniUPnPc API version is set to 10. This keeps compatibility +dnl with Ubuntu 16.04 LTS and Debian 8 libminiupnpc-dev packages. +if test x$have_miniupnpc != xno; then + AC_MSG_CHECKING([whether miniUPnPc API version is supported]) + AC_PREPROC_IFELSE([AC_LANG_PROGRAM([[ + @%:@include + ]], [[ + #if MINIUPNPC_API_VERSION >= 10 + // Everything is okay + #else + # error miniUPnPc API version is too old + #endif + ]])],[ + AC_MSG_RESULT(yes) + ],[ + AC_MSG_RESULT(no) + AC_MSG_WARN([miniUPnPc API version < 10 is unsupported, disabling UPnP support.]) + have_miniupnpc=no + ]) +fi +fi + +if test x$build_bitcoin_wallet$build_bitcoin_cli$build_bitcoin_tx$build_bitcoind$bitcoin_enable_qt$use_tests$use_bench = xnonononononono; then + use_boost=no +else + use_boost=yes fi +if test x$use_boost = xyes; then + +dnl Minimum required Boost version +define(MINIMUM_REQUIRED_BOOST, 1.58.0) + dnl Check for boost libs -AX_BOOST_BASE +AX_BOOST_BASE([MINIMUM_REQUIRED_BOOST]) +if test x$want_boost = xno; then + AC_MSG_ERROR([[only libbitcoinconsensus can be built without boost]]) +fi AX_BOOST_SYSTEM AX_BOOST_FILESYSTEM AX_BOOST_PROGRAM_OPTIONS AX_BOOST_THREAD AX_BOOST_CHRONO +dnl Opt-in to boost-process +AS_IF([ test x$with_boost_process != x ], [ AX_BOOST_PROCESS ], [ ax_cv_boost_process=no ] ) + +if test x$suppress_external_warnings != xno; then + BOOST_CPPFLAGS=SUPPRESS_WARNINGS($BOOST_CPPFLAGS) +fi + +dnl Boost 1.56 through 1.62 allow using std::atomic instead of its own atomic +dnl counter implementations. In 1.63 and later the std::atomic approach is default. +m4_pattern_allow(DBOOST_AC_USE_STD_ATOMIC) dnl otherwise it's treated like a macro +BOOST_CPPFLAGS="-DBOOST_SP_USE_STD_ATOMIC -DBOOST_AC_USE_STD_ATOMIC $BOOST_CPPFLAGS" -if test x$use_reduce_exports != xno; then +if test x$use_reduce_exports = xyes; then AC_MSG_CHECKING([for working boost reduced exports]) TEMP_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$BOOST_CPPFLAGS $CPPFLAGS" @@ -523,23 +1324,16 @@ if test x$use_reduce_exports != xno; then #endif ]])],[ AC_MSG_RESULT(yes) - ],[: - if test x$use_reduce_exports = xauto; then - use_reduce_exports=no - else - if test x$use_reduce_exports = xyes; then - AC_MSG_ERROR([boost versions < 1.49 are known to be broken with reduced exports. Use --disable-reduced-exports.]) - fi - fi - AC_MSG_RESULT(no) - AC_MSG_WARN([boost versions < 1.49 are known to have symbol visibility issues. Disabling reduced exports.]) + ],[ + AC_MSG_ERROR([boost versions < 1.49 are known to be broken with reduced exports. Use --disable-reduce-exports.]) ]) CPPFLAGS="$TEMP_CPPFLAGS" fi +fi -if test x$use_reduce_exports != xno; then +if test x$use_reduce_exports = xyes; then CXXFLAGS="$CXXFLAGS $RE_CXXFLAGS" - AX_CHECK_LINK_FLAG([[-Wl,--exclude-libs,ALL]], [RELDFLAGS="-Wl,--exclude-libs,ALL"]) + AX_CHECK_LINK_FLAG([[-Wl,--exclude-libs,ALL]], [RELDFLAGS="-Wl,--exclude-libs,ALL"],, [[$LDFLAG_WERROR]]) fi if test x$use_tests = xyes; then @@ -549,6 +1343,8 @@ if test x$use_tests = xyes; then fi + if test x$use_boost = xyes; then + AX_BOOST_UNIT_TEST_FRAMEWORK dnl Determine if -DBOOST_TEST_DYN_LINK is needed @@ -561,25 +1357,64 @@ if test x$use_tests = xyes; then #define BOOST_TEST_DYN_LINK #define BOOST_TEST_MAIN #include + ])], [AC_MSG_RESULT(yes)] [TESTDEFS="$TESTDEFS -DBOOST_TEST_DYN_LINK"], [AC_MSG_RESULT(no)]) LIBS="$TEMP_LIBS" CPPFLAGS="$TEMP_CPPFLAGS" + + fi fi -BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRAM_OPTIONS_LIB $BOOST_THREAD_LIB" +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" + + +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 + #include + #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 + ]],[[ + #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 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 after 1.56. dnl If neither is available, abort. -dnl If sleep_for is used, boost_chrono becomes a requirement. -if test x$ax_cv_boost_chrono = xyes; then TEMP_LIBS="$LIBS" -LIBS="$BOOST_LIBS $BOOST_CHRONO_LIB $LIBS" +LIBS="$BOOST_LIBS $LIBS" TEMP_CPPFLAGS="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" AC_LINK_IFELSE([AC_LANG_PROGRAM([[ @@ -592,12 +1427,11 @@ AC_LINK_IFELSE([AC_LANG_PROGRAM([[ choke me #endif ]])], - [boost_sleep=yes; BOOST_LIBS="$BOOST_LIBS $BOOST_CHRONO_LIB"; + [boost_sleep=yes; AC_DEFINE(HAVE_WORKING_BOOST_SLEEP_FOR, 1, [Define this symbol if boost sleep_for works])], [boost_sleep=no]) LIBS="$TEMP_LIBS" CPPFLAGS="$TEMP_CPPFLAGS" -fi if test x$boost_sleep != xyes; then TEMP_LIBS="$LIBS" @@ -625,109 +1459,129 @@ if test x$boost_sleep != xyes; then AC_MSG_ERROR(No working boost sleep implementation found.) fi -AC_ARG_WITH([utils], - [AS_HELP_STRING([--with-utils], - [build bitcoin-cli bitcoin-tx (default=yes)])], - [build_bitcoin_utils=$withval], - [build_bitcoin_utils=yes]) +fi -AC_ARG_WITH([libs], - [AS_HELP_STRING([--with-libs], - [build libraries (default=yes)])], - [build_bitcoin_libs=$withval], - [build_bitcoin_libs=yes]) +dnl libevent check -AC_ARG_WITH([daemon], - [AS_HELP_STRING([--with-daemon], - [build bitcoind daemon (default=yes)])], - [build_bitcoind=$withval], - [build_bitcoind=yes]) +if test x$build_bitcoin_cli$build_bitcoind$bitcoin_enable_qt$use_tests$use_bench != xnonononono; then + PKG_CHECK_MODULES([EVENT], [libevent >= 2.0.21], [use_libevent=yes], [AC_MSG_ERROR([libevent version 2.0.21 or greater not found.])]) + if test x$TARGET_OS != xwindows; then + PKG_CHECK_MODULES([EVENT_PTHREADS], [libevent_pthreads >= 2.0.21],, [AC_MSG_ERROR([libevent_pthreads version 2.0.21 or greater not found.])]) + fi +fi -BITCOIN_QT_INIT +dnl QR Code encoding library check -if test x$use_pkgconfig = xyes; then - : dnl - m4_ifdef( - [PKG_CHECK_MODULES], - [ - PKG_CHECK_MODULES([SSL], [libssl],, [AC_MSG_ERROR(openssl not found.)]) - PKG_CHECK_MODULES([CRYPTO], [libcrypto],,[AC_MSG_ERROR(libcrypto not found.)]) - BITCOIN_QT_CHECK([PKG_CHECK_MODULES([PROTOBUF], [protobuf], [have_protobuf=yes], [BITCOIN_QT_FAIL(libprotobuf not found)])]) - if test x$use_qr != xno; then - BITCOIN_QT_CHECK([PKG_CHECK_MODULES([QR], [libqrencode], [have_qrencode=yes], [have_qrencode=no])]) - fi - if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests != xnononono; then - PKG_CHECK_MODULES([EVENT], [libevent],, [AC_MSG_ERROR(libevent not found.)]) - if test x$TARGET_OS != xwindows; then - PKG_CHECK_MODULES([EVENT_PTHREADS], [libevent_pthreads],, [AC_MSG_ERROR(libevent_pthreads not found.)]) - fi - fi +if test "x$use_qr" != xno; then + BITCOIN_QT_CHECK([PKG_CHECK_MODULES([QR], [libqrencode], [have_qrencode=yes], [have_qrencode=no])]) +fi - if test "x$use_zmq" = "xyes"; then - PKG_CHECK_MODULES([ZMQ],[libzmq >= 4], - [AC_DEFINE([ENABLE_ZMQ],[1],[Define to 1 to enable ZMQ functions])], - [AC_DEFINE([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions]) - AC_MSG_WARN([libzmq version 4.x or greater not found, disabling]) - use_zmq=no]) - else - AC_DEFINE_UNQUOTED([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions]) - fi - ] - ) +dnl ZMQ check + +if test "x$use_zmq" = xyes; then + PKG_CHECK_MODULES([ZMQ], [libzmq >= 4], + AC_DEFINE([ENABLE_ZMQ], [1], [Define to 1 to enable ZMQ functions]), + [AC_DEFINE([ENABLE_ZMQ], [0], [Define to 1 to enable ZMQ functions]) + AC_MSG_WARN([libzmq version 4.x or greater not found, disabling]) + use_zmq=no]) else - AC_CHECK_HEADER([openssl/crypto.h],,AC_MSG_ERROR(libcrypto headers missing)) - AC_CHECK_LIB([crypto], [main],CRYPTO_LIBS=-lcrypto, AC_MSG_ERROR(libcrypto missing)) + AC_DEFINE_UNQUOTED([ENABLE_ZMQ], [0], [Define to 1 to enable ZMQ functions]) +fi - AC_CHECK_HEADER([openssl/ssl.h],, AC_MSG_ERROR(libssl headers missing),) - AC_CHECK_LIB([ssl], [main],SSL_LIBS=-lssl, AC_MSG_ERROR(libssl missing)) +if test "x$use_zmq" = xyes; then + dnl Assume libzmq was built for static linking + case $host in + *mingw*) + ZMQ_CFLAGS="$ZMQ_CFLAGS -DZMQ_STATIC" + ;; + esac +fi + +dnl univalue check - if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests != xnononono; then - AC_CHECK_HEADER([event2/event.h],, AC_MSG_ERROR(libevent headers missing),) - AC_CHECK_LIB([event],[main],EVENT_LIBS=-levent,AC_MSG_ERROR(libevent missing)) - if test x$TARGET_OS != xwindows; then - AC_CHECK_LIB([event_pthreads],[main],EVENT_PTHREADS_LIBS=-levent_pthreads,AC_MSG_ERROR(libevent_pthreads missing)) +need_bundled_univalue=yes +if test x$build_bitcoin_wallet$build_bitcoin_cli$build_bitcoin_tx$build_bitcoind$bitcoin_enable_qt$use_tests$use_bench = xnonononononono; then + need_bundled_univalue=no +else + if test x$system_univalue != xno; then + PKG_CHECK_MODULES([UNIVALUE], [libunivalue >= 1.0.4], [found_univalue=yes], [found_univalue=no]) + if test x$found_univalue = xyes; then + system_univalue=yes + need_bundled_univalue=no + elif test x$system_univalue = xyes; then + AC_MSG_ERROR([univalue not found]) + else + system_univalue=no fi fi - if test "x$use_zmq" = "xyes"; then - AC_CHECK_HEADER([zmq.h], - [AC_DEFINE([ENABLE_ZMQ],[1],[Define to 1 to enable ZMQ functions])], - [AC_MSG_WARN([zmq.h not found, disabling zmq support]) - use_zmq=no - AC_DEFINE([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions])]) - AC_CHECK_LIB([zmq],[zmq_ctx_shutdown],ZMQ_LIBS=-lzmq, - [AC_MSG_WARN([libzmq >= 4.0 not found, disabling zmq support]) - use_zmq=no - AC_DEFINE([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions])]) - else - AC_DEFINE_UNQUOTED([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions]) + if test x$need_bundled_univalue = xyes; then + UNIVALUE_CFLAGS='-I$(srcdir)/univalue/include' + UNIVALUE_LIBS='univalue/libunivalue.la' fi +fi - if test "x$use_zmq" = "xyes"; then - dnl Assume libzmq was built for static linking - case $host in - *mingw*) - ZMQ_CFLAGS="$ZMQ_CFLAGS -DZMQ_STATIC" - ;; - esac - fi +AM_CONDITIONAL([EMBEDDED_UNIVALUE],[test x$need_bundled_univalue = xyes]) +AC_SUBST(UNIVALUE_CFLAGS) +AC_SUBST(UNIVALUE_LIBS) + +dnl libmultiprocess library check + +libmultiprocess_found=no +if test "x$with_libmultiprocess" = xyes || test "x$with_libmultiprocess" = xauto; then + m4_ifdef([PKG_CHECK_MODULES], [PKG_CHECK_MODULES([LIBMULTIPROCESS], [libmultiprocess], [ + libmultiprocess_found=yes; + libmultiprocess_prefix=`$PKG_CONFIG --variable=prefix libmultiprocess`; + ], [true])]) +elif test "x$with_libmultiprocess" != xno; then + AC_MSG_ERROR([--with-libmultiprocess=$with_libmultiprocess value is not yes, auto, or no]) +fi +AC_SUBST(LIBMULTIPROCESS_CFLAGS) +AC_SUBST(LIBMULTIPROCESS_LIBS) - BITCOIN_QT_CHECK(AC_CHECK_LIB([protobuf] ,[main],[PROTOBUF_LIBS=-lprotobuf], BITCOIN_QT_FAIL(libprotobuf not found))) - if test x$use_qr != xno; then - BITCOIN_QT_CHECK([AC_CHECK_LIB([qrencode], [main],[QR_LIBS=-lqrencode], [have_qrencode=no])]) - BITCOIN_QT_CHECK([AC_CHECK_HEADER([qrencode.h],, have_qrencode=no)]) +dnl Enable multiprocess check + +if test "x$enable_multiprocess" = xyes; then + if test "x$libmultiprocess_found" != xyes; then + AC_MSG_ERROR([--enable-multiprocess=yes option specified but libmultiprocess library was not found. May need to install libmultiprocess library, or specify install path with PKG_CONFIG_PATH environment variable. Running 'pkg-config --debug libmultiprocess' may be helpful for debugging.]) fi + build_multiprocess=yes +elif test "x$enable_multiprocess" = xauto; then + build_multiprocess=$libmultiprocess_found +else + build_multiprocess=no fi -BITCOIN_QT_PATH_PROGS([PROTOC], [protoc],$protoc_bin_path) +AM_CONDITIONAL([BUILD_MULTIPROCESS],[test "x$build_multiprocess" = xyes]) +AM_CONDITIONAL([BUILD_BITCOIN_NODE], [test "x$build_multiprocess" = xyes]) +AM_CONDITIONAL([BUILD_BITCOIN_GUI], [test "x$build_multiprocess" = xyes]) + +dnl codegen tools check + +if test x$build_multiprocess != xno; then + if test "x$with_mpgen" = xyes || test "x$with_mpgen" = xauto; then + MPGEN_PREFIX="$libmultiprocess_prefix" + elif test "x$with_mpgen" != xno; then + MPGEN_PREFIX="$with_mpgen"; + fi + AC_SUBST(MPGEN_PREFIX) +fi AC_MSG_CHECKING([whether to build bitcoind]) AM_CONDITIONAL([BUILD_BITCOIND], [test x$build_bitcoind = xyes]) AC_MSG_RESULT($build_bitcoind) -AC_MSG_CHECKING([whether to build utils (bitcoin-cli bitcoin-tx)]) -AM_CONDITIONAL([BUILD_BITCOIN_UTILS], [test x$build_bitcoin_utils = xyes]) -AC_MSG_RESULT($build_bitcoin_utils) +AC_MSG_CHECKING([whether to build bitcoin-cli]) +AM_CONDITIONAL([BUILD_BITCOIN_CLI], [test x$build_bitcoin_cli = xyes]) +AC_MSG_RESULT($build_bitcoin_cli) + +AC_MSG_CHECKING([whether to build bitcoin-tx]) +AM_CONDITIONAL([BUILD_BITCOIN_TX], [test x$build_bitcoin_tx = xyes]) +AC_MSG_RESULT($build_bitcoin_tx) + +AC_MSG_CHECKING([whether to build bitcoin-wallet]) +AM_CONDITIONAL([BUILD_BITCOIN_WALLET], [test x$build_bitcoin_wallet = xyes]) +AC_MSG_RESULT($build_bitcoin_wallet) AC_MSG_CHECKING([whether to build libraries]) AM_CONDITIONAL([BUILD_BITCOIN_LIBS], [test x$build_bitcoin_libs = xyes]) @@ -737,9 +1591,6 @@ if test x$build_bitcoin_libs = xyes; then fi AC_MSG_RESULT($build_bitcoin_libs) -dnl sets $bitcoin_enable_qt, $bitcoin_enable_qt_test, $bitcoin_enable_qt_dbus -BITCOIN_QT_CONFIGURE([$use_pkgconfig], [qt4]) - AC_LANG_POP if test "x$use_ccache" != "xno"; then @@ -757,9 +1608,6 @@ if test "x$use_ccache" != "xno"; then fi AC_MSG_RESULT($use_ccache) fi -if test "x$use_ccache" = "xyes"; then - AX_CHECK_PREPROC_FLAG([-Qunused-arguments],[CPPFLAGS="-Qunused-arguments $CPPFLAGS"]) -fi dnl enable wallet AC_MSG_CHECKING([if wallet should be enabled]) @@ -775,9 +1623,10 @@ dnl enable upnp support AC_MSG_CHECKING([whether to build with support for UPnP]) if test x$have_miniupnpc = xno; then if test x$use_upnp = xyes; then - AC_MSG_ERROR("UPnP requested but cannot be built. use --without-miniupnpc") + AC_MSG_ERROR("UPnP requested but cannot be built. Use --without-miniupnpc.") fi AC_MSG_RESULT(no) + use_upnp=no else if test x$use_upnp != xno; then AC_MSG_RESULT(yes) @@ -799,8 +1648,8 @@ else fi dnl these are only used when qt is enabled +BUILD_TEST_QT="" if test x$bitcoin_enable_qt != xno; then - BUILD_QT=qt dnl enable dbus support AC_MSG_CHECKING([whether to build GUI with support for D-Bus]) if test x$bitcoin_enable_qt_dbus != xno; then @@ -812,93 +1661,153 @@ if test x$bitcoin_enable_qt != xno; then AC_MSG_CHECKING([whether to build GUI with support for QR codes]) if test x$have_qrencode = xno; then if test x$use_qr = xyes; then - AC_MSG_ERROR("QR support requested but cannot be built. use --without-qrencode") + AC_MSG_ERROR([QR support requested but cannot be built. Use --without-qrencode]) fi - AC_MSG_RESULT(no) + use_qr=no else if test x$use_qr != xno; then - AC_MSG_RESULT(yes) AC_DEFINE([USE_QRCODE],[1],[Define if QR support should be compiled in]) use_qr=yes - else - AC_MSG_RESULT(no) fi fi + AC_MSG_RESULT([$use_qr]) if test x$XGETTEXT = x; then AC_MSG_WARN("xgettext is required to update qt translations") fi 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]) - BUILD_TEST_QT="test" + BUILD_TEST_QT="yes" else AC_MSG_RESULT([no]) fi fi +AM_CONDITIONAL([ENABLE_ZMQ], [test "x$use_zmq" = "xyes"]) + AC_MSG_CHECKING([whether to build test_bitcoin]) if test x$use_tests = xyes; then AC_MSG_RESULT([yes]) - BUILD_TEST="test" + BUILD_TEST="yes" else AC_MSG_RESULT([no]) + BUILD_TEST="" fi AC_MSG_CHECKING([whether to reduce exports]) -if test x$use_reduce_exports != xno; then +if test x$use_reduce_exports = xyes; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi -if test x$build_bitcoin_utils$build_bitcoin_libs$build_bitcoind$bitcoin_enable_qt$use_tests = xnononono; then - AC_MSG_ERROR([No targets! Please specify at least one of: --with-utils --with-libs --with-daemon --with-gui or --enable-tests]) +if test x$build_bitcoin_wallet$build_bitcoin_cli$build_bitcoin_tx$build_bitcoin_libs$build_bitcoind$bitcoin_enable_qt$use_bench$use_tests = xnononononononono; then + AC_MSG_ERROR([No targets! Please specify at least one of: --with-utils --with-libs --with-daemon --with-gui --enable-bench or --enable-tests]) fi AM_CONDITIONAL([TARGET_DARWIN], [test x$TARGET_OS = xdarwin]) AM_CONDITIONAL([BUILD_DARWIN], [test x$BUILD_OS = xdarwin]) +AM_CONDITIONAL([TARGET_LINUX], [test x$TARGET_OS = xlinux]) AM_CONDITIONAL([TARGET_WINDOWS], [test x$TARGET_OS = xwindows]) AM_CONDITIONAL([ENABLE_WALLET],[test x$enable_wallet = xyes]) -AM_CONDITIONAL([ENABLE_TESTS],[test x$use_tests = xyes]) +AM_CONDITIONAL([USE_SQLITE], [test "x$use_sqlite" = "xyes"]) +AM_CONDITIONAL([ENABLE_TESTS],[test x$BUILD_TEST = xyes]) +AM_CONDITIONAL([ENABLE_FUZZ],[test x$enable_fuzz = 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([USE_QRCODE], [test x$use_qr = 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_REORG_TESTS],[test x$use_comparison_tool_reorg_test != xno]) +AM_CONDITIONAL([USE_LIBEVENT],[test x$use_libevent = xyes]) AM_CONDITIONAL([GLIBC_BACK_COMPAT],[test x$use_glibc_compat = xyes]) -AM_CONDITIONAL([USE_LIBSECP256K1],[test x$use_libsecp256k1 = xyes]) +AM_CONDITIONAL([HARDEN],[test x$use_hardening = xyes]) +AM_CONDITIONAL([ENABLE_SSE42],[test x$enable_sse42 = xyes]) +AM_CONDITIONAL([ENABLE_SSE41],[test x$enable_sse41 = xyes]) +AM_CONDITIONAL([ENABLE_AVX2],[test x$enable_avx2 = xyes]) +AM_CONDITIONAL([ENABLE_SHANI],[test x$enable_shani = xyes]) +AM_CONDITIONAL([ENABLE_ARM_CRC],[test x$enable_arm_crc = xyes]) +AM_CONDITIONAL([USE_ASM],[test x$use_asm = xyes]) +AM_CONDITIONAL([WORDS_BIGENDIAN],[test x$ac_cv_c_bigendian = xyes]) AC_DEFINE(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR, [Major 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_BUILD, _CLIENT_VERSION_BUILD, [Version Build]) 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_MINOR, _CLIENT_VERSION_MINOR) AC_SUBST(CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION) AC_SUBST(CLIENT_VERSION_BUILD, _CLIENT_VERSION_BUILD) AC_SUBST(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE) 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(BITCOIN_WALLET_TOOL_NAME) AC_SUBST(RELDFLAGS) +AC_SUBST(DEBUG_CPPFLAGS) +AC_SUBST(WARN_CXXFLAGS) +AC_SUBST(NOWARN_CXXFLAGS) +AC_SUBST(DEBUG_CXXFLAGS) +AC_SUBST(COMPAT_LDFLAGS) +AC_SUBST(ERROR_CXXFLAGS) +AC_SUBST(GPROF_CXXFLAGS) +AC_SUBST(GPROF_LDFLAGS) +AC_SUBST(HARDENED_CXXFLAGS) +AC_SUBST(HARDENED_CPPFLAGS) +AC_SUBST(HARDENED_LDFLAGS) +AC_SUBST(PIC_FLAGS) +AC_SUBST(PIE_FLAGS) +AC_SUBST(SANITIZER_CXXFLAGS) +AC_SUBST(SANITIZER_LDFLAGS) +AC_SUBST(SSE42_CXXFLAGS) +AC_SUBST(SSE41_CXXFLAGS) +AC_SUBST(AVX2_CXXFLAGS) +AC_SUBST(SHANI_CXXFLAGS) +AC_SUBST(ARM_CRC_CXXFLAGS) AC_SUBST(LIBTOOL_APP_LDFLAGS) +AC_SUBST(USE_SQLITE) AC_SUBST(USE_UPNP) AC_SUBST(USE_QRCODE) AC_SUBST(BOOST_LIBS) +AC_SUBST(SQLITE_LIBS) AC_SUBST(TESTDEFS) -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_LIBS) -AC_CONFIG_FILES([Makefile src/Makefile share/setup.nsi share/qt/Info.plist src/test/buildenv.py]) -AC_CONFIG_FILES([qa/pull-tester/run-bitcoind-for-test.sh],[chmod +x qa/pull-tester/run-bitcoind-for-test.sh]) -AC_CONFIG_FILES([qa/pull-tester/tests-config.sh],[chmod +x qa/pull-tester/tests-config.sh]) +AC_SUBST(EVENT_LIBS) +AC_SUBST(EVENT_PTHREADS_LIBS) +AC_SUBST(ZMQ_LIBS) +AC_SUBST(QR_LIBS) +AC_SUBST(HAVE_GMTIME_R) +AC_SUBST(HAVE_FDATASYNC) +AC_SUBST(HAVE_FULLFSYNC) +AC_SUBST(HAVE_O_CLOEXEC) +AC_SUBST(HAVE_BUILTIN_PREFETCH) +AC_SUBST(HAVE_MM_PREFETCH) +AC_SUBST(HAVE_STRONG_GETAUXVAL) +AC_SUBST(HAVE_WEAK_GETAUXVAL) +AC_CONFIG_FILES([Makefile src/Makefile share/setup.nsi share/qt/Info.plist]) +AC_CONFIG_FILES([contrib/devtools/split-debug.sh],[chmod +x contrib/devtools/split-debug.sh]) +AM_COND_IF([HAVE_DOXYGEN], [AC_CONFIG_FILES([doc/Doxyfile])]) +#AC_CONFIG_LINKS([contrib/devtools/security-check.py:contrib/devtools/security-check.py]) +#AC_CONFIG_LINKS([contrib/devtools/test-security-check.py:contrib/devtools/test-security-check.py]) +#AC_CONFIG_LINKS([contrib/filter-lcov.py:contrib/filter-lcov.py]) +#AC_CONFIG_LINKS([test/functional/test_runner.py:test/functional/test_runner.py]) +#AC_CONFIG_LINKS([test/fuzz/test_runner.py:test/fuzz/test_runner.py]) +#AC_CONFIG_LINKS([test/util/bitcoin-util-test.py:test/util/bitcoin-util-test.py]) +#AC_CONFIG_LINKS([test/util/rpcauth-test.py:test/util/rpcauth-test.py]) dnl boost's m4 checks do something really nasty: they export these vars. As a dnl result, they leak into secp256k1's configure and crazy things happen. @@ -923,44 +1832,56 @@ PKGCONFIG_LIBDIR_TEMP="$PKG_CONFIG_LIBDIR" unset PKG_CONFIG_LIBDIR PKG_CONFIG_LIBDIR="$PKGCONFIG_LIBDIR_TEMP" -ac_configure_args="${ac_configure_args} --disable-shared --with-pic --enable-module-recovery" +if test x$need_bundled_univalue = xyes; then + AC_CONFIG_SUBDIRS([src/univalue]) +fi + +ac_configure_args="${ac_configure_args} --disable-shared --with-pic --enable-benchmark=no --with-bignum=no --enable-module-recovery --enable-module-schnorrsig --enable-experimental" AC_CONFIG_SUBDIRS([src/secp256k1]) AC_OUTPUT -dnl Taken from https://wiki.debian.org/RpathIssue -case $host in - *-*-linux-gnu) - AC_MSG_RESULT([Fixing libtool for -rpath problems.]) - sed < libtool > libtool-2 \ - 's/^hardcode_libdir_flag_spec.*$'/'hardcode_libdir_flag_spec=" -D__LIBTOOL_IS_A_FOOL__ "/' - mv libtool-2 libtool - chmod 755 libtool +dnl Replace the BUILDDIR path with the correct Windows path if compiling on Native Windows +case ${OS} in + *Windows*) + sed 's/BUILDDIR="\/\([[a-z]]\)/BUILDDIR="\1:/' test/config.ini > test/config-2.ini + mv test/config-2.ini test/config.ini ;; esac echo echo "Options used to compile and link:" +echo " boost process = $ax_cv_boost_process" +echo " multiprocess = $build_multiprocess" echo " with wallet = $enable_wallet" +if test "x$enable_wallet" != "xno"; then + echo " with sqlite = $use_sqlite" +fi echo " with gui / qt = $bitcoin_enable_qt" if test x$bitcoin_enable_qt != xno; then echo " with qr = $use_qr" fi echo " with zmq = $use_zmq" echo " with test = $use_tests" -dnl echo " with bench = $use_bench" +if test x$use_tests != xno; then + echo " with fuzz = $enable_fuzz" +fi +echo " with bench = $use_bench" echo " with upnp = $use_upnp" +echo " use asm = $use_asm" +echo " sanitizers = $use_sanitizers" echo " debug enabled = $enable_debug" +echo " gprof enabled = $enable_gprof" echo " werror = $enable_werror" echo echo " target os = $TARGET_OS" -echo " build os = $BUILD_OS" +echo " build os = $build_os" echo echo " CC = $CC" -echo " CFLAGS = $CFLAGS" -echo " CPPFLAGS = $CPPFLAGS" +echo " CFLAGS = $PTHREAD_CFLAGS $CFLAGS" +echo " CPPFLAGS = $DEBUG_CPPFLAGS $HARDENED_CPPFLAGS $CPPFLAGS" echo " CXX = $CXX" -echo " CXXFLAGS = $CXXFLAGS" -echo " LDFLAGS = $LDFLAGS" +echo " CXXFLAGS = $DEBUG_CXXFLAGS $HARDENED_CXXFLAGS $WARN_CXXFLAGS $NOWARN_CXXFLAGS $ERROR_CXXFLAGS $GPROF_CXXFLAGS $CXXFLAGS" +echo " LDFLAGS = $PTHREAD_LIBS $HARDENED_LDFLAGS $GPROF_LDFLAGS $LDFLAGS" echo " ARFLAGS = $ARFLAGS" echo diff --git a/contrib/devtools/split-debug.sh.in b/contrib/devtools/split-debug.sh.in new file mode 100644 index 00000000..deda49cc --- /dev/null +++ b/contrib/devtools/split-debug.sh.in @@ -0,0 +1,10 @@ +#!/bin/sh + +if [ $# -ne 3 ]; + then echo "usage: $0 " +fi + +@OBJCOPY@ --enable-deterministic-archives -p --only-keep-debug $1 $3 +@OBJCOPY@ --enable-deterministic-archives -p --strip-debug $1 $2 +@STRIP@ --enable-deterministic-archives -p -s $2 +@OBJCOPY@ --enable-deterministic-archives -p --add-gnu-debuglink=$3 $2 diff --git a/doc/Doxyfile b/doc/Doxyfile.in similarity index 100% rename from doc/Doxyfile rename to doc/Doxyfile.in diff --git a/libtool b/libtool index 61429e19..a0d0780d 100755 --- a/libtool +++ b/libtool @@ -11668,7 +11668,7 @@ reload_cmds="\$LTCC \$LTCFLAGS -nostdlib \$wl-r -o \$output\$reload_objs" old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$tool_oldlib" # A language specific compiler. -CC="g++" +CC="g++ -std=c++11" # Is the compiler the GNU compiler? with_gcc=yes diff --git a/src/config/bitcoin-config.h b/src/config/bitcoin-config.h index 1b085472..cfe04774 100644 --- a/src/config/bitcoin-config.h +++ b/src/config/bitcoin-config.h @@ -8,6 +8,9 @@ /* Define if building universal (internal helper macro) */ /* #undef AC_APPLE_UNIVERSAL_BUILD */ +/* Define this symbol if type char equals int8_t */ +/* #undef CHAR_EQUALS_INT8 */ + /* Version Build */ #define CLIENT_VERSION_BUILD 4 @@ -23,18 +26,33 @@ /* Build revision */ #define CLIENT_VERSION_REVISION 3 -/* Version is release */ +/* Copyright holder(s) before %s replacement */ +#define COPYRIGHT_HOLDERS "_COPYRIGHT_HOLDERS" + +/* Copyright holder(s) */ +#define COPYRIGHT_HOLDERS_FINAL "_COPYRIGHT_HOLDERS" + +/* Replacement for %s in copyright holders string */ +#define COPYRIGHT_HOLDERS_SUBSTITUTION "_COPYRIGHT_HOLDERS_SUBSTITUTION" + +/* Copyright year */ #define COPYRIGHT_YEAR 2020 +/* Define this symbol to build code that uses AVX2 intrinsics */ +#define ENABLE_AVX2 1 + +/* Define this symbol to build code that uses SHA-NI intrinsics */ +#define ENABLE_SHANI 1 + +/* Define this symbol to build code that uses SSE4.1 intrinsics */ +#define ENABLE_SSE41 1 + /* Define to 1 to enable wallet functions */ #define ENABLE_WALLET 1 /* Define to 1 to enable ZMQ functions */ #define ENABLE_ZMQ 0 -/* parameter and return value type for __fdelt_chk */ -/* #undef FDELT_TYPE */ - /* define if the Boost library is available */ #define HAVE_BOOST /**/ @@ -54,11 +72,30 @@ #define HAVE_BOOST_THREAD /**/ /* define if the Boost::Unit_Test_Framework library is available */ -/* #undef HAVE_BOOST_UNIT_TEST_FRAMEWORK */ +#define HAVE_BOOST_UNIT_TEST_FRAMEWORK /**/ + +/* Define this symbol if you have __builtin_clzl */ +#define HAVE_BUILTIN_CLZL 1 + +/* Define this symbol if you have __builtin_clzll */ +#define HAVE_BUILTIN_CLZLL 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_BYTESWAP_H */ /* Define this symbol if the consensus lib has been built */ #define HAVE_CONSENSUS_LIB 1 +/* define if the compiler supports basic C++11 syntax */ +#define HAVE_CXX11 1 + +/* define if the compiler supports basic C++17 syntax */ +/* #undef HAVE_CXX17 */ + +/* Define to 1 if you have the declaration of `be16toh', and to 0 if you + don't. */ +#define HAVE_DECL_BE16TOH 0 + /* Define to 1 if you have the declaration of `be32toh', and to 0 if you don't. */ #define HAVE_DECL_BE32TOH 0 @@ -67,6 +104,34 @@ don't. */ #define HAVE_DECL_BE64TOH 0 +/* Define to 1 if you have the declaration of `bswap_16', and to 0 if you + don't. */ +#define HAVE_DECL_BSWAP_16 0 + +/* Define to 1 if you have the declaration of `bswap_32', and to 0 if you + don't. */ +#define HAVE_DECL_BSWAP_32 0 + +/* Define to 1 if you have the declaration of `bswap_64', and to 0 if you + don't. */ +#define HAVE_DECL_BSWAP_64 0 + +/* Define to 1 if you have the declaration of `daemon', and to 0 if you don't. + */ +#define HAVE_DECL_DAEMON 1 + +/* Define to 1 if you have the declaration of `freeifaddrs', and to 0 if you + don't. */ +#define HAVE_DECL_FREEIFADDRS 1 + +/* Define to 1 if you have the declaration of `getifaddrs', and to 0 if you + don't. */ +#define HAVE_DECL_GETIFADDRS 1 + +/* Define to 1 if you have the declaration of `htobe16', and to 0 if you + don't. */ +#define HAVE_DECL_HTOBE16 0 + /* Define to 1 if you have the declaration of `htobe32', and to 0 if you don't. */ #define HAVE_DECL_HTOBE32 0 @@ -75,6 +140,10 @@ don't. */ #define HAVE_DECL_HTOBE64 0 +/* Define to 1 if you have the declaration of `htole16', and to 0 if you + don't. */ +#define HAVE_DECL_HTOLE16 0 + /* Define to 1 if you have the declaration of `htole32', and to 0 if you don't. */ #define HAVE_DECL_HTOLE32 0 @@ -83,6 +152,10 @@ don't. */ #define HAVE_DECL_HTOLE64 0 +/* Define to 1 if you have the declaration of `le16toh', and to 0 if you + don't. */ +#define HAVE_DECL_LE16TOH 0 + /* Define to 1 if you have the declaration of `le32toh', and to 0 if you don't. */ #define HAVE_DECL_LE32TOH 0 @@ -105,6 +178,9 @@ /* Define to 1 if you have the header file. */ /* #undef HAVE_ENDIAN_H */ +/* Define to 1 if fdatasync is available. */ +#define HAVE_FDATASYNC 0 + /* Define to 1 if the system has the `dllexport' function attribute */ /* #undef HAVE_FUNC_ATTRIBUTE_DLLEXPORT */ @@ -114,11 +190,15 @@ /* Define to 1 if the system has the `visibility' function attribute */ /* #undef HAVE_FUNC_ATTRIBUTE_VISIBILITY */ -/* Define this symbol if you have getaddrinfo_a */ -/* #undef HAVE_GETADDRINFO_A */ +/* Define this symbol if the BSD getentropy system call is available */ +/* #undef HAVE_GETENTROPY */ + +/* Define this symbol if the BSD getentropy system call is available with + sys/random.h */ +#define HAVE_GETENTROPY_RAND 1 -/* Define this symbol if you have inet_pton */ -#define HAVE_INET_PTON 1 +/* Define this symbol if gmtime_r is available */ +#define HAVE_GMTIME_R 1 /* Define to 1 if you have the header file. */ #define HAVE_INTTYPES_H 1 @@ -132,45 +212,21 @@ /* Define to 1 if you have the `comdlg32' library (-lcomdlg32). */ /* #undef HAVE_LIBCOMDLG32 */ -/* Define to 1 if you have the `crypt32' library (-lcrypt32). */ -/* #undef HAVE_LIBCRYPT32 */ - /* Define to 1 if you have the `gdi32' library (-lgdi32). */ /* #undef HAVE_LIBGDI32 */ -/* Define to 1 if you have the `imm32' library (-limm32). */ -/* #undef HAVE_LIBIMM32 */ - /* Define to 1 if you have the `iphlpapi' library (-liphlpapi). */ /* #undef HAVE_LIBIPHLPAPI */ -/* Define to 1 if you have the `jpeg ' library (-ljpeg ). */ -/* #undef HAVE_LIBJPEG_ */ - /* Define to 1 if you have the `kernel32' library (-lkernel32). */ /* #undef HAVE_LIBKERNEL32 */ -/* Define to 1 if you have the `mingwthrd' library (-lmingwthrd). */ -/* #undef HAVE_LIBMINGWTHRD */ - -/* Define to 1 if you have the `mswsock' library (-lmswsock). */ -/* #undef HAVE_LIBMSWSOCK */ - /* Define to 1 if you have the `ole32' library (-lole32). */ /* #undef HAVE_LIBOLE32 */ /* Define to 1 if you have the `oleaut32' library (-loleaut32). */ /* #undef HAVE_LIBOLEAUT32 */ -/* Define to 1 if you have the `pcre16 ' library (-lpcre16 ). */ -/* #undef HAVE_LIBPCRE16_ */ - -/* Define to 1 if you have the `png ' library (-lpng ). */ -/* #undef HAVE_LIBPNG_ */ - -/* Define to 1 if you have the `rpcrt4' library (-lrpcrt4). */ -/* #undef HAVE_LIBRPCRT4 */ - /* Define to 1 if you have the `shell32' library (-lshell32). */ /* #undef HAVE_LIBSHELL32 */ @@ -189,14 +245,14 @@ /* Define to 1 if you have the `winmm' library (-lwinmm). */ /* #undef HAVE_LIBWINMM */ -/* Define to 1 if you have the `winspool' library (-lwinspool). */ -/* #undef HAVE_LIBWINSPOOL */ - /* Define to 1 if you have the `ws2_32' library (-lws2_32). */ /* #undef HAVE_LIBWS2_32 */ -/* Define to 1 if you have the `z ' library (-lz ). */ -/* #undef HAVE_LIBZ_ */ +/* Define this symbol if you have malloc_info */ +/* #undef HAVE_MALLOC_INFO */ + +/* Define this symbol if you have mallopt with M_ARENA_MAX */ +/* #undef HAVE_MALLOPT_ARENA_MAX */ /* Define to 1 if you have the header file. */ #define HAVE_MEMORY_H 1 @@ -213,8 +269,8 @@ /* Define to 1 if you have the header file. */ #define HAVE_MINIUPNPC_UPNPERRORS_H 1 -/* Define this symbol if you have MSG_NOSIGNAL */ -/* #undef HAVE_MSG_NOSIGNAL */ +/* Define this symbol if you have posix_fallocate */ +/* #undef HAVE_POSIX_FALLOCATE */ /* Define if you have POSIX threads libraries and header files. */ #define HAVE_PTHREAD 1 @@ -231,6 +287,9 @@ /* Define to 1 if you have the header file. */ #define HAVE_STDLIB_H 1 +/* Define to 1 if std::system is available. */ +#define HAVE_STD__SYSTEM 1 + /* Define to 1 if you have the `strerror_r' function. */ #define HAVE_STRERROR_R 1 @@ -240,30 +299,63 @@ /* Define to 1 if you have the header file. */ #define HAVE_STRING_H 1 +/* Define this symbol if the BSD sysctl() is available */ +#define HAVE_SYSCTL 1 + +/* Define this symbol if the BSD sysctl(KERN_ARND) is available */ +/* #undef HAVE_SYSCTL_ARND */ + +/* std::system or ::wsystem */ +#define HAVE_SYSTEM HAVE_STD__SYSTEM || HAVE_WSYSTEM + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_ENDIAN_H */ + +/* Define this symbol if the Linux getrandom system call is available */ +/* #undef HAVE_SYS_GETRANDOM */ + /* Define to 1 if you have the header file. */ /* #undef HAVE_SYS_PRCTL_H */ +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_RESOURCES_H */ + /* Define to 1 if you have the header file. */ #define HAVE_SYS_SELECT_H 1 /* Define to 1 if you have the header file. */ #define HAVE_SYS_STAT_H 1 +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SYSCTL_H 1 + /* Define to 1 if you have the header file. */ #define HAVE_SYS_TYPES_H 1 +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_VMMETER_H 1 + +/* Define if thread_local is supported. */ +#define HAVE_THREAD_LOCAL 1 + /* Define to 1 if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define if the visibility attribute is supported. */ #define HAVE_VISIBILITY_ATTRIBUTE 1 +/* Define to 1 if you have the header file. */ +/* #undef HAVE_VM_VM_PARAM_H */ + /* Define this symbol if boost sleep works */ /* #undef HAVE_WORKING_BOOST_SLEEP */ /* Define this symbol if boost sleep_for works */ #define HAVE_WORKING_BOOST_SLEEP_FOR 1 +/* Define to 1 if ::wsystem is available. */ +/* #undef HAVE_WSYSTEM */ + /* Define to the sub-directory where libtool stores uninstalled libraries. */ #define LT_OBJDIR ".libs/" @@ -289,9 +381,15 @@ your system. */ /* #undef PTHREAD_CREATE_JOINABLE */ +/* Define this symbol if the qt platform is android */ +/* #undef QT_QPA_PLATFORM_ANDROID */ + /* Define this symbol if the qt platform is cocoa */ /* #undef QT_QPA_PLATFORM_COCOA */ +/* Define this symbol if the minimal qt platform exists */ +/* #undef QT_QPA_PLATFORM_MINIMAL */ + /* Define this symbol if the qt platform is windows */ /* #undef QT_QPA_PLATFORM_WINDOWS */ @@ -307,12 +405,18 @@ /* Define to 1 if strerror_r returns char *. */ /* #undef STRERROR_R_CHAR_P */ +/* Define this symbol to build in assembly routines */ +#define USE_ASM 1 + /* Define if dbus support should be compiled in */ #define USE_DBUS 1 /* Define if QR support should be compiled in */ #define USE_QRCODE 1 +/* Define if sqlite support should be compiled in */ +#define USE_SQLITE 1 + /* UPnP support not compiled if undefined, otherwise value (0 or 1) determines default state */ #define USE_UPNP 0 diff --git a/src/config/bitcoin-config.h.in b/src/config/bitcoin-config.h.in index d5d768cb..a1ad8b38 100644 --- a/src/config/bitcoin-config.h.in +++ b/src/config/bitcoin-config.h.in @@ -7,6 +7,9 @@ /* Define if building universal (internal helper macro) */ #undef AC_APPLE_UNIVERSAL_BUILD +/* Define this symbol if type char equals int8_t */ +#undef CHAR_EQUALS_INT8 + /* Version Build */ #undef CLIENT_VERSION_BUILD @@ -22,18 +25,33 @@ /* Build revision */ #undef CLIENT_VERSION_REVISION -/* Version is release */ +/* Copyright holder(s) before %s replacement */ +#undef COPYRIGHT_HOLDERS + +/* Copyright holder(s) */ +#undef COPYRIGHT_HOLDERS_FINAL + +/* Replacement for %s in copyright holders string */ +#undef COPYRIGHT_HOLDERS_SUBSTITUTION + +/* Copyright year */ #undef COPYRIGHT_YEAR +/* Define this symbol to build code that uses AVX2 intrinsics */ +#undef ENABLE_AVX2 + +/* Define this symbol to build code that uses SHA-NI intrinsics */ +#undef ENABLE_SHANI + +/* Define this symbol to build code that uses SSE4.1 intrinsics */ +#undef ENABLE_SSE41 + /* Define to 1 to enable wallet functions */ #undef ENABLE_WALLET /* Define to 1 to enable ZMQ functions */ #undef ENABLE_ZMQ -/* parameter and return value type for __fdelt_chk */ -#undef FDELT_TYPE - /* define if the Boost library is available */ #undef HAVE_BOOST @@ -55,9 +73,28 @@ /* define if the Boost::Unit_Test_Framework library is available */ #undef HAVE_BOOST_UNIT_TEST_FRAMEWORK +/* Define this symbol if you have __builtin_clzl */ +#undef HAVE_BUILTIN_CLZL + +/* Define this symbol if you have __builtin_clzll */ +#undef HAVE_BUILTIN_CLZLL + +/* Define to 1 if you have the header file. */ +#undef HAVE_BYTESWAP_H + /* Define this symbol if the consensus lib has been built */ #undef HAVE_CONSENSUS_LIB +/* define if the compiler supports basic C++11 syntax */ +#undef HAVE_CXX11 + +/* define if the compiler supports basic C++17 syntax */ +#undef HAVE_CXX17 + +/* Define to 1 if you have the declaration of `be16toh', and to 0 if you + don't. */ +#undef HAVE_DECL_BE16TOH + /* Define to 1 if you have the declaration of `be32toh', and to 0 if you don't. */ #undef HAVE_DECL_BE32TOH @@ -66,6 +103,34 @@ don't. */ #undef HAVE_DECL_BE64TOH +/* Define to 1 if you have the declaration of `bswap_16', and to 0 if you + don't. */ +#undef HAVE_DECL_BSWAP_16 + +/* Define to 1 if you have the declaration of `bswap_32', and to 0 if you + don't. */ +#undef HAVE_DECL_BSWAP_32 + +/* Define to 1 if you have the declaration of `bswap_64', and to 0 if you + don't. */ +#undef HAVE_DECL_BSWAP_64 + +/* Define to 1 if you have the declaration of `daemon', and to 0 if you don't. + */ +#undef HAVE_DECL_DAEMON + +/* Define to 1 if you have the declaration of `freeifaddrs', and to 0 if you + don't. */ +#undef HAVE_DECL_FREEIFADDRS + +/* Define to 1 if you have the declaration of `getifaddrs', and to 0 if you + don't. */ +#undef HAVE_DECL_GETIFADDRS + +/* Define to 1 if you have the declaration of `htobe16', and to 0 if you + don't. */ +#undef HAVE_DECL_HTOBE16 + /* Define to 1 if you have the declaration of `htobe32', and to 0 if you don't. */ #undef HAVE_DECL_HTOBE32 @@ -74,6 +139,10 @@ don't. */ #undef HAVE_DECL_HTOBE64 +/* Define to 1 if you have the declaration of `htole16', and to 0 if you + don't. */ +#undef HAVE_DECL_HTOLE16 + /* Define to 1 if you have the declaration of `htole32', and to 0 if you don't. */ #undef HAVE_DECL_HTOLE32 @@ -82,6 +151,10 @@ don't. */ #undef HAVE_DECL_HTOLE64 +/* Define to 1 if you have the declaration of `le16toh', and to 0 if you + don't. */ +#undef HAVE_DECL_LE16TOH + /* Define to 1 if you have the declaration of `le32toh', and to 0 if you don't. */ #undef HAVE_DECL_LE32TOH @@ -104,6 +177,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_ENDIAN_H +/* Define to 1 if fdatasync is available. */ +#undef HAVE_FDATASYNC + /* Define to 1 if the system has the `dllexport' function attribute */ #undef HAVE_FUNC_ATTRIBUTE_DLLEXPORT @@ -113,11 +189,15 @@ /* Define to 1 if the system has the `visibility' function attribute */ #undef HAVE_FUNC_ATTRIBUTE_VISIBILITY -/* Define this symbol if you have getaddrinfo_a */ -#undef HAVE_GETADDRINFO_A +/* Define this symbol if the BSD getentropy system call is available */ +#undef HAVE_GETENTROPY + +/* Define this symbol if the BSD getentropy system call is available with + sys/random.h */ +#undef HAVE_GETENTROPY_RAND -/* Define this symbol if you have inet_pton */ -#undef HAVE_INET_PTON +/* Define this symbol if gmtime_r is available */ +#undef HAVE_GMTIME_R /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H @@ -131,45 +211,21 @@ /* Define to 1 if you have the `comdlg32' library (-lcomdlg32). */ #undef HAVE_LIBCOMDLG32 -/* Define to 1 if you have the `crypt32' library (-lcrypt32). */ -#undef HAVE_LIBCRYPT32 - /* Define to 1 if you have the `gdi32' library (-lgdi32). */ #undef HAVE_LIBGDI32 -/* Define to 1 if you have the `imm32' library (-limm32). */ -#undef HAVE_LIBIMM32 - /* Define to 1 if you have the `iphlpapi' library (-liphlpapi). */ #undef HAVE_LIBIPHLPAPI -/* Define to 1 if you have the `jpeg ' library (-ljpeg ). */ -#undef HAVE_LIBJPEG_ - /* Define to 1 if you have the `kernel32' library (-lkernel32). */ #undef HAVE_LIBKERNEL32 -/* Define to 1 if you have the `mingwthrd' library (-lmingwthrd). */ -#undef HAVE_LIBMINGWTHRD - -/* Define to 1 if you have the `mswsock' library (-lmswsock). */ -#undef HAVE_LIBMSWSOCK - /* Define to 1 if you have the `ole32' library (-lole32). */ #undef HAVE_LIBOLE32 /* Define to 1 if you have the `oleaut32' library (-loleaut32). */ #undef HAVE_LIBOLEAUT32 -/* Define to 1 if you have the `pcre16 ' library (-lpcre16 ). */ -#undef HAVE_LIBPCRE16_ - -/* Define to 1 if you have the `png ' library (-lpng ). */ -#undef HAVE_LIBPNG_ - -/* Define to 1 if you have the `rpcrt4' library (-lrpcrt4). */ -#undef HAVE_LIBRPCRT4 - /* Define to 1 if you have the `shell32' library (-lshell32). */ #undef HAVE_LIBSHELL32 @@ -188,14 +244,14 @@ /* Define to 1 if you have the `winmm' library (-lwinmm). */ #undef HAVE_LIBWINMM -/* Define to 1 if you have the `winspool' library (-lwinspool). */ -#undef HAVE_LIBWINSPOOL - /* Define to 1 if you have the `ws2_32' library (-lws2_32). */ #undef HAVE_LIBWS2_32 -/* Define to 1 if you have the `z ' library (-lz ). */ -#undef HAVE_LIBZ_ +/* Define this symbol if you have malloc_info */ +#undef HAVE_MALLOC_INFO + +/* Define this symbol if you have mallopt with M_ARENA_MAX */ +#undef HAVE_MALLOPT_ARENA_MAX /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H @@ -212,8 +268,8 @@ /* Define to 1 if you have the header file. */ #undef HAVE_MINIUPNPC_UPNPERRORS_H -/* Define this symbol if you have MSG_NOSIGNAL */ -#undef HAVE_MSG_NOSIGNAL +/* Define this symbol if you have posix_fallocate */ +#undef HAVE_POSIX_FALLOCATE /* Define if you have POSIX threads libraries and header files. */ #undef HAVE_PTHREAD @@ -230,6 +286,9 @@ /* Define to 1 if you have the header file. */ #undef HAVE_STDLIB_H +/* Define to 1 if std::system is available. */ +#undef HAVE_STD__SYSTEM + /* Define to 1 if you have the `strerror_r' function. */ #undef HAVE_STRERROR_R @@ -239,30 +298,63 @@ /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H +/* Define this symbol if the BSD sysctl() is available */ +#undef HAVE_SYSCTL + +/* Define this symbol if the BSD sysctl(KERN_ARND) is available */ +#undef HAVE_SYSCTL_ARND + +/* std::system or ::wsystem */ +#undef HAVE_SYSTEM + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_ENDIAN_H + +/* Define this symbol if the Linux getrandom system call is available */ +#undef HAVE_SYS_GETRANDOM + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PRCTL_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_RESOURCES_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_SELECT_H /* Define to 1 if you have the header file. */ #undef HAVE_SYS_STAT_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SYSCTL_H + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_TYPES_H +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_VMMETER_H + +/* Define if thread_local is supported. */ +#undef HAVE_THREAD_LOCAL + /* Define to 1 if you have the header file. */ #undef HAVE_UNISTD_H /* Define if the visibility attribute is supported. */ #undef HAVE_VISIBILITY_ATTRIBUTE +/* Define to 1 if you have the header file. */ +#undef HAVE_VM_VM_PARAM_H + /* Define this symbol if boost sleep works */ #undef HAVE_WORKING_BOOST_SLEEP /* Define this symbol if boost sleep_for works */ #undef HAVE_WORKING_BOOST_SLEEP_FOR +/* Define to 1 if ::wsystem is available. */ +#undef HAVE_WSYSTEM + /* Define to the sub-directory where libtool stores uninstalled libraries. */ #undef LT_OBJDIR @@ -288,9 +380,15 @@ your system. */ #undef PTHREAD_CREATE_JOINABLE +/* Define this symbol if the qt platform is android */ +#undef QT_QPA_PLATFORM_ANDROID + /* Define this symbol if the qt platform is cocoa */ #undef QT_QPA_PLATFORM_COCOA +/* Define this symbol if the minimal qt platform exists */ +#undef QT_QPA_PLATFORM_MINIMAL + /* Define this symbol if the qt platform is windows */ #undef QT_QPA_PLATFORM_WINDOWS @@ -306,12 +404,18 @@ /* Define to 1 if strerror_r returns char *. */ #undef STRERROR_R_CHAR_P +/* Define this symbol to build in assembly routines */ +#undef USE_ASM + /* Define if dbus support should be compiled in */ #undef USE_DBUS /* Define if QR support should be compiled in */ #undef USE_QRCODE +/* Define if sqlite support should be compiled in */ +#undef USE_SQLITE + /* UPnP support not compiled if undefined, otherwise value (0 or 1) determines default state */ #undef USE_UPNP diff --git a/src/miner.cpp b/src/miner.cpp index 3ef85c44..bb1a8a05 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -106,20 +106,8 @@ class TxPriorityCompare CBlock* CreateNewBlock(CReserveKey& reservekey, bool fProofOfStake, int64_t* pFees) { // Create new block - #ifdef __GNUC__ - #define GCC_VERSION (__GNUC__ * 10000 \ - + __GNUC_MINOR__ * 100 \ - + __GNUC_PATCHLEVEL__) - - /* Test for GCC < 6.3.0 */ - #if GCC_VERSION > 60300 - unique_ptr pblock(new CBlock()); - #else - auto_ptr pblock(new CBlock()); - #endif - #else - unique_ptr pblock(new CBlock()); - #endif + + unique_ptr pblock(new CBlock()); if (!pblock.get()) return NULL; @@ -675,20 +663,7 @@ void ThreadStakeMiner(CWallet *pwallet) // Create new block // int64_t nFees; - #ifdef __GNUC__ - #define GCC_VERSION (__GNUC__ * 10000 \ - + __GNUC_MINOR__ * 100 \ - + __GNUC_PATCHLEVEL__) - - /* Test for GCC < 6.3.0 */ - #if GCC_VERSION > 60300 - unique_ptr pblock(CreateNewBlock(reservekey, true, &nFees)); - #else - auto_ptr pblock(CreateNewBlock(reservekey, true, &nFees)); - #endif - #else - unique_ptr pblock(CreateNewBlock(reservekey, true, &nFees)); - #endif + auto_ptr pblock(CreateNewBlock(reservekey, true, &nFees)); if (!pblock.get()) return; diff --git a/src/rpcmining.cpp b/src/rpcmining.cpp index 583ae620..fc2ac62a 100644 --- a/src/rpcmining.cpp +++ b/src/rpcmining.cpp @@ -229,20 +229,7 @@ Value checkkernel(const Array& params, bool fHelp) int64_t nFees; - #ifdef __GNUC__ - #define GCC_VERSION (__GNUC__ * 10000 \ - + __GNUC_MINOR__ * 100 \ - + __GNUC_PATCHLEVEL__) - - /* Test for GCC < 6.3.0 */ - #if GCC_VERSION > 60300 - unique_ptr pblock(CreateNewBlock(*pMiningKey, true, &nFees)); - #else - auto_ptr pblock(CreateNewBlock(*pMiningKey, true, &nFees)); - #endif - #else - unique_ptr pblock(CreateNewBlock(*pMiningKey, true, &nFees)); - #endif + unique_ptr pblock(CreateNewBlock(*pMiningKey, true, &nFees)); pblock->nTime = pblock->vtx[0].nTime = nTime; diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index e815acf8..1e83622f 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -342,8 +342,7 @@ static const CRPCCommand vRPCCommands[] = { "smsgsendanon", &smsgsendanon, false, false, false }, { "smsginbox", &smsginbox, false, false, false }, { "smsgoutbox", &smsgoutbox, false, false, false }, - { "smsgbuckets", &smsgbuckets, false, false, false }, - { "smsggetmessagesforaccount", &smsggetmessagesforaccount, false, false, false } + { "smsgbuckets", &smsgbuckets, false, false, false } #endif }; diff --git a/src/rpcserver.h b/src/rpcserver.h index cba61bdd..13dbb6c6 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -215,8 +215,6 @@ extern json_spirit::Value smsginbox(const json_spirit::Array& params, bool fHelp extern json_spirit::Value smsgoutbox(const json_spirit::Array& params, bool fHelp); extern json_spirit::Value smsgbuckets(const json_spirit::Array& params, bool fHelp); -extern json_spirit::Value smsggetmessagesforaccount(const json_spirit::Array& params, bool fHelp); - extern json_spirit::Value cclistcoins(const json_spirit::Array& params, bool fHelp); #endif diff --git a/src/rpcsmessage.cpp b/src/rpcsmessage.cpp index f586612a..561a12ed 100644 --- a/src/rpcsmessage.cpp +++ b/src/rpcsmessage.cpp @@ -886,158 +886,5 @@ Value smsgbuckets(const Array& params, bool fHelp) }; - return result; -}; - -Value smsggetmessagesforaccount(const Array& params, bool fHelp) -{ - if (fHelp || params.size() > 1) - throw runtime_error( - "smsggetmessagesforaccount \"account\" [all|unread]\n" - "Decrypt and display all messages for an account." - "smsggetmessagesforaccount \"account\"\n" - "\nReturns decrypted and display all messages for an account.\n" - "\nArguments:\n" - "1. \"account\" (string, required) The account name.\n"); - - if (!fSecMsgEnabled) - throw runtime_error("Secure messaging is disabled."); - - if (pwalletMain->IsLocked()) - throw runtime_error("Wallet is locked."); - - std::string strAccount; - if (params.size() > 0) - { - strAccount = params[0].get_str(); - } else { - throw runtime_error("Account is required."); - } - - Object result; - uint32_t nMessages = 0; - Array resMessagesIn; - Array resMessagesOut; - std::vector accountAddresses; - char cbuf[256]; - - // Find all addresses that have the given account - BOOST_FOREACH(const PAIRTYPE(CDigitalNoteAddress, string)& item, pwalletMain->mapAddressBook) - { - const CDigitalNoteAddress& address = item.first; - const string& strName = item.second; - if (strName == strAccount) - accountAddresses.push_back(address.ToString()); - } - - - // get 'in' messages - { - LOCK(cs_smsgDB); - - SecMsgDB dbInbox; - - if (!dbInbox.Open("cr+")) - throw runtime_error("Could not open DB."); - - std::string sPrefix("im"); - unsigned char chKey[18]; - - SecMsgStored smsgStored; - MessageData msg; - - dbInbox.TxnBegin(); - - leveldb::Iterator *it = dbInbox.pdb->NewIterator(leveldb::ReadOptions()); - while (dbInbox.NextSmesg(it, sPrefix, chKey, smsgStored)) { - uint32_t nPayload = smsgStored.vchMessage.size() - SMSG_HDR_LEN; - if (SecureMsgDecrypt(false, smsgStored.sAddrTo, &smsgStored.vchMessage[0], &smsgStored.vchMessage[SMSG_HDR_LEN], nPayload, msg) == 0) { - bool oneOfTheAccountMessages = false; - for (std::string accountAddress : accountAddresses) { - if (smsgStored.sAddrTo == accountAddress) { - oneOfTheAccountMessages = true; - break; - } - }; - - if (oneOfTheAccountMessages == false) { - continue; - } - - Object objM; - objM.push_back(Pair("received", getTimeString(smsgStored.timeReceived, cbuf, sizeof(cbuf)))); - objM.push_back(Pair("sent", getTimeString(msg.timestamp, cbuf, sizeof(cbuf)))); - objM.push_back(Pair("from", msg.sFromAddress)); - objM.push_back(Pair("to", smsgStored.sAddrTo)); - objM.push_back(Pair("text", std::string((char *) &msg.vchMessage[0]))); // ugh - - resMessagesIn.push_back(objM); - } else { - Object objM; - objM.push_back(Pair("message", "Could not decrypt.")); - resMessagesIn.push_back(objM); - }; - - nMessages++; - }; - delete it; - dbInbox.TxnCommit(); - } - - // get 'out' messages - { - LOCK(cs_smsgDB); - - SecMsgDB dbOutbox; - std::string sPrefix("sm"); - unsigned char chKey[18]; - memset(&chKey[0], 0, 18); - - if (!dbOutbox.Open("cr+")) - throw runtime_error("Could not open DB."); - - SecMsgStored smsgStored; - MessageData msg; - leveldb::Iterator *it = dbOutbox.pdb->NewIterator(leveldb::ReadOptions()); - while (dbOutbox.NextSmesg(it, sPrefix, chKey, smsgStored)) { - uint32_t nPayload = smsgStored.vchMessage.size() - SMSG_HDR_LEN; - if (SecureMsgDecrypt(false, smsgStored.sAddrOutbox, &smsgStored.vchMessage[0], &smsgStored.vchMessage[SMSG_HDR_LEN], nPayload, msg) == 0) { - bool oneOfTheAccountMessages = false; - for (std::string accountAddress : accountAddresses) { - if (fDebugSmsg) - LogPrint("smessage", "Comparing from address with account addresses %s vs %s \n", accountAddress, msg.sFromAddress); - - if (msg.sFromAddress == accountAddress) { - oneOfTheAccountMessages = true; - break; - } - }; - if (oneOfTheAccountMessages == false) { - continue; - } - - Object objM; - objM.push_back(Pair("sent", getTimeString(msg.timestamp, cbuf, sizeof(cbuf)))); - objM.push_back(Pair("from", msg.sFromAddress)); - objM.push_back(Pair("to", smsgStored.sAddrTo)); - objM.push_back(Pair("text", std::string((char *) &msg.vchMessage[0]))); - - resMessagesOut.push_back(objM); - } else { - Object objM; - objM.push_back(Pair("message", "Could not decrypt.")); - resMessagesOut.push_back(objM); - }; - nMessages++; - }; - delete it; - } - - - result.push_back(Pair("messagesIn", resMessagesIn)); - result.push_back(Pair("messagesOut", resMessagesOut)); - snprintf(cbuf, sizeof(cbuf), "%u messages shown.", nMessages); - result.push_back(Pair("result", std::string(cbuf))); - return result; }; diff --git a/src/websocketpp/common/functional.hpp b/src/websocketpp/common/functional.hpp index 1bf3baae..56135b09 100644 --- a/src/websocketpp/common/functional.hpp +++ b/src/websocketpp/common/functional.hpp @@ -85,9 +85,9 @@ namespace lib { using boost::ref; namespace placeholders { /// \todo this feels hacky, is there a better way? - using ::_1; - using ::_2; - using ::_3; + using boost::placeholders::_1; + using boost::placeholders::_2; + using boost::placeholders::_3; } // See above definition for more details on what this is and why it exists From 19fcde45494e69fe7022a25d6c51a5c1ba068d0b Mon Sep 17 00:00:00 2001 From: crytpoplissken Date: Mon, 16 Nov 2020 22:47:43 -0800 Subject: [PATCH 30/35] [LEVELDB] Remove the deprecated OSMemoryBarrier https://github.com/bitcoin-core/leveldb/pull/20/commits/7d9b387acdd60a06fe5856f31e44864f7d761937 --- src/leveldb/port/atomic_pointer.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/leveldb/port/atomic_pointer.h b/src/leveldb/port/atomic_pointer.h index 9bf091f7..173915f2 100644 --- a/src/leveldb/port/atomic_pointer.h +++ b/src/leveldb/port/atomic_pointer.h @@ -19,15 +19,12 @@ #define PORT_ATOMIC_POINTER_H_ #include -#ifdef LEVELDB_ATOMIC_PRESENT +#if defined(LEVELDB_ATOMIC_PRESENT) || defined(OS_MACOSX) #include #endif #ifdef OS_WIN #include #endif -#ifdef OS_MACOSX -#include -#endif #if defined(_M_X64) || defined(__x86_64__) #define ARCH_CPU_X86_FAMILY 1 @@ -52,7 +49,7 @@ namespace port { // Mac OS #elif defined(OS_MACOSX) inline void MemoryBarrier() { - OSMemoryBarrier(); + std::atomic_thread_fence(std::memory_order_seq_cst); } #define LEVELDB_HAVE_MEMORY_BARRIER From 1e7605461074f0c5f7919fc2cefbbee6a8c7b628 Mon Sep 17 00:00:00 2001 From: vgulkevic Date: Tue, 17 Nov 2020 09:09:58 +0200 Subject: [PATCH 31/35] Removed CBigNum usages --- libtool | 2 +- src/base58.cpp | 62 +++--------- src/base58.h | 2 +- src/chainparams.cpp | 2 +- src/chainparamsseeds.h | 8 +- src/key.cpp | 1 + src/miner.cpp | 5 +- src/script.cpp | 221 +++++------------------------------------ src/script.h | 28 ++++++ src/smessage.cpp | 15 --- src/uint256.h | 5 + src/wallet.cpp | 6 +- 12 files changed, 86 insertions(+), 271 deletions(-) diff --git a/libtool b/libtool index a0d0780d..fefc917d 100755 --- a/libtool +++ b/libtool @@ -45,7 +45,7 @@ macro_revision=2.4.6 pic_mode=yes # Whether or not to build shared libraries. -build_libtool_libs=yes +build_libtool_libs=no # Whether or not to build static libraries. build_old_libs=yes diff --git a/src/base58.cpp b/src/base58.cpp index 33fd46f3..10c55bc8 100644 --- a/src/base58.cpp +++ b/src/base58.cpp @@ -19,71 +19,37 @@ /* All alphanumeric characters except for "0", "I", "O", and "l" */ static const char* pszBase58 = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"; -bool DecodeBase58(const char* psz, std::vector& vchRet) { - CAutoBN_CTX pctx; - vchRet.clear(); - CBigNum bn58 = 58; - CBigNum bn = 0; - CBigNum bnChar; +bool DecodeBase58(const char* psz, std::vector& vch) +{ // Skip leading spaces. while (*psz && isspace(*psz)) psz++; // Skip and count leading '1's. int zeroes = 0; + int length = 0; while (*psz == '1') { zeroes++; psz++; } - // Convert big endian string to bignum - for (const char* p = psz; *p; p++) - { - const char* p1 = strchr(pszBase58, *p); - if (p1 == NULL) - { - while (isspace(*p)) - p++; - if (*p != '\0') - return false; - break; - } - bnChar.setulong(p1 - pszBase58); - if (!BN_mul(bn.to_bignum(), bn.to_bignum(), bn58.to_bignum(), pctx)) - throw bignum_error("DecodeBase58 : BN_mul failed"); - bn += bnChar; - } - - // Get bignum as little endian data - std::vector vchTmp = bn.getvch(); - - // Trim off sign byte if present - if (vchTmp.size() >= 2 && vchTmp.end()[-1] == 0 && vchTmp.end()[-2] >= 0x80) - vchTmp.erase(vchTmp.end()-1); - - // Restore leading zeros - int nLeadingZeros = 0; - for (const char* p = psz; *p == pszBase58[0]; p++) - nLeadingZeros++; - vchRet.assign(nLeadingZeros + vchTmp.size(), 0); - - // Convert little endian data to big endian - reverse_copy(vchTmp.begin(), vchTmp.end(), vchRet.end() - vchTmp.size()); - return true; // Allocate enough space in big-endian base256 representation. - std::vector b256(strlen(psz) * 733 / 1000 + 1); // log(58) / log(256), rounded up. + int size = strlen(psz) * 733 /1000 + 1; // log(58) / log(256), rounded up. + std::vector b256(size); // Process the characters. while (*psz && !isspace(*psz)) { // Decode base58 character - const char *ch = strchr(pszBase58, *psz); - if (ch == NULL) + const char* ch = strchr(pszBase58, *psz); + if (ch == nullptr) return false; // Apply "b256 = b256 * 58 + ch". int carry = ch - pszBase58; - for (std::vector::reverse_iterator it = b256.rbegin(); it != b256.rend(); it++) { + int i = 0; + for (std::vector::reverse_iterator it = b256.rbegin(); (carry != 0 || i < length) && (it != b256.rend()); ++it, ++i) { carry += 58 * (*it); *it = carry % 256; carry /= 256; } assert(carry == 0); + length = i; psz++; } // Skip trailing spaces. @@ -92,14 +58,14 @@ bool DecodeBase58(const char* psz, std::vector& vchRet) { if (*psz != 0) return false; // Skip leading zeroes in b256. - std::vector::iterator it = b256.begin(); + std::vector::iterator it = b256.begin() + (size - length); while (it != b256.end() && *it == 0) it++; // Copy result into output vector. - vchRet.reserve(zeroes + (b256.end() - it)); - vchRet.assign(zeroes, 0x00); + vch.reserve(zeroes + (b256.end() - it)); + vch.assign(zeroes, 0x00); while (it != b256.end()) - vchRet.push_back(*(it++)); + vch.push_back(*(it++)); return true; } diff --git a/src/base58.h b/src/base58.h index 683cde5d..2b084c40 100644 --- a/src/base58.h +++ b/src/base58.h @@ -37,7 +37,7 @@ std::string EncodeBase58(const std::vector& vch); * return true if decoding is successful. * psz cannot be NULL. */ -bool DecodeBase58(const char* psz, std::vector& vchRet); +bool DecodeBase58(const char* psz, std::vector& vch); /** * Decode a base58-encoded string (str) into a byte vector (vchRet). diff --git a/src/chainparams.cpp b/src/chainparams.cpp index fe599b1f..a2c39af9 100644 --- a/src/chainparams.cpp +++ b/src/chainparams.cpp @@ -61,7 +61,7 @@ class CMainParams : public CChainParams { const char* pszTimestamp = "Elon Musk Wants to Embed AI-on-a-Chip Into Every Human Brain | JP Buntinx | January 18, 2019 | News, Technology | TheMerkle"; std::vector vin; vin.resize(1); - vin[0].scriptSig = CScript() << 0 << 42 << vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); + vin[0].scriptSig = CScript() << 0 << CScriptNum(42) << vector((const unsigned char*)pszTimestamp, (const unsigned char*)pszTimestamp + strlen(pszTimestamp)); std::vector vout; vout.resize(1); vout[0].nValue = 1 * COIN; diff --git a/src/chainparamsseeds.h b/src/chainparamsseeds.h index 37967f60..c4dfc004 100644 --- a/src/chainparamsseeds.h +++ b/src/chainparamsseeds.h @@ -5,8 +5,12 @@ // Each line contains a 16-byte IPv6 address and a port. // IPv4 as well as onion addresses are wrapped inside a IPv6 address accordingly. -static SeedSpec6 pnSeed6_main[]; +static SeedSpec6 pnSeed6_main[] = { +}; -static const unsigned int pnTestnetSeed[]; + +static const unsigned int pnTestnetSeed[] = { + +}; #endif diff --git a/src/key.cpp b/src/key.cpp index 64dd9ef6..2588956a 100644 --- a/src/key.cpp +++ b/src/key.cpp @@ -7,6 +7,7 @@ #include "crypto/common/common.h" #include "crypto/common/hmac_sha512.h" #include "pubkey.h" +#include "random.h" #include #include diff --git a/src/miner.cpp b/src/miner.cpp index bb1a8a05..f5f8ab94 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -479,9 +479,8 @@ void IncrementExtraNonce(CBlock* pblock, CBlockIndex* pindexPrev, unsigned int& hashPrevBlock = pblock->hashPrevBlock; } ++nExtraNonce; - unsigned int nHeight = pindexPrev->nHeight+1; // Height first in coinbase required for block.version=2 - pblock->vtx[0].vin[0].scriptSig = (CScript() << nHeight << uint256(nExtraNonce)) + COINBASE_FLAGS; + pblock->vtx[0].vin[0].scriptSig = (CScript() << nHeight << CScriptNum(nExtraNonce)) + COINBASE_FLAGS; assert(pblock->vtx[0].vin[0].scriptSig.size() <= 100); pblock->hashMerkleRoot = pblock->BuildMerkleTree(); @@ -663,7 +662,7 @@ void ThreadStakeMiner(CWallet *pwallet) // Create new block // int64_t nFees; - auto_ptr pblock(CreateNewBlock(reservekey, true, &nFees)); + unique_ptr pblock(CreateNewBlock(reservekey, true, &nFees)); if (!pblock.get()) return; diff --git a/src/script.cpp b/src/script.cpp index 81c0404a..bc641ab3 100644 --- a/src/script.cpp +++ b/src/script.cpp @@ -111,21 +111,13 @@ bool CheckSig(vector vchSig, const vector &vchPubK static const valtype vchFalse(0); static const valtype vchZero(0); static const valtype vchTrue(1, 1); -static const CBigNum bnZero(0); -static const CBigNum bnOne(1); -static const CBigNum bnFalse(0); -static const CBigNum bnTrue(1); +static const CScriptNum bnZero(0); +static const CScriptNum bnOne(1); +static const CScriptNum bnFalse(0); +static const CScriptNum bnTrue(1); static const size_t nDefaultMaxNumSize = 4; -CBigNum CastToBigNum(const valtype& vch, const size_t nMaxNumSize = nDefaultMaxNumSize) -{ - if (vch.size() > nMaxNumSize) - throw runtime_error("CastToBigNum() : overflow"); - // Get rid of extra leading zeros - return CBigNum(CBigNum(vch).getvch()); -} - bool CastToBool(const valtype& vch) { for (unsigned int i = 0; i < vch.size(); i++) @@ -141,33 +133,6 @@ bool CastToBool(const valtype& vch) return false; } -// -// WARNING: This does not work as expected for signed integers; the sign-bit -// is left in place as the integer is zero-extended. The correct behavior -// would be to move the most significant bit of the last byte during the -// resize process. MakeSameSize() is currently only used by the disabled -// opcodes OP_AND, OP_OR, and OP_XOR. -// -void MakeSameSize(valtype& vch1, valtype& vch2) -{ - // Lengthen the shorter one - if (vch1.size() < vch2.size()) - // PATCH: - // +unsigned char msb = vch1[vch1.size()-1]; - // +vch1[vch1.size()-1] &= 0x7f; - // vch1.resize(vch2.size(), 0); - // +vch1[vch1.size()-1] = msb; - vch1.resize(vch2.size(), 0); - if (vch2.size() < vch1.size()) - // PATCH: - // +unsigned char msb = vch2[vch2.size()-1]; - // +vch2[vch2.size()-1] &= 0x7f; - // vch2.resize(vch1.size(), 0); - // +vch2[vch2.size()-1] = msb; - vch2.resize(vch1.size(), 0); -} - - // // Script is a stack machine (like Forth) that evaluates a predicate @@ -437,7 +402,6 @@ bool static CheckPubKeyEncoding(const valtype &vchSig) { bool EvalScript(vector >& stack, const CScript& script, const CTransaction& txTo, unsigned int nIn, unsigned int flags, int nHashType) { - CAutoBN_CTX pctx; CScript::const_iterator pc = script.begin(); CScript::const_iterator pend = script.end(); CScript::const_iterator pbegincodehash = script.begin(); @@ -510,7 +474,7 @@ bool EvalScript(vector >& stack, const CScript& script, co case OP_16: { // ( -- value) - CBigNum bn((int)opcode - (int)(OP_1 - 1)); + CScriptNum bn((int)opcode - (int)(OP_1 - 1)); stack.push_back(bn.getvch()); } break; @@ -692,7 +656,7 @@ bool EvalScript(vector >& stack, const CScript& script, co case OP_DEPTH: { // -- stacksize - CBigNum bn(stack.size()); + CScriptNum bn(stack.size()); stack.push_back(bn.getvch()); } break; @@ -742,7 +706,7 @@ bool EvalScript(vector >& stack, const CScript& script, co // (xn ... x2 x1 x0 n - ... x2 x1 x0 xn) if (stack.size() < 2) return false; - int n = CastToBigNum(stacktop(-1)).getint(); + int n = CScriptNum(stacktop(-1)).getint(); popstack(stack); if (n < 0 || n >= (int)stack.size()) return false; @@ -784,124 +748,16 @@ bool EvalScript(vector >& stack, const CScript& script, co } break; - - // - // Splice ops - // - case OP_CAT: - { - // (x1 x2 -- out) - if (stack.size() < 2) - return false; - valtype& vch1 = stacktop(-2); - valtype& vch2 = stacktop(-1); - vch1.insert(vch1.end(), vch2.begin(), vch2.end()); - popstack(stack); - if (stacktop(-1).size() > MAX_SCRIPT_ELEMENT_SIZE) - return false; - } - break; - - case OP_SUBSTR: - { - // (in begin size -- out) - if (stack.size() < 3) - return false; - valtype& vch = stacktop(-3); - int nBegin = CastToBigNum(stacktop(-2)).getint(); - int nEnd = nBegin + CastToBigNum(stacktop(-1)).getint(); - if (nBegin < 0 || nEnd < nBegin) - return false; - if (nBegin > (int)vch.size()) - nBegin = vch.size(); - if (nEnd > (int)vch.size()) - nEnd = vch.size(); - vch.erase(vch.begin() + nEnd, vch.end()); - vch.erase(vch.begin(), vch.begin() + nBegin); - popstack(stack); - popstack(stack); - } - break; - - case OP_LEFT: - case OP_RIGHT: - { - // (in size -- out) - if (stack.size() < 2) - return false; - valtype& vch = stacktop(-2); - int nSize = CastToBigNum(stacktop(-1)).getint(); - if (nSize < 0) - return false; - if (nSize > (int)vch.size()) - nSize = vch.size(); - if (opcode == OP_LEFT) - vch.erase(vch.begin() + nSize, vch.end()); - else - vch.erase(vch.begin(), vch.end() - nSize); - popstack(stack); - } - break; - case OP_SIZE: { // (in -- in size) if (stack.size() < 1) return false; - CBigNum bn(stacktop(-1).size()); + CScriptNum bn(stacktop(-1).size()); stack.push_back(bn.getvch()); } break; - - // - // Bitwise logic - // - case OP_INVERT: - { - // (in - out) - if (stack.size() < 1) - return false; - valtype& vch = stacktop(-1); - for (unsigned int i = 0; i < vch.size(); i++) - vch[i] = ~vch[i]; - } - break; - - // - // WARNING: These disabled opcodes exhibit unexpected behavior - // when used on signed integers due to a bug in MakeSameSize() - // [see definition of MakeSameSize() above]. - // - case OP_AND: - case OP_OR: - case OP_XOR: - { - // (x1 x2 - out) - if (stack.size() < 2) - return false; - valtype& vch1 = stacktop(-2); - valtype& vch2 = stacktop(-1); - MakeSameSize(vch1, vch2); // <-- NOT SAFE FOR SIGNED VALUES - if (opcode == OP_AND) - { - for (unsigned int i = 0; i < vch1.size(); i++) - vch1[i] &= vch2[i]; - } - else if (opcode == OP_OR) - { - for (unsigned int i = 0; i < vch1.size(); i++) - vch1[i] |= vch2[i]; - } - else if (opcode == OP_XOR) - { - for (unsigned int i = 0; i < vch1.size(); i++) - vch1[i] ^= vch2[i]; - } - popstack(stack); - } - break; - case OP_EQUAL: case OP_EQUALVERIFY: //case OP_NOTEQUAL: // use OP_NUMNOTEQUAL @@ -946,18 +802,16 @@ bool EvalScript(vector >& stack, const CScript& script, co // (in -- out) if (stack.size() < 1) return false; - CBigNum bn = CastToBigNum(stacktop(-1)); + CScriptNum bn(stacktop(-1)); switch (opcode) { - case OP_1ADD: bn += bnOne; break; - case OP_1SUB: bn -= bnOne; break; - case OP_2MUL: bn <<= 1; break; - case OP_2DIV: bn >>= 1; break; - case OP_NEGATE: bn = -bn; break; - case OP_ABS: if (bn < bnZero) bn = -bn; break; - case OP_NOT: bn = (bn == bnZero); break; - case OP_0NOTEQUAL: bn = (bn != bnZero); break; - default: assert(!"invalid opcode"); break; + case OP_1ADD: bn += bnOne; break; + case OP_1SUB: bn -= bnOne; break; + case OP_NEGATE: bn = -bn; break; + case OP_ABS: if (bn < bnZero) bn = -bn; break; + case OP_NOT: bn = (bn == bnZero); break; + case OP_0NOTEQUAL: bn = (bn != bnZero); break; + default: assert(!"invalid opcode"); break; } popstack(stack); stack.push_back(bn.getvch()); @@ -986,9 +840,9 @@ bool EvalScript(vector >& stack, const CScript& script, co // (x1 x2 -- out) if (stack.size() < 2) return false; - CBigNum bn1 = CastToBigNum(stacktop(-2)); - CBigNum bn2 = CastToBigNum(stacktop(-1)); - CBigNum bn; + CScriptNum bn1(stacktop(-2)); + CScriptNum bn2(stacktop(-1)); + CScriptNum bn(0); switch (opcode) { case OP_ADD: @@ -999,33 +853,6 @@ bool EvalScript(vector >& stack, const CScript& script, co bn = bn1 - bn2; break; - case OP_MUL: - if (!BN_mul(bn.to_bignum(), bn1.to_bignum(), bn2.to_bignum(), pctx)) - return false; - break; - - case OP_DIV: - if (!BN_div(bn.to_bignum(), NULL, bn1.to_bignum(), bn2.to_bignum(), pctx)) - return false; - break; - - case OP_MOD: - if (!BN_mod(bn.to_bignum(), bn1.to_bignum(), bn2.to_bignum(), pctx)) - return false; - break; - - case OP_LSHIFT: - if (bn2 < bnZero || bn2 > CBigNum(2048)) - return false; - bn = bn1 << bn2.getulong(); - break; - - case OP_RSHIFT: - if (bn2 < bnZero || bn2 > CBigNum(2048)) - return false; - bn = bn1 >> bn2.getulong(); - break; - case OP_BOOLAND: bn = (bn1 != bnZero && bn2 != bnZero); break; case OP_BOOLOR: bn = (bn1 != bnZero || bn2 != bnZero); break; case OP_NUMEQUAL: bn = (bn1 == bn2); break; @@ -1058,9 +885,9 @@ bool EvalScript(vector >& stack, const CScript& script, co // (x min max -- out) if (stack.size() < 3) return false; - CBigNum bn1 = CastToBigNum(stacktop(-3)); - CBigNum bn2 = CastToBigNum(stacktop(-2)); - CBigNum bn3 = CastToBigNum(stacktop(-1)); + CScriptNum bn1(stacktop(-3)); + CScriptNum bn2(stacktop(-2)); + CScriptNum bn3(stacktop(-1)); bool fValue = (bn2 <= bn1 && bn1 < bn3); popstack(stack); popstack(stack); @@ -1156,7 +983,7 @@ bool EvalScript(vector >& stack, const CScript& script, co if ((int)stack.size() < i) return false; - int nKeysCount = CastToBigNum(stacktop(-i)).getint(); + int nKeysCount = CScriptNum(stacktop(-i)).getint(); if (nKeysCount < 0 || nKeysCount > 20) return false; nOpCount += nKeysCount; @@ -1167,7 +994,7 @@ bool EvalScript(vector >& stack, const CScript& script, co if ((int)stack.size() < i) return false; - int nSigsCount = CastToBigNum(stacktop(-i)).getint(); + int nSigsCount = CScriptNum(stacktop(-i)).getint(); if (nSigsCount < 0 || nSigsCount > nKeysCount) return false; int isig = ++i; diff --git a/src/script.h b/src/script.h index cc84e718..143b882a 100644 --- a/src/script.h +++ b/src/script.h @@ -45,6 +45,7 @@ class CScriptNum * throwing an exception if arithmetic is done or the result is interpreted as an integer. */ public: + static const size_t nDefaultMaxNumSize = 4; explicit CScriptNum(const int64_t& n) { @@ -58,6 +59,33 @@ class CScriptNum m_value = set_vch(vch); } + explicit CScriptNum(const std::vector& vch, bool fRequireMinimal, + const size_t nMaxNumSize = nDefaultMaxNumSize) + { + if (vch.size() > nMaxNumSize) { + throw scriptnum_error("script number overflow"); + } + if (fRequireMinimal && vch.size() > 0) { + // Check that the number is encoded with the minimum possible + // number of bytes. + // + // If the most-significant-byte - excluding the sign bit - is zero + // then we're not minimal. Note how this test also rejects the + // negative-zero encoding, 0x80. + if ((vch.back() & 0x7f) == 0) { + // One exception: if there's more than one byte and the most + // significant bit of the second-most-significant-byte is set + // it would conflict with the sign bit. An example of this case + // is +-255, which encode to 0xff00 and 0xff80 respectively. + // (big-endian). + if (vch.size() <= 1 || (vch[vch.size() - 2] & 0x80) == 0) { + throw scriptnum_error("non-minimally encoded script number"); + } + } + } + m_value = set_vch(vch); + } + inline bool operator==(const int64_t& rhs) const { return m_value == rhs; } inline bool operator!=(const int64_t& rhs) const { return m_value != rhs; } inline bool operator<=(const int64_t& rhs) const { return m_value <= rhs; } diff --git a/src/smessage.cpp b/src/smessage.cpp index 6896a537..4f67b4d9 100644 --- a/src/smessage.cpp +++ b/src/smessage.cpp @@ -3227,17 +3227,12 @@ int SecureMsgSetHash(uint8_t *pHeader, uint8_t *pPayload, uint32_t nPayload) uint32_t nonse = 0; - //CBigNum bnTarget(2); - //bnTarget = bnTarget.pow(256 - 40); - // -- break for HMAC_CTX_cleanup for (;;) { if (!fSecMsgEnabled) break; - //psmsg->timestamp = GetTime(); - //memcpy(&psmsg->timestamp, &now, 8); memcpy(&psmsg->nonse[0], &nonse, 4); for (int i = 0; i < 32; i+=4) @@ -3253,16 +3248,6 @@ int SecureMsgSetHash(uint8_t *pHeader, uint8_t *pPayload, uint32_t nPayload) || nBytes != 32) break; - /* - if (CBigNum(vchHash) <= bnTarget) - { - found = true; - if (fDebugSmsg) - LogPrint("smessage", "Match %u\n", nonse); - break; - }; - */ - if (sha256Hash[31] == 0 && sha256Hash[30] == 0 && (~(sha256Hash[29]) & ((1<<0) | (1<<1) | (1<<2)) )) diff --git a/src/uint256.h b/src/uint256.h index 0289fc9b..3c14e33e 100644 --- a/src/uint256.h +++ b/src/uint256.h @@ -18,6 +18,11 @@ extern const signed char p_util_hexdigit[256]; // defined in util.cpp +inline signed char HexDigit(char c) +{ + return p_util_hexdigit[(unsigned char)c]; +} + class uint_error : public std::runtime_error { public: explicit uint_error(const std::string& str) : std::runtime_error(str) {} diff --git a/src/wallet.cpp b/src/wallet.cpp index a190c584..6a353a85 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -1931,8 +1931,8 @@ bool CWallet::GetStakeWeightFromValue(const int64_t& nTime, const int64_t& nValu if (nTimeWeight < 0 ) nTimeWeight=0; - CBigNum bnCoinDayWeight = CBigNum(nValue) * nTimeWeight / COIN / (24 * 60 * 60); - nWeight = bnCoinDayWeight.getuint64(); + uint256 bnCoinDayWeight = uint256(nValue) * nTimeWeight / COIN / (24 * 60 * 60); + nWeight = bnCoinDayWeight.Get64(); return true; } @@ -2885,7 +2885,7 @@ uint64_t CWallet::GetStakeWeight() const bool CWallet::CreateCoinStake(const CKeyStore& keystore, unsigned int nBits, int64_t nSearchInterval, int64_t nFees, CTransaction& txNew, CKey& key) { CBlockIndex* pindexPrev = pindexBest; - CBigNum bnTargetPerCoinDay; + uint256 bnTargetPerCoinDay; bnTargetPerCoinDay.SetCompact(nBits); txNew.vin.clear(); From 668e46f27fa77c569d9a71a42f330a817f61506a Mon Sep 17 00:00:00 2001 From: vgulkevic Date: Tue, 17 Nov 2020 09:44:42 +0200 Subject: [PATCH 32/35] Fix lcrypto missing --- configure.ac | 35 +++++++++++++++++++++++++++++++++++ libtool | 2 +- src/Makefile.qt.include | 2 +- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 3015e23c..776510bf 100644 --- a/configure.ac +++ b/configure.ac @@ -585,8 +585,13 @@ AC_ARG_WITH([daemon], [build_bitcoind=$withval], [build_bitcoind=yes]) +use_pkgconfig=yes case $host in *mingw*) + + #pkgconfig does more harm than good with MinGW + use_pkgconfig=no + TARGET_OS=windows AC_CHECK_LIB([kernel32], [GetModuleFileNameA],, AC_MSG_ERROR(libkernel32 missing)) AC_CHECK_LIB([user32], [main],, AC_MSG_ERROR(libuser32 missing)) @@ -643,8 +648,13 @@ case $host in dnl It's safe to add these paths even if the functionality is disabled by dnl the user (--without-wallet or --without-gui for example). + openssl_prefix=`$BREW --prefix openssl 2>/dev/null` bdb_prefix=$($BREW --prefix berkeley-db4 2>/dev/null) qt5_prefix=$($BREW --prefix qt5 2>/dev/null) + if test x$openssl_prefix != x; then + PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH" + export PKG_CONFIG_PATH + fi if test x$bdb_prefix != x && test "x$BDB_CFLAGS" = "x" && test "x$BDB_LIBS" = "x"; then dnl This must precede the call to BITCOIN_FIND_BDB48 below. BDB_CFLAGS="-I$bdb_prefix/include" @@ -691,6 +701,16 @@ case $host in ;; esac +if test x$use_pkgconfig = xyes; then + m4_ifndef([PKG_PROG_PKG_CONFIG], [AC_MSG_ERROR(PKG_PROG_PKG_CONFIG macro not found. Please install pkg-config and re-run autogen.sh.)]) + m4_ifdef([PKG_PROG_PKG_CONFIG], [ + PKG_PROG_PKG_CONFIG + if test x"$PKG_CONFIG" = "x"; then + AC_MSG_ERROR(pkg-config not found.) + fi + ]) +fi + if test x$use_extended_functional_tests != xno; then AC_SUBST(EXTENDED_FUNCTIONAL_TESTS, --extended) fi @@ -1461,6 +1481,20 @@ fi fi +if test x$use_pkgconfig = xyes; then + : dnl + m4_ifdef( + [PKG_CHECK_MODULES], + [ + PKG_CHECK_MODULES([CRYPTO], [libcrypto],,[AC_MSG_ERROR(libcrypto not found.)]) + ] + ) +else + AC_CHECK_HEADER([openssl/crypto.h],,AC_MSG_ERROR(libcrypto headers missing)) + AC_CHECK_LIB([crypto], [main],CRYPTO_LIBS=-lcrypto, AC_MSG_ERROR(libcrypto missing)) +fi + + dnl libevent check if test x$build_bitcoin_cli$build_bitcoind$bitcoin_enable_qt$use_tests$use_bench != xnonononono; then @@ -1788,6 +1822,7 @@ AC_SUBST(MINIUPNPC_CPPFLAGS) AC_SUBST(MINIUPNPC_LIBS) AC_SUBST(EVENT_LIBS) AC_SUBST(EVENT_PTHREADS_LIBS) +AC_SUBST(CRYPTO_LIBS) AC_SUBST(ZMQ_LIBS) AC_SUBST(QR_LIBS) AC_SUBST(HAVE_GMTIME_R) diff --git a/libtool b/libtool index fefc917d..a0d0780d 100755 --- a/libtool +++ b/libtool @@ -45,7 +45,7 @@ macro_revision=2.4.6 pic_mode=yes # Whether or not to build shared libraries. -build_libtool_libs=no +build_libtool_libs=yes # Whether or not to build static libraries. build_old_libs=yes diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 1c0d3104..204b36d3 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -413,7 +413,7 @@ if ENABLE_WALLET qt_bitcoin_qt_LDADD += $(LIBBITCOIN_WALLET) endif qt_bitcoin_qt_LDADD += $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBBITCOIN_UNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \ - $(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(PROTOBUF_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBSECP256K1) + $(BOOST_LIBS) $(QT_LIBS) $(QT_DBUS_LIBS) $(QR_LIBS) $(BDB_LIBS) $(SSL_LIBS) $(CRYPTO_LIBS) $(MINIUPNPC_LIBS) $(LIBSECP256K1) qt_bitcoin_qt_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(QT_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS) qt_bitcoin_qt_LIBTOOLFLAGS = --tag CXX From fa90fdca4054ef2ab020ac0665bef3c16142bbd2 Mon Sep 17 00:00:00 2001 From: vgulkevic Date: Tue, 17 Nov 2020 10:10:35 +0200 Subject: [PATCH 33/35] Fix lssl missing --- configure.ac | 5 +++++ src/Makefile.qt.include | 1 + src/config/bitcoin-config.h | 2 +- src/qt/forms/rpcconsole.ui | 2 +- src/qt/walletmodel.h | 10 ++++------ 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/configure.ac b/configure.ac index 776510bf..190d815f 100644 --- a/configure.ac +++ b/configure.ac @@ -1486,10 +1486,14 @@ if test x$use_pkgconfig = xyes; then m4_ifdef( [PKG_CHECK_MODULES], [ + PKG_CHECK_MODULES([SSL], [libssl],, [AC_MSG_ERROR(openssl not found.)]) PKG_CHECK_MODULES([CRYPTO], [libcrypto],,[AC_MSG_ERROR(libcrypto not found.)]) ] ) else + AC_CHECK_HEADER([openssl/ssl.h],, AC_MSG_ERROR(libssl headers missing),) + AC_CHECK_LIB([ssl], [main],SSL_LIBS=-lssl, AC_MSG_ERROR(libssl missing)) + AC_CHECK_HEADER([openssl/crypto.h],,AC_MSG_ERROR(libcrypto headers missing)) AC_CHECK_LIB([crypto], [main],CRYPTO_LIBS=-lcrypto, AC_MSG_ERROR(libcrypto missing)) fi @@ -1823,6 +1827,7 @@ AC_SUBST(MINIUPNPC_LIBS) AC_SUBST(EVENT_LIBS) AC_SUBST(EVENT_PTHREADS_LIBS) AC_SUBST(CRYPTO_LIBS) +AC_SUBST(SSL_LIBS) AC_SUBST(ZMQ_LIBS) AC_SUBST(QR_LIBS) AC_SUBST(HAVE_GMTIME_R) diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 204b36d3..09508298 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -119,6 +119,7 @@ QT_MOC_CPP = \ qt/moc_masternodemanager.cpp \ qt/moc_addeditadrenalinenode.cpp \ qt/moc_adrenalinenodeconfigdialog.cpp \ + qt/moc_bitcoinamountfield.cpp \ qt/moc_qcustomplot.cpp \ qt/moc_messagepage.cpp \ qt/moc_messagemodel.cpp \ diff --git a/src/config/bitcoin-config.h b/src/config/bitcoin-config.h index cfe04774..4585910f 100644 --- a/src/config/bitcoin-config.h +++ b/src/config/bitcoin-config.h @@ -72,7 +72,7 @@ #define HAVE_BOOST_THREAD /**/ /* define if the Boost::Unit_Test_Framework library is available */ -#define HAVE_BOOST_UNIT_TEST_FRAMEWORK /**/ +/* #undef HAVE_BOOST_UNIT_TEST_FRAMEWORK */ /* Define this symbol if you have __builtin_clzl */ #define HAVE_BUILTIN_CLZL 1 diff --git a/src/qt/forms/rpcconsole.ui b/src/qt/forms/rpcconsole.ui index 9a82b272..3a41f460 100644 --- a/src/qt/forms/rpcconsole.ui +++ b/src/qt/forms/rpcconsole.ui @@ -198,7 +198,7 @@ - + Number of masternodes diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h index 9d74ec5f..ea8d75ad 100644 --- a/src/qt/walletmodel.h +++ b/src/qt/walletmodel.h @@ -77,12 +77,10 @@ class SendCoinsRecipient READWRITE(amount); READWRITE(sMessage); - if (ser_action.ForRead()) - { - address = QString::fromStdString(sAddress); - label = QString::fromStdString(sLabel); - message = QString::fromStdString(sMessage); - } + + address = QString::fromStdString(sAddress); + label = QString::fromStdString(sLabel); + message = QString::fromStdString(sMessage); } }; From 820168da05d5c3c4bca9b1203de7539b78d597b6 Mon Sep 17 00:00:00 2001 From: vgulkevic Date: Tue, 17 Nov 2020 10:35:18 +0200 Subject: [PATCH 34/35] Fix boost printsupport --- build-aux/m4/bitcoin_qt.m4 | 10 ++++++++-- src/qt/qcustomplot.h | 10 ++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/build-aux/m4/bitcoin_qt.m4 b/build-aux/m4/bitcoin_qt.m4 index 6c766583..d8a2883b 100644 --- a/build-aux/m4/bitcoin_qt.m4 +++ b/build-aux/m4/bitcoin_qt.m4 @@ -345,8 +345,14 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS],[ PKG_CHECK_MODULES([QT_NETWORK], [${qt_lib_prefix}Network $qt_version], [], [BITCOIN_QT_FAIL([${qt_lib_prefix}Network $qt_version not found])]) ]) - QT_INCLUDES="$QT_CORE_CFLAGS $QT_GUI_CFLAGS $QT_WIDGETS_CFLAGS $QT_NETWORK_CFLAGS" - QT_LIBS="$QT_CORE_LIBS $QT_GUI_LIBS $QT_WIDGETS_LIBS $QT_NETWORK_LIBS" + + BITCOIN_QT_CHECK([ + PKG_CHECK_MODULES([QT_PRINT_SUPPORT], [${qt_lib_prefix}PrintSupport $qt_version], [], + [BITCOIN_QT_FAIL([${qt_lib_prefix}PrintSupport $qt_version not found])]) + ]) + + QT_INCLUDES="$QT_CORE_CFLAGS $QT_GUI_CFLAGS $QT_WIDGETS_CFLAGS $QT_NETWORK_CFLAGS $QT_PRINT_SUPPORT_CFLAGS" + QT_LIBS="$QT_CORE_LIBS $QT_GUI_LIBS $QT_WIDGETS_LIBS $QT_NETWORK_LIBS $QT_PRINT_SUPPORT_LIBS" BITCOIN_QT_CHECK([ PKG_CHECK_MODULES([QT_TEST], [${qt_lib_prefix}Test $qt_version], [QT_TEST_INCLUDES="$QT_TEST_CFLAGS"; have_qt_test=yes], [have_qt_test=no]) diff --git a/src/qt/qcustomplot.h b/src/qt/qcustomplot.h index 338f43ff..3a7bd6f5 100644 --- a/src/qt/qcustomplot.h +++ b/src/qt/qcustomplot.h @@ -45,14 +45,8 @@ #include #include #include -#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0) -# include -# include -# include -#else -# include -# include -#endif +#include +#include class QCPPainter; class QCustomPlot; From 8ed2041a83826c98e7cae1f12e2bae1cb68d49f5 Mon Sep 17 00:00:00 2001 From: vgulkevic Date: Tue, 17 Nov 2020 11:38:44 +0200 Subject: [PATCH 35/35] Fix bitcoin.cpp is not included int BITCOIN_QT_CPP --- configure.ac | 2 +- src/Makefile.qt.include | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 190d815f..18678b88 100644 --- a/configure.ac +++ b/configure.ac @@ -146,7 +146,7 @@ AC_ARG_ENABLE([upnp-default], AC_ARG_ENABLE(tests, AS_HELP_STRING([--disable-tests],[do not compile tests (default is to compile)]), [use_tests=$enableval], - [use_tests=yes]) + [use_tests=no]) 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)]), diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index 09508298..724ad5db 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -112,6 +112,7 @@ QT_MOC_CPP = \ qt/moc_addressbookpage.cpp \ qt/moc_signverifymessagedialog.cpp \ qt/moc_aboutdialog.cpp \ + #qt/moc_bitcoin.cpp \ qt/moc_editaddressdialog.cpp \ qt/moc_importprivatekeydialog.cpp \ qt/moc_editconfigdialog.cpp \ @@ -311,6 +312,7 @@ RES_ICONS = \ if ENABLE_WALLET BITCOIN_QT_CPP = \ qt/bitcoingui.cpp \ + qt/bitcoin.cpp \ qt/transactiontablemodel.cpp \ qt/addresstablemodel.cpp \ qt/bantablemodel.cpp \

4p~Bvo3)4qY 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 diff --git a/src/qt/locale/bitcoin_sq.qm b/src/qt/locale/bitcoin_sq.qm deleted file mode 100644 index dba40fad2ab505d4bf1e1f3a39e0be7caee4f35d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12051 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 XSON>puvj7`Lut;AYk`=HDk}a9jQZ3) diff --git a/src/qt/locale/bitcoin_sr.qm b/src/qt/locale/bitcoin_sr.qm deleted file mode 100644 index 65883658faadabbaf20af41a5ff1f34b3a1b5db9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18719 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 diff --git a/src/qt/locale/bitcoin_sv.qm b/src/qt/locale/bitcoin_sv.qm deleted file mode 100644 index f0cdd7a674257ceff43f09b1dd56d4311debe1b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85134 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 diff --git a/src/qt/locale/bitcoin_tr.qm b/src/qt/locale/bitcoin_tr.qm deleted file mode 100644 index d9b804def479313055c2a99864f1bdcaf00f5eaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 89034 zcmdqK2YejWwFi9H>cz4F(;UYP2FtRs(x#w>9(BN_R{_c%8eCfn_AAkB={`32rj5+c+W6TO;UO!<>{Wp#I_36em++oc9 z&o`!Nk1;(N{k;8M_{8_WD;jgkQ;f;I(3rEA8uRmhHT2fB&j}-h8*IzyBr1Ja>nftxf#=Pkv(|PsNG4B~>$w%vrX??R<^3{dLZ2h!Z@*B`& z>z~ajr~cEJ(Lr;{(8r9q{=MduH)DR+f7f*H{-`mV-*1*54O;!zy=LRZ^No4-gXXLs zU>qm@+4OuK?SJwkX8RA&?(Ui9>~)VAbH^V2eE%cnYz))f@f`iUbE(o?|~gJ$Oko@dM}=a_v5?>6S>bM$j_nF-DZZPKCA2e4CpKemiPcuc1Ui}?HT6!mw(onJ%`LozkHQ3U--Ux#YZj#Z*-Wq{A068oz`LA zwGDiB{=dxa1-$pnf0(;o`F70r73M=c|a zhy3v@o{ZFdlf(~OobWiHoV?Ks{-kLh$ z){Q2$`3f7}5Emx)%edV9V{O38THJ^RNq|W+C>a-c}2H$=m z^_1&QHm2ja)W$))_xZb0J$E)3)7P2Gya#mp?Dkagb61&E>e;D@lYeGXW*~L&!}E^7-0TT=gVJm$51M(UFp?3>wNOMT`(%y;v@QlC2p^SSZP)VIF>pfTs3pZe*8uQRC= z-jMp!HTe71C(TGb_l4lMn`Wf$*?PBeSXHq;?>6Nx_!pB zgP$>G$uDN~uX%?tFWoaEzZ&bgt$xPTFJ5F)GoCf$8DB4fUl-1J&a3g<{SVK0!G7%P zjrZ@7}k@m{ot%&zrt9B_vCcl_SCJ$d~ZYDu0hOi?SItm?Ks(_RzI`u;@|w!n5TWAZuBb; z8guthUEx1KpZ7gfH-07d$(_S>hdvMaaQjhpSAKQ3F>^m!ch$;4e9o%7YJJwEmi?mc z#jm{=a_Jd$FFn53nC9Jeum5znF@sO3yXhq*lUnlex_2JB(WJI7sC)08pFtj8Qupbf zU17|(KBb>OD%Rb*AP?DiaoxSIdA>2<{O`IiZdzkfZQrT8{{y$0RP%i$K3e%eTV{X0{}{A6MM zv9HFu*56%!;wH3z*L&(0H$2anqi(NX@@n+kc}e|-o1YB%e0lxm*LE25ns3zaDq;Vw zx~G2d>{l7{hL_fl_$--H`PUos z{eLvfx(>fDx~buaEAjka-r8{FKVAhsd}G5ge>~cled`-e*b4q?{Z4~7=dUKUw4veT z6JLjQoz<}D#eXyA+J_pJWw9gJdFRmTO0PbK!^VFM-2yC!Iuwv z4F~t%0DgIO!-f+#XYmNEM4;ya&!VTDOPinYj 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 diff --git a/src/qt/locale/bitcoin_ur_PK.qm b/src/qt/locale/bitcoin_ur_PK.qm deleted file mode 100644 index 31cf0a93f742df94eecca8e7684ea5200e78e551..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3070 zcmb7GO=uid9DiwM-%hq^K57#Rij38CHzD06O+}0f?q)WoG$}Q1ETk7-c3-k%CNs;- zq?-j@5Hv(;1rI$4y+kN9c<>~Z;8#QsO1$*sMLZO}dXR!1M1ODIX0lCZr^#XFKOgV+ z|Ns7<@4fg%>Eus;-n{YiQ%`*J#>Q8_<_KxKM9AbYA@QR`xqXWeWm(GD1u5yEl<_x7 z>|0I<{Y1)+D+623xud!AzGWK{w{v~C6EVi1s4g6cN)!7?Z{}LS@ zfIL#B)$1zw|49G-eFg8|#|P^FK<~d&wtpw3vJrn(#s9Wj@lQXv2bq;pp;E@Sq@=&7 zsp$lG+*7C5K7_qv9X~Ao2fvw=YWC=R*L3(>?R@2rcGw}E^$`VjmF|!3KMlX`7$A3D z{5eG@=nhR1jV2-2=?LzlcuV1XlAgxf7KlSNt`p-9XCBv>X7Q@VN+pN8ZX7?lv+_A- z+e??&B5xC#=k{roR&;1gQ5_cYLO0|PY>MYRo;UG4LGR+JPDgNGZ>-&3%=b29HzE$&bZQ#Cs2 z=Vg=L4S09yyy(;_o>pb1$-PJ$&xE*;fu(e)13h`mwb+} zC85V{a;_7xMxP+9qhu_wtLB)=tRf#1wnK3d{&g1|X1T2B8MdW!x9GP~q<5i+E|MY_ ziAFNGvScve7E4(f<`12|CPRlBJQ2VMzamhP-bLVgFr6k*-zoYvvM@}OftPV4%frwX z35ZajV)lrRs|P@(P^Lj8?PI@DknLrGY?aH72TdS<>t|pg-Z z1~3%SYL^II+z)rx5M$jR(|HW49kG=LK}$?A*VC5K`enc3!(3AR9p$s8Jy4wy8%a8y zZizWqenTnuAlTxp5kj_5Hrz*$?P{R6v3CtMIojc4tDG;j!V&jC1q|_v}GI_aY7V9dr;pxz8q<5`yZXOmx}-Z diff --git a/src/qt/locale/bitcoin_vi.qm b/src/qt/locale/bitcoin_vi.qm deleted file mode 100644 index 8cb33c4496bad17a2c28f7d78069b228fbc69932..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1847 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 dBnPAkNCGIaq Date: Sat, 14 Nov 2020 12:51:01 +0200 Subject: [PATCH 08/35] fixes. wip on including all required deps in MakeFile.am --- build-aux/config.guess | 48 +- build-aux/config.sub | 584 ++++++++---------- configure.ac | 179 ++---- share/genbuild.sh | 0 src/MakeFile.am | 90 +-- src/alert.cpp | 1 + src/bitcoind.cpp | 1 + src/clientversion.cpp | 103 +++ src/clientversion.h | 68 +- .../.deps/libbitcoin_common_a-glibc_compat.Po | 1 - .../.deps/libbitcoin_common_a-glibc_sanity.Po | 1 - .../libbitcoin_common_a-glibcxx_compat.Po | 1 - .../libbitcoin_common_a-glibcxx_sanity.Po | 1 - .../.deps/libbitcoin_util_a-glibc_compat.Po | 1 - .../.deps/libbitcoin_util_a-glibc_sanity.Po | 1 - .../.deps/libbitcoin_util_a-glibcxx_compat.Po | 1 - .../.deps/libbitcoin_util_a-glibcxx_sanity.Po | 1 - src/compat/assumptions.h | 66 ++ src/compat/byteswap.h | 59 ++ src/compat/cpuid.h | 24 + src/compat/endian.h | 241 ++++++++ src/compat/glibc_compat.cpp | 63 ++ src/compat/glibc_sanity.cpp | 45 ++ src/compat/glibcxx_sanity.cpp | 61 ++ src/compat/sanity.h | 11 + src/compat/stdin.cpp | 72 +++ src/compat/stdin.h | 18 + src/compat/strnlen.cpp | 18 + src/config/bitcoin-config.h | 4 + src/config/bitcoin-config.h.in | 4 + src/config/dash-config.h.in | 373 ----------- src/config/ohmcoin-config.h.in | 361 ----------- src/config/stamp-h1 | 1 - src/crypto/common/common.h | 2 +- src/db.h | 1 + src/init.cpp | 3 +- src/main.h | 4 +- src/net.cpp | 1 + src/qt/addressbookpage.cpp | 2 +- src/qt/notificator.h | 2 +- src/qt/optionsdialog.cpp | 2 +- src/qt/optionsmodel.cpp | 2 +- src/rpcdump.cpp | 2 +- src/rpcmisc.cpp | 2 + src/rpcnet.cpp | 2 +- src/rpcprotocol.cpp | 1 + src/txmempool.cpp | 1 + src/util.cpp | 27 +- src/util.h | 6 +- src/version.h | 25 +- 50 files changed, 1250 insertions(+), 1338 deletions(-) mode change 100644 => 100755 share/genbuild.sh create mode 100644 src/clientversion.cpp delete mode 100644 src/compat/.deps/libbitcoin_common_a-glibc_compat.Po delete mode 100644 src/compat/.deps/libbitcoin_common_a-glibc_sanity.Po delete mode 100644 src/compat/.deps/libbitcoin_common_a-glibcxx_compat.Po delete mode 100644 src/compat/.deps/libbitcoin_common_a-glibcxx_sanity.Po delete mode 100644 src/compat/.deps/libbitcoin_util_a-glibc_compat.Po delete mode 100644 src/compat/.deps/libbitcoin_util_a-glibc_sanity.Po delete mode 100644 src/compat/.deps/libbitcoin_util_a-glibcxx_compat.Po delete mode 100644 src/compat/.deps/libbitcoin_util_a-glibcxx_sanity.Po create mode 100644 src/compat/assumptions.h create mode 100644 src/compat/byteswap.h create mode 100644 src/compat/cpuid.h create mode 100644 src/compat/endian.h create mode 100644 src/compat/glibc_compat.cpp create mode 100644 src/compat/glibc_sanity.cpp create mode 100644 src/compat/glibcxx_sanity.cpp create mode 100644 src/compat/sanity.h create mode 100644 src/compat/stdin.cpp create mode 100644 src/compat/stdin.h create mode 100644 src/compat/strnlen.cpp delete mode 100644 src/config/dash-config.h.in delete mode 100644 src/config/ohmcoin-config.h.in delete mode 100644 src/config/stamp-h1 diff --git a/build-aux/config.guess b/build-aux/config.guess index 9aff91cf..45001cfe 100755 --- a/build-aux/config.guess +++ b/build-aux/config.guess @@ -2,7 +2,7 @@ # Attempt to guess a canonical system name. # Copyright 1992-2020 Free Software Foundation, Inc. -timestamp='2020-08-17' +timestamp='2020-01-01' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -404,7 +404,7 @@ case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. - if test "$CC_FOR_BUILD" != no_compiler_found; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null @@ -544,10 +544,10 @@ EOF AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` - if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 + if [ "$UNAME_PROCESSOR" = mc88100 ] || [ "$UNAME_PROCESSOR" = mc88110 ] then - if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ - test "$TARGET_BINARY_INTERFACE"x = x + if [ "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx ] || \ + [ "$TARGET_BINARY_INTERFACE"x = x ] then echo m88k-dg-dgux"$UNAME_RELEASE" else @@ -580,7 +580,7 @@ EOF echo i386-ibm-aix exit ;; ia64:AIX:*:*) - if test -x /usr/bin/oslevel ; then + if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" @@ -620,7 +620,7 @@ EOF else IBM_ARCH=powerpc fi - if test -x /usr/bin/lslpp ; then + if [ -x /usr/bin/lslpp ] ; then IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` else @@ -655,7 +655,7 @@ EOF 9000/31?) HP_ARCH=m68000 ;; 9000/[34]??) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) - if test -x /usr/bin/getconf; then + if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "$sc_cpu_version" in @@ -669,7 +669,7 @@ EOF esac ;; esac fi - if test "$HP_ARCH" = ""; then + if [ "$HP_ARCH" = "" ]; then set_cc_for_build sed 's/^ //' << EOF > "$dummy.c" @@ -708,7 +708,7 @@ EOF test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac - if test "$HP_ARCH" = hppa2.0w + if [ "$HP_ARCH" = hppa2.0w ] then set_cc_for_build @@ -782,7 +782,7 @@ EOF echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) - if test -x /usr/sbin/sysversion ; then + if [ -x /usr/sbin/sysversion ] ; then echo "$UNAME_MACHINE"-unknown-osf1mk else echo "$UNAME_MACHINE"-unknown-osf1 @@ -1095,17 +1095,7 @@ EOF echo "$UNAME_MACHINE"-dec-linux-"$LIBC" exit ;; x86_64:Linux:*:*) - set_cc_for_build - LIBCABI=$LIBC - if test "$CC_FOR_BUILD" != no_compiler_found; then - if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ - (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ - grep IS_X32 >/dev/null - then - LIBCABI="$LIBC"x32 - fi - fi - echo "$UNAME_MACHINE"-pc-linux-"$LIBCABI" + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" exit ;; xtensa*:Linux:*:*) echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" @@ -1294,7 +1284,7 @@ EOF echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) - if test -d /usr/nec; then + if [ -d /usr/nec ]; then echo mips-nec-sysv"$UNAME_RELEASE" else echo mips-unknown-sysv"$UNAME_RELEASE" @@ -1342,9 +1332,6 @@ EOF *:Rhapsody:*:*) echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" exit ;; - arm64:Darwin:*:*) - echo aarch64-apple-darwin"$UNAME_RELEASE" - exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` case $UNAME_PROCESSOR in @@ -1359,7 +1346,7 @@ EOF else set_cc_for_build fi - if test "$CC_FOR_BUILD" != no_compiler_found; then + if [ "$CC_FOR_BUILD" != no_compiler_found ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null @@ -1642,12 +1629,6 @@ copies of config.guess and config.sub with the latest versions from: https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess and https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub -EOF - -year=`echo $timestamp | sed 's,-.*,,'` -# shellcheck disable=SC2003 -if test "`expr "\`date +%Y\`" - "$year"`" -lt 3 ; then - cat >&2 <&2 + exit 1 ;; esac - else # Here we handle the default operating systems that come with various machines. @@ -1499,7 +1528,6 @@ else # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. -kernel= case $cpu-$vendor in score-*) os=elf @@ -1511,8 +1539,7 @@ case $cpu-$vendor in os=riscix1.2 ;; arm*-rebel) - kernel=linux - os=gnu + os=linux ;; arm*-semi) os=aout @@ -1678,169 +1705,84 @@ case $cpu-$vendor in os=none ;; esac - fi -# Now, validate our (potentially fixed-up) OS. -case $os in - # Sometimes we do "kernel-abi", so those need to count as OSes. - musl* | newlib* | uclibc*) - ;; - # Likewise for "kernel-libc" - eabi | eabihf | gnueabi | gnueabihf) - ;; - # Now accept the basic system types. - # The portable systems comes first. - # Each alternative MUST end in a * to match a version number. - gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \ - | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \ - | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \ - | sym* | plan9* | psp* | sim* | xray* | os68k* | v88r* \ - | hiux* | abug | nacl* | netware* | windows* \ - | os9* | macos* | osx* | ios* \ - | mpw* | magic* | mmixware* | mon960* | lnews* \ - | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \ - | aos* | aros* | cloudabi* | sortix* | twizzler* \ - | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \ - | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \ - | mirbsd* | netbsd* | dicos* | openedition* | ose* \ - | bitrig* | openbsd* | solidbsd* | libertybsd* | os108* \ - | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \ - | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \ - | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \ - | udi* | lites* | ieee* | go32* | aux* | hcos* \ - | chorusrdb* | cegcc* | glidix* \ - | cygwin* | msys* | pe* | moss* | proelf* | rtems* \ - | midipix* | mingw32* | mingw64* | mint* \ - | uxpv* | beos* | mpeix* | udk* | moxiebox* \ - | interix* | uwin* | mks* | rhapsody* | darwin* \ - | openstep* | oskit* | conix* | pw32* | nonstopux* \ - | storm-chaos* | tops10* | tenex* | tops20* | its* \ - | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \ - | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \ - | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \ - | skyos* | haiku* | rdos* | toppers* | drops* | es* \ - | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \ - | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \ - | nsk* | powerunix* | genode* | zvmoe* ) - ;; - # This one is extra strict with allowed versions - sco3.2v2 | sco3.2v[4-9]* | sco5v6*) - # Don't forget version if it is 3.2v4 or newer. - ;; - none) - ;; - *) - echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2 - exit 1 - ;; -esac - -# As a final step for OS-related things, validate the OS-kernel combination -# (given a valid OS), if there is a kernel. -case $kernel-$os in - linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* | linux-musl* | linux-uclibc* ) - ;; - -dietlibc* | -newlib* | -musl* | -uclibc* ) - # These are just libc implementations, not actual OSes, and thus - # require a kernel. - echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 - exit 1 - ;; - kfreebsd*-gnu* | kopensolaris*-gnu*) - ;; - nto-qnx*) - ;; - *-eabi* | *-gnueabi*) - ;; - -*) - # Blank kernel with real OS is always fine. - ;; - *-*) - echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 - exit 1 - ;; -esac - # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. case $vendor in unknown) - case $cpu-$os in - *-riscix*) + case $os in + riscix*) vendor=acorn ;; - *-sunos*) + sunos*) vendor=sun ;; - *-cnk* | *-aix*) + cnk*|-aix*) vendor=ibm ;; - *-beos*) + beos*) vendor=be ;; - *-hpux*) + hpux*) vendor=hp ;; - *-mpeix*) + mpeix*) vendor=hp ;; - *-hiux*) + hiux*) vendor=hitachi ;; - *-unos*) + unos*) vendor=crds ;; - *-dgux*) + dgux*) vendor=dg ;; - *-luna*) + luna*) vendor=omron ;; - *-genix*) + genix*) vendor=ns ;; - *-clix*) + clix*) vendor=intergraph ;; - *-mvs* | *-opened*) - vendor=ibm - ;; - *-os400*) + mvs* | opened*) vendor=ibm ;; - s390-* | s390x-*) + os400*) vendor=ibm ;; - *-ptx*) + ptx*) vendor=sequent ;; - *-tpf*) + tpf*) vendor=ibm ;; - *-vxsim* | *-vxworks* | *-windiss*) + vxsim* | vxworks* | windiss*) vendor=wrs ;; - *-aux*) + aux*) vendor=apple ;; - *-hms*) + hms*) vendor=hitachi ;; - *-mpw* | *-macos*) + mpw* | macos*) vendor=apple ;; - *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) + *mint | mint[0-9]* | *MiNT | MiNT[0-9]*) vendor=atari ;; - *-vos*) + vos*) vendor=stratus ;; esac ;; esac -echo "$cpu-$vendor-${kernel:+$kernel-}$os" +echo "$cpu-$vendor-$os" exit # Local variables: diff --git a/configure.ac b/configure.ac index 1c445017..b7e5dca7 100644 --- a/configure.ac +++ b/configure.ac @@ -14,42 +14,14 @@ AC_CONFIG_MACRO_DIR([build-aux/m4]) AC_CANONICAL_HOST -dnl By default, libtool for mingw refuses to link static libs into a dll for -dnl fear of mixing pic/non-pic objects, and import/export complications. Since -dnl we have those under control, re-enable that functionality. - -case $host in - *mingw*) - lt_cv_deplibs_check_method="pass_all" - ;; -esac - -LT_INIT([pic-only]) - AH_TOP([#ifndef BITCOIN_CONFIG_H]) AH_TOP([#define BITCOIN_CONFIG_H]) AH_BOTTOM([#endif //BITCOIN_CONFIG_H]) -# This m4 will only be used if a system copy cannot be found. This is helpful -# on systems where autotools are installed but the pkg-config macros are not in -# a default location. It is currently used for building on OSX where autotools -# are preinstalled but pkg-config comes from macports or homebrew. It should -# probably be removed when building on <= 10.6 is no longer supported. -m4_include([pkg.m4]) - dnl faketime breaks configure and is only needed for make. Disable it here. unset FAKETIME -if test "x${CXXFLAGS+set}" = "xset"; then - CXXFLAGS_overridden=yes -else - CXXFLAGS_overridden=no -fi - -dnl ============================================================== -dnl Setup for automake -dnl ============================================================== - +dnl Automake init set-up and checks AM_INIT_AUTOMAKE([no-define subdir-objects foreign]) dnl faketime messes with timestamps and causes configure to be re-run. @@ -59,17 +31,27 @@ AM_MAINTAINER_MODE([enable]) dnl make the compilation flags quiet unless V=1 is used m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) -dnl Checks for programs. +dnl Compiler checks (here before libtool). +if test "x${CXXFLAGS+set}" = "xset"; then + CXXFLAGS_overridden=yes +else + CXXFLAGS_overridden=no +fi AC_PROG_CXX -AC_PROG_CC -AC_PROG_CPP -AC_PROG_CXXCPP -AC_PROG_INSTALL -AC_PROG_OBJC -AC_PROG_LN_S m4_ifdef([AC_PROG_OBJCXX],[AC_PROG_OBJCXX]) -AC_PROG_MKDIR_P -AC_PROG_SED + +dnl By default, libtool for mingw refuses to link static libs into a dll for +dnl fear of mixing pic/non-pic objects, and import/export complications. Since +dnl we have those under control, re-enable that functionality. +case $host in + *mingw*) + lt_cv_deplibs_check_method="pass_all" + ;; +esac +dnl Libtool init checks. +LT_INIT([pic-only]) + +dnl Check/return PATH for base programs. AC_PATH_TOOL(AR, ar) AC_PATH_TOOL(RANLIB, ranlib) AC_PATH_TOOL(STRIP, strip) @@ -81,6 +63,15 @@ AC_PATH_PROG([GIT], [git]) AC_PATH_PROG(CCACHE,ccache) AC_PATH_PROG(XGETTEXT,xgettext) AC_PATH_PROG(HEXDUMP,hexdump) + +# This m4 will only be used if a system copy cannot be found. This is helpful +# on systems where autotools are installed but the pkg-config macros are not in +# a default location. It is currently used for building on OSX where autotools +# are preinstalled but pkg-config comes from macports or homebrew. It should +# probably be removed when building on <= 10.6 is no longer supported. +m4_include([pkg.m4]) + +dnl pkg-config check. PKG_PROG_PKG_CONFIG # Enable wallet @@ -180,24 +171,6 @@ if test "x$CXXFLAGS_overridden" = "xno"; then fi CPPFLAGS="$CPPFLAGS -DBOOST_SPIRIT_THREADSAFE -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS" -AC_ARG_WITH([utils], - [AS_HELP_STRING([--with-utils], - [build bitcoin-cli bitcoin-tx (default=yes)])], - [build_bitcoin_utils=$withval], - [build_bitcoin_utils=yes]) - -AC_ARG_WITH([libs], - [AS_HELP_STRING([--with-libs], - [build libraries (default=yes)])], - [build_bitcoin_libs=$withval], - [build_bitcoin_libs=yes]) - -AC_ARG_WITH([daemon], - [AS_HELP_STRING([--with-daemon], - [build bitcoind daemon (default=yes)])], - [build_bitcoind=$withval], - [build_bitcoind=yes]) - AC_LANG_PUSH([C++]) use_pkgconfig=yes @@ -271,8 +244,12 @@ case $host in AC_CHECK_PROG([PORT],port, port) if test x$PORT = xport; then dnl add default macports paths - CPPFLAGS="$CPPFLAGS -isystem /opt/local/include -I/opt/local/include/db48" - LIBS="$LIBS -L/opt/local/lib -L/opt/local/lib/db48" + CPPFLAGS="$CPPFLAGS -isystem /opt/local/include" + LIBS="$LIBS -L/opt/local/lib" + if test -d /opt/local/include/db48; then + CPPFLAGS="$CPPFLAGS -I/opt/local/include/db48" + LIBS="$LIBS -L/opt/local/lib/db48" + fi fi AC_CHECK_PROG([BREW],brew, brew) @@ -288,6 +265,7 @@ case $host in qt5_prefix=`$BREW --prefix qt5 2>/dev/null` if test x$openssl_prefix != x; then PKG_CONFIG_PATH="$openssl_prefix/lib/pkgconfig:$PKG_CONFIG_PATH" + export PKG_CONFIG_PATH fi if test x$bdb_prefix != x; then CPPFLAGS="$CPPFLAGS -I$bdb_prefix/include" @@ -295,6 +273,7 @@ case $host in fi if test x$qt5_prefix != x; then PKG_CONFIG_PATH="$qt5_prefix/lib/pkgconfig:$PKG_CONFIG_PATH" + export PKG_CONFIG_PATH fi fi else @@ -452,6 +431,8 @@ AC_CHECK_HEADERS([endian.h stdio.h stdlib.h unistd.h strings.h sys/types.h sys/s AC_SEARCH_LIBS([getaddrinfo_a], [anl], [AC_DEFINE(HAVE_GETADDRINFO_A, 1, [Define this symbol if you have getaddrinfo_a])]) AC_SEARCH_LIBS([inet_pton], [nsl resolv], [AC_DEFINE(HAVE_INET_PTON, 1, [Define this symbol if you have inet_pton])]) +AC_CHECK_DECLS([strnlen]) + AC_CHECK_DECLS([le32toh, le64toh, htole32, htole64, be32toh, be64toh, htobe32, htobe64],,, [#if HAVE_ENDIAN_H #include @@ -519,19 +500,6 @@ if test x$use_upnp != xno; then ) fi -BITCOIN_QT_INIT - -dnl sets $bitcoin_enable_qt, $bitcoin_enable_qt_test, $bitcoin_enable_qt_dbus -BITCOIN_QT_CONFIGURE([$use_pkgconfig], [qt4]) - -if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests = xnononono; then - use_boost=no -else - use_boost=yes -fi - -if test x$use_boost = xyes; then - dnl Check for boost libs AX_BOOST_BASE AX_BOOST_SYSTEM @@ -569,10 +537,6 @@ if test x$use_reduce_exports != xno; then CPPFLAGS="$TEMP_CPPFLAGS" fi -elif test x$use_reduce_exports = xauto; then - use_reduce_exports=yes -fi - if test x$use_reduce_exports != xno; then CXXFLAGS="$CXXFLAGS $RE_CXXFLAGS" AX_CHECK_LINK_FLAG([[-Wl,--exclude-libs,ALL]], [RELDFLAGS="-Wl,--exclude-libs,ALL"]) @@ -584,7 +548,6 @@ if test x$use_tests = xyes; then AC_MSG_ERROR(hexdump is required for tests) fi - if test x$use_boost = xyes; then AX_BOOST_UNIT_TEST_FRAMEWORK @@ -604,11 +567,8 @@ if test x$use_tests = xyes; then [AC_MSG_RESULT(no)]) LIBS="$TEMP_LIBS" CPPFLAGS="$TEMP_CPPFLAGS" - fi fi -if test x$use_boost = xyes; then - BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRAM_OPTIONS_LIB $BOOST_THREAD_LIB" dnl Boost >= 1.50 uses sleep_for rather than the now-deprecated sleep, however @@ -665,7 +625,25 @@ if test x$boost_sleep != xyes; then AC_MSG_ERROR(No working boost sleep implementation found.) fi -fi +AC_ARG_WITH([utils], + [AS_HELP_STRING([--with-utils], + [build bitcoin-cli bitcoin-tx (default=yes)])], + [build_bitcoin_utils=$withval], + [build_bitcoin_utils=yes]) + +AC_ARG_WITH([libs], + [AS_HELP_STRING([--with-libs], + [build libraries (default=yes)])], + [build_bitcoin_libs=$withval], + [build_bitcoin_libs=yes]) + +AC_ARG_WITH([daemon], + [AS_HELP_STRING([--with-daemon], + [build bitcoind daemon (default=yes)])], + [build_bitcoind=$withval], + [build_bitcoind=yes]) + +BITCOIN_QT_INIT if test x$use_pkgconfig = xyes; then @@ -699,14 +677,6 @@ else fi fi -CFLAGS_TEMP="$CFLAGS" -LIBS_TEMP="$LIBS" -CFLAGS="$CFLAGS $SSL_CFLAGS $CRYPTO_CFLAGS" -LIBS="$LIBS $SSL_LIBS $CRYPTO_LIBS" -AC_CHECK_HEADER([openssl/ec.h],, AC_MSG_ERROR(OpenSSL ec header missing),) -CFLAGS="$CFLAGS_TEMP" -LIBS="$LIBS_TEMP" - BITCOIN_QT_PATH_PROGS([PROTOC], [protoc],$protoc_bin_path) AC_MSG_CHECKING([whether to build bitcoind]) @@ -721,10 +691,12 @@ AC_MSG_CHECKING([whether to build libraries]) AM_CONDITIONAL([BUILD_BITCOIN_LIBS], [test x$build_bitcoin_libs = xyes]) if test x$build_bitcoin_libs = xyes; then AC_DEFINE(HAVE_CONSENSUS_LIB, 1, [Define this symbol if the consensus lib has been built]) - AC_CONFIG_FILES([libbitcoinconsensus.pc:libbitcoinconsensus.pc.in]) fi AC_MSG_RESULT($build_bitcoin_libs) +dnl sets $bitcoin_enable_qt, $bitcoin_enable_qt_test, $bitcoin_enable_qt_dbus +BITCOIN_QT_CONFIGURE([$use_pkgconfig], [qt4]) + AC_LANG_POP if test "x$use_ccache" != "xno"; then @@ -922,31 +894,4 @@ case $host in mv libtool-2 libtool chmod 755 libtool ;; -esac - -echo -echo "Options used to compile and link:" -echo " with wallet = $enable_wallet" -echo " with gui / qt = $bitcoin_enable_qt" -if test x$bitcoin_enable_qt != xno; then - echo " with qr = $use_qr" -fi -echo " with zmq = $use_zmq" -echo " with test = $use_tests" -dnl echo " with bench = $use_bench" -echo " with upnp = $use_upnp" -echo " debug enabled = $enable_debug" -echo " werror = $enable_werror" -echo -echo " target os = $TARGET_OS" -echo " build os = $BUILD_OS" -echo -echo " CC = $CC" -echo " CFLAGS = $CFLAGS" -echo " CPPFLAGS = $CPPFLAGS" -echo " CXX = $CXX" -echo " CXXFLAGS = $CXXFLAGS" -echo " LDFLAGS = $LDFLAGS" -echo " ARFLAGS = $ARFLAGS" -echo - +esac \ No newline at end of file diff --git a/share/genbuild.sh b/share/genbuild.sh old mode 100644 new mode 100755 diff --git a/src/MakeFile.am b/src/MakeFile.am index ea4fbf03..a2c0250c 100644 --- a/src/MakeFile.am +++ b/src/MakeFile.am @@ -13,7 +13,7 @@ $(LIBLEVELDB): $(LIBMEMENV) $(LIBLEVELDB) $(LIBMEMENV): @echo "Building LevelDB ..." && $(MAKE) -C $(@D) $(@F) CXX="$(CXX)" \ CC="$(CC)" PLATFORM=$(TARGET_OS) AR="$(AR)" $(LEVELDB_TARGET_FLAGS) \ - OPT="$(CXXFLAGS) $(CPPFLAGS)" + OPT="$(CXXFLAGS) $(CPPFLAGS)" endif BITCOIN_CONFIG_INCLUDES=-I$(builddir)/config @@ -69,48 +69,52 @@ endif .PHONY: FORCE # bitcoin core # BITCOIN_CORE_H = \ + activemasternode.h \ addrman.h \ alert.h \ allocators.h \ - #amount.h \ base58.h \ + bignum.h \ + blockparams.h \ + blocksizecalculator.h \ chain.h \ chainparams.h \ - chainparamsbase.h \ chainparamsseeds.h \ checkpoints.h \ - checkqueue.h \ clientversion.h \ coincontrol.h \ - coins.h \ compat.h \ - compressor.h \ - core/block.h \ - core/transaction.h \ - core_io.h \ crypter.h \ db.h \ - eccryptoverify.h \ ecwrapper.h \ + fork.h \ + genesis.h \ hash.h \ init.h \ + instantx.h \ + kernel.h \ key.h \ keystore.h \ - #leveldbwrapper.h \ limitedmap.h \ main.h \ + masternode-payments.h \ + masternode.h \ + masternodeconfig.h \ + masternodeman.h \ miner.h \ + mining.h \ + mnengine.h \ mruset.h \ - netbase.h \ net.h \ - noui.h \ - pow.h \ + netbase.h \ + pbkdf2.h \ protocol.h \ pubkey.h \ random.h \ rpcclient.h \ rpcprotocol.h \ rpcserver.h \ + rpcvelocity.h \ script/interpreter.h \ script.h \ script/sigcache.h \ @@ -118,25 +122,22 @@ BITCOIN_CORE_H = \ script/standard.h \ script/script_error.h \ serialize.h \ - streams.h \ + smessage.h \ + spork.h \ + stealth.h \ + support/cleanse.h \ sync.h \ threadsafety.h \ - timedata.h \ tinyformat.h \ txdb.h \ txmempool.h \ - ui_interface.h \ uint256.h \ - undo.h \ util.h \ - utilstrencodings.h \ - utilmoneystr.h \ - utiltime.h \ + velocity.h \ version.h \ wallet.h \ - wallet_ismine.h \ walletdb.h \ - #compat/sanity.h + webwalletconnector.h JSON_H = \ json/json_spirit.h \ @@ -192,28 +193,33 @@ libbitcoin_wallet_a_SOURCES = \ rpcdump.cpp \ rpcwallet.cpp \ wallet.cpp \ - wallet_ismine.cpp \ walletdb.cpp \ $(BITCOIN_CORE_H) # crypto primitives library crypto_libbitcoin_crypto_a_CPPFLAGS = $(BITCOIN_CONFIG_INCLUDES) crypto_libbitcoin_crypto_a_SOURCES = \ - crypto/sha1.cpp \ - crypto/sha2.cpp \ - crypto/ripemd160.cpp \ - crypto/common.h \ - crypto/sha2.h \ - crypto/sha1.h \ - crypto/ripemd160.h - -# univalue JSON library -#univalue_libbitcoin_univalue_a_SOURCES = \ -# univalue/univalue.cpp \ -# univalue/univalue_read.cpp \ -# univalue/univalue_write.cpp \ -# univalue/univalue_escapes.h \ -# univalue/univalue.h + crypto/bmw/bmw512.h \ + crypto/common/aes_helper.c \ + crypto/common/bmw.c \ + crypto/common/common.h \ + crypto/common/echo.c \ + crypto/common/hmac_sha256.cpp \ + crypto/common/hmac_sha256.h \ + crypto/common/hmac_sha512.cpp \ + crypto/common/hmac_sha512.h \ + crypto/common/ripemd160.cpp \ + crypto/common/ripemd160.h \ + crypto/common/sha1.cpp \ + crypto/common/sha1.h \ + crypto/common/sha256.cpp \ + crypto/common/sha256.h \ + crypto/common/sha512.cpp \ + crypto/common/sha512.h \ + crypto/common/sph_bmw.h \ + crypto/common/sph_echo.h \ + crypto/common/sph_types.h \ + crypto/echo/echo512.h # common: shared between bitcoind, and bitcoin-qt and non-server tools libbitcoin_common_a_CPPFLAGS = $(BITCOIN_INCLUDES) @@ -250,16 +256,12 @@ libbitcoin_util_a_CPPFLAGS = $(BITCOIN_INCLUDES) libbitcoin_util_a_SOURCES = \ compat/glibc_sanity.cpp \ compat/glibcxx_sanity.cpp \ - chainparamsbase.cpp \ + chainparams.cpp \ clientversion.cpp \ - random.cpp \ rpcprotocol.cpp \ sync.cpp \ - uint256.cpp \ util.cpp \ utilstrencodings.cpp \ - utilmoneystr.cpp \ - utiltime.cpp \ $(BITCOIN_CORE_H) if GLIBC_BACK_COMPAT diff --git a/src/alert.cpp b/src/alert.cpp index 44240b7b..c6fd900c 100644 --- a/src/alert.cpp +++ b/src/alert.cpp @@ -4,6 +4,7 @@ #include "alert.h" +#include "clientversion.h" #include "chainparams.h" #include "pubkey.h" #include "net.h" diff --git a/src/bitcoind.cpp b/src/bitcoind.cpp index 287f00ee..fa5ac905 100644 --- a/src/bitcoind.cpp +++ b/src/bitcoind.cpp @@ -3,6 +3,7 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#include "clientversion.h" #include "rpcserver.h" #include "rpcclient.h" #include "init.h" diff --git a/src/clientversion.cpp b/src/clientversion.cpp new file mode 100644 index 00000000..7c313d63 --- /dev/null +++ b/src/clientversion.cpp @@ -0,0 +1,103 @@ +// Copyright (c) 2012-2014 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "clientversion.h" + +#include "tinyformat.h" + +#include + +/** + * Name of client reported in the 'version' message. Report the same name + * for both bitcoind and bitcoin-core, to make it harder for attackers to + * target servers or GUI users specifically. + */ +const std::string CLIENT_NAME("Satoshi"); + +/** + * Client version number + */ +#define CLIENT_VERSION_SUFFIX "" + + +/** + * The following part of the code determines the CLIENT_BUILD variable. + * Several mechanisms are used for this: + * * first, if HAVE_BUILD_INFO is defined, include build.h, a file that is + * generated by the build environment, possibly containing the output + * of git-describe in a macro called BUILD_DESC + * * secondly, if this is an exported version of the code, GIT_ARCHIVE will + * be defined (automatically using the export-subst git attribute), and + * GIT_COMMIT will contain the commit id. + * * then, three options exist for determining CLIENT_BUILD: + * * if BUILD_DESC is defined, use that literally (output of git-describe) + * * if not, but GIT_COMMIT is defined, use v[maj].[min].[rev].[build]-g[commit] + * * otherwise, use v[maj].[min].[rev].[build]-unk + * finally CLIENT_VERSION_SUFFIX is added + */ + +//! First, include build.h if requested +#ifdef HAVE_BUILD_INFO +#include "build.h" +#endif + +//! git will put "#define GIT_ARCHIVE 1" on the next line inside archives. $Format:%n#define GIT_ARCHIVE 1$ +#ifdef GIT_ARCHIVE +#define GIT_COMMIT_ID "$Format:%h$" +#define GIT_COMMIT_DATE "$Format:%cD$" +#endif + +#define BUILD_DESC_WITH_SUFFIX(maj, min, rev, build, suffix) \ + "v" DO_STRINGIZE(maj) "." DO_STRINGIZE(min) "." DO_STRINGIZE(rev) "." DO_STRINGIZE(build) "-" DO_STRINGIZE(suffix) + +#define BUILD_DESC_FROM_COMMIT(maj, min, rev, build, commit) \ + "v" DO_STRINGIZE(maj) "." DO_STRINGIZE(min) "." DO_STRINGIZE(rev) "." DO_STRINGIZE(build) "-g" commit + +#define BUILD_DESC_FROM_UNKNOWN(maj, min, rev, build) \ + "v" DO_STRINGIZE(maj) "." DO_STRINGIZE(min) "." DO_STRINGIZE(rev) "." DO_STRINGIZE(build) "-unk" + +#ifndef BUILD_DESC +#ifdef BUILD_SUFFIX +#define BUILD_DESC BUILD_DESC_WITH_SUFFIX(CLIENT_VERSION_MAJOR, CLIENT_VERSION_MINOR, CLIENT_VERSION_REVISION, CLIENT_VERSION_BUILD, BUILD_SUFFIX) +#elif defined(GIT_COMMIT_ID) +#define BUILD_DESC BUILD_DESC_FROM_COMMIT(CLIENT_VERSION_MAJOR, CLIENT_VERSION_MINOR, CLIENT_VERSION_REVISION, CLIENT_VERSION_BUILD, GIT_COMMIT_ID) +#else +#define BUILD_DESC BUILD_DESC_FROM_UNKNOWN(CLIENT_VERSION_MAJOR, CLIENT_VERSION_MINOR, CLIENT_VERSION_REVISION, CLIENT_VERSION_BUILD) +#endif +#endif + +const std::string CLIENT_BUILD(BUILD_DESC CLIENT_VERSION_SUFFIX); + +static std::string FormatVersion(int nVersion) +{ + if (nVersion % 100 == 0) + return strprintf("%d.%d.%d", nVersion / 1000000, (nVersion / 10000) % 100, (nVersion / 100) % 100); + else + return strprintf("%d.%d.%d.%d", nVersion / 1000000, (nVersion / 10000) % 100, (nVersion / 100) % 100, nVersion % 100); +} + +std::string FormatFullVersion() +{ + return CLIENT_BUILD; +} + +/** + * Format the subversion field according to BIP 14 spec (https://github.com/bitcoin/bips/blob/master/bip-0014.mediawiki) + */ +std::string FormatSubVersion(const std::string& name, int nClientVersion, const std::vector& comments) +{ + std::ostringstream ss; + ss << "/"; + ss << name << ":" << FormatVersion(nClientVersion); + if (!comments.empty()) + { + std::vector::const_iterator it(comments.begin()); + ss << "(" << *it; + for(++it; it != comments.end(); ++it) + ss << "; " << *it; + ss << ")"; + } + ss << "/"; + return ss.str(); +} diff --git a/src/clientversion.h b/src/clientversion.h index 2cd13fb5..ac2bbbf7 100644 --- a/src/clientversion.h +++ b/src/clientversion.h @@ -1,31 +1,53 @@ -#ifndef CLIENTVERSION_H -#define CLIENTVERSION_H +// Copyright (c) 2009-2018 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_CLIENTVERSION_H +#define BITCOIN_CLIENTVERSION_H #if defined(HAVE_CONFIG_H) -#include "bitcoin-config.h" -#else -// -// client versioning and copyright year -// +#include +#endif //HAVE_CONFIG_H -// These need to be macros, as version.cpp's and bitcoin-qt.rc's voodoo requires it -#define CLIENT_VERSION_MAJOR 1 -#define CLIENT_VERSION_MINOR 0 -#define CLIENT_VERSION_REVISION 3 -#define CLIENT_VERSION_BUILD 4 +// Check that required client information is defined +#if !defined(CLIENT_VERSION_MAJOR) || !defined(CLIENT_VERSION_MINOR) || !defined(CLIENT_VERSION_REVISION) || !defined(CLIENT_VERSION_BUILD) || !defined(CLIENT_VERSION_IS_RELEASE) || !defined(COPYRIGHT_YEAR) +#error Client version information missing: version is not defined by bitcoin-config.h or in any other way +#endif -// Set to true for release, false for prerelease or test build -#define CLIENT_VERSION_IS_RELEASE true +/** + * Converts the parameter X to a string after macro replacement on X has been performed. + * Don't merge these into one macro! + */ +#define STRINGIZE(X) DO_STRINGIZE(X) +#define DO_STRINGIZE(X) #X -// Copyright year (2009-this) -// Todo: update this when changing our copyright comments in the source -#define COPYRIGHT_YEAR 2020 +//! Copyright string used in Windows .rc files +#define COPYRIGHT_STR "2009-" STRINGIZE(COPYRIGHT_YEAR) " " COPYRIGHT_HOLDERS_FINAL -#endif //HAVE_CONFIG_H +/** + * bitcoind-res.rc includes this file, but it cannot cope with real c++ code. + * WINDRES_PREPROC is defined to indicate that its pre-processor is running. + * Anything other than a define should be guarded below. + */ -// Converts the parameter X to a string after macro replacement on X has been performed. -// Don't merge these into one macro! -#define STRINGIZE(X) DO_STRINGIZE(X) -#define DO_STRINGIZE(X) #X +#if !defined(WINDRES_PREPROC) + +#include +#include + +static const int CLIENT_VERSION = + 1000000 * CLIENT_VERSION_MAJOR + + 10000 * CLIENT_VERSION_MINOR + + 100 * CLIENT_VERSION_REVISION + + 1 * CLIENT_VERSION_BUILD; + +extern const std::string CLIENT_NAME; +extern const std::string CLIENT_BUILD; + + +std::string FormatFullVersion(); +std::string FormatSubVersion(const std::string& name, int nClientVersion, const std::vector& comments); + +#endif // WINDRES_PREPROC -#endif // CLIENTVERSION_H \ No newline at end of file +#endif // BITCOIN_CLIENTVERSION_H diff --git a/src/compat/.deps/libbitcoin_common_a-glibc_compat.Po b/src/compat/.deps/libbitcoin_common_a-glibc_compat.Po deleted file mode 100644 index 9ce06a81..00000000 --- a/src/compat/.deps/libbitcoin_common_a-glibc_compat.Po +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/src/compat/.deps/libbitcoin_common_a-glibc_sanity.Po b/src/compat/.deps/libbitcoin_common_a-glibc_sanity.Po deleted file mode 100644 index 9ce06a81..00000000 --- a/src/compat/.deps/libbitcoin_common_a-glibc_sanity.Po +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/src/compat/.deps/libbitcoin_common_a-glibcxx_compat.Po b/src/compat/.deps/libbitcoin_common_a-glibcxx_compat.Po deleted file mode 100644 index 9ce06a81..00000000 --- a/src/compat/.deps/libbitcoin_common_a-glibcxx_compat.Po +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/src/compat/.deps/libbitcoin_common_a-glibcxx_sanity.Po b/src/compat/.deps/libbitcoin_common_a-glibcxx_sanity.Po deleted file mode 100644 index 9ce06a81..00000000 --- a/src/compat/.deps/libbitcoin_common_a-glibcxx_sanity.Po +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/src/compat/.deps/libbitcoin_util_a-glibc_compat.Po b/src/compat/.deps/libbitcoin_util_a-glibc_compat.Po deleted file mode 100644 index 9ce06a81..00000000 --- a/src/compat/.deps/libbitcoin_util_a-glibc_compat.Po +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/src/compat/.deps/libbitcoin_util_a-glibc_sanity.Po b/src/compat/.deps/libbitcoin_util_a-glibc_sanity.Po deleted file mode 100644 index 9ce06a81..00000000 --- a/src/compat/.deps/libbitcoin_util_a-glibc_sanity.Po +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/src/compat/.deps/libbitcoin_util_a-glibcxx_compat.Po b/src/compat/.deps/libbitcoin_util_a-glibcxx_compat.Po deleted file mode 100644 index 9ce06a81..00000000 --- a/src/compat/.deps/libbitcoin_util_a-glibcxx_compat.Po +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/src/compat/.deps/libbitcoin_util_a-glibcxx_sanity.Po b/src/compat/.deps/libbitcoin_util_a-glibcxx_sanity.Po deleted file mode 100644 index 9ce06a81..00000000 --- a/src/compat/.deps/libbitcoin_util_a-glibcxx_sanity.Po +++ /dev/null @@ -1 +0,0 @@ -# dummy diff --git a/src/compat/assumptions.h b/src/compat/assumptions.h new file mode 100644 index 00000000..4b0b224c --- /dev/null +++ b/src/compat/assumptions.h @@ -0,0 +1,66 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2019 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +// Compile-time verification of assumptions we make. + +#ifndef BITCOIN_COMPAT_ASSUMPTIONS_H +#define BITCOIN_COMPAT_ASSUMPTIONS_H + +#include + +// Assumption: We assume that the macro NDEBUG is not defined. +// Example(s): We use assert(...) extensively with the assumption of it never +// being a noop at runtime. +#if defined(NDEBUG) +# error "Bitcoin cannot be compiled without assertions." +#endif + +// Assumption: We assume a C++11 (ISO/IEC 14882:2011) compiler (minimum requirement). +// Example(s): We assume the presence of C++11 features everywhere :-) +// Note: MSVC does not report the expected __cplusplus value due to legacy +// reasons. +#if !defined(_MSC_VER) +// ISO Standard C++11 [cpp.predefined]p1: +// "The name __cplusplus is defined to the value 201103L when compiling a C++ +// translation unit." +static_assert(__cplusplus >= 201103L, "C++11 standard assumed"); +#endif + +// Assumption: We assume the floating-point types to fulfill the requirements of +// IEC 559 (IEEE 754) standard. +// Example(s): Floating-point division by zero in ConnectBlock, CreateTransaction +// and EstimateMedianVal. +static_assert(std::numeric_limits::is_iec559, "IEEE 754 float assumed"); +static_assert(std::numeric_limits::is_iec559, "IEEE 754 double assumed"); + +// Assumption: We assume eight bits per byte (obviously, but remember: don't +// trust -- verify!). +// Example(s): Everywhere :-) +static_assert(std::numeric_limits::digits == 8, "8-bit byte assumed"); + +// Assumption: We assume floating-point widths. +// Example(s): Type punning in serialization code (ser_{float,double}_to_uint{32,64}). +static_assert(sizeof(float) == 4, "32-bit float assumed"); +static_assert(sizeof(double) == 8, "64-bit double assumed"); + +// Assumption: We assume integer widths. +// Example(s): GetSizeOfCompactSize and WriteCompactSize in the serialization +// code. +static_assert(sizeof(short) == 2, "16-bit short assumed"); +static_assert(sizeof(int) == 4, "32-bit int assumed"); +static_assert(sizeof(unsigned) == 4, "32-bit unsigned assumed"); + +// Assumption: We assume size_t to be 32-bit or 64-bit. +// Example(s): size_t assumed to be at least 32-bit in ecdsa_signature_parse_der_lax(...). +// size_t assumed to be 32-bit or 64-bit in MallocUsage(...). +static_assert(sizeof(size_t) == 4 || sizeof(size_t) == 8, "size_t assumed to be 32-bit or 64-bit"); +static_assert(sizeof(size_t) == sizeof(void*), "Sizes of size_t and void* assumed to be equal"); + +// Some important things we are NOT assuming (non-exhaustive list): +// * We are NOT assuming a specific value for std::endian::native. +// * We are NOT assuming a specific value for std::locale("").name(). +// * We are NOT assuming a specific value for std::numeric_limits::is_signed. + +#endif // BITCOIN_COMPAT_ASSUMPTIONS_H diff --git a/src/compat/byteswap.h b/src/compat/byteswap.h new file mode 100644 index 00000000..27ef1a18 --- /dev/null +++ b/src/compat/byteswap.h @@ -0,0 +1,59 @@ +// Copyright (c) 2014-2019 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_COMPAT_BYTESWAP_H +#define BITCOIN_COMPAT_BYTESWAP_H + +#if defined(HAVE_CONFIG_H) +#include +#endif + +#include + +#if defined(HAVE_BYTESWAP_H) +#include +#endif + +#if defined(MAC_OSX) + +#include +#define bswap_16(x) OSSwapInt16(x) +#define bswap_32(x) OSSwapInt32(x) +#define bswap_64(x) OSSwapInt64(x) + +#else +// Non-MacOS / non-Darwin + +#if HAVE_DECL_BSWAP_16 == 0 +inline uint16_t bswap_16(uint16_t x) +{ + return (x >> 8) | (x << 8); +} +#endif // HAVE_DECL_BSWAP16 == 0 + +#if HAVE_DECL_BSWAP_32 == 0 +inline uint32_t bswap_32(uint32_t x) +{ + return (((x & 0xff000000U) >> 24) | ((x & 0x00ff0000U) >> 8) | + ((x & 0x0000ff00U) << 8) | ((x & 0x000000ffU) << 24)); +} +#endif // HAVE_DECL_BSWAP32 == 0 + +#if HAVE_DECL_BSWAP_64 == 0 +inline uint64_t bswap_64(uint64_t x) +{ + return (((x & 0xff00000000000000ull) >> 56) + | ((x & 0x00ff000000000000ull) >> 40) + | ((x & 0x0000ff0000000000ull) >> 24) + | ((x & 0x000000ff00000000ull) >> 8) + | ((x & 0x00000000ff000000ull) << 8) + | ((x & 0x0000000000ff0000ull) << 24) + | ((x & 0x000000000000ff00ull) << 40) + | ((x & 0x00000000000000ffull) << 56)); +} +#endif // HAVE_DECL_BSWAP64 == 0 + +#endif // defined(MAC_OSX) + +#endif // BITCOIN_COMPAT_BYTESWAP_H diff --git a/src/compat/cpuid.h b/src/compat/cpuid.h new file mode 100644 index 00000000..0877ad47 --- /dev/null +++ b/src/compat/cpuid.h @@ -0,0 +1,24 @@ +// Copyright (c) 2017-2019 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_COMPAT_CPUID_H +#define BITCOIN_COMPAT_CPUID_H + +#if defined(__x86_64__) || defined(__amd64__) || defined(__i386__) +#define HAVE_GETCPUID + +#include + +// We can't use cpuid.h's __get_cpuid as it does not support subleafs. +void static inline GetCPUID(uint32_t leaf, uint32_t subleaf, uint32_t& a, uint32_t& b, uint32_t& c, uint32_t& d) +{ +#ifdef __GNUC__ + __cpuid_count(leaf, subleaf, a, b, c, d); +#else + __asm__ ("cpuid" : "=a"(a), "=b"(b), "=c"(c), "=d"(d) : "0"(leaf), "2"(subleaf)); +#endif +} + +#endif // defined(__x86_64__) || defined(__amd64__) || defined(__i386__) +#endif // BITCOIN_COMPAT_CPUID_H diff --git a/src/compat/endian.h b/src/compat/endian.h new file mode 100644 index 00000000..c5cf7a46 --- /dev/null +++ b/src/compat/endian.h @@ -0,0 +1,241 @@ +// Copyright (c) 2014-2018 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_COMPAT_ENDIAN_H +#define BITCOIN_COMPAT_ENDIAN_H + +#if defined(HAVE_CONFIG_H) +#include +#endif + +#include + +#include + +#if defined(HAVE_ENDIAN_H) +#include +#elif defined(HAVE_SYS_ENDIAN_H) +#include +#endif + +#ifndef HAVE_CONFIG_H +// While not technically a supported configuration, defaulting to defining these +// DECLs when we were compiled without autotools makes it easier for other build +// systems to build things like libbitcoinconsensus for strange targets. +#ifdef htobe16 +#define HAVE_DECL_HTOBE16 1 +#endif +#ifdef htole16 +#define HAVE_DECL_HTOLE16 1 +#endif +#ifdef be16toh +#define HAVE_DECL_BE16TOH 1 +#endif +#ifdef le16toh +#define HAVE_DECL_LE16TOH 1 +#endif + +#ifdef htobe32 +#define HAVE_DECL_HTOBE32 1 +#endif +#ifdef htole32 +#define HAVE_DECL_HTOLE32 1 +#endif +#ifdef be32toh +#define HAVE_DECL_BE32TOH 1 +#endif +#ifdef le32toh +#define HAVE_DECL_LE32TOH 1 +#endif + +#ifdef htobe64 +#define HAVE_DECL_HTOBE64 1 +#endif +#ifdef htole64 +#define HAVE_DECL_HTOLE64 1 +#endif +#ifdef be64toh +#define HAVE_DECL_BE64TOH 1 +#endif +#ifdef le64toh +#define HAVE_DECL_LE64TOH 1 +#endif + +#endif // HAVE_CONFIG_H + +#if defined(WORDS_BIGENDIAN) + +#if HAVE_DECL_HTOBE16 == 0 +inline uint16_t htobe16(uint16_t host_16bits) +{ + return host_16bits; +} +#endif // HAVE_DECL_HTOBE16 + +#if HAVE_DECL_HTOLE16 == 0 +inline uint16_t htole16(uint16_t host_16bits) +{ + return bswap_16(host_16bits); +} +#endif // HAVE_DECL_HTOLE16 + +#if HAVE_DECL_BE16TOH == 0 +inline uint16_t be16toh(uint16_t big_endian_16bits) +{ + return big_endian_16bits; +} +#endif // HAVE_DECL_BE16TOH + +#if HAVE_DECL_LE16TOH == 0 +inline uint16_t le16toh(uint16_t little_endian_16bits) +{ + return bswap_16(little_endian_16bits); +} +#endif // HAVE_DECL_LE16TOH + +#if HAVE_DECL_HTOBE32 == 0 +inline uint32_t htobe32(uint32_t host_32bits) +{ + return host_32bits; +} +#endif // HAVE_DECL_HTOBE32 + +#if HAVE_DECL_HTOLE32 == 0 +inline uint32_t htole32(uint32_t host_32bits) +{ + return bswap_32(host_32bits); +} +#endif // HAVE_DECL_HTOLE32 + +#if HAVE_DECL_BE32TOH == 0 +inline uint32_t be32toh(uint32_t big_endian_32bits) +{ + return big_endian_32bits; +} +#endif // HAVE_DECL_BE32TOH + +#if HAVE_DECL_LE32TOH == 0 +inline uint32_t le32toh(uint32_t little_endian_32bits) +{ + return bswap_32(little_endian_32bits); +} +#endif // HAVE_DECL_LE32TOH + +#if HAVE_DECL_HTOBE64 == 0 +inline uint64_t htobe64(uint64_t host_64bits) +{ + return host_64bits; +} +#endif // HAVE_DECL_HTOBE64 + +#if HAVE_DECL_HTOLE64 == 0 +inline uint64_t htole64(uint64_t host_64bits) +{ + return bswap_64(host_64bits); +} +#endif // HAVE_DECL_HTOLE64 + +#if HAVE_DECL_BE64TOH == 0 +inline uint64_t be64toh(uint64_t big_endian_64bits) +{ + return big_endian_64bits; +} +#endif // HAVE_DECL_BE64TOH + +#if HAVE_DECL_LE64TOH == 0 +inline uint64_t le64toh(uint64_t little_endian_64bits) +{ + return bswap_64(little_endian_64bits); +} +#endif // HAVE_DECL_LE64TOH + +#else // WORDS_BIGENDIAN + +#if HAVE_DECL_HTOBE16 == 0 +inline uint16_t htobe16(uint16_t host_16bits) +{ + return bswap_16(host_16bits); +} +#endif // HAVE_DECL_HTOBE16 + +#if HAVE_DECL_HTOLE16 == 0 +inline uint16_t htole16(uint16_t host_16bits) +{ + return host_16bits; +} +#endif // HAVE_DECL_HTOLE16 + +#if HAVE_DECL_BE16TOH == 0 +inline uint16_t be16toh(uint16_t big_endian_16bits) +{ + return bswap_16(big_endian_16bits); +} +#endif // HAVE_DECL_BE16TOH + +#if HAVE_DECL_LE16TOH == 0 +inline uint16_t le16toh(uint16_t little_endian_16bits) +{ + return little_endian_16bits; +} +#endif // HAVE_DECL_LE16TOH + +#if HAVE_DECL_HTOBE32 == 0 +inline uint32_t htobe32(uint32_t host_32bits) +{ + return bswap_32(host_32bits); +} +#endif // HAVE_DECL_HTOBE32 + +#if HAVE_DECL_HTOLE32 == 0 +inline uint32_t htole32(uint32_t host_32bits) +{ + return host_32bits; +} +#endif // HAVE_DECL_HTOLE32 + +#if HAVE_DECL_BE32TOH == 0 +inline uint32_t be32toh(uint32_t big_endian_32bits) +{ + return bswap_32(big_endian_32bits); +} +#endif // HAVE_DECL_BE32TOH + +#if HAVE_DECL_LE32TOH == 0 +inline uint32_t le32toh(uint32_t little_endian_32bits) +{ + return little_endian_32bits; +} +#endif // HAVE_DECL_LE32TOH + +#if HAVE_DECL_HTOBE64 == 0 +inline uint64_t htobe64(uint64_t host_64bits) +{ + return bswap_64(host_64bits); +} +#endif // HAVE_DECL_HTOBE64 + +#if HAVE_DECL_HTOLE64 == 0 +inline uint64_t htole64(uint64_t host_64bits) +{ + return host_64bits; +} +#endif // HAVE_DECL_HTOLE64 + +#if HAVE_DECL_BE64TOH == 0 +inline uint64_t be64toh(uint64_t big_endian_64bits) +{ + return bswap_64(big_endian_64bits); +} +#endif // HAVE_DECL_BE64TOH + +#if HAVE_DECL_LE64TOH == 0 +inline uint64_t le64toh(uint64_t little_endian_64bits) +{ + return little_endian_64bits; +} +#endif // HAVE_DECL_LE64TOH + +#endif // WORDS_BIGENDIAN + +#endif // BITCOIN_COMPAT_ENDIAN_H diff --git a/src/compat/glibc_compat.cpp b/src/compat/glibc_compat.cpp new file mode 100644 index 00000000..d17de33e --- /dev/null +++ b/src/compat/glibc_compat.cpp @@ -0,0 +1,63 @@ +// Copyright (c) 2009-2018 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#if defined(HAVE_CONFIG_H) +#include +#endif + +#include +#include + +// Prior to GLIBC_2.14, memcpy was aliased to memmove. +extern "C" void* memmove(void* a, const void* b, size_t c); +extern "C" void* memcpy(void* a, const void* b, size_t c) +{ + return memmove(a, b, c); +} + +#if defined(__i386__) || defined(__arm__) + +extern "C" int64_t __udivmoddi4(uint64_t u, uint64_t v, uint64_t* rp); + +extern "C" int64_t __wrap___divmoddi4(int64_t u, int64_t v, int64_t* rp) +{ + int32_t c1 = 0, c2 = 0; + int64_t uu = u, vv = v; + int64_t w; + int64_t r; + + if (uu < 0) { + c1 = ~c1, c2 = ~c2, uu = -uu; + } + if (vv < 0) { + c1 = ~c1, vv = -vv; + } + + w = __udivmoddi4(uu, vv, (uint64_t*)&r); + if (c1) + w = -w; + if (c2) + r = -r; + + *rp = r; + return w; +} +#endif + +extern "C" float log2f_old(float x); +#ifdef __i386__ +__asm(".symver log2f_old,log2f@GLIBC_2.1"); +#elif defined(__amd64__) +__asm(".symver log2f_old,log2f@GLIBC_2.2.5"); +#elif defined(__arm__) +__asm(".symver log2f_old,log2f@GLIBC_2.4"); +#elif defined(__aarch64__) +__asm(".symver log2f_old,log2f@GLIBC_2.17"); +#elif defined(__riscv) +__asm(".symver log2f_old,log2f@GLIBC_2.27"); +#endif +extern "C" float __wrap_log2f(float x) +{ + return log2f_old(x); +} diff --git a/src/compat/glibc_sanity.cpp b/src/compat/glibc_sanity.cpp new file mode 100644 index 00000000..0367b9a5 --- /dev/null +++ b/src/compat/glibc_sanity.cpp @@ -0,0 +1,45 @@ +// Copyright (c) 2009-2019 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#if defined(HAVE_CONFIG_H) +#include +#endif + +#include + +extern "C" void* memcpy(void* a, const void* b, size_t c); +void* memcpy_int(void* a, const void* b, size_t c) +{ + return memcpy(a, b, c); +} + +namespace +{ +// trigger: Use the memcpy_int wrapper which calls our internal memcpy. +// A direct call to memcpy may be optimized away by the compiler. +// test: Fill an array with a sequence of integers. memcpy to a new empty array. +// Verify that the arrays are equal. Use an odd size to decrease the odds of +// the call being optimized away. +template +bool sanity_test_memcpy() +{ + unsigned int memcpy_test[T]; + unsigned int memcpy_verify[T] = {}; + for (unsigned int i = 0; i != T; ++i) + memcpy_test[i] = i; + + memcpy_int(memcpy_verify, memcpy_test, sizeof(memcpy_test)); + + for (unsigned int i = 0; i != T; ++i) { + if (memcpy_verify[i] != i) + return false; + } + return true; +} +} // namespace + +bool glibc_sanity_test() +{ + return sanity_test_memcpy<1025>(); +} diff --git a/src/compat/glibcxx_sanity.cpp b/src/compat/glibcxx_sanity.cpp new file mode 100644 index 00000000..e6e6208e --- /dev/null +++ b/src/compat/glibcxx_sanity.cpp @@ -0,0 +1,61 @@ +// Copyright (c) 2009-2018 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include +#include +#include + +namespace +{ +// trigger: use ctype::widen to trigger ctype::_M_widen_init(). +// test: convert a char from narrow to wide and back. Verify that the result +// matches the original. +bool sanity_test_widen(char testchar) +{ + const std::ctype& test(std::use_facet >(std::locale())); + return test.narrow(test.widen(testchar), 'b') == testchar; +} + +// trigger: use list::push_back and list::pop_back to trigger _M_hook and +// _M_unhook. +// test: Push a sequence of integers into a list. Pop them off and verify that +// they match the original sequence. +bool sanity_test_list(unsigned int size) +{ + std::list test; + for (unsigned int i = 0; i != size; ++i) + test.push_back(i + 1); + + if (test.size() != size) + return false; + + while (!test.empty()) { + if (test.back() != test.size()) + return false; + test.pop_back(); + } + return true; +} + +} // namespace + +// trigger: string::at(x) on an empty string to trigger __throw_out_of_range_fmt. +// test: force std::string to throw an out_of_range exception. Verify that +// it's caught correctly. +bool sanity_test_range_fmt() +{ + std::string test; + try { + test.at(1); + } catch (const std::out_of_range&) { + return true; + } catch (...) { + } + return false; +} + +bool glibcxx_sanity_test() +{ + return sanity_test_widen('a') && sanity_test_list(100) && sanity_test_range_fmt(); +} diff --git a/src/compat/sanity.h b/src/compat/sanity.h new file mode 100644 index 00000000..909c4f6d --- /dev/null +++ b/src/compat/sanity.h @@ -0,0 +1,11 @@ +// Copyright (c) 2009-2014 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_COMPAT_SANITY_H +#define BITCOIN_COMPAT_SANITY_H + +bool glibc_sanity_test(); +bool glibcxx_sanity_test(); + +#endif // BITCOIN_COMPAT_SANITY_H diff --git a/src/compat/stdin.cpp b/src/compat/stdin.cpp new file mode 100644 index 00000000..0fc4e0fc --- /dev/null +++ b/src/compat/stdin.cpp @@ -0,0 +1,72 @@ +// Copyright (c) 2018-2019 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#if defined(HAVE_CONFIG_H) +#include +#endif + +#include // for fileno(), stdin + +#ifdef WIN32 +#include // for SetStdinEcho() +#include // for isatty() +#else +#include // for SetStdinEcho() +#include // for SetStdinEcho(), isatty() +#include // for StdinReady() +#endif + +#include + +// https://stackoverflow.com/questions/1413445/reading-a-password-from-stdcin +void SetStdinEcho(bool enable) +{ +#ifdef WIN32 + HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE); + DWORD mode; + GetConsoleMode(hStdin, &mode); + if (!enable) { + mode &= ~ENABLE_ECHO_INPUT; + } else { + mode |= ENABLE_ECHO_INPUT; + } + SetConsoleMode(hStdin, mode); +#else + struct termios tty; + tcgetattr(STDIN_FILENO, &tty); + if (!enable) { + tty.c_lflag &= ~ECHO; + } else { + tty.c_lflag |= ECHO; + } + (void)tcsetattr(STDIN_FILENO, TCSANOW, &tty); +#endif +} + +bool StdinTerminal() +{ +#ifdef WIN32 + return _isatty(_fileno(stdin)); +#else + return isatty(fileno(stdin)); +#endif +} + +bool StdinReady() +{ + if (!StdinTerminal()) { + return true; + } +#ifdef WIN32 + return false; +#else + struct pollfd fds; + fds.fd = 0; /* this is STDIN */ + fds.events = POLLIN; + return poll(&fds, 1, 0) == 1; +#endif +} + +NoechoInst::NoechoInst() { SetStdinEcho(false); } +NoechoInst::~NoechoInst() { SetStdinEcho(true); } diff --git a/src/compat/stdin.h b/src/compat/stdin.h new file mode 100644 index 00000000..468fe4d6 --- /dev/null +++ b/src/compat/stdin.h @@ -0,0 +1,18 @@ +// Copyright (c) 2018 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#ifndef BITCOIN_COMPAT_STDIN_H +#define BITCOIN_COMPAT_STDIN_H + +struct NoechoInst { + NoechoInst(); + ~NoechoInst(); +}; + +#define NO_STDIN_ECHO() NoechoInst _no_echo + +bool StdinTerminal(); +bool StdinReady(); + +#endif // BITCOIN_COMPAT_STDIN_H diff --git a/src/compat/strnlen.cpp b/src/compat/strnlen.cpp new file mode 100644 index 00000000..93a034a6 --- /dev/null +++ b/src/compat/strnlen.cpp @@ -0,0 +1,18 @@ +// Copyright (c) 2009-2018 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#if defined(HAVE_CONFIG_H) +#include +#endif + +#include + +#if HAVE_DECL_STRNLEN == 0 +size_t strnlen( const char *start, size_t max_len) +{ + const char *end = (const char *)memchr(start, '\0', max_len); + + return end ? (size_t)(end - start) : max_len; +} +#endif // HAVE_DECL_STRNLEN diff --git a/src/config/bitcoin-config.h b/src/config/bitcoin-config.h index 8715e994..ba70d85d 100644 --- a/src/config/bitcoin-config.h +++ b/src/config/bitcoin-config.h @@ -92,6 +92,10 @@ don't. */ #define HAVE_DECL_STRERROR_R 1 +/* Define to 1 if you have the declaration of `strnlen', and to 0 if you + don't. */ +#define HAVE_DECL_STRNLEN 1 + /* Define to 1 if you have the header file. */ #define HAVE_DLFCN_H 1 diff --git a/src/config/bitcoin-config.h.in b/src/config/bitcoin-config.h.in index 9f66d3b7..600260e6 100644 --- a/src/config/bitcoin-config.h.in +++ b/src/config/bitcoin-config.h.in @@ -91,6 +91,10 @@ don't. */ #undef HAVE_DECL_STRERROR_R +/* Define to 1 if you have the declaration of `strnlen', and to 0 if you + don't. */ +#undef HAVE_DECL_STRNLEN + /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H diff --git a/src/config/dash-config.h.in b/src/config/dash-config.h.in deleted file mode 100644 index 3d627b3f..00000000 --- a/src/config/dash-config.h.in +++ /dev/null @@ -1,373 +0,0 @@ -/* src/config/dash-config.h.in. Generated from configure.ac by autoheader. */ - -#ifndef DASH_CONFIG_H - -#define DASH_CONFIG_H - -/* Define if building universal (internal helper macro) */ -#undef AC_APPLE_UNIVERSAL_BUILD - -/* Version Build */ -#undef CLIENT_VERSION_BUILD - -/* Version is release */ -#undef CLIENT_VERSION_IS_RELEASE - -/* Major version */ -#undef CLIENT_VERSION_MAJOR - -/* Minor version */ -#undef CLIENT_VERSION_MINOR - -/* Build revision */ -#undef CLIENT_VERSION_REVISION - -/* Version is release */ -#undef COPYRIGHT_YEAR - -/* Define to 1 to enable wallet functions */ -#undef ENABLE_WALLET - -/* Define to 1 to enable ZMQ functions */ -#undef ENABLE_ZMQ - -/* parameter and return value type for __fdelt_chk */ -#undef FDELT_TYPE - -/* define if the Boost library is available */ -#undef HAVE_BOOST - -/* define if the Boost::Chrono library is available */ -#undef HAVE_BOOST_CHRONO - -/* define if the Boost::Filesystem library is available */ -#undef HAVE_BOOST_FILESYSTEM - -/* define if the Boost::PROGRAM_OPTIONS library is available */ -#undef HAVE_BOOST_PROGRAM_OPTIONS - -/* define if the Boost::System library is available */ -#undef HAVE_BOOST_SYSTEM - -/* define if the Boost::Thread library is available */ -#undef HAVE_BOOST_THREAD - -/* define if the Boost::Unit_Test_Framework library is available */ -#undef HAVE_BOOST_UNIT_TEST_FRAMEWORK - -/* Define to 1 if you have the header file. */ -#undef HAVE_BYTESWAP_H - -/* Define this symbol if the consensus lib has been built */ -#undef HAVE_CONSENSUS_LIB - -/* define if the compiler supports basic C++11 syntax */ -#undef HAVE_CXX11 - -/* Define to 1 if you have the declaration of `be16toh', and to 0 if you - don't. */ -#undef HAVE_DECL_BE16TOH - -/* Define to 1 if you have the declaration of `be32toh', and to 0 if you - don't. */ -#undef HAVE_DECL_BE32TOH - -/* Define to 1 if you have the declaration of `be64toh', and to 0 if you - don't. */ -#undef HAVE_DECL_BE64TOH - -/* Define to 1 if you have the declaration of `bswap_16', and to 0 if you - don't. */ -#undef HAVE_DECL_BSWAP_16 - -/* Define to 1 if you have the declaration of `bswap_32', and to 0 if you - don't. */ -#undef HAVE_DECL_BSWAP_32 - -/* Define to 1 if you have the declaration of `bswap_64', and to 0 if you - don't. */ -#undef HAVE_DECL_BSWAP_64 - -/* Define to 1 if you have the declaration of `htobe16', and to 0 if you - don't. */ -#undef HAVE_DECL_HTOBE16 - -/* Define to 1 if you have the declaration of `htobe32', and to 0 if you - don't. */ -#undef HAVE_DECL_HTOBE32 - -/* Define to 1 if you have the declaration of `htobe64', and to 0 if you - don't. */ -#undef HAVE_DECL_HTOBE64 - -/* Define to 1 if you have the declaration of `htole16', and to 0 if you - don't. */ -#undef HAVE_DECL_HTOLE16 - -/* Define to 1 if you have the declaration of `htole32', and to 0 if you - don't. */ -#undef HAVE_DECL_HTOLE32 - -/* Define to 1 if you have the declaration of `htole64', and to 0 if you - don't. */ -#undef HAVE_DECL_HTOLE64 - -/* Define to 1 if you have the declaration of `le16toh', and to 0 if you - don't. */ -#undef HAVE_DECL_LE16TOH - -/* Define to 1 if you have the declaration of `le32toh', and to 0 if you - don't. */ -#undef HAVE_DECL_LE32TOH - -/* Define to 1 if you have the declaration of `le64toh', and to 0 if you - don't. */ -#undef HAVE_DECL_LE64TOH - -/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you - don't. */ -#undef HAVE_DECL_STRERROR_R - -/* Define to 1 if you have the declaration of `strnlen', and to 0 if you - don't. */ -#undef HAVE_DECL_STRNLEN - -/* Define to 1 if you have the header file. */ -#undef HAVE_DLFCN_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_ENDIAN_H - -/* Define this symbol if you have getaddrinfo_a */ -#undef HAVE_GETADDRINFO_A - -/* Define this symbol if you have inet_pton */ -#undef HAVE_INET_PTON - -/* Define to 1 if you have the header file. */ -#undef HAVE_INTTYPES_H - -/* Define to 1 if you have the `advapi32' library (-ladvapi32). */ -#undef HAVE_LIBADVAPI32 - -/* Define to 1 if you have the `comctl32' library (-lcomctl32). */ -#undef HAVE_LIBCOMCTL32 - -/* Define to 1 if you have the `comdlg32' library (-lcomdlg32). */ -#undef HAVE_LIBCOMDLG32 - -/* Define to 1 if you have the `crypt32' library (-lcrypt32). */ -#undef HAVE_LIBCRYPT32 - -/* Define to 1 if you have the `gdi32' library (-lgdi32). */ -#undef HAVE_LIBGDI32 - -/* Define to 1 if you have the `imm32' library (-limm32). */ -#undef HAVE_LIBIMM32 - -/* Define to 1 if you have the `iphlpapi' library (-liphlpapi). */ -#undef HAVE_LIBIPHLPAPI - -/* Define to 1 if you have the `jpeg ' library (-ljpeg ). */ -#undef HAVE_LIBJPEG_ - -/* Define to 1 if you have the `kernel32' library (-lkernel32). */ -#undef HAVE_LIBKERNEL32 - -/* Define to 1 if you have the `mingwthrd' library (-lmingwthrd). */ -#undef HAVE_LIBMINGWTHRD - -/* Define to 1 if you have the `mswsock' library (-lmswsock). */ -#undef HAVE_LIBMSWSOCK - -/* Define to 1 if you have the `ole32' library (-lole32). */ -#undef HAVE_LIBOLE32 - -/* Define to 1 if you have the `oleaut32' library (-loleaut32). */ -#undef HAVE_LIBOLEAUT32 - -/* Define to 1 if you have the `pcre16 ' library (-lpcre16 ). */ -#undef HAVE_LIBPCRE16_ - -/* Define to 1 if you have the `png ' library (-lpng ). */ -#undef HAVE_LIBPNG_ - -/* Define to 1 if you have the `rpcrt4' library (-lrpcrt4). */ -#undef HAVE_LIBRPCRT4 - -/* Define to 1 if you have the `rt' library (-lrt). */ -#undef HAVE_LIBRT - -/* Define to 1 if you have the `shell32' library (-lshell32). */ -#undef HAVE_LIBSHELL32 - -/* Define to 1 if you have the `shlwapi' library (-lshlwapi). */ -#undef HAVE_LIBSHLWAPI - -/* Define to 1 if you have the `ssp' library (-lssp). */ -#undef HAVE_LIBSSP - -/* Define to 1 if you have the `user32' library (-luser32). */ -#undef HAVE_LIBUSER32 - -/* Define to 1 if you have the `uuid' library (-luuid). */ -#undef HAVE_LIBUUID - -/* Define to 1 if you have the `winmm' library (-lwinmm). */ -#undef HAVE_LIBWINMM - -/* Define to 1 if you have the `winspool' library (-lwinspool). */ -#undef HAVE_LIBWINSPOOL - -/* Define to 1 if you have the `ws2_32' library (-lws2_32). */ -#undef HAVE_LIBWS2_32 - -/* Define to 1 if you have the `z ' library (-lz ). */ -#undef HAVE_LIBZ_ - -/* Define to 1 if you have the header file. */ -#undef HAVE_MEMORY_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_MINIUPNPC_MINIUPNPC_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_MINIUPNPC_MINIWGET_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_MINIUPNPC_UPNPCOMMANDS_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_MINIUPNPC_UPNPERRORS_H - -/* Define this symbol if you have MSG_NOSIGNAL */ -#undef HAVE_MSG_NOSIGNAL - -/* Define if you have POSIX threads libraries and header files. */ -#undef HAVE_PTHREAD - -/* Have PTHREAD_PRIO_INHERIT. */ -#undef HAVE_PTHREAD_PRIO_INHERIT - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDINT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDIO_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDLIB_H - -/* Define to 1 if you have the `strerror_r' function. */ -#undef HAVE_STRERROR_R - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRINGS_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRING_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_ENDIAN_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_PRCTL_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_SELECT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_STAT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_TYPES_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Define if the visibility attribute is supported. */ -#undef HAVE_VISIBILITY_ATTRIBUTE - -/* Define this symbol if boost sleep works */ -#undef HAVE_WORKING_BOOST_SLEEP - -/* Define this symbol if boost sleep_for works */ -#undef HAVE_WORKING_BOOST_SLEEP_FOR - -/* Define to the sub-directory where libtool stores uninstalled libraries. */ -#undef LT_OBJDIR - -/* Define to the address where bug reports for this package should be sent. */ -#undef PACKAGE_BUGREPORT - -/* Define to the full name of this package. */ -#undef PACKAGE_NAME - -/* Define to the full name and version of this package. */ -#undef PACKAGE_STRING - -/* Define to the one symbol short name of this package. */ -#undef PACKAGE_TARNAME - -/* Define to the home page for this package. */ -#undef PACKAGE_URL - -/* Define to the version of this package. */ -#undef PACKAGE_VERSION - -/* Define to necessary symbol if this constant uses a non-standard name on - your system. */ -#undef PTHREAD_CREATE_JOINABLE - -/* Define this symbol if the qt platform is cocoa */ -#undef QT_QPA_PLATFORM_COCOA - -/* Define this symbol if the qt platform is windows */ -#undef QT_QPA_PLATFORM_WINDOWS - -/* Define this symbol if the qt platform is xcb */ -#undef QT_QPA_PLATFORM_XCB - -/* Define this symbol if qt plugins are static */ -#undef QT_STATICPLUGIN - -/* Define to 1 if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define to 1 if strerror_r returns char *. */ -#undef STRERROR_R_CHAR_P - -/* Define if dbus support should be compiled in */ -#undef USE_DBUS - -/* Define if QR support should be compiled in */ -#undef USE_QRCODE - -/* UPnP support not compiled if undefined, otherwise value (0 or 1) determines - default state */ -#undef USE_UPNP - -/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most - significant byte first (like Motorola and SPARC, unlike Intel). */ -#if defined AC_APPLE_UNIVERSAL_BUILD -# if defined __BIG_ENDIAN__ -# define WORDS_BIGENDIAN 1 -# endif -#else -# ifndef WORDS_BIGENDIAN -# undef WORDS_BIGENDIAN -# endif -#endif - -/* Enable large inode numbers on Mac OS X 10.5. */ -#ifndef _DARWIN_USE_64_BIT_INODE -# define _DARWIN_USE_64_BIT_INODE 1 -#endif - -/* Number of bits in a file offset, on hosts where this is settable. */ -#undef _FILE_OFFSET_BITS - -/* Define for large files, on AIX-style hosts. */ -#undef _LARGE_FILES - -#endif //DASH_CONFIG_H diff --git a/src/config/ohmcoin-config.h.in b/src/config/ohmcoin-config.h.in deleted file mode 100644 index 4a0083f5..00000000 --- a/src/config/ohmcoin-config.h.in +++ /dev/null @@ -1,361 +0,0 @@ -/* src/config/ohmcoin-config.h.in. Generated from configure.ac by autoheader. */ - -#ifndef OHMC_CONFIG_H - -#define OHMC_CONFIG_H - -/* Define if building universal (internal helper macro) */ -#undef AC_APPLE_UNIVERSAL_BUILD - -/* Version Build */ -#undef CLIENT_VERSION_BUILD - -/* Version is release */ -#undef CLIENT_VERSION_IS_RELEASE - -/* Major version */ -#undef CLIENT_VERSION_MAJOR - -/* Minor version */ -#undef CLIENT_VERSION_MINOR - -/* Build revision */ -#undef CLIENT_VERSION_REVISION - -/* Version is release */ -#undef COPYRIGHT_YEAR - -/* Define to 1 to enable wallet functions */ -#undef ENABLE_WALLET - -/* Define to 1 to enable ZMQ functions */ -#undef ENABLE_ZMQ - -/* parameter and return value type for __fdelt_chk */ -#undef FDELT_TYPE - -/* define if the Boost library is available */ -#undef HAVE_BOOST - -/* define if the Boost::Chrono library is available */ -#undef HAVE_BOOST_CHRONO - -/* define if the Boost::Filesystem library is available */ -#undef HAVE_BOOST_FILESYSTEM - -/* define if the Boost::PROGRAM_OPTIONS library is available */ -#undef HAVE_BOOST_PROGRAM_OPTIONS - -/* define if the Boost::System library is available */ -#undef HAVE_BOOST_SYSTEM - -/* define if the Boost::Thread library is available */ -#undef HAVE_BOOST_THREAD - -/* define if the Boost::Unit_Test_Framework library is available */ -#undef HAVE_BOOST_UNIT_TEST_FRAMEWORK - -/* Define this symbol if the consensus lib has been built */ -#undef HAVE_CONSENSUS_LIB - -/* define if the compiler supports basic C++11 syntax */ -#undef HAVE_CXX11 - -/* Define to 1 if you have the declaration of `be32toh', and to 0 if you - don't. */ -#undef HAVE_DECL_BE32TOH - -/* Define to 1 if you have the declaration of `be64toh', and to 0 if you - don't. */ -#undef HAVE_DECL_BE64TOH - -/* Define to 1 if you have the declaration of `daemon', and to 0 if you don't. - */ -#undef HAVE_DECL_DAEMON - -/* Define to 1 if you have the declaration of `htobe32', and to 0 if you - don't. */ -#undef HAVE_DECL_HTOBE32 - -/* Define to 1 if you have the declaration of `htobe64', and to 0 if you - don't. */ -#undef HAVE_DECL_HTOBE64 - -/* Define to 1 if you have the declaration of `htole32', and to 0 if you - don't. */ -#undef HAVE_DECL_HTOLE32 - -/* Define to 1 if you have the declaration of `htole64', and to 0 if you - don't. */ -#undef HAVE_DECL_HTOLE64 - -/* Define to 1 if you have the declaration of `le32toh', and to 0 if you - don't. */ -#undef HAVE_DECL_LE32TOH - -/* Define to 1 if you have the declaration of `le64toh', and to 0 if you - don't. */ -#undef HAVE_DECL_LE64TOH - -/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you - don't. */ -#undef HAVE_DECL_STRERROR_R - -/* Define to 1 if you have the declaration of `strnlen', and to 0 if you - don't. */ -#undef HAVE_DECL_STRNLEN - -/* Define to 1 if you have the header file. */ -#undef HAVE_DLFCN_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_ENDIAN_H - -/* Define this symbol if you have getaddrinfo_a */ -#undef HAVE_GETADDRINFO_A - -/* Define this symbol if you have inet_pton */ -#undef HAVE_INET_PTON - -/* Define to 1 if you have the header file. */ -#undef HAVE_INTTYPES_H - -/* Define to 1 if you have the `advapi32' library (-ladvapi32). */ -#undef HAVE_LIBADVAPI32 - -/* Define to 1 if you have the `comctl32' library (-lcomctl32). */ -#undef HAVE_LIBCOMCTL32 - -/* Define to 1 if you have the `comdlg32' library (-lcomdlg32). */ -#undef HAVE_LIBCOMDLG32 - -/* Define to 1 if you have the `crypt32' library (-lcrypt32). */ -#undef HAVE_LIBCRYPT32 - -/* Define to 1 if you have the `crypto' library (-lcrypto). */ -#undef HAVE_LIBCRYPTO - -/* Define to 1 if you have the `gdi32' library (-lgdi32). */ -#undef HAVE_LIBGDI32 - -/* Define to 1 if you have the `imm32' library (-limm32). */ -#undef HAVE_LIBIMM32 - -/* Define to 1 if you have the `iphlpapi' library (-liphlpapi). */ -#undef HAVE_LIBIPHLPAPI - -/* Define to 1 if you have the `jpeg ' library (-ljpeg ). */ -#undef HAVE_LIBJPEG_ - -/* Define to 1 if you have the `kernel32' library (-lkernel32). */ -#undef HAVE_LIBKERNEL32 - -/* Define to 1 if you have the `mingwthrd' library (-lmingwthrd). */ -#undef HAVE_LIBMINGWTHRD - -/* Define to 1 if you have the `mswsock' library (-lmswsock). */ -#undef HAVE_LIBMSWSOCK - -/* Define to 1 if you have the `ole32' library (-lole32). */ -#undef HAVE_LIBOLE32 - -/* Define to 1 if you have the `oleaut32' library (-loleaut32). */ -#undef HAVE_LIBOLEAUT32 - -/* Define to 1 if you have the `pcre16 ' library (-lpcre16 ). */ -#undef HAVE_LIBPCRE16_ - -/* Define to 1 if you have the `png ' library (-lpng ). */ -#undef HAVE_LIBPNG_ - -/* Define to 1 if you have the `rpcrt4' library (-lrpcrt4). */ -#undef HAVE_LIBRPCRT4 - -/* Define to 1 if you have the `rt' library (-lrt). */ -#undef HAVE_LIBRT - -/* Define to 1 if you have the `shell32' library (-lshell32). */ -#undef HAVE_LIBSHELL32 - -/* Define to 1 if you have the `shlwapi' library (-lshlwapi). */ -#undef HAVE_LIBSHLWAPI - -/* Define to 1 if you have the `ssp' library (-lssp). */ -#undef HAVE_LIBSSP - -/* Define to 1 if you have the `user32' library (-luser32). */ -#undef HAVE_LIBUSER32 - -/* Define to 1 if you have the `uuid' library (-luuid). */ -#undef HAVE_LIBUUID - -/* Define to 1 if you have the `winmm' library (-lwinmm). */ -#undef HAVE_LIBWINMM - -/* Define to 1 if you have the `winspool' library (-lwinspool). */ -#undef HAVE_LIBWINSPOOL - -/* Define to 1 if you have the `ws2_32' library (-lws2_32). */ -#undef HAVE_LIBWS2_32 - -/* Define to 1 if you have the `z ' library (-lz ). */ -#undef HAVE_LIBZ_ - -/* Define this symbol if you have malloc_info */ -#undef HAVE_MALLOC_INFO - -/* Define this symbol if you have mallopt with M_ARENA_MAX */ -#undef HAVE_MALLOPT_ARENA_MAX - -/* Define to 1 if you have the header file. */ -#undef HAVE_MEMORY_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_MINIUPNPC_MINIUPNPC_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_MINIUPNPC_MINIWGET_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_MINIUPNPC_UPNPCOMMANDS_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_MINIUPNPC_UPNPERRORS_H - -/* Define this symbol if you have MSG_DONTWAIT */ -#undef HAVE_MSG_DONTWAIT - -/* Define this symbol if you have MSG_NOSIGNAL */ -#undef HAVE_MSG_NOSIGNAL - -/* Define if you have POSIX threads libraries and header files. */ -#undef HAVE_PTHREAD - -/* Have PTHREAD_PRIO_INHERIT. */ -#undef HAVE_PTHREAD_PRIO_INHERIT - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDINT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDIO_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STDLIB_H - -/* Define to 1 if you have the `strerror_r' function. */ -#undef HAVE_STRERROR_R - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRINGS_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_STRING_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_PRCTL_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_SELECT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_STAT_H - -/* Define to 1 if you have the header file. */ -#undef HAVE_SYS_TYPES_H - -/* Define if thread_local is supported. */ -#undef HAVE_THREAD_LOCAL - -/* Define to 1 if you have the header file. */ -#undef HAVE_UNISTD_H - -/* Define if the visibility attribute is supported. */ -#undef HAVE_VISIBILITY_ATTRIBUTE - -/* Define this symbol if boost sleep works */ -#undef HAVE_WORKING_BOOST_SLEEP - -/* Define this symbol if boost sleep_for works */ -#undef HAVE_WORKING_BOOST_SLEEP_FOR - -/* Define to the sub-directory where libtool stores uninstalled libraries. */ -#undef LT_OBJDIR - -/* Define to the address where bug reports for this package should be sent. */ -#undef PACKAGE_BUGREPORT - -/* Define to the full name of this package. */ -#undef PACKAGE_NAME - -/* Define to the full name and version of this package. */ -#undef PACKAGE_STRING - -/* Define to the one symbol short name of this package. */ -#undef PACKAGE_TARNAME - -/* Define to the home page for this package. */ -#undef PACKAGE_URL - -/* Define to the version of this package. */ -#undef PACKAGE_VERSION - -/* Define to necessary symbol if this constant uses a non-standard name on - your system. */ -#undef PTHREAD_CREATE_JOINABLE - -/* Define this symbol if the qt platform is cocoa */ -#undef QT_QPA_PLATFORM_COCOA - -/* Define this symbol if the qt platform is windows */ -#undef QT_QPA_PLATFORM_WINDOWS - -/* Define this symbol if the qt platform is xcb */ -#undef QT_QPA_PLATFORM_XCB - -/* Define this symbol if qt plugins are static */ -#undef QT_STATICPLUGIN - -/* Define to 1 if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define to 1 if strerror_r returns char *. */ -#undef STRERROR_R_CHAR_P - -/* Define this symbol if coverage is enabled */ -#undef USE_COVERAGE - -/* Define if dbus support should be compiled in */ -#undef USE_DBUS - -/* Define if QR support should be compiled in */ -#undef USE_QRCODE - -/* UPnP support not compiled if undefined, otherwise value (0 or 1) determines - default state */ -#undef USE_UPNP - -/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most - significant byte first (like Motorola and SPARC, unlike Intel). */ -#if defined AC_APPLE_UNIVERSAL_BUILD -# if defined __BIG_ENDIAN__ -# define WORDS_BIGENDIAN 1 -# endif -#else -# ifndef WORDS_BIGENDIAN -# undef WORDS_BIGENDIAN -# endif -#endif - -/* Enable large inode numbers on Mac OS X 10.5. */ -#ifndef _DARWIN_USE_64_BIT_INODE -# define _DARWIN_USE_64_BIT_INODE 1 -#endif - -/* Number of bits in a file offset, on hosts where this is settable. */ -#undef _FILE_OFFSET_BITS - -/* Define for large files, on AIX-style hosts. */ -#undef _LARGE_FILES - -#endif //OHMC_CONFIG_H diff --git a/src/config/stamp-h1 b/src/config/stamp-h1 deleted file mode 100644 index 390232e7..00000000 --- a/src/config/stamp-h1 +++ /dev/null @@ -1 +0,0 @@ -timestamp for src/config/bitcoin-config.h diff --git a/src/crypto/common/common.h b/src/crypto/common/common.h index 07c2625e..319d1a4d 100644 --- a/src/crypto/common/common.h +++ b/src/crypto/common/common.h @@ -6,7 +6,7 @@ #define TX_CRYPTO_COMMON_H #if defined(HAVE_CONFIG_H) -#include "bitcoin-config.h" +#include #endif #include diff --git a/src/db.h b/src/db.h index fd53707e..7e20d417 100644 --- a/src/db.h +++ b/src/db.h @@ -6,6 +6,7 @@ #ifndef BITCOIN_DB_H #define BITCOIN_DB_H +#include "clientversion.h" #include "serialize.h" #include "sync.h" #include "version.h" diff --git a/src/init.cpp b/src/init.cpp index 521d90bf..d9a72b08 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -5,6 +5,7 @@ #include "init.h" +#include "clientversion.h" #include "addrman.h" #include "main.h" #include "chainparams.h" @@ -535,7 +536,7 @@ bool AppInit2(boost::thread_group& threadGroup) if (GetBoolArg("-shrinkdebugfile", !fDebug)) ShrinkDebugFile(); LogPrintf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); - LogPrintf("DigitalNote version %s (%s)\n", FormatFullVersion(), CLIENT_DATE); + LogPrintf("DigitalNote version %s\n", FormatFullVersion()); LogPrintf("Using OpenSSL version %s\n", SSLeay_version(SSLEAY_VERSION)); if (!fLogTimestamps) LogPrintf("Startup time: %s\n", DateTimeStrFormat("%x %H:%M:%S", GetTime())); diff --git a/src/main.h b/src/main.h index 39d0acd7..08f2fd69 100644 --- a/src/main.h +++ b/src/main.h @@ -6,10 +6,10 @@ #define BITCOIN_MAIN_H #if defined(HAVE_CONFIG_H) -#include "bitcoin-config.h" +#include #endif - +#include "clientversion.h" #include "chain.h" #include "bignum.h" #include "sync.h" diff --git a/src/net.cpp b/src/net.cpp index 7de37d22..1d4f5549 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -11,6 +11,7 @@ #include "ui_interface.h" #include "mnengine.h" #include "wallet.h" +#include "clientversion.h" #ifdef WIN32 #include diff --git a/src/qt/addressbookpage.cpp b/src/qt/addressbookpage.cpp index 4891b1fe..6adf6aa0 100644 --- a/src/qt/addressbookpage.cpp +++ b/src/qt/addressbookpage.cpp @@ -1,5 +1,5 @@ #if defined(HAVE_CONFIG_H) -#include "bitcoin-config.h" +#include #endif #include "addressbookpage.h" diff --git a/src/qt/notificator.h b/src/qt/notificator.h index aee096e9..158716e5 100644 --- a/src/qt/notificator.h +++ b/src/qt/notificator.h @@ -2,7 +2,7 @@ #define NOTIFICATOR_H #if defined(HAVE_CONFIG_H) -#include "bitcoin-config.h" +#include #endif #include diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp index 43bfc435..558a34da 100644 --- a/src/qt/optionsdialog.cpp +++ b/src/qt/optionsdialog.cpp @@ -1,5 +1,5 @@ #if defined(HAVE_CONFIG_H) -#include "bitcoin-config.h" +#include #endif #include "optionsdialog.h" diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp index 25e62a94..7bccbd62 100644 --- a/src/qt/optionsmodel.cpp +++ b/src/qt/optionsmodel.cpp @@ -2,7 +2,7 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #if defined(HAVE_CONFIG_H) -#include "bitcoin-config.h" +#include #endif #include "optionsmodel.h" diff --git a/src/rpcdump.cpp b/src/rpcdump.cpp index 675bce67..a4143a7c 100644 --- a/src/rpcdump.cpp +++ b/src/rpcdump.cpp @@ -373,7 +373,7 @@ Value dumpwallet(const Array& params, bool fHelp) std::sort(vKeyBirth.begin(), vKeyBirth.end()); // produce output - file << strprintf("# Wallet dump created by DigitalNote %s (%s)\n", CLIENT_BUILD, CLIENT_DATE); + file << strprintf("# Wallet dump created by DigitalNote %s\n", CLIENT_BUILD); file << strprintf("# * Created on %s\n", EncodeDumpTime(GetTime())); file << strprintf("# * Best block at time of backup was %i (%s),\n", nBestHeight, hashBestChain.ToString()); file << strprintf("# mined on %s\n", EncodeDumpTime(pindexBest->nTime)); diff --git a/src/rpcmisc.cpp b/src/rpcmisc.cpp index 94fe20f7..6f572a05 100644 --- a/src/rpcmisc.cpp +++ b/src/rpcmisc.cpp @@ -3,6 +3,8 @@ // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. +#include "clientversion.h" + #include "base58.h" #include "init.h" #include "main.h" diff --git a/src/rpcnet.cpp b/src/rpcnet.cpp index ad9d81ff..06529153 100644 --- a/src/rpcnet.cpp +++ b/src/rpcnet.cpp @@ -4,7 +4,7 @@ #include "rpcserver.h" - +#include "clientversion.h" #include "main.h" #include "alert.h" #include "main.h" diff --git a/src/rpcprotocol.cpp b/src/rpcprotocol.cpp index 8f370f19..9f546cc6 100644 --- a/src/rpcprotocol.cpp +++ b/src/rpcprotocol.cpp @@ -5,6 +5,7 @@ #include "rpcprotocol.h" +#include "clientversion.h" #include "util.h" #include diff --git a/src/txmempool.cpp b/src/txmempool.cpp index 41fea5b2..297fcdf8 100644 --- a/src/txmempool.cpp +++ b/src/txmempool.cpp @@ -5,6 +5,7 @@ #include "chain.h" #include "txmempool.h" +#include "clientversion.h" #include "main.h" // for CTransaction using namespace std; diff --git a/src/util.cpp b/src/util.cpp index d59ddc5f..3f2215be 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -4,7 +4,7 @@ // file COPYING or http://www.opensource.org/licenses/mit-license.php. #if defined(HAVE_CONFIG_H) -#include "config/bitcoin-config.h" +#include #endif #include "util.h" @@ -1468,31 +1468,6 @@ void seed_insecure_rand(bool fDeterministic) } } -string FormatVersion(int nVersion) -{ - if (nVersion%100 == 0) - return strprintf("%d.%d.%d", nVersion/1000000, (nVersion/10000)%100, (nVersion/100)%100); - else - return strprintf("%d.%d.%d.%d", nVersion/1000000, (nVersion/10000)%100, (nVersion/100)%100, nVersion%100); -} - -string FormatFullVersion() -{ - return CLIENT_BUILD; -} - -// Format the subversion field according to BIP 14 spec (https://en.bitcoin.it/wiki/BIP_0014) -std::string FormatSubVersion(const std::string& name, int nClientVersion, const std::vector& comments) -{ - std::ostringstream ss; - ss << "/"; - ss << name << ":" << FormatVersion(nClientVersion); - if (!comments.empty()) - ss << "(" << boost::algorithm::join(comments, "; ") << ")"; - ss << "/"; - return ss.str(); -} - #ifdef WIN32 boost::filesystem::path GetSpecialFolderPath(int nFolder, bool fCreate) { diff --git a/src/util.h b/src/util.h index 57cf2d7e..72c3aa63 100644 --- a/src/util.h +++ b/src/util.h @@ -6,6 +6,10 @@ #ifndef BITCOIN_UTIL_H #define BITCOIN_UTIL_H +#if defined(HAVE_CONFIG_H) +#include +#endif + #ifndef WIN32 #include #include @@ -276,8 +280,6 @@ int64_t GetTime(); void SetMockTime(int64_t nMockTimeIn); int64_t GetAdjustedTime(); int64_t GetTimeOffset(); -std::string FormatFullVersion(); -std::string FormatSubVersion(const std::string& name, int nClientVersion, const std::vector& comments); void AddTimeData(const CNetAddr& ip, int64_t nTime); void runCommand(std::string strCommand); long hex2long(const char *hexString); diff --git a/src/version.h b/src/version.h index 61d25713..ef3174a0 100644 --- a/src/version.h +++ b/src/version.h @@ -1,26 +1,15 @@ -// Copyright (c) 2012 The Bitcoin developers -// Distributed under the MIT/X11 software license, see the accompanying +// Copyright (c) 2012-2018 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. + #ifndef BITCOIN_VERSION_H #define BITCOIN_VERSION_H -#include "clientversion.h" -#include -#include - -// -// client versioning -// -static const int CLIENT_VERSION = - 1000000 * CLIENT_VERSION_MAJOR - + 10000 * CLIENT_VERSION_MINOR - + 100 * CLIENT_VERSION_REVISION - + 1 * CLIENT_VERSION_BUILD; +/** + * network protocol versioning + */ -extern const std::string CLIENT_NAME; -extern const std::string CLIENT_BUILD; -extern const std::string CLIENT_DATE; // // database format versioning @@ -74,4 +63,4 @@ static const int64_t MIN_MASTERNODE_ADV_RELAY = 9993058800; // OFF (NOT TOGGLED) // MasterNode peer IP basic relay system start (on and functional) static const int64_t MIN_MASTERNODE_BSC_RELAY = 62026; // ON -#endif +#endif // BITCOIN_VERSION_H From 605c20e948dd4608816b0243f0f19da047f5068f Mon Sep 17 00:00:00 2001 From: vgulkevic Date: Sun, 15 Nov 2020 08:36:41 +0200 Subject: [PATCH 09/35] Fixes, upstream updates for deprecated stuff, makefile targets updates --- build-aux/m4/bitcoin_qt.m4 | 7 +- configure.ac | 2 +- depends/packages/qt.mk | 2 +- libtool | 12 +- share/qt/extract_strings_qt.py | 2 +- src/MakeFile.am | 92 ++++---- src/Makefile.qt.include | 377 +++++++++++++++++++-------------- src/qt/bitcoin.cpp | 2 - src/qt/bitcoingui.cpp | 2 +- src/qt/bitcoinstrings.cpp | 201 +----------------- src/qt/clientmodel.cpp | 10 +- src/qt/clientmodel.h | 2 +- src/qt/forms/rpcconsole.ui | 7 +- src/qt/messagepage.cpp | 2 +- src/qt/overviewpage.cpp | 2 +- src/qt/rpcconsole.cpp | 2 +- src/txdb-leveldb.cpp | 2 +- 17 files changed, 293 insertions(+), 433 deletions(-) mode change 100644 => 100755 share/qt/extract_strings_qt.py diff --git a/build-aux/m4/bitcoin_qt.m4 b/build-aux/m4/bitcoin_qt.m4 index 0a4c047c..ae1e8d19 100644 --- a/build-aux/m4/bitcoin_qt.m4 +++ b/build-aux/m4/bitcoin_qt.m4 @@ -289,8 +289,8 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITH_PKGCONFIG],[ QT_LIB_PREFIX=Qt bitcoin_qt_got_major_vers=4 fi - qt5_modules="Qt5Core Qt5Gui Qt5Network Qt5Widgets" - qt4_modules="QtCore QtGui QtNetwork" + qt5_modules="Qt5Core Qt5Gui Qt5Network Qt5Widgets Qt5PrintSupport" + qt4_modules="QtCore QtGui QtNetwork QtPrintSupport" BITCOIN_QT_CHECK([ if test x$bitcoin_qt_want_version = xqt5 || ( test x$bitcoin_qt_want_version = xauto && test x$auto_priority_version = xqt5 ); then PKG_CHECK_MODULES([QT], [$qt5_modules], [QT_INCLUDES="$QT_CFLAGS"; have_qt=yes],[have_qt=no]) @@ -332,7 +332,7 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[ TEMP_LIBS="$LIBS" BITCOIN_QT_CHECK([ if test x$qt_include_path != x; then - QT_INCLUDES="-I$qt_include_path -I$qt_include_path/QtCore -I$qt_include_path/QtGui -I$qt_include_path/QtWidgets -I$qt_include_path/QtNetwork -I$qt_include_path/QtTest -I$qt_include_path/QtDBus" + QT_INCLUDES="-I$qt_include_path -I$qt_include_path/QtCore -I$qt_include_path/QtGui -I$qt_include_path/QtWidgets -I$qt_include_path/QtPrintSupport -I$qt_include_path/QtNetwork -I$qt_include_path/QtTest -I$qt_include_path/QtDBus" CPPFLAGS="$QT_INCLUDES $CPPFLAGS" fi ]) @@ -366,6 +366,7 @@ AC_DEFUN([_BITCOIN_QT_FIND_LIBS_WITHOUT_PKGCONFIG],[ BITCOIN_QT_CHECK(AC_CHECK_LIB([pcre16] ,[main],,AC_MSG_WARN([libpcre16 not found. Assuming qt has it built-in]))) BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Core] ,[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXCore not found))) BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Gui] ,[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXGui not found))) + BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}PrintSupport] ,[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXPrintSupport not found))) BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Network],[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXNetwork not found))) if test x$bitcoin_qt_got_major_vers = x5; then BITCOIN_QT_CHECK(AC_CHECK_LIB([${QT_LIB_PREFIX}Widgets],[main],,BITCOIN_QT_FAIL(lib$QT_LIB_PREFIXWidgets not found))) diff --git a/configure.ac b/configure.ac index b7e5dca7..8ffe74dd 100644 --- a/configure.ac +++ b/configure.ac @@ -880,7 +880,7 @@ PKGCONFIG_LIBDIR_TEMP="$PKG_CONFIG_LIBDIR" unset PKG_CONFIG_LIBDIR PKG_CONFIG_LIBDIR="$PKGCONFIG_LIBDIR_TEMP" -ac_configure_args="${ac_configure_args} --disable-shared --with-pic" +ac_configure_args="${ac_configure_args} --disable-shared --with-pic --enable-module-recovery" AC_CONFIG_SUBDIRS([src/secp256k1]) AC_OUTPUT diff --git a/depends/packages/qt.mk b/depends/packages/qt.mk index bcfe8846..17502f0f 100644 --- a/depends/packages/qt.mk +++ b/depends/packages/qt.mk @@ -7,7 +7,7 @@ $(package)_sha256_hash=95f83e532d23b3ddbde7973f380ecae1bac13230340557276f75f2e37 $(package)_dependencies=openssl zlib $(package)_linux_dependencies=freetype fontconfig libxcb libX11 xproto libXext $(package)_build_subdir=qtbase -$(package)_qt_libs=corelib network widgets gui plugins testlib +$(package)_qt_libs=corelib network widgets gui plugins printsupport testlib $(package)_patches=mac-qmake.conf mingw-uuidof.patch pidlist_absolute.patch fix-xcb-include-order.patch $(package)_patches+=fix_qt_configure.patch fix_qt_pkgconfig.patch fix-cocoahelpers-macos.patch qfixed-coretext.patch # NOTE: fix_qt_configure.patch is only needed for Qt 5.7, newer versions don't have this issue. diff --git a/libtool b/libtool index 0dee692c..61429e19 100755 --- a/libtool +++ b/libtool @@ -1,6 +1,6 @@ #! /bin/sh # Generated automatically by config.status (bitcoin) 1.0.3 -# Libtool was configured on host buddillalappy.local: +# Libtool was configured on host Vadims-MacBook-Pro.local: # NOTE: Changes made to this file will be lost: look at ltmain.sh. # Provide generalized library-building support services. @@ -82,13 +82,13 @@ SED="/usr/local/bin/gsed" Xsed="$SED -e 1s/^X//" # A grep program that handles long lines. -GREP="/usr/local/bin/ggrep" +GREP="/usr/bin/grep" # An ERE matcher. -EGREP="/usr/local/bin/ggrep -E" +EGREP="/usr/bin/grep -E" # A literal string matcher. -FGREP="/usr/local/bin/ggrep -F" +FGREP="/usr/bin/grep -F" # A BSD- or MS-compatible name lister. NM="/usr/bin/nm -B" @@ -162,7 +162,7 @@ old_postuninstall_cmds="" lock_old_archive_extraction=yes # A C compiler. -LTCC="/usr/local/bin/ccache gcc" +LTCC="gcc" # LTCC compiler flags. LTCFLAGS="-g -O2" @@ -282,7 +282,7 @@ finish_eval="" hardcode_into_libs=no # Compile-time system search path for libraries. -sys_lib_search_path_spec="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/12.0.0 /usr/local/lib" +sys_lib_search_path_spec="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/11.0.3 /usr/local/lib" # Detected run-time system search path for libraries. sys_lib_dlsearch_path_spec="/usr/local/lib /lib /usr/lib" diff --git a/share/qt/extract_strings_qt.py b/share/qt/extract_strings_qt.py old mode 100644 new mode 100755 index 771f28ab..49bb7af7 --- a/share/qt/extract_strings_qt.py +++ b/share/qt/extract_strings_qt.py @@ -6,7 +6,7 @@ from subprocess import Popen, PIPE import glob -OUT_CPP="src/qt/bitcoinstrings.cpp" +OUT_CPP="../src/qt/bitcoinstrings.cpp" EMPTY=['""'] def parse_po(text): diff --git a/src/MakeFile.am b/src/MakeFile.am index a2c0250c..f724c0cf 100644 --- a/src/MakeFile.am +++ b/src/MakeFile.am @@ -1,3 +1,4 @@ +DIST_SUBDIRS = secp256k1 AM_LDFLAGS = $(PTHREAD_CFLAGS) $(LIBTOOL_LDFLAGS) @@ -62,9 +63,9 @@ if BUILD_BITCOIND bin_PROGRAMS += bitcoind endif -if BUILD_BITCOIN_UTILS - bin_PROGRAMS += bitcoin-cli bitcoin-tx -endif +#if BUILD_BITCOIN_UTILS +# bin_PROGRAMS += bitcoin-cli bitcoin-tx +#endif .PHONY: FORCE # bitcoin core # @@ -85,6 +86,7 @@ BITCOIN_CORE_H = \ coincontrol.h \ compat.h \ crypter.h \ + scrypt.h \ db.h \ ecwrapper.h \ fork.h \ @@ -97,6 +99,7 @@ BITCOIN_CORE_H = \ keystore.h \ limitedmap.h \ main.h \ + protocol.h \ masternode-payments.h \ masternode.h \ masternodeconfig.h \ @@ -110,17 +113,11 @@ BITCOIN_CORE_H = \ pbkdf2.h \ protocol.h \ pubkey.h \ - random.h \ rpcclient.h \ rpcprotocol.h \ rpcserver.h \ rpcvelocity.h \ - script/interpreter.h \ script.h \ - script/sigcache.h \ - script/sign.h \ - script/standard.h \ - script/script_error.h \ serialize.h \ smessage.h \ spork.h \ @@ -164,22 +161,30 @@ libbitcoin_server_a_SOURCES = \ chain.cpp \ checkpoints.cpp \ init.cpp \ - #leveldbwrapper.cpp \ + txdb-leveldb.cpp \ main.cpp \ + blocksizecalculator.cpp \ + velocity.cpp \ + mnengine.cpp \ + protocol.cpp \ + kernel.cpp \ miner.cpp \ net.cpp \ noui.cpp \ - pow.cpp \ - rest.cpp \ rpcblockchain.cpp \ rpcmining.cpp \ rpcmisc.cpp \ rpcnet.cpp \ rpcrawtransaction.cpp \ rpcserver.cpp \ - script/sigcache.cpp \ - timedata.cpp \ - txdb.cpp \ + rpcmnengine.cpp \ + rpcvelocity.cpp \ + blockparams.cpp \ + rpcsmessage.cpp \ + smessage.cpp \ + webwalletconnector.cpp \ + stealth.cpp \ + support/cleanse.cpp \ txmempool.cpp \ $(JSON_H) \ $(BITCOIN_CORE_H) @@ -188,12 +193,21 @@ libbitcoin_server_a_SOURCES = \ # when wallet enabled libbitcoin_wallet_a_CPPFLAGS = $(BITCOIN_INCLUDES) libbitcoin_wallet_a_SOURCES = \ + activemasternode.cpp \ db.cpp \ crypter.cpp \ + scrypt.cpp \ + instantx.cpp \ + masternode.cpp \ + masternode-payments.cpp \ + masternodeconfig.cpp \ + masternodeman.cpp \ rpcdump.cpp \ rpcwallet.cpp \ wallet.cpp \ walletdb.cpp \ + rpcclient.cpp \ + pbkdf2.cpp \ $(BITCOIN_CORE_H) # crypto primitives library @@ -225,28 +239,16 @@ crypto_libbitcoin_crypto_a_SOURCES = \ libbitcoin_common_a_CPPFLAGS = $(BITCOIN_INCLUDES) libbitcoin_common_a_SOURCES = \ allocators.cpp \ - #amount.cpp \ base58.cpp \ chainparams.cpp \ - coins.cpp \ - compressor.cpp \ - core/block.cpp \ - core/transaction.cpp \ - core_read.cpp \ - core_write.cpp \ - eccryptoverify.cpp \ ecwrapper.cpp \ hash.cpp \ key.cpp \ keystore.cpp \ netbase.cpp \ - protocol.cpp \ + script.cpp \ pubkey.cpp \ - script/interpreter.cpp \ - script/script.cpp \ - script/sign.cpp \ - script/standard.cpp \ - script/script_error.cpp \ + spork.cpp \ $(BITCOIN_CORE_H) # util: shared between all executables. @@ -270,10 +272,10 @@ libbitcoin_util_a_SOURCES += compat/glibcxx_compat.cpp endif # cli: shared between bitcoin-cli and bitcoin-qt -libbitcoin_cli_a_CPPFLAGS = $(BITCOIN_INCLUDES) -libbitcoin_cli_a_SOURCES = \ - rpcclient.cpp \ - $(BITCOIN_CORE_H) +#libbitcoin_cli_a_CPPFLAGS = $(BITCOIN_INCLUDES) +#libbitcoin_cli_a_SOURCES = \ +# rpcclient.cpp \ +# $(BITCOIN_CORE_H) nodist_libbitcoin_util_a_SOURCES = $(srcdir)/obj/build.h # @@ -304,15 +306,15 @@ bitcoind_CPPFLAGS = $(BITCOIN_INCLUDES) bitcoind_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) # bitcoin-cli binary # -bitcoin_cli_LDADD = \ - $(LIBBITCOIN_CLI) \ - $(LIBBITCOIN_UTIL) \ - $(BOOST_LIBS) \ - $(SSL_LIBS) \ - $(CRYPTO_LIBS) +#bitcoin_cli_LDADD = \ +# $(LIBBITCOIN_CLI) \ +# $(LIBBITCOIN_UTIL) \ +# $(BOOST_LIBS) \ +# $(SSL_LIBS) \ +# $(CRYPTO_LIBS) -bitcoin_cli_SOURCES = \ - bitcoin-cli.cpp +#bitcoin_cli_SOURCES = \ +# bitcoin-cli.cpp bitcoin_cli_CPPFLAGS = $(BITCOIN_INCLUDES) # @@ -332,10 +334,10 @@ bitcoin_tx_CPPFLAGS = $(BITCOIN_INCLUDES) # bitcoin_tx_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) -if TARGET_WINDOWS -bitcoin_cli_SOURCES += bitcoin-cli-res.rc -endif -bitcoin_cli_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) +#if TARGET_WINDOWS +#bitcoin_cli_SOURCES += bitcoin-cli-res.rc +#endif +#bitcoin_cli_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) CLEANFILES = leveldb/libleveldb.a leveldb/libmemenv.a *.gcda *.gcno diff --git a/src/Makefile.qt.include b/src/Makefile.qt.include index a27d7264..08d7915e 100644 --- a/src/Makefile.qt.include +++ b/src/Makefile.qt.include @@ -76,67 +76,83 @@ QT_TS = \ qt/locale/bitcoin_zh_TW.ts QT_FORMS_UI = \ - qt/forms/addressbookpage.ui \ - qt/forms/askpassphrasedialog.ui \ qt/forms/coincontroldialog.ui \ + qt/forms/sendcoinsdialog.ui \ + qt/forms/addressbookpage.ui \ + qt/forms/signverifymessagedialog.ui \ + qt/forms/aboutdialog.ui \ qt/forms/editaddressdialog.ui \ - qt/forms/helpmessagedialog.ui \ - qt/forms/intro.ui \ - qt/forms/openuridialog.ui \ - qt/forms/optionsdialog.ui \ + qt/forms/importprivatekeydialog.ui \ + qt/forms/editconfigdialog.ui \ + qt/forms/transactiondescdialog.ui \ qt/forms/overviewpage.ui \ - qt/forms/receivecoinsdialog.ui \ - qt/forms/receiverequestdialog.ui \ - qt/forms/rpcconsole.ui \ - qt/forms/sendcoinsdialog.ui \ qt/forms/sendcoinsentry.ui \ - qt/forms/signverifymessagedialog.ui \ - qt/forms/transactiondescdialog.ui + qt/forms/askpassphrasedialog.ui \ + qt/forms/rpcconsole.ui \ + qt/forms/optionsdialog.ui \ + qt/forms/masternodemanager.ui \ + qt/forms/addeditadrenalinenode.ui \ + qt/forms/adrenalinenodeconfigdialog.ui \ + qt/forms/messagepage.ui \ + qt/forms/sendmessagesentry.ui \ + qt/forms/sendmessagesdialog.ui \ + qt/forms/blockbrowser.ui \ + qt/plugins/mrichtexteditor/mrichtextedit.ui QT_MOC_CPP = \ - qt/moc_addressbookpage.cpp \ - qt/moc_addresstablemodel.cpp \ - qt/moc_askpassphrasedialog.cpp \ - qt/moc_bitcoinaddressvalidator.cpp \ - qt/moc_bitcoinamountfield.cpp \ qt/moc_bitcoingui.cpp \ - qt/moc_bitcoinunits.cpp \ - qt/moc_clientmodel.cpp \ + qt/moc_transactiontablemodel.cpp \ + qt/moc_addresstablemodel.cpp \ + qt/moc_bantablemodel.cpp \ + qt/moc_optionsdialog.cpp \ qt/moc_coincontroldialog.cpp \ qt/moc_coincontroltreewidget.cpp \ - qt/moc_csvmodelwriter.cpp \ + qt/moc_sendcoinsdialog.cpp \ + qt/moc_addressbookpage.cpp \ + qt/moc_signverifymessagedialog.cpp \ + qt/moc_aboutdialog.cpp \ qt/moc_editaddressdialog.cpp \ + qt/moc_importprivatekeydialog.cpp \ + qt/moc_editconfigdialog.cpp \ + qt/moc_bitcoinaddressvalidator.cpp \ + qt/moc_masternodemanager.cpp \ + qt/moc_addeditadrenalinenode.cpp \ + qt/moc_adrenalinenodeconfigdialog.cpp \ + qt/moc_qcustomplot.cpp \ + qt/moc_messagepage.cpp \ + qt/moc_messagemodel.cpp \ + qt/moc_sendmessagesdialog.cpp \ + qt/moc_sendmessagesentry.cpp \ + qt/moc_blockbrowser.cpp \ + qt/moc_superblockpage.cpp \ + qt/moc_plugins/mrichtexteditor/mrichtextedit.cpp \ + qt/moc_qvalidatedtextedit.cpp \ + qt/moc_flowlayout.cpp \ + qt/moc_clientmodel.cpp \ qt/moc_guiutil.cpp \ - qt/moc_intro.cpp \ - qt/moc_macdockiconhandler.cpp \ - qt/moc_macnotificationhandler.cpp \ - qt/moc_notificator.cpp \ - qt/moc_openuridialog.cpp \ - qt/moc_optionsdialog.cpp \ + qt/moc_transactionrecord.cpp \ + qt/moc_guiconstants.cpp \ qt/moc_optionsmodel.cpp \ - qt/moc_overviewpage.cpp \ + qt/moc_monitoreddatamapper.cpp \ qt/moc_peertablemodel.cpp \ - qt/moc_paymentserver.cpp \ - qt/moc_qvalidatedlineedit.cpp \ - qt/moc_qvaluecombobox.cpp \ - qt/moc_receivecoinsdialog.cpp \ - qt/moc_receiverequestdialog.cpp \ - qt/moc_recentrequeststablemodel.cpp \ - qt/moc_rpcconsole.cpp \ - qt/moc_sendcoinsdialog.cpp \ - qt/moc_sendcoinsentry.cpp \ - qt/moc_signverifymessagedialog.cpp \ - qt/moc_splashscreen.cpp \ qt/moc_trafficgraphwidget.cpp \ qt/moc_transactiondesc.cpp \ qt/moc_transactiondescdialog.cpp \ + qt/moc_bitcoinamountfield.cpp \ qt/moc_transactionfilterproxy.cpp \ - qt/moc_transactiontablemodel.cpp \ qt/moc_transactionview.cpp \ - qt/moc_utilitydialog.cpp \ - qt/moc_walletframe.cpp \ qt/moc_walletmodel.cpp \ - qt/moc_walletview.cpp + qt/moc_walletmodeltransaction.cpp \ + qt/moc_overviewpage.cpp \ + qt/moc_csvmodelwriter.cpp \ + qt/moc_sendcoinsentry.cpp \ + qt/moc_qvalidatedlineedit.cpp \ + qt/moc_bitcoinunits.cpp \ + qt/moc_qvaluecombobox.cpp \ + qt/moc_askpassphrasedialog.cpp \ + qt/moc_notificator.cpp \ + qt/moc_paymentserver.cpp \ + qt/moc_rpcconsole.cpp BITCOIN_MM = \ qt/macdockiconhandler.mm \ @@ -154,166 +170,210 @@ QT_QRC = qt/bitcoin.qrc QT_QRC_LOCALE_CPP = qt/qrc_bitcoin_locale.cpp QT_QRC_LOCALE = qt/bitcoin_locale.qrc -PROTOBUF_CC = qt/paymentrequest.pb.cc -PROTOBUF_H = qt/paymentrequest.pb.h -PROTOBUF_PROTO = qt/paymentrequest.proto +#PROTOBUF_CC = qt/paymentrequest.pb.cc +#PROTOBUF_H = qt/paymentrequest.pb.h +#PROTOBUF_PROTO = qt/paymentrequest.proto BITCOIN_QT_H = \ - qt/addressbookpage.h \ - qt/addresstablemodel.h \ - qt/askpassphrasedialog.h \ - qt/bitcoinaddressvalidator.h \ - qt/bitcoinamountfield.h \ qt/bitcoingui.h \ - qt/bitcoinunits.h \ - qt/clientmodel.h \ + qt/transactiontablemodel.h \ + qt/addresstablemodel.h \ + qt/bantablemodel.h \ + qt/optionsdialog.h \ qt/coincontroldialog.h \ qt/coincontroltreewidget.h \ - qt/csvmodelwriter.h \ + qt/sendcoinsdialog.h \ + qt/addressbookpage.h \ + qt/signverifymessagedialog.h \ + qt/aboutdialog.h \ qt/editaddressdialog.h \ - qt/guiconstants.h \ + qt/importprivatekeydialog.h \ + qt/editconfigdialog.h \ + qt/bitcoinaddressvalidator.h \ + qt/masternodemanager.h \ + qt/addeditadrenalinenode.h \ + qt/adrenalinenodeconfigdialog.h \ + qt/qcustomplot.h \ + qt/plugins/mrichtexteditor/mrichtextedit.h \ + qt/messagepage.h \ + qt/messagemodel.h \ + qt/sendmessagesdialog.h \ + qt/sendmessagesentry.h \ + qt/blockbrowser.h \ + qt/superblockpage.h \ + qt/qvalidatedtextedit.h \ + qt/flowlayout.h \ + qt/clientmodel.h \ qt/guiutil.h \ - qt/intro.h \ - qt/macdockiconhandler.h \ - qt/macnotificationhandler.h \ - qt/networkstyle.h \ - qt/notificator.h \ - qt/openuridialog.h \ - qt/optionsdialog.h \ + qt/transactionrecord.h \ + qt/guiconstants.h \ qt/optionsmodel.h \ - qt/overviewpage.h \ - qt/paymentrequestplus.h \ - qt/paymentserver.h \ + qt/monitoreddatamapper.h \ qt/peertablemodel.h \ - qt/qvalidatedlineedit.h \ - qt/qvaluecombobox.h \ - qt/receivecoinsdialog.h \ - qt/receiverequestdialog.h \ - qt/recentrequeststablemodel.h \ - qt/rpcconsole.h \ - qt/sendcoinsdialog.h \ - qt/sendcoinsentry.h \ - qt/signverifymessagedialog.h \ - qt/splashscreen.h \ qt/trafficgraphwidget.h \ qt/transactiondesc.h \ qt/transactiondescdialog.h \ + qt/bitcoinamountfield.h \ qt/transactionfilterproxy.h \ - qt/transactionrecord.h \ - qt/transactiontablemodel.h \ qt/transactionview.h \ - qt/utilitydialog.h \ - qt/walletframe.h \ qt/walletmodel.h \ qt/walletmodeltransaction.h \ - qt/walletview.h \ - qt/winshutdownmonitor.h - + qt/overviewpage.h \ + qt/csvmodelwriter.h \ + qt/sendcoinsentry.h \ + qt/qvalidatedlineedit.h \ + qt/bitcoinunits.h \ + qt/qvaluecombobox.h \ + qt/askpassphrasedialog.h \ + qt/notificator.h \ + qt/paymentserver.h \ + qt/rpcconsole.h + RES_ICONS = \ + qt/res/icons/quit.png \ + qt/res/icons/editcopy.png \ + qt/res/icons/address-book-sidebar.png \ + qt/res/icons/onion.png \ qt/res/icons/add.png \ - qt/res/icons/address-book.png \ - qt/res/icons/bitcoin.ico \ - qt/res/icons/bitcoin.png \ - qt/res/icons/bitcoin_testnet.ico \ - qt/res/icons/bitcoin_testnet.png \ - qt/res/icons/clock1.png \ - qt/res/icons/clock2.png \ - qt/res/icons/clock3.png \ - qt/res/icons/clock4.png \ - qt/res/icons/clock5.png \ + qt/res/icons/transaction2.png \ + qt/res/icons/trade.png \ + qt/res/icons/folder.png \ + qt/res/icons/staking_on.png \ + qt/res/icons/tx_inout.png \ + qt/res/icons/eye.png \ qt/res/icons/configure.png \ + qt/res/icons/send-sidebar.png \ + qt/res/icons/receive.png \ + qt/res/icons/eye_plus.png \ + qt/res/icons/history.png \ + qt/res/icons/tx_output.png \ + qt/res/icons/key.png \ qt/res/icons/connect0_16.png \ qt/res/icons/connect1_16.png \ qt/res/icons/connect2_16.png \ + qt/res/icons/digitalnote.png \ qt/res/icons/connect3_16.png \ qt/res/icons/connect4_16.png \ + qt/res/icons/remove.png \ qt/res/icons/debugwindow.png \ qt/res/icons/edit.png \ - qt/res/icons/editcopy.png \ - qt/res/icons/editpaste.png \ - qt/res/icons/export.png \ - qt/res/icons/eye.png \ - qt/res/icons/eye_minus.png \ - qt/res/icons/eye_plus.png \ - qt/res/icons/filesave.png \ - qt/res/icons/history.png \ - qt/res/icons/key.png \ - qt/res/icons/lock_closed.png \ + qt/res/icons/transaction0.png \ + qt/res/icons/tx_input.png \ + qt/res/icons/browse.png \ + qt/res/icons/mnodes.png \ + qt/res/icons/clock1.png \ qt/res/icons/lock_open.png \ + qt/res/icons/staking_off.png \ + qt/res/icons/clock2.png \ qt/res/icons/overview.png \ qt/res/icons/qrcode.png \ - qt/res/icons/quit.png \ - qt/res/icons/receive.png \ - qt/res/icons/remove.png \ - qt/res/icons/send.png \ + qt/res/icons/clock3.png \ + qt/res/icons/tx_mined.png \ + qt/res/icons/clock4.png \ + qt/res/icons/address-book.png \ + qt/res/icons/clock5.png \ + qt/res/icons/block.png \ + qt/res/icons/lock_closed_toolbar.png \ + qt/res/icons/onion-black.png \ + qt/res/icons/eye_minus.png \ + qt/res/icons/digitalnote_testnet.png \ qt/res/icons/synced.png \ - qt/res/icons/transaction0.png \ - qt/res/icons/transaction2.png \ qt/res/icons/transaction_conflicted.png \ - qt/res/icons/tx_inout.png \ - qt/res/icons/tx_input.png \ - qt/res/icons/tx_output.png \ - qt/res/icons/tx_mined.png \ - qt/res/icons/unit_btc.png \ - qt/res/icons/unit_mbtc.png \ - qt/res/icons/unit_ubtc.png + qt/res/icons/lock_open_toolbar\ .png \ + qt/res/icons/superblock.png \ + qt/res/icons/export.png \ + qt/res/icons/editconf.png \ + qt/res/icons/digitalnote-16_testnet.png \ + qt/res/icons/filesave.png \ + qt/res/icons/digitalnote-16.png \ + qt/res/icons/send.png \ + qt/res/icons/message.png \ + qt/res/icons/editpaste.png \ + qt/res/icons/lock_closed.png \ + qt/res/icons/dark/digitalnote_dark-16_testnet.png \ + qt/res/icons/dark/synced.png \ + qt/res/icons/dark/lock_open.png \ + qt/res/icons/dark/tx_mined.png \ + qt/res/icons/dark/lock_closed.png \ + qt/res/icons/dark/connect0_16.png \ + qt/res/icons/dark/connect1_16.png \ + qt/res/icons/dark/connect2_16.png \ + qt/res/icons/dark/connect3_16.png \ + qt/res/icons/dark/connect4_16.png \ + qt/res/icons/dark/digitalnote_dark-16.png \ + qt/res/icons/dark/digitalnote_dark_testnet.png \ + qt/res/icons/dark/tx_input.png \ + qt/res/icons/dark/tx_inout.png \ + qt/res/icons/dark/digitalnote_dark.png \ + qt/res/icons/dark/tx_output.png \ + qt/res/icons/dark/staking_on.png \ + qt/res/icons/dark/staking_off.png +if ENABLE_WALLET BITCOIN_QT_CPP = \ - qt/bitcoinaddressvalidator.cpp \ - qt/bitcoinamountfield.cpp \ + qt/bitcoin.cpp \ qt/bitcoingui.cpp \ - qt/bitcoinunits.cpp \ + qt/transactiontablemodel.cpp \ + qt/addresstablemodel.cpp \ + qt/bantablemodel.cpp \ + qt/optionsdialog.cpp \ + qt/sendcoinsdialog.cpp \ + qt/coincontroldialog.cpp \ + qt/coincontroltreewidget.cpp \ + qt/addressbookpage.cpp \ + qt/signverifymessagedialog.cpp \ + qt/aboutdialog.cpp \ + qt/editaddressdialog.cpp \ + qt/importprivatekeydialog.cpp \ + qt/editconfigdialog.cpp \ + qt/bitcoinaddressvalidator.cpp \ qt/clientmodel.cpp \ - qt/csvmodelwriter.cpp \ qt/guiutil.cpp \ - qt/intro.cpp \ - qt/networkstyle.cpp \ - qt/notificator.cpp \ - qt/optionsdialog.cpp \ + qt/transactionrecord.cpp \ qt/optionsmodel.cpp \ + qt/monitoreddatamapper.cpp \ qt/peertablemodel.cpp \ - qt/qvalidatedlineedit.cpp \ - qt/qvaluecombobox.cpp \ - qt/rpcconsole.cpp \ - qt/splashscreen.cpp \ qt/trafficgraphwidget.cpp \ - qt/utilitydialog.cpp \ - qt/winshutdownmonitor.cpp - -if ENABLE_WALLET -BITCOIN_QT_CPP += \ - qt/addressbookpage.cpp \ - qt/addresstablemodel.cpp \ - qt/askpassphrasedialog.cpp \ - qt/coincontroldialog.cpp \ - qt/coincontroltreewidget.cpp \ - qt/editaddressdialog.cpp \ - qt/openuridialog.cpp \ - qt/overviewpage.cpp \ - qt/paymentrequestplus.cpp \ - qt/paymentserver.cpp \ - qt/receivecoinsdialog.cpp \ - qt/receiverequestdialog.cpp \ - qt/recentrequeststablemodel.cpp \ - qt/sendcoinsdialog.cpp \ - qt/sendcoinsentry.cpp \ - qt/signverifymessagedialog.cpp \ qt/transactiondesc.cpp \ qt/transactiondescdialog.cpp \ + qt/bitcoinstrings.cpp \ + qt/bitcoinamountfield.cpp \ qt/transactionfilterproxy.cpp \ - qt/transactionrecord.cpp \ - qt/transactiontablemodel.cpp \ qt/transactionview.cpp \ - qt/walletframe.cpp \ qt/walletmodel.cpp \ qt/walletmodeltransaction.cpp \ - qt/walletview.cpp + qt/overviewpage.cpp \ + qt/csvmodelwriter.cpp \ + qt/sendcoinsentry.cpp \ + qt/qvalidatedlineedit.cpp \ + qt/bitcoinunits.cpp \ + qt/qvaluecombobox.cpp \ + qt/askpassphrasedialog.cpp \ + qt/notificator.cpp \ + qt/paymentserver.cpp \ + qt/rpcconsole.cpp \ + qt/flowlayout.cpp \ + qt/masternodemanager.cpp \ + qt/addeditadrenalinenode.cpp \ + qt/adrenalinenodeconfigdialog.cpp \ + qt/qcustomplot.cpp \ + qt/messagepage.cpp \ + qt/messagemodel.cpp \ + qt/sendmessagesdialog.cpp \ + qt/sendmessagesentry.cpp \ + qt/blockbrowser.cpp \ + qt/qvalidatedtextedit.cpp \ + qt/plugins/mrichtexteditor/mrichtextedit.cpp endif RES_IMAGES = \ + qt/res/images/header.png \ qt/res/images/about.png \ qt/res/images/splash.png \ - qt/res/images/splash_testnet.png + qt/res/images/splash_dark.png \ + qt/res/images/about_dark.png \ + qt/res/images/header_dark.png + RES_MOVIES = $(wildcard qt/res/movies/spinner-*.png) @@ -326,10 +386,10 @@ qt_libbitcoinqt_a_CPPFLAGS = $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \ $(QT_INCLUDES) $(QT_DBUS_INCLUDES) $(PROTOBUF_CFLAGS) $(QR_CFLAGS) qt_libbitcoinqt_a_SOURCES = $(BITCOIN_QT_CPP) $(BITCOIN_QT_H) $(QT_FORMS_UI) \ - $(QT_QRC) $(QT_QRC_LOCALE) $(QT_TS) $(PROTOBUF_PROTO) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) + $(QT_QRC) $(QT_QRC_LOCALE) $(QT_TS) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) -nodist_qt_libbitcoinqt_a_SOURCES = $(QT_MOC_CPP) $(QT_MOC) $(PROTOBUF_CC) \ - $(PROTOBUF_H) $(QT_QRC_CPP) $(QT_QRC_LOCALE_CPP) +nodist_qt_libbitcoinqt_a_SOURCES = $(QT_MOC_CPP) $(QT_MOC) \ + $(QT_QRC_CPP) $(QT_QRC_LOCALE_CPP) # forms/foo.h -> forms/ui_foo.h QT_FORMS_H=$(join $(dir $(QT_FORMS_UI)),$(addprefix ui_, $(notdir $(QT_FORMS_UI:.ui=.h)))) @@ -339,11 +399,6 @@ QT_FORMS_H=$(join $(dir $(QT_FORMS_UI)),$(addprefix ui_, $(notdir $(QT_FORMS_UI: $(QT_MOC): $(QT_FORMS_H) $(qt_libbitcoinqt_a_OBJECTS) $(qt_bitcoin_qt_OBJECTS) : | $(QT_MOC) -#Generating these with a half-written protobuf header leads to wacky results. -#This makes sure it's done. -$(QT_MOC): $(PROTOBUF_H) -$(QT_MOC_CPP): $(PROTOBUF_H) - # bitcoin-qt binary # qt_bitcoin_qt_CPPFLAGS = $(BITCOIN_INCLUDES) $(BITCOIN_QT_INCLUDES) \ $(QT_INCLUDES) $(PROTOBUF_CFLAGS) $(QR_CFLAGS) @@ -383,7 +438,7 @@ $(QT_QRC_LOCALE_CPP): $(QT_QRC_LOCALE) $(QT_QM) $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin_locale $(@D)/$( $@ -$(QT_QRC_CPP): $(QT_QRC) $(QT_FORMS_H) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) $(PROTOBUF_H) +$(QT_QRC_CPP): $(QT_QRC) $(QT_FORMS_H) $(RES_ICONS) $(RES_IMAGES) $(RES_MOVIES) @test -f $(RCC) $(AM_V_GEN) QT_SELECT=$(QT_SELECT) $(RCC) -name bitcoin $< | \ $(SED) -e '/^\*\*.*Created:/d' -e '/^\*\*.*by:/d' > $@ diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp index 91661e03..61c11026 100644 --- a/src/qt/bitcoin.cpp +++ b/src/qt/bitcoin.cpp @@ -39,7 +39,6 @@ Q_IMPORT_PLUGIN(qjpcodecs) Q_IMPORT_PLUGIN(qtwcodecs) Q_IMPORT_PLUGIN(qkrcodecs) Q_IMPORT_PLUGIN(qtaccessiblewidgets) -#endif Q_IMPORT_PLUGIN(AccessibleFactory) #if defined(QT_QPA_PLATFORM_XCB) Q_IMPORT_PLUGIN(QXcbIntegrationPlugin); @@ -49,7 +48,6 @@ Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin); Q_IMPORT_PLUGIN(QCocoaIntegrationPlugin); #endif #endif -#endif // Need a global reference for the notifications to find the GUI static DigitalNoteGUI *guiref; diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 33530234..728eedcb 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -1186,7 +1186,7 @@ void DigitalNoteGUI::encryptWallet() void DigitalNoteGUI::backupWallet() { - QString saveDir = QDesktopServices::storageLocation(QDesktopServices::DocumentsLocation); + QString saveDir = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation); QString filename = QFileDialog::getSaveFileName(this, tr("Backup Wallet"), saveDir, tr("Wallet Data (*.dat)")); if(!filename.isEmpty()) { if(!walletModel->backupWallet(filename)) { diff --git a/src/qt/bitcoinstrings.cpp b/src/qt/bitcoinstrings.cpp index 57e3e253..b5f098ea 100644 --- a/src/qt/bitcoinstrings.cpp +++ b/src/qt/bitcoinstrings.cpp @@ -5,203 +5,4 @@ #else #define UNUSED #endif -static const char UNUSED *bitcoin_strings[] = {QT_TRANSLATE_NOOP("bitcoin-core", "To use the %s option"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"%s, you must set a rpcpassword in the configuration file:\n" -"%s\n" -"It is recommended you use the following random password:\n" -"rpcuser=DigitalNoterpc\n" -"rpcpassword=%s\n" -"(you do not need to remember this password)\n" -"The username and password MUST NOT be the same.\n" -"If the file does not exist, create it with owner-readable-only file " -"permissions.\n" -"It is also recommended to set alertnotify so you are notified of problems;\n" -"for example: alertnotify=echo %%s | mail -s \"DigitalNote Alert\" admin@foo." -"com\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"An error occurred while setting up the RPC port %u for listening on IPv6, " -"falling back to IPv4: %s"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"An error occurred while setting up the RPC port %u for listening on IPv4: %s"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"Warning: Please check that your computer's date and time are correct! If " -"your clock is wrong DigitalNote will not work properly."), -QT_TRANSLATE_NOOP("bitcoin-core", "Options:"), -QT_TRANSLATE_NOOP("bitcoin-core", "This help message"), -QT_TRANSLATE_NOOP("bitcoin-core", "Specify configuration file (default: DigitalNote.conf)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Specify pid file (default: DigitalNoted.pid)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Specify data directory"), -QT_TRANSLATE_NOOP("bitcoin-core", "Specify wallet file (within data directory)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Set database cache size in megabytes (default: 25)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Set database disk log size in megabytes (default: 100)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Specify connection timeout in milliseconds (default: 5000)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Connect through socks proxy"), -QT_TRANSLATE_NOOP("bitcoin-core", "Select the version of socks proxy to use (4-5, default: 5)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Use proxy to reach tor hidden services (default: same as -proxy)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Allow DNS lookups for -addnode, -seednode and -connect"), -QT_TRANSLATE_NOOP("bitcoin-core", "Listen for connections on (default: 15714 or testnet: 25714)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Maintain at most connections to peers (default: 125)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Add a node to connect to and attempt to keep the connection open"), -QT_TRANSLATE_NOOP("bitcoin-core", "Connect only to the specified node(s)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Connect to a node to retrieve peer addresses, and disconnect"), -QT_TRANSLATE_NOOP("bitcoin-core", "Specify your own public address"), -QT_TRANSLATE_NOOP("bitcoin-core", "Only connect to nodes in network (IPv4, IPv6 or Tor)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Discover own IP address (default: 1 when listening and no -externalip)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Accept connections from outside (default: 1 if no -proxy or -connect)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Bind to given address. Use [host]:port notation for IPv6"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"Query for peer addresses via DNS lookup, if low on addresses (default: 1 " -"unless -connect)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Always query for peer addresses via DNS lookup (default: 0)"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"Sync time with other nodes. Disable if time on your system is precise e.g. " -"syncing with NTP (default: 1)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Sync checkpoints policy (default: strict)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Threshold for disconnecting misbehaving peers (default: 100)"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"Number of seconds to keep misbehaving peers from reconnecting (default: " -"86400)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Maximum per-connection receive buffer, *1000 bytes (default: 5000)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Maximum per-connection send buffer, *1000 bytes (default: 1000)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Use UPnP to map the listening port (default: 1 when listening)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Use UPnP to map the listening port (default: 0)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Fee per KB to add to transactions you send"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"When creating transactions, ignore inputs with value less than this " -"(default: 0.01)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Accept command line and JSON-RPC commands"), -QT_TRANSLATE_NOOP("bitcoin-core", "Run in the background as a daemon and accept commands"), -QT_TRANSLATE_NOOP("bitcoin-core", "Use the test network"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"Output debugging information (default: 0, supplying is optional)"), -QT_TRANSLATE_NOOP("bitcoin-core", "If is not supplied, output all debugging information."), -QT_TRANSLATE_NOOP("bitcoin-core", " can be:"), -QT_TRANSLATE_NOOP("bitcoin-core", "Prepend debug output with timestamp"), -QT_TRANSLATE_NOOP("bitcoin-core", "Shrink debug.log file on client startup (default: 1 when no -debug)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Send trace/debug info to console instead of debug.log file"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"Enter regression test mode, which uses a special chain in which blocks can " -"be solved instantly. This is intended for regression testing tools and app " -"development."), -QT_TRANSLATE_NOOP("bitcoin-core", "Username for JSON-RPC connections"), -QT_TRANSLATE_NOOP("bitcoin-core", "Password for JSON-RPC connections"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"Listen for JSON-RPC connections on (default: 15715 or testnet: 25715)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Allow JSON-RPC connections from specified IP address"), -QT_TRANSLATE_NOOP("bitcoin-core", "Send commands to node running on (default: 127.0.0.1)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Wait for RPC server to start"), -QT_TRANSLATE_NOOP("bitcoin-core", "Set the number of threads to service RPC calls (default: 4)"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"Execute command when the best block changes (%s in cmd is replaced by block " -"hash)"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"Execute command when a wallet transaction changes (%s in cmd is replaced by " -"TxID)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Require a confirmations for change (default: 0)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Minimize weight consumption (experimental) (default: 0)"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"Execute command when a relevant alert is received (%s in cmd is replaced by " -"message)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Upgrade wallet to latest format"), -QT_TRANSLATE_NOOP("bitcoin-core", "Set key pool size to (default: 100)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Rescan the block chain for missing wallet transactions"), -QT_TRANSLATE_NOOP("bitcoin-core", "Attempt to recover private keys from a corrupt wallet.dat"), -QT_TRANSLATE_NOOP("bitcoin-core", "How many blocks to check at startup (default: 500, 0 = all)"), -QT_TRANSLATE_NOOP("bitcoin-core", "How thorough the block verification is (0-6, default: 1)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Imports blocks from external blk000?.dat file"), -QT_TRANSLATE_NOOP("bitcoin-core", "Keep at most unconnectable blocks in memory (default: %u)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Block creation options:"), -QT_TRANSLATE_NOOP("bitcoin-core", "Set minimum block size in bytes (default: 0)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Set maximum block size in bytes (default: 250000)"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"Set maximum size of high-priority/low-fee transactions in bytes (default: " -"27000)"), -QT_TRANSLATE_NOOP("bitcoin-core", "SSL options: (see the DigitalNote Wiki for SSL setup instructions)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Use OpenSSL (https) for JSON-RPC connections"), -QT_TRANSLATE_NOOP("bitcoin-core", "Server certificate file (default: server.cert)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Server private key (default: server.pem)"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"Acceptable ciphers (default: TLSv1.2+HIGH:TLSv1+HIGH:!SSLv2:!aNULL:!eNULL:!" -"3DES:@STRENGTH)"), -QT_TRANSLATE_NOOP("bitcoin-core", "Warning: Deprecated argument -debugnet ignored, use -debug=net"), -QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount for -paytxfee=: '%s'"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"Warning: -paytxfee is set very high! This is the transaction fee you will " -"pay if you send a transaction."), -QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount for -mininput=: '%s'"), -QT_TRANSLATE_NOOP("bitcoin-core", "Initialization sanity check failed. DigitalNote is shutting down."), -QT_TRANSLATE_NOOP("bitcoin-core", "Wallet %s resides outside data directory %s."), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"Cannot obtain a lock on data directory %s. DigitalNote is probably already " -"running."), -QT_TRANSLATE_NOOP("bitcoin-core", "Verifying database integrity..."), -QT_TRANSLATE_NOOP("bitcoin-core", "Error initializing wallet database environment %s!"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"Warning: wallet.dat corrupt, data salvaged! Original wallet.dat saved as " -"wallet.{timestamp}.bak in %s; if your balance or transactions are incorrect " -"you should restore from a backup."), -QT_TRANSLATE_NOOP("bitcoin-core", "wallet.dat corrupt, salvage failed"), -QT_TRANSLATE_NOOP("bitcoin-core", "Unknown -socks proxy version requested: %i"), -QT_TRANSLATE_NOOP("bitcoin-core", "Unknown network specified in -onlynet: '%s'"), -QT_TRANSLATE_NOOP("bitcoin-core", "Invalid -proxy address: '%s'"), -QT_TRANSLATE_NOOP("bitcoin-core", "Invalid -tor address: '%s'"), -QT_TRANSLATE_NOOP("bitcoin-core", "Cannot resolve -bind address: '%s'"), -QT_TRANSLATE_NOOP("bitcoin-core", "Failed to listen on any port. Use -listen=0 if you want this."), -QT_TRANSLATE_NOOP("bitcoin-core", "Cannot resolve -externalip address: '%s'"), -QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount for -reservebalance="), -QT_TRANSLATE_NOOP("bitcoin-core", "Unable to sign checkpoint, wrong checkpointkey?\n"), -QT_TRANSLATE_NOOP("bitcoin-core", "Loading block index..."), -QT_TRANSLATE_NOOP("bitcoin-core", "Error loading blkindex.dat"), -QT_TRANSLATE_NOOP("bitcoin-core", "Loading wallet..."), -QT_TRANSLATE_NOOP("bitcoin-core", "Error loading wallet.dat: Wallet corrupted"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"Warning: error reading wallet.dat! All keys read correctly, but transaction " -"data or address book entries might be missing or incorrect."), -QT_TRANSLATE_NOOP("bitcoin-core", "Error loading wallet.dat: Wallet requires newer version of DigitalNote"), -QT_TRANSLATE_NOOP("bitcoin-core", "Wallet needed to be rewritten: restart DigitalNote to complete"), -QT_TRANSLATE_NOOP("bitcoin-core", "Error loading wallet.dat"), -QT_TRANSLATE_NOOP("bitcoin-core", "Cannot downgrade wallet"), -QT_TRANSLATE_NOOP("bitcoin-core", "Cannot write default address"), -QT_TRANSLATE_NOOP("bitcoin-core", "Rescanning..."), -QT_TRANSLATE_NOOP("bitcoin-core", "Loading addresses..."), -QT_TRANSLATE_NOOP("bitcoin-core", "Done loading"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"Unable to bind to %s on this computer. DigitalNote is probably already running."), -QT_TRANSLATE_NOOP("bitcoin-core", "Unable to bind to %s on this computer (bind returned error %d, %s)"), -QT_TRANSLATE_NOOP("bitcoin-core", "DigitalNote version"), -QT_TRANSLATE_NOOP("bitcoin-core", "Usage:"), -QT_TRANSLATE_NOOP("bitcoin-core", "Send command to -server or DigitalNoted"), -QT_TRANSLATE_NOOP("bitcoin-core", "List commands"), -QT_TRANSLATE_NOOP("bitcoin-core", "Get help for a command"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"You must set rpcpassword= in the configuration file:\n" -"%s\n" -"If the file does not exist, create it with owner-readable-only file " -"permissions."), -QT_TRANSLATE_NOOP("bitcoin-core", "Error: Wallet locked, unable to create transaction!"), -QT_TRANSLATE_NOOP("bitcoin-core", "Error: Wallet unlocked for staking only, unable to create transaction."), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"Error: This transaction requires a transaction fee of at least %s because of " -"its amount, complexity, or use of recently received funds!"), -QT_TRANSLATE_NOOP("bitcoin-core", "Error: Transaction creation failed!"), -QT_TRANSLATE_NOOP("bitcoin-core", "Sending..."), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"Error: The transaction was rejected! This might happen if some of the coins " -"in your wallet were already spent, such as if you used a copy of wallet.dat " -"and coins were spent in the copy but not marked as spent here."), -QT_TRANSLATE_NOOP("bitcoin-core", "Invalid amount"), -QT_TRANSLATE_NOOP("bitcoin-core", "Insufficient funds"), -QT_TRANSLATE_NOOP("bitcoin-core", "Error"), -QT_TRANSLATE_NOOP("bitcoin-core", "Warning"), -QT_TRANSLATE_NOOP("bitcoin-core", "Information"), -QT_TRANSLATE_NOOP("bitcoin-core", "Warning: This version is obsolete, upgrade required!"), -QT_TRANSLATE_NOOP("bitcoin-core", "WARNING: syncronized checkpoint violation detected, but skipped!"), -QT_TRANSLATE_NOOP("bitcoin-core", "Error: Disk space is low!"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"This is a pre-release test build - use at your own risk - do not use for " -"mining or merchant applications"), -QT_TRANSLATE_NOOP("bitcoin-core", "" -"WARNING: Invalid checkpoint found! Displayed transactions may not be " -"correct! You may need to upgrade, or notify developers."), -}; \ No newline at end of file +static const char UNUSED *bitcoin_strings[] = {}; \ No newline at end of file diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp index 7dceb905..48fd9d1b 100644 --- a/src/qt/clientmodel.cpp +++ b/src/qt/clientmodel.cpp @@ -195,11 +195,6 @@ QString ClientModel::formatFullVersion() const return QString::fromStdString(FormatFullVersion()); } -QString ClientModel::formatBuildDate() const -{ - return QString::fromStdString(CLIENT_DATE); -} - bool ClientModel::isReleaseVersion() const { return CLIENT_VERSION_IS_RELEASE; @@ -215,6 +210,11 @@ QString ClientModel::formatClientStartupTime() const return QDateTime::fromTime_t(nClientStartupTime).toString(); } +QString ClientModel::dataDir() const +{ + return QString::fromStdString(GetDataDir().string()); +} + QString ClientModel::getConfigFileContent() const { QString result; diff --git a/src/qt/clientmodel.h b/src/qt/clientmodel.h index 1343c701..131126bb 100644 --- a/src/qt/clientmodel.h +++ b/src/qt/clientmodel.h @@ -48,10 +48,10 @@ class ClientModel : public QObject QString getStatusBarWarnings() const; QString formatFullVersion() const; - QString formatBuildDate() const; bool isReleaseVersion() const; QString clientName() const; QString formatClientStartupTime() const; + QString dataDir() const; //! Get and set the content of the DigitalNote.conf file QString getConfigFileContent() const; diff --git a/src/qt/forms/rpcconsole.ui b/src/qt/forms/rpcconsole.ui index a5fb6109..9455fc9d 100644 --- a/src/qt/forms/rpcconsole.ui +++ b/src/qt/forms/rpcconsole.ui @@ -115,12 +115,12 @@ - Build date + Datadir - + IBeamCursor @@ -130,6 +130,9 @@ Qt::PlainText + + true + Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse diff --git a/src/qt/messagepage.cpp b/src/qt/messagepage.cpp index 0166021e..993ca273 100644 --- a/src/qt/messagepage.cpp +++ b/src/qt/messagepage.cpp @@ -2,7 +2,7 @@ #include "ui_messagepage.h" #include "sendmessagesdialog.h" -#include "mrichtextedit.h" +#include "plugins/mrichtexteditor/mrichtextedit.h" #include "messagemodel.h" #include "bitcoingui.h" #include "csvmodelwriter.h" diff --git a/src/qt/overviewpage.cpp b/src/qt/overviewpage.cpp index a5789c9a..cbf89651 100644 --- a/src/qt/overviewpage.cpp +++ b/src/qt/overviewpage.cpp @@ -52,7 +52,7 @@ class TxViewDelegate : public QAbstractItemDelegate bool confirmed = index.data(TransactionTableModel::ConfirmedRole).toBool(); QVariant value = index.data(Qt::ForegroundRole); QColor foreground = option.palette.color(QPalette::Text); - if(qVariantCanConvert(value)) + if(value.canConvert()) { foreground = qvariant_cast(value); } diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp index ac7de151..43a09c7e 100644 --- a/src/qt/rpcconsole.cpp +++ b/src/qt/rpcconsole.cpp @@ -378,7 +378,7 @@ void RPCConsole::setClientModel(ClientModel *model) // Provide initial values ui->clientVersion->setText(model->formatFullVersion()); ui->clientName->setText(model->clientName()); - ui->buildDate->setText(model->formatBuildDate()); + ui->dataDir->setText(model->dataDir()); ui->startupTime->setText(model->formatClientStartupTime()); setNumConnections(model->getNumConnections()); diff --git a/src/txdb-leveldb.cpp b/src/txdb-leveldb.cpp index de3a45f2..46187f1f 100644 --- a/src/txdb-leveldb.cpp +++ b/src/txdb-leveldb.cpp @@ -12,7 +12,7 @@ #include #include #include -#include +#include #include "kernel.h" #include "checkpoints.h" From bec9ccec293d38ad014af1ce1216107872cc9d2a Mon Sep 17 00:00:00 2001 From: 2a5A1Ghu1 <13294167+2a5A1Ghu1@users.noreply.github.com> Date: Sat, 14 Nov 2020 23:58:44 -0800 Subject: [PATCH 10/35] Update .gitignore --- .gitignore | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1fce8dca..ff6931af 100644 --- a/.gitignore +++ b/.gitignore @@ -98,4 +98,13 @@ qa/pull-tester/test.*/* !src/leveldb-*/Makefile -/doc/doxygen/ \ No newline at end of file +/doc/doxygen/ +*.Po +src/compat/.deps/.dirstamp +src/compat/.dirstamp +src/config/stamp-h1 +src/crypto/.dirstamp +src/crypto/common/.deps/.dirstamp +src/crypto/common/.dirstamp +src/support/.deps/.dirstamp +src/support/.dirstamp From a868dc80585bc527b9e83d523866cda82155d22a Mon Sep 17 00:00:00 2001 From: 2a5A1Ghu1 <13294167+2a5A1Ghu1@users.noreply.github.com> Date: Sat, 14 Nov 2020 23:59:59 -0800 Subject: [PATCH 11/35] [UPNP] Correct Lib Link --- src/net.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/net.cpp b/src/net.cpp index 1d4f5549..4db0c02e 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -20,10 +20,10 @@ #endif #ifdef USE_UPNP -#include -#include -#include -#include +#include +#include +#include +#include #endif #include @@ -751,7 +751,7 @@ void RefreshRecentConnections(int RefreshMinutes) SecondsPassed = CurrentTimestamp - LastRefreshstamp; MinutesPassed = SecondsPassed / 60; - if (MinutesPassed > RefreshMinutes - 2) + if (MinutesPassed > RefreshMinutes - 2) { FirstCycle = false; } @@ -765,7 +765,7 @@ void RefreshRecentConnections(int RefreshMinutes) if (FirstCycle == false) { - if (MinutesPassed < RefreshMinutes) + if (MinutesPassed < RefreshMinutes) { return; } @@ -786,7 +786,7 @@ void RefreshRecentConnections(int RefreshMinutes) if (!adb.Read(addrman)) LogPrintf("Invalid or missing peers.dat; recreating\n"); } - + LogPrintf("Loaded %i addresses from peers.dat %dms\n", addrman.size(), GetTimeMillis() - nStart); @@ -799,8 +799,8 @@ void RefreshRecentConnections(int RefreshMinutes) if (HaveNameProxy()) { AddOneShot(seed.host); - } - else + } + else { vector vIPs; vector vAdd; From b9dadd131fb8d8eb53965bada5ecc27e7f58eebe Mon Sep 17 00:00:00 2001 From: 2a5A1Ghu1 <13294167+2a5A1Ghu1@users.noreply.github.com> Date: Sun, 15 Nov 2020 00:42:11 -0800 Subject: [PATCH 12/35] [QT] Update Message Qt Paths --- .gitignore | 1 + src/qt/forms/messagepage.ui | 2 +- src/qt/messagemodel.cpp | 32 +++++++++---------- .../plugins/mrichtexteditor/mrichtextedit.cpp | 2 +- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index ff6931af..4bad53c5 100644 --- a/.gitignore +++ b/.gitignore @@ -108,3 +108,4 @@ src/crypto/common/.deps/.dirstamp src/crypto/common/.dirstamp src/support/.deps/.dirstamp src/support/.dirstamp +src/qt/plugins/mrichtexteditor/ui_mrichtextedit.h diff --git a/src/qt/forms/messagepage.ui b/src/qt/forms/messagepage.ui index d3a26097..1db2e78f 100644 --- a/src/qt/forms/messagepage.ui +++ b/src/qt/forms/messagepage.ui @@ -241,7 +241,7 @@ MRichTextEdit QWidget -

Z7}BhcZv9*pj1b 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 xwt$12OdE1#4Phqf>V;BXS+auvjYR+e diff --git a/src/qt/locale/bitcoin_fr_CA.qm b/src/qt/locale/bitcoin_fr_CA.qm deleted file mode 100644 index 2c6ad542f0397b7f1f36066932ccbf306068cd64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 93416 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 diff --git a/src/qt/locale/bitcoin_gl.qm b/src/qt/locale/bitcoin_gl.qm deleted file mode 100644 index 341017049fb5c1a69fa303eccf69febcd2fdd861..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58163 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 L$M&XKb#?z2qV=Cx diff --git a/src/qt/locale/bitcoin_he.qm b/src/qt/locale/bitcoin_he.qm deleted file mode 100644 index 72ef39713d20af787f3cbaa718adf94ee7ebf41d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43392 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 yLt_yil$J|s9;E3j75@z!f$eDk diff --git a/src/qt/locale/bitcoin_hi_IN.qm b/src/qt/locale/bitcoin_hi_IN.qm deleted file mode 100644 index b5049274e441ead8d55ecdbe7e23c4c1ef4b55bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16935 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 diff --git a/src/qt/locale/bitcoin_hr.qm b/src/qt/locale/bitcoin_hr.qm deleted file mode 100644 index c8e8d88d74e01709f2af823342222ad32cdd4689..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32617 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 diff --git a/src/qt/locale/bitcoin_hu.qm b/src/qt/locale/bitcoin_hu.qm deleted file mode 100644 index e52c66ec53287edf45809a4d4004264ecde0c873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42986 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 G=Kl|G^%l4Q diff --git a/src/qt/locale/bitcoin_id_ID.qm b/src/qt/locale/bitcoin_id_ID.qm deleted file mode 100644 index 8db0c7d6be7c0afe876b0cb9caaa6d83e9ae01f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40293 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 H6bM-jLM%aK55@xMiv0Q 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 diff --git a/src/qt/locale/bitcoin_it.qm b/src/qt/locale/bitcoin_it.qm deleted file mode 100644 index 187bc81ed527b6fc4485c98d21cf5b7a5014f3f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53332 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 diff --git a/src/qt/locale/bitcoin_ja.qm b/src/qt/locale/bitcoin_ja.qm deleted file mode 100644 index 694ef4dac88640265c9b409183ae292a51e506c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65499 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 W8R7n#m``@Q6zV>x_BF$0u>S)~fxZd= diff --git a/src/qt/locale/bitcoin_ka.qm b/src/qt/locale/bitcoin_ka.qm deleted file mode 100644 index ac9213aaa5bccedb3459d2c88bb746f4b17c211e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49852 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