diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml index 06e8de3..fecd67b 100644 --- a/.github/workflows/package.yml +++ b/.github/workflows/package.yml @@ -15,13 +15,10 @@ jobs: steps: - uses: actions/checkout@v1 - - name: Build - run: ./build.sh - - name: Package id: package run: | - cmake --build build --config Release --target package_deb + ./build.sh -t Release --pkg-type deb FILE=$(ls build/*.deb | head -1) echo "::set-output name=filename::$FILE" echo "::set-output name=name::$(basename $FILE)" diff --git a/CMakeLists.txt b/CMakeLists.txt index 9633d16..5192dfb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,15 +39,108 @@ elseif (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") endif() # -------------------------------- -# Additional project dirs +# Program # -------------------------------- -add_subdirectory( cli ) -add_subdirectory( docs ) +set (PROGRAM_EXE ${CMAKE_PROJECT_NAME}) + +set (PROGRAM_SOURCE + src/core/file.cpp + src/core/dictionary.cpp + src/core/string.cpp + src/core/isatty.cpp + src/crypto/base58.cpp + src/crypto/WIF.cpp + src/console.cpp + src/key_search.cpp + src/key_search_helpers.cpp + src/benchmark.cpp + src/main.cpp +) + +if (WIN32 AND NOT FORCE_ANSI) + set (PROGRAM_SOURCE ${PROGRAM_SOURCE} src/console_win32.cpp) +else() + # *nix should have ansi support. + set (PROGRAM_SOURCE ${PROGRAM_SOURCE} src/console_ansi.cpp) +endif() + +# Libraries +find_package(OpenSSL 1.1 REQUIRED) +set (PROGRAM_SOURCE ${PROGRAM_SOURCE} + src/crypto/openssl/ec.cpp + src/crypto/openssl/hash.cpp +) + +if (USE_THREADS) + find_package(Threads) + if (Threads_FOUND) + # Add preprocessor flag + add_definitions( "-DHAVE_THREADS=1" ) + set (PROGRAM_SOURCE ${PROGRAM_SOURCE} src/key_search_mt.cpp) + endif (Threads_FOUND) +endif (USE_THREADS) + +# Project config file +configure_file(src/config.h.in "${PROJECT_BINARY_DIR}/config.h" @ONLY) +include_directories(${PROJECT_BINARY_DIR}) + +# Include OpenSSL headers +include_directories( ${OPENSSL_INCLUDE_DIR} ) + +add_executable( ${PROGRAM_EXE} ${PROGRAM_SOURCE} ) + +target_link_libraries( ${PROGRAM_EXE} + PUBLIC + ${OPENSSL_LIBRARIES} + ${CMAKE_THREAD_LIBS_INIT} +) # -------------------------------- -# Additional install files +# Install # -------------------------------- +install(TARGETS ${PROGRAM_EXE} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + +# Win32 specific. +if (WIN32) + if (CMAKE_SIZEOF_VOID_P EQUAL 8) + set (OPENSSL_LIBCRYPTO_NAME libcrypto-1_1-x64) + else() + set (OPENSSL_LIBCRYPTO_NAME libcrypto-1_1) + endif() + set( OPENSSL_LIBCRYPTO_DLL ${OPENSSL_ROOT_DIR}/bin/${OPENSSL_LIBCRYPTO_NAME}.dll ) + + # Need to copy libcrypto dll to binary folder. + add_custom_command(TARGET ${PROGRAM_EXE} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${OPENSSL_LIBCRYPTO_DLL} + ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR} + ) + + # We also need to copy libcrypto dll during install + install(FILES ${OPENSSL_LIBCRYPTO_DLL} DESTINATION ${CMAKE_INSTALL_BINDIR}) +endif (WIN32) + +# Readme and license install(FILES README.md LICENSE LICENSE.bitcoin DESTINATION ${CMAKE_INSTALL_SHAREDIR}) + +# Documentation + +if (UNIX) + configure_file( docs/eosio-keygen.1.in ${PROJECT_BINARY_DIR}/man1/eosio-keygen.1 ) + + install(DIRECTORY ${PROJECT_BINARY_DIR}/man1 + DESTINATION ${CMAKE_INSTALL_MANDIR}) +endif (UNIX) + +# -------------------------------- +# Package +# -------------------------------- + +set( CPACK_DEBIAN_PACKAGE_PRIORITY "optional" ) +set( CPACK_DEBIAN_PACKAGE_SECTION "misc" ) +set( CPACK_DEBIAN_PACKAGE_DEPENDS "libssl1.1, libc6" ) + +include( cpack_custom ) diff --git a/CMakeModules/cpack_custom.cmake b/CMakeModules/cpack_custom.cmake new file mode 100644 index 0000000..6a23457 --- /dev/null +++ b/CMakeModules/cpack_custom.cmake @@ -0,0 +1,121 @@ +# Custom script to setup cpack properly. + +# -------------------------------- +# System variables +# -------------------------------- + +# check CMAKE_SIZEOF_VOID_P to know if we are 32 or 64 bit. +set( CPACK_SYSTEM_ARCH "x86" ) +if (CMAKE_SIZEOF_VOID_P EQUAL 8) + set( CPACK_SYSTEM_ARCH "${CPACK_SYSTEM_ARCH}_64" ) +endif() + +if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") + + # Set CPACK_SYSTEM_NAME, CPACK_SYSTEM_VERSION + # and CPACK_DEBIAN_PACKAGE_ARCHITECTURE correctly for debian based systems. + execute_process(COMMAND lsb_release -is OUTPUT_VARIABLE SYS OUTPUT_STRIP_TRAILING_WHITESPACE) + if (SYS) + string(TOLOWER "${SYS}" CPACK_SYSTEM_NAME ) + + # Set CPACK_SYSTEM_VERSION + execute_process(COMMAND lsb_release -rs OUTPUT_VARIABLE SYS_VER OUTPUT_STRIP_TRAILING_WHITESPACE) + if (SYS_VER) + set( CPACK_SYSTEM_VERSION ${SYS_VER} ) + endif(SYS_VER) + + # Try setting CPACK_DEBIAN_PACKAGE_ARCHITECTURE based on dpkg + if (NOT CPACK_DEBIAN_PACKAGE_ARCHITECTURE) + execute_process( + COMMAND dpkg --print-architecture + OUTPUT_VARIABLE ARCH + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + + if (ARCH) + set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE ${ARCH}) + endif() + endif() + endif(SYS) + + + # set CPACK_DEBIAN_PACKAGE_ARCHITECTURE to somthing sane by default. + if (NOT CPACK_DEBIAN_PACKAGE_ARCHITECTURE) + + # debian uses different names for 32/64 bit. + if (CPACK_SYSTEM_ARCH STREQUAL "x86") + set( ARCH "i386" ) + else() + set( ARCH "amd64" ) + endif() + + set(CPACK_DEBIAN_PACKAGE_ARCHITECTURE ${ARCH}) + endif() + +endif() + +# CPACK_SYSTEM_NAME defaults are weird. so we set good default here. +if (NOT CPACK_SYSTEM_NAME) + set (CPACK_SYSTEM_NAME ${CMAKE_SYSTEM_NAME}) +endif() + +# CPACK_SYSTEM_VERSION does not exist in original CPack. so we set a default here. +if (NOT CPACK_SYSTEM_VERSION) + set (CPACK_SYSTEM_VERSION ${CMAKE_SYSTEM_VERSION}) +endif() + + +# -------------------------------- +# Package variables +# -------------------------------- + + +# Forward some variables not handled by CPack. +if (NOT CPACK_PACKAGE_CONTACT AND PROJECT_MAINTAINER) + set( CPACK_PACKAGE_CONTACT ${PROJECT_MAINTAINER} ) +endif() + +# Set "correct" filename that also include system version. +if (CPACK_SYSTEM_VERSION) + set( CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}_${CPACK_SYSTEM_NAME}-${CPACK_SYSTEM_VERSION}_${CPACK_SYSTEM_ARCH}" ) +else() + set( CPACK_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}_${CPACK_SYSTEM_NAME}_${CPACK_SYSTEM_ARCH}" ) +endif() + + +# .deb specific + +# Set release version default 1. +set( CPACK_DEBIAN_PACKAGE_RELEASE "1" CACHE STRING "Debian package release version" ) + +# For some reason CPackDeb does not honor CPACK_PACKAGE_HOMEPAGE_URL (that is set correctly) +# if CPACK_DEBIAN_PACKAGE_HOMEPAGE (that the docs says it should.) +# So we have to do it here. +set( CPACK_DEBIAN_PACKAGE_HOMEPAGE "${PROJECT_HOMEPAGE_URL}" ) + +# Set "correct" filename that also include system version and architecture. +set( CPACK_DEBIAN_FILE_NAME + "${PROJECT_NAME}-${PROJECT_VERSION}-${CPACK_DEBIAN_PACKAGE_RELEASE}-${CPACK_SYSTEM_NAME}-${CPACK_SYSTEM_VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}.deb" +) + + +# -------------------------------- +# Generator default +# -------------------------------- + + +# Defult to gzip tar on unix. zip otherwise. +if (NOT CPACK_GENERATOR) + if (UNIX) + set( CPACK_GENERATOR "TGZ" ) + else() + set( CPACK_GENERATOR "ZIP" ) + endif() +endif() + + +# -------------------------------- +# Include original CPack module. +# -------------------------------- + +include( CPack ) diff --git a/CMakeModules/package.cmake b/CMakeModules/package.cmake deleted file mode 100644 index a5ba51f..0000000 --- a/CMakeModules/package.cmake +++ /dev/null @@ -1,65 +0,0 @@ - -# -------------------------------- -# Info -# -------------------------------- -set( PACKAGE_NAME ${PROJECT_NAME} ) -set( PACKAGE_DESCRIPTION ${PROJECT_DESCRIPTION} ) -set( PACKAGE_VERSION "${PROJECT_VERSION}" ) -set( PACKAGE_HOMEPAGE_URL ${PROJECT_HOMEPAGE_URL} ) -set( PACKAGE_MAINTAINER ${PROJECT_MAINTAINER}) - -set( PACKAGE_PLATFORM "x86" ) -if (CMAKE_SIZEOF_VOID_P EQUAL 8) - set( PACKAGE_PLATFORM "${PACKAGE_PLATFORM}_64" ) -endif() - -# -------------------------------- -# Debian script -# -------------------------------- - -if (UNIX) # Only include in bash environments. - - execute_process( - COMMAND lsb_release -rs - OUTPUT_VARIABLE UBUNTU_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE - ) - - # Debian uses different names for 32 and 64 bit. - if (PACKAGE_PLATFORM EQUAL "x86") - set( PACKAGE_DEB_PLATFORM "i386" ) - else() - set( PACKAGE_DEB_PLATFORM "amd64" ) - endif() - - set( PACKAGE_DEB_RELEASE 1 CACHE STRING "Debian package release number") - set( PACKAGE_DEB_VERSION ${PACKAGE_VERSION}-${PACKAGE_DEB_RELEASE} ) - set( PACKAGE_DEB_FILENAME ${PACKAGE_NAME}_${PACKAGE_DEB_VERSION}-ubuntu-${UBUNTU_VERSION}_${PACKAGE_DEB_PLATFORM}.deb ) - set( DEB_ROOT "${CMAKE_CURRENT_BINARY_DIR}/debroot" ) - - configure_file(debian_control.in ${DEB_ROOT}/DEBIAN/control @ONLY) - - add_custom_target(package_deb - COMMAND ${CMAKE_COMMAND} --install . --prefix "${DEB_ROOT}${CMAKE_INSTALL_PREFIX}" - COMMAND fakeroot dpkg-deb --build ${DEB_ROOT} ${PACKAGE_DEB_FILENAME} > /dev/null - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - ) - - add_dependencies(package_deb ${PROGRAM_EXE}) -endif (UNIX) - -# -------------------------------- -# Windows -# -------------------------------- -if (WIN32) - - set ( PACKAGE_FILENAME "${PACKAGE_NAME}_${PACKAGE_VERSION}-windows-${PACKAGE_PLATFORM}" ) - - add_custom_target(package - COMMAND ${CMAKE_COMMAND} --install . --prefix "${PACKAGE_FILENAME}" - COMMAND ${CMAKE_COMMAND} -E tar c "${PACKAGE_FILENAME}.zip" --format=zip "${PACKAGE_FILENAME}" - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - ) - - add_dependencies(package ${PROGRAM_EXE}) -endif (WIN32) diff --git a/build.sh b/build.sh index ae356b0..05ef766 100755 --- a/build.sh +++ b/build.sh @@ -1,11 +1,11 @@ #!/bin/bash function usage() { - echo "Usage: ${0##*/} [ -h|--help ] [ -t|--type Debug|Release|RelWithDebInfo|MinSizeRel ] [ --disable-threads ] [ --force-ansi ]" + echo "Usage: ${0##*/} [ -h|--help ] [ -t|--type Debug|Release|RelWithDebInfo|MinSizeRel ] [--pkg-type deb|zip|tgz] [ --disable-threads ] [ --force-ansi ]" exit 1 } -options=$(getopt -n "${0##*/}" -o "lht:" -l "help,type:,disable-threads,force-ansi" -- "$@") +options=$(getopt -n "${0##*/}" -o "lht:" -l "help,type:,pkg-type:,disable-threads,force-ansi" -- "$@") [ $? -eq 0 ] || usage @@ -24,6 +24,15 @@ while true; do } ARGS="${ARGS} -DCMAKE_BUILD_TYPE=${1}" ;; + --pkg-type) + shift + [[ ! "$1" =~ ^(deb|zip|tgz)$ ]] && { + echo "Incorrect package type '$1' provided" + usage + } + TARGET="package" + ARGS="${ARGS} -DCPACK_GENERATOR=${1^^}" + ;; --disable-threads) ARGS="${ARGS} -DUSE_THREADS=OFF" ;; --force-ansi) @@ -41,5 +50,5 @@ done cmake -B build $ARGS . if [ ${ONLY_CONFIG} -eq 0 ]; then - cmake --build build --clean-first --target + cmake --build build --clean-first --target ${TARGET} fi diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt deleted file mode 100644 index 9d9a555..0000000 --- a/cli/CMakeLists.txt +++ /dev/null @@ -1,83 +0,0 @@ -cmake_minimum_required(VERSION 3.15) - -# -------------------------------- -# Program -# -------------------------------- - -set (PROGRAM_EXE ${CMAKE_PROJECT_NAME}) - -set (PROGRAM_SOURCE - src/core/file.cpp - src/core/dictionary.cpp - src/core/string.cpp - src/core/isatty.cpp - src/crypto/base58.cpp - src/crypto/WIF.cpp - src/console.cpp - src/key_search.cpp - src/key_search_helpers.cpp - src/benchmark.cpp - src/main.cpp -) - -if (WIN32 AND NOT FORCE_ANSI) - set (PROGRAM_SOURCE ${PROGRAM_SOURCE} src/console_win32.cpp) -else() - # *nix should have ansi support. - set (PROGRAM_SOURCE ${PROGRAM_SOURCE} src/console_ansi.cpp) -endif() - -# Libraries -find_package(OpenSSL 1.1 REQUIRED) -set (PROGRAM_SOURCE ${PROGRAM_SOURCE} - src/crypto/openssl/ec.cpp - src/crypto/openssl/hash.cpp -) - -if (USE_THREADS) - find_package(Threads) - if (Threads_FOUND) - # Add preprocessor flag - add_definitions( "-DHAVE_THREADS=1" ) - set (PROGRAM_SOURCE ${PROGRAM_SOURCE} src/key_search_mt.cpp) - endif (Threads_FOUND) -endif (USE_THREADS) - -# Project config file -configure_file(src/config.h.in "${PROJECT_BINARY_DIR}/config.h" @ONLY) -include_directories(${PROJECT_BINARY_DIR}) - -# Include OpenSSL headers -include_directories( ${OPENSSL_INCLUDE_DIR} ) - -add_executable( ${PROGRAM_EXE} ${PROGRAM_SOURCE} ) - -target_link_libraries( ${PROGRAM_EXE} - PUBLIC - ${OPENSSL_LIBRARIES} - ${CMAKE_THREAD_LIBS_INIT} -) - -install(TARGETS ${PROGRAM_EXE} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) - -# Win32 specific. -if (WIN32) - if (CMAKE_SIZEOF_VOID_P EQUAL 8) - set (OPENSSL_LIBCRYPTO_NAME libcrypto-1_1-x64) - else() - set (OPENSSL_LIBCRYPTO_NAME libcrypto-1_1) - endif() - set( OPENSSL_LIBCRYPTO_DLL ${OPENSSL_ROOT_DIR}/bin/${OPENSSL_LIBCRYPTO_NAME}.dll ) - - # Need to copy libcrypto dll to binary folder. - add_custom_command(TARGET ${PROGRAM_EXE} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${OPENSSL_LIBCRYPTO_DLL} - ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR} - ) - - # We also need to copy libcrypto dll during install - install(FILES ${OPENSSL_LIBCRYPTO_DLL} DESTINATION ${CMAKE_INSTALL_BINDIR}) -endif (WIN32) - -include( package ) diff --git a/cli/debian_control.in b/cli/debian_control.in deleted file mode 100644 index e8f3f23..0000000 --- a/cli/debian_control.in +++ /dev/null @@ -1,9 +0,0 @@ -Package: @PACKAGE_NAME@ -Version: @PACKAGE_DEB_VERSION@ -Description: @PACKAGE_DESCRIPTION@ -Section: misc -Priority: optional -Architecture: @PACKAGE_DEB_PLATFORM@ -Homepage: @PACKAGE_HOMEPAGE_URL@ -Maintainer: @PACKAGE_MAINTAINER@ -Depends: libssl1.1, libc6 diff --git a/docs/CMakeLists.txt b/docs/CMakeLists.txt deleted file mode 100644 index 2ca518c..0000000 --- a/docs/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ - -if (UNIX) - configure_file( eosio-keygen.1.in ${PROJECT_BINARY_DIR}/man1/eosio-keygen.1 ) - - install(DIRECTORY ${PROJECT_BINARY_DIR}/man1 - DESTINATION ${CMAKE_INSTALL_MANDIR}) -endif (UNIX) diff --git a/cli/src/benchmark.cpp b/src/benchmark.cpp similarity index 100% rename from cli/src/benchmark.cpp rename to src/benchmark.cpp diff --git a/cli/src/benchmark.h b/src/benchmark.h similarity index 100% rename from cli/src/benchmark.h rename to src/benchmark.h diff --git a/cli/src/config.h.in b/src/config.h.in similarity index 100% rename from cli/src/config.h.in rename to src/config.h.in diff --git a/cli/src/console.cpp b/src/console.cpp similarity index 100% rename from cli/src/console.cpp rename to src/console.cpp diff --git a/cli/src/console.h b/src/console.h similarity index 100% rename from cli/src/console.h rename to src/console.h diff --git a/cli/src/console_ansi.cpp b/src/console_ansi.cpp similarity index 100% rename from cli/src/console_ansi.cpp rename to src/console_ansi.cpp diff --git a/cli/src/console_win32.cpp b/src/console_win32.cpp similarity index 100% rename from cli/src/console_win32.cpp rename to src/console_win32.cpp diff --git a/cli/src/core/dictionary.cpp b/src/core/dictionary.cpp similarity index 100% rename from cli/src/core/dictionary.cpp rename to src/core/dictionary.cpp diff --git a/cli/src/core/dictionary.h b/src/core/dictionary.h similarity index 100% rename from cli/src/core/dictionary.h rename to src/core/dictionary.h diff --git a/cli/src/core/file.cpp b/src/core/file.cpp similarity index 100% rename from cli/src/core/file.cpp rename to src/core/file.cpp diff --git a/cli/src/core/file.h b/src/core/file.h similarity index 100% rename from cli/src/core/file.h rename to src/core/file.h diff --git a/cli/src/core/isatty.cpp b/src/core/isatty.cpp similarity index 100% rename from cli/src/core/isatty.cpp rename to src/core/isatty.cpp diff --git a/cli/src/core/isatty.h b/src/core/isatty.h similarity index 100% rename from cli/src/core/isatty.h rename to src/core/isatty.h diff --git a/cli/src/core/string.cpp b/src/core/string.cpp similarity index 100% rename from cli/src/core/string.cpp rename to src/core/string.cpp diff --git a/cli/src/core/string.h b/src/core/string.h similarity index 100% rename from cli/src/core/string.h rename to src/core/string.h diff --git a/cli/src/crypto/WIF.cpp b/src/crypto/WIF.cpp similarity index 100% rename from cli/src/crypto/WIF.cpp rename to src/crypto/WIF.cpp diff --git a/cli/src/crypto/WIF.h b/src/crypto/WIF.h similarity index 100% rename from cli/src/crypto/WIF.h rename to src/crypto/WIF.h diff --git a/cli/src/crypto/base58.cpp b/src/crypto/base58.cpp similarity index 100% rename from cli/src/crypto/base58.cpp rename to src/crypto/base58.cpp diff --git a/cli/src/crypto/base58.h b/src/crypto/base58.h similarity index 100% rename from cli/src/crypto/base58.h rename to src/crypto/base58.h diff --git a/cli/src/crypto/checksum.h b/src/crypto/checksum.h similarity index 100% rename from cli/src/crypto/checksum.h rename to src/crypto/checksum.h diff --git a/cli/src/crypto/ec.h b/src/crypto/ec.h similarity index 100% rename from cli/src/crypto/ec.h rename to src/crypto/ec.h diff --git a/cli/src/crypto/hash.h b/src/crypto/hash.h similarity index 100% rename from cli/src/crypto/hash.h rename to src/crypto/hash.h diff --git a/cli/src/crypto/openssl/ec.cpp b/src/crypto/openssl/ec.cpp similarity index 100% rename from cli/src/crypto/openssl/ec.cpp rename to src/crypto/openssl/ec.cpp diff --git a/cli/src/crypto/openssl/hash.cpp b/src/crypto/openssl/hash.cpp similarity index 100% rename from cli/src/crypto/openssl/hash.cpp rename to src/crypto/openssl/hash.cpp diff --git a/cli/src/crypto/types.h b/src/crypto/types.h similarity index 100% rename from cli/src/crypto/types.h rename to src/crypto/types.h diff --git a/cli/src/key_search.cpp b/src/key_search.cpp similarity index 100% rename from cli/src/key_search.cpp rename to src/key_search.cpp diff --git a/cli/src/key_search.h b/src/key_search.h similarity index 100% rename from cli/src/key_search.h rename to src/key_search.h diff --git a/cli/src/key_search_helpers.cpp b/src/key_search_helpers.cpp similarity index 100% rename from cli/src/key_search_helpers.cpp rename to src/key_search_helpers.cpp diff --git a/cli/src/key_search_helpers.h b/src/key_search_helpers.h similarity index 100% rename from cli/src/key_search_helpers.h rename to src/key_search_helpers.h diff --git a/cli/src/key_search_mt.cpp b/src/key_search_mt.cpp similarity index 100% rename from cli/src/key_search_mt.cpp rename to src/key_search_mt.cpp diff --git a/cli/src/main.cpp b/src/main.cpp similarity index 100% rename from cli/src/main.cpp rename to src/main.cpp