From 639193d3737f4fb2958332577661e4e1ede1ddff Mon Sep 17 00:00:00 2001 From: Huang-Ming Huang Date: Thu, 21 May 2020 14:23:17 -0500 Subject: [PATCH 1/4] Add unity build support for some targets --- libraries/chain/CMakeLists.txt | 4 ++++ libraries/chainbase/CMakeLists.txt | 4 ++++ libraries/fc/CMakeLists.txt | 5 +++++ libraries/fc/src/crypto/elliptic_secp256k1.cpp | 3 ++- libraries/fc/src/crypto/private_key.cpp | 6 +++--- libraries/fc/src/crypto/signature.cpp | 4 ++-- libraries/rodeos/CMakeLists.txt | 4 ++++ libraries/rodeos/include/b1/rodeos/rodeos.hpp | 1 + libraries/state_history/CMakeLists.txt | 4 ++++ libraries/state_history/trace_converter.cpp | 2 +- 10 files changed, 30 insertions(+), 7 deletions(-) diff --git a/libraries/chain/CMakeLists.txt b/libraries/chain/CMakeLists.txt index 695835e262f..6863e3b604f 100644 --- a/libraries/chain/CMakeLists.txt +++ b/libraries/chain/CMakeLists.txt @@ -140,6 +140,10 @@ target_include_directories( eosio_chain add_library(eosio_chain_wrap INTERFACE ) target_link_libraries(eosio_chain_wrap INTERFACE eosio_chain) +if(ENABLE_UNITY_BUILD) + set_target_properties(eosio_chain PROPERTIES UNITY_BUILD TRUE) +endif() + if("eos-vm-oc" IN_LIST EOSIO_WASM_RUNTIMES) target_link_libraries(eosio_chain_wrap INTERFACE "-Wl,-wrap=main") endif() diff --git a/libraries/chainbase/CMakeLists.txt b/libraries/chainbase/CMakeLists.txt index 1b005af0fc6..8893033b4a4 100644 --- a/libraries/chainbase/CMakeLists.txt +++ b/libraries/chainbase/CMakeLists.txt @@ -67,6 +67,10 @@ add_library( chainbase src/chainbase.cpp src/pinnable_mapped_file.cpp ${HEADERS} target_link_libraries( chainbase Boost::filesystem ${PLATFORM_LIBRARIES} ) target_include_directories( chainbase PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include" ) +if(ENABLE_UNITY_BUILD) + set_target_properties(chainbase PROPERTIES UNITY_BUILD TRUE) +endif() + if(WIN32) target_link_libraries( chainbase ws2_32 mswsock ) endif() diff --git a/libraries/fc/CMakeLists.txt b/libraries/fc/CMakeLists.txt index b21fd6cea88..93f06c7c207 100644 --- a/libraries/fc/CMakeLists.txt +++ b/libraries/fc/CMakeLists.txt @@ -123,6 +123,11 @@ list(APPEND sources ${fc_headers}) setup_library( fc SOURCES ${sources} LIBRARY_TYPE STATIC DONT_INSTALL_LIBRARY ) +if(ENABLE_UNITY_BUILD) + set_target_properties(fc PROPERTIES UNITY_BUILD TRUE) +endif() + + function(detect_thread_name) include(CheckSymbolExists) list(APPEND CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE) diff --git a/libraries/fc/src/crypto/elliptic_secp256k1.cpp b/libraries/fc/src/crypto/elliptic_secp256k1.cpp index 47b55b79095..826d57358f3 100644 --- a/libraries/fc/src/crypto/elliptic_secp256k1.cpp +++ b/libraries/fc/src/crypto/elliptic_secp256k1.cpp @@ -63,10 +63,11 @@ namespace fc { namespace ecc { } static const public_key_data empty_pub; - static const private_key_secret empty_priv; + fc::sha512 private_key::get_shared_secret( const public_key& other )const { + static const private_key_secret empty_priv; FC_ASSERT( my->_key != empty_priv ); FC_ASSERT( other.my->_key != empty_pub ); public_key_data pub(other.my->_key); diff --git a/libraries/fc/src/crypto/private_key.cpp b/libraries/fc/src/crypto/private_key.cpp index d67097122f3..a2a9f39fdc7 100644 --- a/libraries/fc/src/crypto/private_key.cpp +++ b/libraries/fc/src/crypto/private_key.cpp @@ -88,7 +88,7 @@ namespace fc { namespace crypto { return Data(fc::variant(key_bytes).as()); } - static private_key::storage_type parse_base58(const string& base58str) + static private_key::storage_type priv_parse_base58(const string& base58str) { const auto pivot = base58str.find('_'); @@ -108,7 +108,7 @@ namespace fc { namespace crypto { } private_key::private_key(const std::string& base58str) - :_storage(parse_base58(base58str)) + :_storage(priv_parse_base58(base58str)) {} std::string private_key::to_string(const fc::yield_function_t& yield) const @@ -118,7 +118,7 @@ namespace fc { namespace crypto { if (which == 0) { using default_type = storage_type::template type_at<0>; return to_wif(_storage.template get(), yield); - } + } auto data_str = _storage.visit(base58str_visitor(yield)); return std::string(config::private_key_base_prefix) + "_" + data_str; diff --git a/libraries/fc/src/crypto/signature.cpp b/libraries/fc/src/crypto/signature.cpp index 1372679f1d4..44294fff3a6 100644 --- a/libraries/fc/src/crypto/signature.cpp +++ b/libraries/fc/src/crypto/signature.cpp @@ -16,7 +16,7 @@ namespace fc { namespace crypto { } }; - static signature::storage_type parse_base58(const std::string& base58str) + static signature::storage_type sig_parse_base58(const std::string& base58str) { try { constexpr auto prefix = config::signature_base_prefix; @@ -32,7 +32,7 @@ namespace fc { namespace crypto { } FC_RETHROW_EXCEPTIONS( warn, "error parsing signature", ("str", base58str ) ) } signature::signature(const std::string& base58str) - :_storage(parse_base58(base58str)) + :_storage(sig_parse_base58(base58str)) {} int signature::which() const { diff --git a/libraries/rodeos/CMakeLists.txt b/libraries/rodeos/CMakeLists.txt index 3d657b18457..b1bd7ae6114 100644 --- a/libraries/rodeos/CMakeLists.txt +++ b/libraries/rodeos/CMakeLists.txt @@ -14,3 +14,7 @@ target_link_libraries( rodeos_lib target_include_directories( rodeos_lib PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include" ) + +if(ENABLE_UNITY_BUILD) + set_target_properties(rodeos_lib PROPERTIES UNITY_BUILD TRUE) +endif() diff --git a/libraries/rodeos/include/b1/rodeos/rodeos.hpp b/libraries/rodeos/include/b1/rodeos/rodeos.hpp index 67a9b9af930..491b7c8615f 100644 --- a/libraries/rodeos/include/b1/rodeos/rodeos.hpp +++ b/libraries/rodeos/include/b1/rodeos/rodeos.hpp @@ -1,3 +1,4 @@ +#pragma once #include #include #include diff --git a/libraries/state_history/CMakeLists.txt b/libraries/state_history/CMakeLists.txt index 1a6d4d15786..9e676f27800 100644 --- a/libraries/state_history/CMakeLists.txt +++ b/libraries/state_history/CMakeLists.txt @@ -16,3 +16,7 @@ target_link_libraries( state_history target_include_directories( state_history PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include" ) + +if(ENABLE_UNITY_BUILD) + set_target_properties(state_history PROPERTIES UNITY_BUILD TRUE) +endif() diff --git a/libraries/state_history/trace_converter.cpp b/libraries/state_history/trace_converter.cpp index e68975d05ca..f5ba5e008d5 100644 --- a/libraries/state_history/trace_converter.cpp +++ b/libraries/state_history/trace_converter.cpp @@ -5,7 +5,7 @@ #include #include #include -extern const char* state_history_plugin_abi; +extern const char* const state_history_plugin_abi; namespace bio = boost::iostreams; namespace eosio { From ff7572717087cd9fd22d08adc0125f5ce40ed7a9 Mon Sep 17 00:00:00 2001 From: Huang-Ming Huang Date: Fri, 22 May 2020 15:09:59 -0500 Subject: [PATCH 2/4] Disable compile_commands.json generation when unity build is enabled Up until cmake version 3.17.*, The unity build support by cmake does not work well in combination with the production of compile_commands.json. This commit allows the short-term workaround: running cmake twice: once with ENABLE_UNITY_BUILD=OFF to generate compile_commands.json for LSP servers, clang-tidy / clangd, etc, and then again with ENABLE_UNITY_BUILD=ON to build the project. --- CMakeLists.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a51ecfd0e03..49f4eb5e277 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,7 +51,12 @@ if ("${CMAKE_GENERATOR}" STREQUAL "Ninja") add_compile_options(-fdiagnostics-color=always) endif() -set(CMAKE_EXPORT_COMPILE_COMMANDS "ON") +if (ENABLE_UNITY_BUILD) + set(CMAKE_EXPORT_COMPILE_COMMANDS "OFF") +else() + set(CMAKE_EXPORT_COMPILE_COMMANDS "ON") +endif() + set(BUILD_DOXYGEN FALSE CACHE BOOL "Build doxygen documentation on every make") set(ENABLE_MULTIVERSION_PROTOCOL_TEST FALSE CACHE BOOL "Enable nodeos multiversion protocol test") From 137f51fd7945a80057255437e235753515bf4cb3 Mon Sep 17 00:00:00 2001 From: Huang-Ming Huang Date: Fri, 29 May 2020 13:01:17 -0500 Subject: [PATCH 3/4] enable unity build for ci --- .cicd/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cicd/build.sh b/.cicd/build.sh index 7a076acc532..6f26fe570c4 100755 --- a/.cicd/build.sh +++ b/.cicd/build.sh @@ -2,7 +2,7 @@ set -eo pipefail . ./.cicd/helpers/general.sh mkdir -p $BUILD_DIR -CMAKE_EXTRAS="-DCMAKE_BUILD_TYPE='Release' -DENABLE_MULTIVERSION_PROTOCOL_TEST=true" +CMAKE_EXTRAS="-DCMAKE_BUILD_TYPE='Release' -DENABLE_MULTIVERSION_PROTOCOL_TEST=true -DENABLE_UNITY_BUILD=ON" if [[ "$(uname)" == 'Darwin' && $FORCE_LINUX != true ]]; then # You can't use chained commands in execute if [[ "$GITHUB_ACTIONS" == 'true' ]]; then From f2ed1d524e05f271214d1defe63b0f6af925f246 Mon Sep 17 00:00:00 2001 From: Huang-Ming Huang Date: Mon, 1 Jun 2020 08:07:14 -0500 Subject: [PATCH 4/4] strip trailing spaces --- libraries/fc/src/crypto/private_key.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/fc/src/crypto/private_key.cpp b/libraries/fc/src/crypto/private_key.cpp index a2a9f39fdc7..2056897dfbe 100644 --- a/libraries/fc/src/crypto/private_key.cpp +++ b/libraries/fc/src/crypto/private_key.cpp @@ -118,7 +118,7 @@ namespace fc { namespace crypto { if (which == 0) { using default_type = storage_type::template type_at<0>; return to_wif(_storage.template get(), yield); - } + } auto data_str = _storage.visit(base58str_visitor(yield)); return std::string(config::private_key_base_prefix) + "_" + data_str;