Skip to content

Commit 693f780

Browse files
committed
maint: Modularize libmamba
Signed-off-by: Julien Jerphanion <git@jjerphan.xyz>
1 parent b98c281 commit 693f780

File tree

8 files changed

+1287
-591
lines changed

8 files changed

+1287
-591
lines changed

libmamba/CMakeLists.txt

Lines changed: 160 additions & 430 deletions
Large diffs are not rendered by default.

libmamba/archive/CMakeLists.txt

Lines changed: 226 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,226 @@
1+
# Copyright (c) 2019, QuantStack and Mamba Contributors
2+
#
3+
# Distributed under the terms of the BSD 3-Clause License.
4+
#
5+
# The full license is in the file LICENSE, distributed with this software.
6+
7+
# Archive component - depends on libmamba-common and libarchive
8+
9+
# These variables should be set by the parent CMakeLists.txt
10+
if(NOT DEFINED LIBMAMBA_SOURCE_DIR)
11+
set(LIBMAMBA_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../src)
12+
endif()
13+
if(NOT DEFINED LIBMAMBA_INCLUDE_DIR)
14+
set(LIBMAMBA_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../include)
15+
endif()
16+
17+
set(
18+
LIBMAMBA_ARCHIVE_SOURCES
19+
# Archive extraction and package handling
20+
${LIBMAMBA_SOURCE_DIR}/core/package_handling.cpp
21+
${LIBMAMBA_SOURCE_DIR}/core/package_fetcher.cpp
22+
${LIBMAMBA_SOURCE_DIR}/core/package_cache.cpp
23+
)
24+
25+
set(
26+
LIBMAMBA_ARCHIVE_PUBLIC_HEADERS
27+
# Archive extraction and package handling
28+
${LIBMAMBA_INCLUDE_DIR}/mamba/core/package_handling.hpp
29+
${LIBMAMBA_INCLUDE_DIR}/mamba/core/package_fetcher.hpp
30+
${LIBMAMBA_INCLUDE_DIR}/mamba/core/package_cache.hpp
31+
)
32+
33+
# Create the archive library target
34+
macro(libmamba_archive_create_target target_name linkage output_name)
35+
string(TOUPPER "${linkage}" linkage_upper)
36+
if(NOT ${linkage_upper} MATCHES "^(SHARED|STATIC)$")
37+
message(FATAL_ERROR "Invalid library linkage: ${linkage}")
38+
endif()
39+
40+
add_library(
41+
${target_name}
42+
${linkage_upper} ${LIBMAMBA_ARCHIVE_PUBLIC_HEADERS} ${LIBMAMBA_ARCHIVE_SOURCES}
43+
)
44+
45+
target_include_directories(
46+
${target_name}
47+
PUBLIC $<BUILD_INTERFACE:${LIBMAMBA_INCLUDE_DIR}> $<INSTALL_INTERFACE:include>
48+
PRIVATE ${LIBMAMBA_SOURCE_DIR}
49+
)
50+
51+
target_compile_features(${target_name} PUBLIC cxx_std_20)
52+
set_target_properties(
53+
${target_name}
54+
PROPERTIES
55+
CXX_STANDARD 20
56+
CXX_STANDARD_REQUIRED YES
57+
CXX_EXTENSIONS NO
58+
)
59+
60+
mamba_target_add_compile_warnings(${target_name} WARNING_AS_ERROR ${MAMBA_WARNING_AS_ERROR})
61+
mamba_target_set_lto(${target_name} MODE ${MAMBA_LTO})
62+
63+
# For shared libraries, archive uses symbols from network but can't link to it due to circular
64+
# dependency (network also needs archive symbols). Allow undefined symbols - they'll be resolved
65+
# when the aggregated libmamba target links all components together.
66+
if(${linkage_upper} STREQUAL "SHARED")
67+
if(APPLE)
68+
target_link_options(${target_name} PRIVATE -Wl,-undefined,dynamic_lookup)
69+
elseif(UNIX)
70+
target_link_options(${target_name} PRIVATE -Wl,--allow-shlib-undefined)
71+
endif()
72+
endif()
73+
74+
# Depend on common component
75+
if(TARGET mamba::libmamba-common-dyn)
76+
target_link_libraries(${target_name} PUBLIC mamba::libmamba-common-dyn)
77+
elseif(TARGET mamba::libmamba-common-static)
78+
target_link_libraries(${target_name} PUBLIC mamba::libmamba-common-static)
79+
else()
80+
message(FATAL_ERROR "libmamba-common must be built before libmamba-archive")
81+
endif()
82+
83+
# Depend on network component (package_fetcher uses download::Request, package_cache uses
84+
# util::URL) Note: Archive is built after network, so this link will be added in main
85+
# CMakeLists.txt
86+
87+
if(${linkage_upper} STREQUAL "STATIC")
88+
if(UNIX)
89+
set(
90+
REQUIRED_STATIC_DEPS
91+
libarchive.a
92+
libiconv.a
93+
libbz2.a
94+
liblz4.a
95+
libzstd.a
96+
libz.a
97+
liblzma.a
98+
)
99+
if(APPLE)
100+
set(REQUIRED_STATIC_DEPS ${REQUIRED_STATIC_DEPS} libc++.a)
101+
endif()
102+
103+
if(UNIX AND NOT APPLE)
104+
list(REMOVE_ITEM REQUIRED_STATIC_DEPS libiconv.a)
105+
endif()
106+
107+
set(STATIC_DEPS "")
108+
foreach(LIB ${REQUIRED_STATIC_DEPS})
109+
set(TMP_LIB "${LIB}-NOTFOUND")
110+
find_library(TMP_LIB NAMES "${LIB}")
111+
if(NOT ${TMP_LIB} STREQUAL "TMP_LIB-NOTFOUND")
112+
list(APPEND STATIC_DEPS "${TMP_LIB}")
113+
else()
114+
list(APPEND STATIC_DEPS "${LIB}-NOTFOUND")
115+
endif()
116+
endforeach(LIB)
117+
118+
if(APPLE)
119+
find_library(SECURITY_LIBRARY Security)
120+
find_library(SYSTEMCONFIGURATION_LIBRARY SystemConfiguration)
121+
find_library(COREFOUNDATION_LIBRARY CoreFoundation)
122+
list(
123+
APPEND
124+
STATIC_DEPS
125+
${COREFOUNDATION_LIBRARY}
126+
${SECURITY_LIBRARY}
127+
${SYSTEMCONFIGURATION_LIBRARY}
128+
)
129+
endif()
130+
131+
target_link_libraries(${target_name} PUBLIC ${STATIC_DEPS})
132+
133+
if(APPLE)
134+
set(MAMBA_FORCE_DYNAMIC_LIBS resolv c++abi)
135+
target_link_options(${target_name} PRIVATE -nostdlib++)
136+
elseif(UNIX)
137+
set(MAMBA_FORCE_DYNAMIC_LIBS rt dl resolv)
138+
target_link_options(${target_name} PUBLIC -static-libstdc++ -static-libgcc)
139+
endif()
140+
141+
target_link_libraries(${target_name} PUBLIC ${MAMBA_FORCE_DYNAMIC_LIBS})
142+
143+
# reproc is needed for package_handling.cpp
144+
target_link_libraries(${target_name} PUBLIC reproc reproc++)
145+
146+
elseif(WIN32)
147+
set(CMAKE_PREFIX_PATH "$ENV{VCPKG_ROOT}/installed/x64-windows-static-md/")
148+
set(SYSTEM_PROVIDED_LIBRARIES XmlLite.lib)
149+
set(ENABLE_WIN32_XMLLITE ON)
150+
151+
find_package(LibArchive MODULE REQUIRED)
152+
find_library(LIBLZMA_LIBRARIES lzma REQUIRED)
153+
find_library(LZ4_LIBRARY NAMES lz4)
154+
find_library(LZO2_LIBRARY NAMES lzo2)
155+
find_package(zstd CONFIG REQUIRED)
156+
find_library(BZIP2_LIBRARIES NAMES bz2)
157+
find_library(CRYPTO_LIBRARIES NAMES libcrypto)
158+
find_library(LIBXML2_LIBRARY NAMES libxml2)
159+
find_library(ICONV_LIBRARY NAMES libiconv iconv)
160+
find_library(CHARSET_LIBRARY NAMES libcharset charset)
161+
162+
target_link_libraries(
163+
${target_name}
164+
PUBLIC
165+
${CRYPTO_LIBRARIES}
166+
${SYSTEM_PROVIDED_LIBRARIES}
167+
${LibArchive_LIBRARY}
168+
${LIBXML2_LIBRARY}
169+
${ICONV_LIBRARY}
170+
${CHARSET_LIBRARY}
171+
zstd::libzstd_static
172+
${LZ4_LIBRARY}
173+
${LZO2_LIBRARY}
174+
${BZIP2_LIBRARIES}
175+
${LIBLZMA_LIBRARIES}
176+
)
177+
178+
add_compile_definitions(LIBARCHIVE_STATIC)
179+
include_directories($ENV{CONDA_PREFIX}/Library/include/)
180+
include_directories($ENV{VCPKG_ROOT}/installed/x64-windows-static-md/include/)
181+
endif()
182+
else()
183+
find_package(LibArchive REQUIRED)
184+
find_package(zstd REQUIRED)
185+
find_package(BZip2 REQUIRED)
186+
find_package(OpenSSL REQUIRED)
187+
188+
target_link_libraries(
189+
${target_name}
190+
PUBLIC ${LibArchive_LIBRARIES} BZip2::BZip2 zstd::libzstd_shared ${OPENSSL_LIBRARIES}
191+
)
192+
target_include_directories(${target_name} PRIVATE "${LibArchive_INCLUDE_DIRS}")
193+
194+
# reproc is needed for package_handling.cpp
195+
target_link_libraries(${target_name} PUBLIC reproc reproc++)
196+
endif()
197+
198+
if(UNIX)
199+
math(EXPR LIBMAMBA_BINARY_COMPATIBLE "${LIBMAMBA_BINARY_CURRENT} - ${LIBMAMBA_BINARY_AGE}")
200+
set_target_properties(
201+
${target_name}
202+
PROPERTIES
203+
COMPILE_DEFINITIONS "LIBMAMBA_ARCHIVE_EXPORTS"
204+
PREFIX ""
205+
VERSION
206+
"${LIBMAMBA_BINARY_COMPATIBLE}.${LIBMAMBA_BINARY_REVISION}.${LIBMAMBA_BINARY_AGE}"
207+
SOVERSION ${LIBMAMBA_BINARY_COMPATIBLE}
208+
OUTPUT_NAME "${output_name}"
209+
)
210+
else()
211+
set_target_properties(
212+
${target_name}
213+
PROPERTIES
214+
COMPILE_DEFINITIONS "LIBMAMBA_ARCHIVE_EXPORTS"
215+
PREFIX ""
216+
VERSION ${LIBMAMBA_BINARY_VERSION}
217+
SOVERSION ${LIBMAMBA_BINARY_CURRENT}
218+
OUTPUT_NAME "${output_name}"
219+
)
220+
endif()
221+
222+
list(APPEND libmamba_archive_targets ${target_name})
223+
add_library(mamba::${target_name} ALIAS ${target_name})
224+
endmacro()
225+
226+
set(libmamba_archive_targets "")

0 commit comments

Comments
 (0)