Only full shared or full static build (#2342)

This commit is contained in:
Johan Mabille 2023-03-03 17:27:25 +01:00 committed by GitHub
parent 2811c25d75
commit b38377a479
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 160 additions and 161 deletions

View File

@ -23,7 +23,7 @@ jobs:
- name: create build environment
uses: mamba-org/provision-with-micromamba@main
with:
environment-file: ./libmamba/environment-dev.yml
environment-file: ./libmamba/environment-static-dev.yml
environment-name: build_env
cache-env: true
- uses: hendrikmuhs/ccache-action@main
@ -283,9 +283,53 @@ jobs:
- name: create build environment
uses: mamba-org/provision-with-micromamba@main
with:
environment-file: ./libmamba/environment-dev.yml
environment-file: ./libmamba/environment-static-dev-win.yml
environment-name: build_env
cache-env: true
- name: fix up vcpkg recipes
shell: python
run: |
# See https://github.com/microsoft/vcpkg/pull/28919
import os
from pathlib import Path
vcpkg_root = Path(os.environ["MAMBA_ROOT_PREFIX"]) / "envs" / "build_env" / "Library" / "share" / "vcpkg"
f = vcpkg_root / "scripts" / "cmake" / "vcpkg_acquire_msys.cmake"
text = f.read_text()
text = text.replace("b309799e5a9d248ef66eaf11a0bd21bf4e8b9bd5c677c627ec83fa760ce9f0b54ddf1b62cbb436e641fbbde71e3b61cb71ff541d866f8ca7717a3a0dbeb00ebf",
"a202ddaefa93d8a4b15431dc514e3a6200c47275c5a0027c09cc32b28bc079b1b9a93d5ef65adafdc9aba5f76a42f3303b1492106ddf72e67f1801ebfe6d02cc")
text = text.replace("https://repo.msys2.org/msys/x86_64/libtool-2.4.6-9-x86_64.pkg.tar.xz", "https://repo.msys2.org/msys/x86_64/libtool-2.4.7-3-x86_64.pkg.tar.zst")
f.write_text(text)
- name: build static windows dependencies with vcpkg
shell: cmd /C CALL {0}
run: |
call micromamba activate build_env
if %errorlevel% neq 0 exit /b %errorlevel%
mkdir build
if %errorlevel% neq 0 exit /b %errorlevel%
cd build
if %errorlevel% neq 0 exit /b %errorlevel%
git clone https://github.com/conda-forge/micromamba-feedstock.git
if %errorlevel% neq 0 exit /b %errorlevel%
ROBOCOPY micromamba-feedstock/recipe/libsolv %VCPKG_ROOT%/ports/libsolv
@rem ROBOCOPY has 0 and 1 as successfull exit codes
if %errorlevel% neq 0 if %errorlevel% neq 1 exit /b %errorlevel%
SET VCPKG_BUILD_TYPE=release && vcpkg install libsolv[conda] --triplet x64-windows-static
if %errorlevel% neq 0 exit /b %errorlevel%
vcpkg install "libarchive[bzip2,lz4,lzma,lzo,openssl,zstd]" --triplet x64-windows-static
if %errorlevel% neq 0 exit /b %errorlevel%
vcpkg install curl --triplet x64-windows-static
if %errorlevel% neq 0 exit /b %errorlevel%
vcpkg install yaml-cpp --triplet x64-windows-static
if %errorlevel% neq 0 exit /b %errorlevel%
vcpkg install reproc --triplet x64-windows-static
if %errorlevel% neq 0 exit /b %errorlevel%
set CMAKE_PREFIX_PATH=%VCPKG_ROOT%\installed\x64-windows-static\;%CMAKE_PREFIX_PATH%
if %errorlevel% neq 0 exit /b %errorlevel%
- uses: hendrikmuhs/ccache-action@main
with:
variant: sccache
@ -295,8 +339,6 @@ jobs:
run: |
call micromamba activate build_env
if %errorlevel% neq 0 exit /b %errorlevel%
mkdir build
if %errorlevel% neq 0 exit /b %errorlevel%
cd build
if %errorlevel% neq 0 exit /b %errorlevel%
cmake .. -DCMAKE_INSTALL_PREFIX=%CONDA_PREFIX%\Library ^
@ -499,9 +541,8 @@ jobs:
if %errorlevel% neq 0 exit /b %errorlevel%
cmake .. -DCMAKE_INSTALL_PREFIX=%CONDA_PREFIX%\Library ^
-DBUILD_MICROMAMBA=ON ^
-DMICROMAMBA_LINKAGE=STATIC ^
-DBUILD_LIBMAMBA=ON ^
-DBUILD_STATIC=ON ^
-DBUILD_SHARED=ON ^
-DCMAKE_CXX_COMPILER_LAUNCHER=sccache ^
-DCMAKE_C_COMPILER_LAUNCHER=sccache ^
-GNinja
@ -515,7 +556,10 @@ jobs:
- name: build cache statistics
run: sccache --show-stats
- name: tar micromamba artifact
run: tar -cvf umamba.tar build/micromamba/micromamba.exe
shell: cmd /C call {0}
run: |
cp build/libmamba/libmamba.dll build/micromamba/
tar -cvf umamba.tar build/micromamba/micromamba.exe build/micromamba/libmamba.dll
- uses: actions/upload-artifact@v3
with:
name: _internal_micromamba_binary

View File

@ -160,9 +160,8 @@ jobs:
-D CMAKE_C_COMPILER_LAUNCHER=sccache ^
-D CMAKE_BUILD_TYPE="Release" ^
-D BUILD_LIBMAMBA=ON ^
-D BUILD_STATIC_DEPS=ON ^
-D BUILD_STATIC=ON ^
-D BUILD_MICROMAMBA=ON ^
-D MICROMAMBA_LINKAGE=FULL_STATIC ^
-G "Ninja"
if %errorlevel% neq 0 exit /b %errorlevel%
ninja install

View File

@ -4,14 +4,9 @@
#
# The full license is in the file LICENSE, distributed with this software.
cmake_minimum_required (VERSION 3.2)
if(POLICY CMP0025)
cmake_policy(SET CMP0025 NEW)
endif()
cmake_policy(SET CMP0077 NEW)
#if(POLICY CMP0028)
# cmake_policy(SET CMP0028 NEW)
#endif()
cmake_minimum_required (VERSION 3.16)
cmake_policy(SET CMP0025 NEW) # Introduced in cmake 3.0
cmake_policy(SET CMP0077 NEW) # Introduced in cmake 3.13
project(mamba)

View File

@ -81,34 +81,18 @@ Static library
cmake --build build/
.. note::
``libmamba-static`` ``cmake`` target represents the static library without any dependency linkage
Fully static library
********************
``BUILD_STATIC_DEPS`` option needs to be activated:
.. code:: bash
cmake -B build/ \
-DBUILD_LIBMAMBA=ON \
-DBUILD_STATIC_DEPS=ON
cmake --build build/
.. note::
``libmamba-full-static`` ``cmake`` target represents the static library with static dependencies linkage
``libmamba-static`` ``cmake`` target represents the static library with static dependencies linkage
.. note::
The ``libmamba`` static library does not embed the dependencies but the ``cmake`` target will expose those dependencies to any executable linking on it
.. note::
The fully statically lib still has few symbols required from system shared libraries (``glibc`` for instance)
The ``libmamba`` static lib still has few symbols required from system shared libraries (``glibc`` for instance)
.. warning::
This version of the library has a small difference versus the static and shared ones, on the way the SSL backend of cURL is set
This version of the library has a small difference versus the shared one, on the way the SSL backend of cURL is set
See `libmamba/src/core/fetch.cpp` for more information
Tests
*****
@ -215,7 +199,7 @@ To build ``micromamba``, activate the ``BUILD_MICROMAMBA`` flag in ``cmake`` com
cmake -B build/ \
-DBUILD_MICROMAMBA=ON \
-DMICROMAMBA_LINKAGE=DYNAMIC
-DBULD_SHARED=ON
cmake --build build/
or rebuild ``libmamba`` in the same time:
@ -227,8 +211,7 @@ or rebuild ``libmamba`` in the same time:
-DBUILD_SHARED=ON \
-DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX \
-DCMAKE_PREFIX_PATH=$CONDA_PREFIX \
-DBUILD_MICROMAMBA=ON \
-DMICROMAMBA_LINKAGE=DYNAMIC
-DBUILD_MICROMAMBA=ON
cmake --build build/
.. note::
@ -251,13 +234,21 @@ or rebuild ``libmamba`` in the same time:
Statically linked
*****************
You can also build ``micromamba`` statically linked against ``libmamba``:
You can also build ``micromamba`` as a fully statically linked executable. For that, you need to install extra requirements:
.. code::
micromamba install --name <env_name> --file ./libmamba/environment-static-dev.yml
It will install the development version of dependencies, including static libraries.
Now you can run ``cmake``:
.. code:: bash
cmake -B build/ \
-DBUILD_MICROMAMBA=ON \
-DMICROMAMBA_LINKAGE=STATIC
-DBUILD_STATIC=ON
cmake --build build/
or with ``libmamba``:
@ -269,46 +260,12 @@ or with ``libmamba``:
-DBUILD_STATIC=ON \
-DCMAKE_INSTALL_PREFIX=$CONDA_PREFIX \
-DCMAKE_PREFIX_PATH=$CONDA_PREFIX \
-DBUILD_MICROMAMBA=ON \
-DMICROMAMBA_LINKAGE=STATIC
-DBUILD_MICROMAMBA=ON
cmake --build build/
.. note::
``MICROMAMBA_LINKAGE`` default value is ``DYNAMIC``
.. note::
``micromamba`` will be then statically linked against ``libmamba`` but still dynamically linked against all its dependencies (``libsolv``, ``libarchive``, etc.)
Fully statically linked
***********************
``micromamba`` can be built as a fully statically linked executable. For that, you need to install extra requirements:
.. code::
micromamba install --name <env_name> --file ./libmamba/environment-static-dev.yml
It will install the development version of dependencies, including static libraries.
Now you can run ``cmake`` with the additional flag ``MICROMAMBA_STATIC_DEPS`` turned on:
.. code:: bash
cmake -B build/ \
-DBUILD_MICROMAMBA=ON \
-DMICROMAMBA_LINKAGE=FULL_STATIC
cmake --build build/
or with ``libmamba``:
.. code:: bash
cmake -B build/ \
-DBUILD_LIBMAMBA=ON \
-DBUILD_STATIC_DEPS=ON \
-DBUILD_MICROMAMBA=ON \
-DMICROMAMBA_LINKAGE=FULL_STATIC
cmake --build build/
If you decide to build both the static and shared libraries, ``micromamba`` will link with the shared one. To link
with the static library, pass the additional build option ``-DMICROMAMBA_LINKAGE=STATIC``
Tests
*****

View File

@ -4,10 +4,9 @@
#
# The full license is in the file LICENSE, distributed with this software.
cmake_minimum_required(VERSION 3.18.2)
cmake_policy(SET CMP0025 NEW)
cmake_policy(SET CMP0077 NEW)
cmake_minimum_required (VERSION 3.16)
cmake_policy(SET CMP0025 NEW) # Introduced in cmake 3.0
cmake_policy(SET CMP0077 NEW) # Introduced in cmake 3.13
project(libmamba)
set(LIBMAMBA_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)
@ -48,19 +47,15 @@ message(STATUS "libmamba binary version: v${LIBMAMBA_BINARY_VERSION}")
option(BUILD_TESTS "Build libmamba C++ tests" OFF)
option(BUILD_SHARED "Build shared libmamba library" OFF)
option(BUILD_STATIC "Build static libmamba library" OFF)
option(BUILD_STATIC_DEPS "Build static libmamba library with static linkage to its dependencies" OFF)
option(BUILD_STATIC "Build static libmamba library with static linkage to its dependencies" OFF)
set(BUILD_LOG_LEVEL "TRACE" CACHE STRING "Logger active level at compile time")
if (NOT ${BUILD_LOG_LEVEL} MATCHES "^(TRACE|DEBUG|INFO|WARN|ERROR|CRITICAL|OFF)$")
message(FATAL_ERROR "Invalid log level: ${BUILD_LOG_LEVEL}, should be one of { TRACE, DEBUG, INFO, WARN, ERROR, CRITICAL, OFF }")
endif ()
if (BUILD_STATIC_DEPS)
if (BUILD_STATIC)
add_definitions("-DSPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_${BUILD_LOG_LEVEL}")
endif ()
if (BUILD_STATIC_DEPS)
add_definitions(-DLIBMAMBA_STATIC_DEPS)
endif ()
@ -264,17 +259,12 @@ set(LIBMAMBA_PRIVATE_HEADERS
# Targets and link
# ================
macro(libmamba_create_target target_name linkage deps_linkage output_name)
macro(libmamba_create_target target_name linkage output_name)
string(TOUPPER "${linkage}" linkage_upper)
if (NOT ${linkage_upper} MATCHES "^(SHARED|STATIC)$")
message(FATAL_ERROR "Invalid library linkage: ${linkage}")
endif ()
string(TOUPPER "${deps_linkage}" deps_linkage_upper)
if (NOT ${deps_linkage_upper} MATCHES "^(SHARED|STATIC)$")
message(FATAL_ERROR "Invalid library dependencies linkage: ${deps_linkage_upper}")
endif ()
# Output
# ======
add_library(
@ -289,7 +279,7 @@ macro(libmamba_create_target target_name linkage deps_linkage output_name)
WARNING_AS_ERROR ${MAMBA_WARNING_AS_ERROR}
)
if (${deps_linkage_upper} STREQUAL "STATIC")
if (${linkage_upper} STREQUAL "STATIC")
message(" -> Statically linking against libmamba (static) dependencies")
if (UNIX)
@ -357,18 +347,19 @@ macro(libmamba_create_target target_name linkage deps_linkage output_name)
if (APPLE)
set (MAMBA_FORCE_DYNAMIC_LIBS resolv c++abi)
target_link_options(libmamba-full-static PRIVATE -static-libstdc++)
target_link_options(${target_name} PRIVATE -static-libstdc++)
elseif (UNIX)
set(MAMBA_FORCE_DYNAMIC_LIBS rt dl resolv)
target_link_options(libmamba-full-static PUBLIC -static-libstdc++ -static-libgcc)
target_link_options(${target_name} PUBLIC -static-libstdc++ -static-libgcc)
endif()
find_package(fmt REQUIRED)
find_package(spdlog CONFIG REQUIRED)
find_package(tl-expected REQUIRED)
add_compile_definitions(SPDLOG_FMT_EXTERNAL)
target_link_libraries(
libmamba-full-static
${target_name}
PUBLIC
${STATIC_DEPS}
${MAMBA_FORCE_DYNAMIC_LIBS}
@ -379,6 +370,7 @@ macro(libmamba_create_target target_name linkage deps_linkage output_name)
elseif (WIN32)
set(CMAKE_PREFIX_PATH "$ENV{VCPKG_ROOT}/installed/x64-windows-static/")
set_target_properties(${target_name} PROPERTIES MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
# For Windows we have a vcpkg based build system right now.
find_package(LibArchive REQUIRED)
@ -437,7 +429,6 @@ macro(libmamba_create_target target_name linkage deps_linkage output_name)
CURL_STATICLIB
SOLV_BUILD_STATIC
)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
include_directories($ENV{CONDA_PREFIX}/Library/include/)
include_directories($ENV{VCPKG_ROOT}/installed/x64-windows-static/include/)
endif()
@ -508,7 +499,7 @@ macro(libmamba_create_target target_name linkage deps_linkage output_name)
set_target_properties(
${target_name}
PROPERTIES
PUBLIC_HEADER "${LIBMAMBA_PUBLIC_HEADERS}"
#PUBLIC_HEADER "${LIBMAMBA_PUBLIC_HEADERS}"
COMPILE_DEFINITIONS "LIBMAMBA_EXPORTS"
PREFIX ""
VERSION "${LIBMAMBA_BINARY_COMPATIBLE}.${LIBMAMBA_BINARY_REVISION}.${LIBMAMBA_BINARY_AGE}"
@ -519,7 +510,7 @@ macro(libmamba_create_target target_name linkage deps_linkage output_name)
set_target_properties(
${target_name}
PROPERTIES
PUBLIC_HEADER "${LIBMAMBA_PUBLIC_HEADERS}"
#PUBLIC_HEADER "${LIBMAMBA_PUBLIC_HEADERS}"
COMPILE_DEFINITIONS "LIBMAMBA_EXPORTS"
PREFIX ""
VERSION ${LIBMAMBA_BINARY_VERSION}
@ -546,7 +537,7 @@ set(libmamba_targets "")
if (BUILD_SHARED)
message(STATUS "Adding shared libmamba target")
libmamba_create_target(libmamba SHARED SHARED libmamba)
libmamba_create_target(libmamba SHARED libmamba)
endif ()
if (BUILD_STATIC)
@ -555,23 +546,13 @@ if (BUILD_STATIC)
# On Windows, a static library should use a different output name
# to avoid the conflict with the import library of a shared one.
if (CMAKE_HOST_WIN32)
libmamba_create_target(libmamba-static STATIC SHARED libmamba_static)
libmamba_create_target(libmamba-static STATIC libmamba_static)
else ()
libmamba_create_target(libmamba-static STATIC SHARED libmamba)
libmamba_create_target(libmamba-static STATIC libmamba)
endif ()
endif ()
if (BUILD_STATIC_DEPS)
message(STATUS "Adding full-static libmamba target")
if (CMAKE_HOST_WIN32)
libmamba_create_target(libmamba-full-static STATIC STATIC libmamba_full_static)
else ()
libmamba_create_target(libmamba-full-static STATIC STATIC libmamba_full_static)
endif ()
endif ()
if (NOT (BUILD_SHARED OR BUILD_STATIC OR BUILD_STATIC_DEPS))
if (NOT (BUILD_SHARED OR BUILD_STATIC))
message(FATAL_ERROR "Select at least a build variant for libmamba")
endif ()

View File

@ -2,6 +2,9 @@ name: mamba-dev
channels:
- conda-forge
dependencies:
- cxx-compiler
- cmake
- ninja
- yaml-cpp-static
- spdlog
- fmt
@ -20,3 +23,5 @@ dependencies:
- reproc-cpp-static
- openssl
- libopenssl-static
- nlohmann_json
- cpp-expected

View File

@ -30,24 +30,16 @@ find_dependency(tl-expected)
find_dependency(zstd)
find_dependency(BZip2)
if(NOT (TARGET libmamba OR TARGET libmamba-static OR TARGET libmamba-full-static))
if(NOT (TARGET libmamba OR TARGET libmamba-static))
include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake")
if (TARGET libmamba-static)
get_target_property(@PROJECT_NAME@_INCLUDE_DIR libmamba-static INTERFACE_INCLUDE_DIRECTORIES)
get_target_property(@PROJECT_NAME@_STATIC_LIBRARY libmamba-static LOCATION)
endif ()
if (TARGET libmamba-full-static)
get_target_property(@PROJECT_NAME@_FULL_STATIC_LIBRARY libmamba-full-static LOCATION)
endif ()
if (TARGET libmamba)
get_target_property(@PROJECT_NAME@_INCLUDE_DIR libmamba INTERFACE_INCLUDE_DIRECTORIES)
get_target_property(@PROJECT_NAME@_LIBRARY libmamba LOCATION)
elseif (TARGET libmamba-static)
get_target_property(@PROJECT_NAME@_INCLUDE_DIR libmamba-static INTERFACE_INCLUDE_DIRECTORIES)
set(@PROJECT_NAME@_LIBRARY ${@PROJECT_NAME@_STATIC_LIBRARY})
elseif (TARGET libmamba-full-static)
get_target_property(@PROJECT_NAME@_INCLUDE_DIR libmamba-full-static INTERFACE_INCLUDE_DIRECTORIES)
set(@PROJECT_NAME@_LIBRARY ${@PROJECT_NAME@_STATIC_LIBRARY})
endif ()
endif()

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.1)
cmake_minimum_required(VERSION 3.16)
add_executable(testing_libmamba_lock testing/lock.cpp)

View File

@ -4,24 +4,22 @@
#
# The full license is in the file LICENSE, distributed with this software.
cmake_minimum_required (VERSION 3.2)
if(POLICY CMP0025)
cmake_policy(SET CMP0025 NEW)
endif()
cmake_policy(SET CMP0077 NEW)
cmake_minimum_required (VERSION 3.16)
cmake_policy(SET CMP0025 NEW) # Introduced in cmake 3.0
cmake_policy(SET CMP0077 NEW) # Introduced in cmake 3.13
project(mamba-package)
# Build options
# =============
set(MAMBA_PACKAGE_LINKAGE "DYNAMIC" CACHE STRING "mamba-package linkage against libraries")
string(TOUPPER "${MAMBA_PACKAGE_LINKAGE}" linkage_upper)
if (NOT ${linkage_upper} MATCHES "^(DYNAMIC|STATIC|FULL_STATIC)$")
message(FATAL_ERROR "Invalid executable linkage: ${MAMBA_PACKAGE_LINKAGE}, should be one of { DYNAMIC, STATIC, FULL_STATIC }")
if (BUILD_STATIC AND NOT BUILD_SHARED)
set(MAMBA_PACKAGE_LINKAGE "STATIC" CACHE STRING "mamba-package linkage against libraries")
else ()
set(MAMBA_PACKAGE_LINKAGE "DYNAMIC" CACHE STRING "mamba-package linkage against libraries")
endif ()
string(TOUPPER "${MAMBA_PACKAGE_LINKAGE}" linkage_upper)
message(STATUS "'mamba-package' linkage: ${MAMBA_PACKAGE_LINKAGE}")
# Source files
@ -39,7 +37,7 @@ set(MAMBA_PACKAGE_HEADERS
# Dependencies
# ============
if(NOT (TARGET libmamba OR TARGET libmamba-static OR TARGET libmamba-full-static))
if(NOT (TARGET libmamba OR TARGET libmamba-static))
find_package(libmamba REQUIRED)
endif ()
@ -49,10 +47,11 @@ endif ()
add_executable(mamba-package ${MAMBA_PACKAGE_SRCS} ${MAMBA_PACKAGE_HEADERS})
mamba_target_add_compile_warnings(mamba-package WARNING_AS_ERROR ${MAMBA_WARNING_AS_ERROR})
if (${MAMBA_PACKAGE_LINKAGE} STREQUAL "FULL_STATIC")
target_link_libraries(mamba-package PRIVATE libmamba-full-static)
elseif (${MAMBA_PACKAGE_LINKAGE} STREQUAL "STATIC")
if (${MAMBA_PACKAGE_LINKAGE} STREQUAL "STATIC")
target_link_libraries(mamba-package PRIVATE libmamba-static)
if (WIN32)
set_target_properties(mamba-package PROPERTIES MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
endif ()
else ()
target_link_libraries(mamba-package PRIVATE libmamba)
endif ()

View File

@ -4,18 +4,19 @@
#
# The full license is in the file LICENSE, distributed with this software.
cmake_minimum_required (VERSION 3.2)
if(POLICY CMP0025)
cmake_policy(SET CMP0025 NEW)
endif()
cmake_policy(SET CMP0077 NEW)
cmake_minimum_required (VERSION 3.16)
cmake_policy(SET CMP0025 NEW) # Introduced in cmake 3.0
cmake_policy(SET CMP0077 NEW) # Introduced in cmake 3.13
project(micromamba)
# Build options
# =============
set(MICROMAMBA_LINKAGE "DYNAMIC" CACHE STRING "micromamba linkage against libraries")
if (BUILD_STATIC AND NOT BUILD_SHARED)
set(MICROMAMBA_LINKAGE "STATIC" CACHE STRING "micromamba linkage against libraries")
else ()
set(MICROMAMBA_LINKAGE "DYNAMIC" CACHE STRING "micromamba linkage against libraries")
endif ()
# Source files
# ============
@ -55,27 +56,21 @@ add_executable(micromamba ${MICROMAMBA_SRCS} ${MICROMAMBA_HEADERS})
mamba_target_add_compile_warnings(micromamba WARNING_AS_ERROR ${MAMBA_WARNING_AS_ERROR})
if(NOT (TARGET libmamba OR TARGET libmamba-static OR TARGET libmamba-full-static))
if(NOT (TARGET libmamba OR TARGET libmamba-static))
find_package(libmamba REQUIRED)
endif ()
string(TOUPPER "${MICROMAMBA_LINKAGE}" linkage_upper)
if (NOT ${linkage_upper} MATCHES "^(DYNAMIC|STATIC|FULL_STATIC)$")
message(FATAL_ERROR "Invalid executable linkage: ${MICROMAMBA_LINKAGE}, should be one of { DYNAMIC, STATIC, FULL_STATIC }")
endif ()
message(STATUS "Micromamba linkage: ${MICROMAMBA_LINKAGE}")
find_package(Threads REQUIRED)
target_link_libraries(micromamba PRIVATE Threads::Threads)
if (${MICROMAMBA_LINKAGE} STREQUAL "FULL_STATIC")
target_link_libraries(micromamba PRIVATE libmamba-full-static)
if (WIN32)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
endif ()
elseif (${MICROMAMBA_LINKAGE} STREQUAL "STATIC")
string(TOUPPER "${MICROMAMBA_LINKAGE}" linkage_upper)
message(STATUS "Micromamba linkage: ${MICROMAMBA_LINKAGE}")
if (${MICROMAMBA_LINKAGE} STREQUAL "STATIC")
target_link_libraries(micromamba PRIVATE libmamba-static)
if (WIN32)
set_target_properties(micromamba PROPERTIES MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
endif ()
else ()
target_link_libraries(micromamba PRIVATE libmamba)
endif ()

View File

@ -0,0 +1,32 @@
# Conda's binary relocation can result in string changing which can result in errors like
# > warning: command substitution: ignored null byte in input
# https://github.com/mamba-org/mamba/issues/1517
export CXXFLAGS="${CXXFLAGS} -fno-merge-constants"
export CFLAGS="${CFLAGS} -fno-merge-constants"
export CXXFLAGS="${CXXFLAGS} -D_LIBCPP_DISABLE_AVAILABILITY=1"
cmake -B build \
-G Ninja \
${CMAKE_ARGS} \
-D CMAKE_INSTALL_PREFIX=${PREFIX} \
-D CMAKE_BUILD_TYPE="Release" \
-D BUILD_LIBMAMBA=ON \
-D BUILD_STATIC=ON \
-D BUILD_MICROMAMBA=ON
cmake --build build/ --parallel ${CPU_COUNT}
cmake --install build/
# remove everything related to `libmamba`
rm -rf $PREFIX/lib/libmamba*
rm -rf $PREFIX/include/mamba
rm -rf $PREFIX/lib/cmake/libmamba
${STRIP:-strip} ${PREFIX}/bin/micromamba
if [[ "$target_platform" == "osx-"* ]]; then
OTOOL_OUTPUT=$(${OTOOL:-otool} -L ${PREFIX}/bin/micromamba)
if [[ "$OTOOL_OUTPUT" == *libc++.1.dylib* ]]; then
echo "micromamba is linked to libc++.1.dlyb"
exit 1
fi
fi