diff --git a/cmake/modules/InstallationHelper.cmake b/cmake/modules/InstallationHelper.cmake index c734d06a3..3e4f7ea62 100644 --- a/cmake/modules/InstallationHelper.cmake +++ b/cmake/modules/InstallationHelper.cmake @@ -1,219 +1,221 @@ # This file contains facilities for installing the files. include(GNUInstallDirs) include(SanitizeHelper) function(_add_install_target COMPONENT) cmake_parse_arguments(ARG "EXCLUDE_FROM_ALL" "" "DEPENDS" ${ARGN} ) sanitize_target_name("install-" "${COMPONENT}" INSTALL_TARGET) if(NOT TARGET ${INSTALL_TARGET}) add_custom_target(${INSTALL_TARGET} COMMENT "Installing component ${COMPONENT}" COMMAND "${CMAKE_COMMAND}" -E env CMAKE_INSTALL_ALWAYS=ON "${CMAKE_COMMAND}" -DCOMPONENT="${COMPONENT}" -DCMAKE_INSTALL_PREFIX="${CMAKE_INSTALL_PREFIX}" -P cmake_install.cmake WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" ) if(TARGET install-all) add_dependencies(install-all ${INSTALL_TARGET}) endif() endif() # Other arguments are additional dependencies if(ARG_DEPENDS) add_dependencies(${INSTALL_TARGET} ${ARG_DEPENDS}) endif() if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "Darwin") if(NOT TARGET "install-${COMPONENT}-debug") add_custom_target("install-${COMPONENT}-debug" COMMENT "Splitting out the debug symbols for component ${COMPONENT}" COMMAND "${CMAKE_SOURCE_DIR}/cmake/utils/split-installed-component.sh" "${CMAKE_BINARY_DIR}/contrib/devtools/split-debug.sh" "${CMAKE_BINARY_DIR}/install_manifest_${COMPONENT}.txt" "${CMAKE_INSTALL_BINDIR}" "${CMAKE_INSTALL_LIBDIR}" DEPENDS "${INSTALL_TARGET}" "${CMAKE_BINARY_DIR}/contrib/devtools/split-debug.sh" ) endif() if(NOT ARG_EXCLUDE_FROM_ALL AND TARGET install-debug) add_dependencies(install-debug "install-${COMPONENT}-debug") endif() if(TARGET install-all-debug) add_dependencies(install-all-debug "install-${COMPONENT}-debug") endif() endif() endfunction() function(install_target _target) cmake_parse_arguments(ARG "EXCLUDE_FROM_ALL" "COMPONENT" "" ${ARGN} ) if(NOT ARG_COMPONENT) set(ARG_COMPONENT ${PROJECT_NAME}) endif() if(ARG_EXCLUDE_FROM_ALL) set(INSTALL_EXCLUDE_FROM_ALL EXCLUDE_FROM_ALL) endif() set(COMMON_INSTALL_ARGUMENTS COMPONENT ${ARG_COMPONENT} ${INSTALL_EXCLUDE_FROM_ALL} ${ARG_UNPARSED_ARGUMENTS} ) install( TARGETS ${_target} RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" ${COMMON_INSTALL_ARGUMENTS} ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" ${COMMON_INSTALL_ARGUMENTS} LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" ${COMMON_INSTALL_ARGUMENTS} PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" ${COMMON_INSTALL_ARGUMENTS} ) _add_install_target("${ARG_COMPONENT}" ${INSTALL_EXCLUDE_FROM_ALL} DEPENDS ${_target} ) endfunction() function(install_shared_library NAME) cmake_parse_arguments(ARG "EXCLUDE_FROM_ALL" "" "PUBLIC_HEADER" ${ARGN} ) set(_sources ${ARG_UNPARSED_ARGUMENTS}) get_target_property(_target_type ${NAME} TYPE) if(_target_type STREQUAL "SHARED_LIBRARY") set(_shared_name "${NAME}") target_sources(${NAME} PRIVATE ${_sources}) else() set(_shared_name "${NAME}-shared") add_library(${_shared_name} SHARED ${_sources}) target_link_libraries(${_shared_name} ${NAME}) endif() if(ARG_PUBLIC_HEADER) set_property(TARGET ${_shared_name} PROPERTY PUBLIC_HEADER ${ARG_PUBLIC_HEADER}) endif() if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") # FIXME For compatibility reason with autotools, the version is set # to 0.0.0 (major being actually 0). This is obviously wrong and the # version of the library should reflect the version of the release. # On platforms other than linux, only the major version (0) is used. # Replace the VERSION line with the statement below to set the # correct version: # set(_properties VERSION "${CMAKE_PROJECT_VERSION}") list(APPEND _properties VERSION "${CMAKE_PROJECT_VERSION_MAJOR}.0.0") else() list(APPEND _properties VERSION "${CMAKE_PROJECT_VERSION_MAJOR}") endif() # For autotools compatibility, rename the library to ${OUTPUT_NAME}-0.dll if(${CMAKE_SYSTEM_NAME} MATCHES "Windows") list(APPEND _properties OUTPUT_NAME "${NAME}-${CMAKE_PROJECT_VERSION_MAJOR}") # DLL_EXPORT is defined by libtool, and is expected by some sources. target_compile_definitions(${_shared_name} PRIVATE DLL_EXPORT) else() list(APPEND _properties OUTPUT_NAME "${NAME}") endif() list(APPEND _properties SOVERSION "${CMAKE_PROJECT_VERSION_MAJOR}") set_target_properties(${_shared_name} PROPERTIES ${_properties}) # Forward EXCLUDE_FROM_ALL if set if(ARG_EXCLUDE_FROM_ALL) set(FORWARD_EXCLUDE_FROM_ALL EXCLUDE_FROM_ALL) endif() install_target(${_shared_name} ${FORWARD_EXCLUDE_FROM_ALL}) endfunction() function(install_manpage TARGET) set(MAN_DESTINATION "${CMAKE_INSTALL_MANDIR}/man1") set(MAN_PAGE "${CMAKE_BINARY_DIR}/doc/man/${TARGET}.1") add_custom_command( OUTPUT "${MAN_PAGE}" COMMENT "Generating man page for ${TARGET}" COMMAND "${CMAKE_SOURCE_DIR}/doc/man/gen-manpages.sh" "$" "$" "${MAN_PAGE}" DEPENDS bitcoind "${TARGET}" ) add_custom_target(gen-manpage-${TARGET} DEPENDS "${MAN_PAGE}" ) install( FILES "${MAN_PAGE}" DESTINATION "${MAN_DESTINATION}" COMPONENT manpage-${TARGET} EXCLUDE_FROM_ALL ) _add_install_target(manpage-${TARGET} DEPENDS gen-manpage-${TARGET} + EXCLUDE_FROM_ALL ) _add_install_target(manpages DEPENDS install-manpage-${TARGET} + EXCLUDE_FROM_ALL ) if(NOT TARGET install-manpages-html) set(INPUT_DIR "${CMAKE_INSTALL_PREFIX}/${MAN_DESTINATION}") set(OUTPUT_DIR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_MANDIR}/html") configure_file( "${CMAKE_SOURCE_DIR}/cmake/templates/man2html.sh.in" "${CMAKE_BINARY_DIR}/config/man2html.sh" @ONLY ) add_custom_target(install-manpages-html COMMENT "Generating man pages for web rendering" COMMAND "${CMAKE_BINARY_DIR}/config/man2html.sh" DEPENDS install-manpages "${CMAKE_BINARY_DIR}/config/man2html.sh" ) endif() endfunction() diff --git a/contrib/gitian-descriptors/gitian-osx.yml b/contrib/gitian-descriptors/gitian-osx.yml index ee44fedb5..44f5f4d35 100644 --- a/contrib/gitian-descriptors/gitian-osx.yml +++ b/contrib/gitian-descriptors/gitian-osx.yml @@ -1,201 +1,200 @@ --- name: "bitcoin-abc-osx" enable_cache: true distro: "debian" suites: - "buster" architectures: - "amd64" packages: - "autoconf" - "automake" - "bsdmainutils" - "ca-certificates" - "curl" - "faketime" - "fonts-tuffy" - "g++" - "git" - "imagemagick" - "libbz2-dev" - "libcap-dev" - "librsvg2-bin" - "libtiff-tools" - "libtinfo5" - "libtool" - "libz-dev" - "ninja-build" - "pkg-config" - "python3" - "python3-dev" - "python3-setuptools" # FIXME: these dependencies are only required to make CMake happy when building # native tools. They can be removed when the `NativeExecutable.cmake` gets # improved to avoid requiring all the bitcoin-abc dependencies. - "libboost-all-dev" - "libevent-dev" - "libssl-dev" repositories: - "distribution": "buster-backports" "source": "deb http://deb.debian.org/debian/ buster-backports main" packages: - "cmake" remotes: - "url": "https://github.com/Bitcoin-ABC/bitcoin-abc.git" "dir": "bitcoin" files: - "MacOSX10.14.sdk.tar.gz" script: | WRAP_DIR=$HOME/wrapped HOSTS="x86_64-apple-darwin16" # CMake toolchain file name differ from host name declare -A CMAKE_TOOLCHAIN_FILE CMAKE_TOOLCHAIN_FILE[x86_64-apple-darwin16]=OSX.cmake FAKETIME_HOST_PROGS="" FAKETIME_PROGS="ar ranlib date dmg genisoimage" export QT_RCC_TEST=1 export QT_RCC_SOURCE_DATE_OVERRIDE=1 export GZIP="-9n" export TAR_OPTIONS="--mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME"" export TZ="UTC" export BUILD_DIR=`pwd` mkdir -p ${WRAP_DIR} if test -n "$GBUILD_CACHE_ENABLED"; then export SOURCES_PATH=${GBUILD_COMMON_CACHE} export BASE_CACHE=${GBUILD_PACKAGE_CACHE} mkdir -p ${BASE_CACHE} ${SOURCES_PATH} fi export ZERO_AR_DATE=1 function create_global_faketime_wrappers { for prog in ${FAKETIME_PROGS}; do echo '#!/usr/bin/env bash' > ${WRAP_DIR}/${prog} echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog} echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog} echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${prog} echo "\$REAL \$@" >> $WRAP_DIR/${prog} chmod +x ${WRAP_DIR}/${prog} done } function create_per-host_faketime_wrappers { for i in $HOSTS; do for prog in ${FAKETIME_HOST_PROGS}; do echo '#!/usr/bin/env bash' > ${WRAP_DIR}/${i}-${prog} echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog} echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${i}-${prog} echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog} chmod +x ${WRAP_DIR}/${i}-${prog} done done } # Faketime for depends so intermediate results are comparable export PATH_orig=${PATH} create_global_faketime_wrappers "2000-01-01 12:00:00" create_per-host_faketime_wrappers "2000-01-01 12:00:00" export PATH=${WRAP_DIR}:${PATH} cd bitcoin SOURCEDIR=`pwd` BASEPREFIX=`pwd`/depends mkdir -p ${BASEPREFIX}/SDKs tar -C ${BASEPREFIX}/SDKs -xf ${BUILD_DIR}/MacOSX10.14.sdk.tar.gz # Build dependencies for each host for i in $HOSTS; do make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}" done # Faketime for binaries export PATH=${PATH_orig} create_global_faketime_wrappers "${REFERENCE_DATETIME}" create_per-host_faketime_wrappers "${REFERENCE_DATETIME}" export PATH=${WRAP_DIR}:${PATH} mkdir -p source_package pushd source_package cmake -GNinja .. \ -DBUILD_BITCOIN_WALLET=OFF \ -DBUILD_BITCOIN_ZMQ=OFF \ -DBUILD_BITCOIN_ZMQ=OFF \ -DBUILD_BITCOIN_SEEDER=OFF \ -DBUILD_BITCOIN_CLI=OFF \ -DBUILD_BITCOIN_TX=OFF \ -DBUILD_BITCOIN_QT=OFF \ -DBUILD_LIBBITCOINCONSENSUS=OFF \ -DENABLE_CLANG_TIDY=OFF \ -DENABLE_QRCODE=OFF \ -DENABLE_UPNP=OFF \ -DUSE_JEMALLOC=OFF ninja package_source SOURCEDIST=`echo bitcoin-abc-*.tar.gz` mv ${SOURCEDIST} .. popd DISTNAME=`echo ${SOURCEDIST} | sed 's/.tar.*//'` # Correct tar file order mkdir -p temp pushd temp tar xf ../$SOURCEDIST find bitcoin-abc-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST popd ORIGPATH="$PATH" # Extract the release tarball into a dir for each host and build for i in ${HOSTS}; do export PATH=${BASEPREFIX}/${i}/native/bin:${ORIGPATH} mkdir -p distsrc-${i} cd distsrc-${i} INSTALLPATH=`pwd`/installed/${DISTNAME} mkdir -p ${INSTALLPATH} tar --strip-components=1 -xf ../$SOURCEDIST cmake -GNinja .. \ -DCMAKE_TOOLCHAIN_FILE=${SOURCEDIR}/cmake/platforms/${CMAKE_TOOLCHAIN_FILE[${i}]} \ -DCLIENT_VERSION_IS_RELEASE=ON \ -DENABLE_CLANG_TIDY=OFF \ -DENABLE_REDUCE_EXPORTS=ON \ -DCMAKE_INSTALL_PREFIX=${INSTALLPATH} \ -DCCACHE=OFF \ -DGENISOIMAGE_EXECUTABLE="${WRAP_DIR}/genisoimage" ninja ninja install/strip - ninja install-manpages export PYTHONPATH="${BASEPREFIX}/${i}/native/lib/python3/dist-packages:${PYTHONPATH}" ninja osx-deploydir OSX_VOLNAME="$(cat osx_volname)" mkdir -p unsigned-app-${i} cp osx_volname unsigned-app-${i}/ cp contrib/macdeploy/detached-sig-apply.sh unsigned-app-${i} cp contrib/macdeploy/detached-sig-create.sh unsigned-app-${i} cp ${BASEPREFIX}/${i}/native/bin/dmg ${BASEPREFIX}/${i}/native/bin/genisoimage unsigned-app-${i} cp ${BASEPREFIX}/${i}/native/bin/${i}-codesign_allocate unsigned-app-${i}/codesign_allocate cp ${BASEPREFIX}/${i}/native/bin/${i}-pagestuff unsigned-app-${i}/pagestuff mv dist unsigned-app-${i} pushd unsigned-app-${i} find . | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-osx-unsigned.tar.gz popd ninja osx-dmg ${WRAP_DIR}/dmg dmg "${OSX_VOLNAME}.dmg" ${OUTDIR}/${DISTNAME}-osx-unsigned.dmg cd installed find -path "*.app*" -type f -executable -exec mv {} ${DISTNAME}/bin/bitcoin-qt \; find ${DISTNAME} -not -path "*.app*" | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}.tar.gz cd ../../ done mkdir -p $OUTDIR/src mv $SOURCEDIST $OUTDIR/src mv ${OUTDIR}/${DISTNAME}-x86_64-*.tar.gz ${OUTDIR}/${DISTNAME}-osx64.tar.gz