Skip to content

Commit c1e16cb

Browse files
committed
build: Create .la library for bitcoincrypto
Libtool will yell at you if you try to link a shared library against static ones. This change creates a libtool archive library for bitcoincrypto and allows a shared library to be linked against it portably. Also specify -static in both: - ..._la_CXXFLAGS so that libtool will avoid building two versions of each object (one PIC, one non-PIC). We just need the one that is suitable for static linking. - ..._la_LDFLAGS so that libtool will create a static library. [META] This change is done in preparation for a future commit where we link the libbitcoinkernel library against this one.
1 parent 8bdfe05 commit c1e16cb

File tree

1 file changed

+62
-43
lines changed

1 file changed

+62
-43
lines changed

src/Makefile.am

Lines changed: 62 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,22 @@ AM_LIBTOOLFLAGS = --preserve-dup-deps
1515
PTHREAD_FLAGS = $(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
1616
EXTRA_LIBRARIES =
1717

18+
lib_LTLIBRARIES = $(LIBBITCOINCONSENSUS)
19+
noinst_LTLIBRARIES =
20+
21+
bin_PROGRAMS =
22+
noinst_PROGRAMS =
23+
TESTS =
24+
BENCHMARKS =
25+
1826
BITCOIN_INCLUDES=-I$(builddir) -I$(srcdir)/$(MINISKETCH_INCLUDE_DIR_INT) -I$(srcdir)/secp256k1/include -I$(srcdir)/$(UNIVALUE_INCLUDE_DIR_INT) $(BDB_CPPFLAGS) $(BOOST_CPPFLAGS) $(LEVELDB_CPPFLAGS)
1927

2028
LIBBITCOIN_NODE=libbitcoin_node.a
2129
LIBBITCOIN_COMMON=libbitcoin_common.a
2230
LIBBITCOIN_CONSENSUS=libbitcoin_consensus.a
2331
LIBBITCOIN_CLI=libbitcoin_cli.a
2432
LIBBITCOIN_UTIL=libbitcoin_util.a
25-
LIBBITCOIN_CRYPTO_BASE=crypto/libbitcoin_crypto_base.a
33+
LIBBITCOIN_CRYPTO_BASE=crypto/libbitcoin_crypto_base.la
2634
LIBBITCOINQT=qt/libbitcoinqt.a
2735
LIBSECP256K1=secp256k1/libsecp256k1.la
2836

@@ -37,31 +45,31 @@ LIBBITCOIN_WALLET=libbitcoin_wallet.a
3745
LIBBITCOIN_WALLET_TOOL=libbitcoin_wallet_tool.a
3846
endif
3947

40-
LIBBITCOIN_CRYPTO= $(LIBBITCOIN_CRYPTO_BASE)
48+
LIBBITCOIN_CRYPTO = $(LIBBITCOIN_CRYPTO_BASE)
4149
if ENABLE_SSE41
42-
LIBBITCOIN_CRYPTO_SSE41 = crypto/libbitcoin_crypto_sse41.a
50+
LIBBITCOIN_CRYPTO_SSE41 = crypto/libbitcoin_crypto_sse41.la
4351
LIBBITCOIN_CRYPTO += $(LIBBITCOIN_CRYPTO_SSE41)
4452
endif
4553
if ENABLE_AVX2
46-
LIBBITCOIN_CRYPTO_AVX2 = crypto/libbitcoin_crypto_avx2.a
54+
LIBBITCOIN_CRYPTO_AVX2 = crypto/libbitcoin_crypto_avx2.la
4755
LIBBITCOIN_CRYPTO += $(LIBBITCOIN_CRYPTO_AVX2)
4856
endif
4957
if ENABLE_X86_SHANI
50-
LIBBITCOIN_CRYPTO_X86_SHANI = crypto/libbitcoin_crypto_x86_shani.a
58+
LIBBITCOIN_CRYPTO_X86_SHANI = crypto/libbitcoin_crypto_x86_shani.la
5159
LIBBITCOIN_CRYPTO += $(LIBBITCOIN_CRYPTO_X86_SHANI)
5260
endif
5361
if ENABLE_ARM_SHANI
54-
LIBBITCOIN_CRYPTO_ARM_SHANI = crypto/libbitcoin_crypto_arm_shani.a
62+
LIBBITCOIN_CRYPTO_ARM_SHANI = crypto/libbitcoin_crypto_arm_shani.la
5563
LIBBITCOIN_CRYPTO += $(LIBBITCOIN_CRYPTO_ARM_SHANI)
5664
endif
65+
noinst_LTLIBRARIES += $(LIBBITCOIN_CRYPTO)
5766

5867
$(LIBSECP256K1): $(wildcard secp256k1/src/*.h) $(wildcard secp256k1/src/*.c) $(wildcard secp256k1/include/*)
5968
$(AM_V_at)$(MAKE) $(AM_MAKEFLAGS) -C $(@D) $(@F)
6069

6170
# Make is not made aware of per-object dependencies to avoid limiting building parallelization
6271
# But to build the less dependent modules first, we manually select their order here:
6372
EXTRA_LIBRARIES += \
64-
$(LIBBITCOIN_CRYPTO) \
6573
$(LIBBITCOIN_UTIL) \
6674
$(LIBBITCOIN_COMMON) \
6775
$(LIBBITCOIN_CONSENSUS) \
@@ -72,14 +80,6 @@ EXTRA_LIBRARIES += \
7280
$(LIBBITCOIN_WALLET_TOOL) \
7381
$(LIBBITCOIN_ZMQ)
7482

75-
lib_LTLIBRARIES = $(LIBBITCOINCONSENSUS)
76-
noinst_LTLIBRARIES =
77-
78-
bin_PROGRAMS =
79-
noinst_PROGRAMS =
80-
TESTS =
81-
BENCHMARKS =
82-
8383
if BUILD_BITCOIND
8484
bin_PROGRAMS += bitcoind
8585
endif
@@ -462,9 +462,16 @@ libbitcoin_wallet_tool_a_SOURCES = \
462462
$(BITCOIN_CORE_H)
463463

464464
# crypto primitives library
465-
crypto_libbitcoin_crypto_base_a_CPPFLAGS = $(AM_CPPFLAGS)
466-
crypto_libbitcoin_crypto_base_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
467-
crypto_libbitcoin_crypto_base_a_SOURCES = \
465+
crypto_libbitcoin_crypto_base_la_CPPFLAGS = $(AM_CPPFLAGS)
466+
467+
# Specify -static in both CXXFLAGS and LDFLAGS so libtool will only build a
468+
# static version of this library. We don't need a dynamic version, and a dynamic
469+
# version can't be used on windows anyway because the library doesn't currently
470+
# export DLL symbols.
471+
crypto_libbitcoin_crypto_base_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -static
472+
crypto_libbitcoin_crypto_base_la_LDFLAGS = $(AM_LDFLAGS) -static
473+
474+
crypto_libbitcoin_crypto_base_la_SOURCES = \
468475
crypto/aes.cpp \
469476
crypto/aes.h \
470477
crypto/chacha_poly_aead.h \
@@ -496,32 +503,44 @@ crypto_libbitcoin_crypto_base_a_SOURCES = \
496503
crypto/siphash.h
497504

498505
if USE_ASM
499-
crypto_libbitcoin_crypto_base_a_SOURCES += crypto/sha256_sse4.cpp
506+
crypto_libbitcoin_crypto_base_la_SOURCES += crypto/sha256_sse4.cpp
500507
endif
501508

502-
crypto_libbitcoin_crypto_sse41_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
503-
crypto_libbitcoin_crypto_sse41_a_CPPFLAGS = $(AM_CPPFLAGS)
504-
crypto_libbitcoin_crypto_sse41_a_CXXFLAGS += $(SSE41_CXXFLAGS)
505-
crypto_libbitcoin_crypto_sse41_a_CPPFLAGS += -DENABLE_SSE41
506-
crypto_libbitcoin_crypto_sse41_a_SOURCES = crypto/sha256_sse41.cpp
507-
508-
crypto_libbitcoin_crypto_avx2_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
509-
crypto_libbitcoin_crypto_avx2_a_CPPFLAGS = $(AM_CPPFLAGS)
510-
crypto_libbitcoin_crypto_avx2_a_CXXFLAGS += $(AVX2_CXXFLAGS)
511-
crypto_libbitcoin_crypto_avx2_a_CPPFLAGS += -DENABLE_AVX2
512-
crypto_libbitcoin_crypto_avx2_a_SOURCES = crypto/sha256_avx2.cpp
513-
514-
crypto_libbitcoin_crypto_x86_shani_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
515-
crypto_libbitcoin_crypto_x86_shani_a_CPPFLAGS = $(AM_CPPFLAGS)
516-
crypto_libbitcoin_crypto_x86_shani_a_CXXFLAGS += $(X86_SHANI_CXXFLAGS)
517-
crypto_libbitcoin_crypto_x86_shani_a_CPPFLAGS += -DENABLE_X86_SHANI
518-
crypto_libbitcoin_crypto_x86_shani_a_SOURCES = crypto/sha256_x86_shani.cpp
519-
520-
crypto_libbitcoin_crypto_arm_shani_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
521-
crypto_libbitcoin_crypto_arm_shani_a_CPPFLAGS = $(AM_CPPFLAGS)
522-
crypto_libbitcoin_crypto_arm_shani_a_CXXFLAGS += $(ARM_SHANI_CXXFLAGS)
523-
crypto_libbitcoin_crypto_arm_shani_a_CPPFLAGS += -DENABLE_ARM_SHANI
524-
crypto_libbitcoin_crypto_arm_shani_a_SOURCES = crypto/sha256_arm_shani.cpp
509+
# See explanation for -static in crypto_libbitcoin_crypto_base_la's LDFLAGS and
510+
# CXXFLAGS above
511+
crypto_libbitcoin_crypto_sse41_la_LDFLAGS = $(AM_LDFLAGS) -static
512+
crypto_libbitcoin_crypto_sse41_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -static
513+
crypto_libbitcoin_crypto_sse41_la_CPPFLAGS = $(AM_CPPFLAGS)
514+
crypto_libbitcoin_crypto_sse41_la_CXXFLAGS += $(SSE41_CXXFLAGS)
515+
crypto_libbitcoin_crypto_sse41_la_CPPFLAGS += -DENABLE_SSE41
516+
crypto_libbitcoin_crypto_sse41_la_SOURCES = crypto/sha256_sse41.cpp
517+
518+
# See explanation for -static in crypto_libbitcoin_crypto_base_la's LDFLAGS and
519+
# CXXFLAGS above
520+
crypto_libbitcoin_crypto_avx2_la_LDFLAGS = $(AM_LDFLAGS) -static
521+
crypto_libbitcoin_crypto_avx2_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -static
522+
crypto_libbitcoin_crypto_avx2_la_CPPFLAGS = $(AM_CPPFLAGS)
523+
crypto_libbitcoin_crypto_avx2_la_CXXFLAGS += $(AVX2_CXXFLAGS)
524+
crypto_libbitcoin_crypto_avx2_la_CPPFLAGS += -DENABLE_AVX2
525+
crypto_libbitcoin_crypto_avx2_la_SOURCES = crypto/sha256_avx2.cpp
526+
527+
# See explanation for -static in crypto_libbitcoin_crypto_base_la's LDFLAGS and
528+
# CXXFLAGS above
529+
crypto_libbitcoin_crypto_x86_shani_la_LDFLAGS = $(AM_LDFLAGS) -static
530+
crypto_libbitcoin_crypto_x86_shani_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -static
531+
crypto_libbitcoin_crypto_x86_shani_la_CPPFLAGS = $(AM_CPPFLAGS)
532+
crypto_libbitcoin_crypto_x86_shani_la_CXXFLAGS += $(X86_SHANI_CXXFLAGS)
533+
crypto_libbitcoin_crypto_x86_shani_la_CPPFLAGS += -DENABLE_X86_SHANI
534+
crypto_libbitcoin_crypto_x86_shani_la_SOURCES = crypto/sha256_x86_shani.cpp
535+
536+
# See explanation for -static in crypto_libbitcoin_crypto_base_la's LDFLAGS and
537+
# CXXFLAGS above
538+
crypto_libbitcoin_crypto_arm_shani_la_LDFLAGS = $(AM_LDFLAGS) -static
539+
crypto_libbitcoin_crypto_arm_shani_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) -static
540+
crypto_libbitcoin_crypto_arm_shani_la_CPPFLAGS = $(AM_CPPFLAGS)
541+
crypto_libbitcoin_crypto_arm_shani_la_CXXFLAGS += $(ARM_SHANI_CXXFLAGS)
542+
crypto_libbitcoin_crypto_arm_shani_la_CPPFLAGS += -DENABLE_ARM_SHANI
543+
crypto_libbitcoin_crypto_arm_shani_la_SOURCES = crypto/sha256_arm_shani.cpp
525544

526545
# consensus: shared between all executables that validate any consensus rules.
527546
libbitcoin_consensus_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
@@ -877,7 +896,7 @@ bitcoin_chainstate-clientversion.$(OBJEXT): obj/build.h
877896
# bitcoinconsensus library #
878897
if BUILD_BITCOIN_LIBS
879898
include_HEADERS = script/bitcoinconsensus.h
880-
libbitcoinconsensus_la_SOURCES = support/cleanse.cpp $(crypto_libbitcoin_crypto_base_a_SOURCES) $(libbitcoin_consensus_a_SOURCES)
899+
libbitcoinconsensus_la_SOURCES = support/cleanse.cpp $(crypto_libbitcoin_crypto_base_la_SOURCES) $(libbitcoin_consensus_a_SOURCES)
881900

882901
libbitcoinconsensus_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined $(RELDFLAGS)
883902
libbitcoinconsensus_la_LIBADD = $(LIBSECP256K1)

0 commit comments

Comments
 (0)