diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e248cd22..ed2bcc95 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -66,14 +66,17 @@ jobs: - name: Checkout uses: actions/checkout@v2 - name: Build docker image - run: cd builders && make docker-image-alpine + run: cd builders && make docker-image-alpine && make docker-image-cross - name: Build & Test static library run: make release-build-alpine + - name: Build static library for MacOS + run: make release-build-macos-static - name: Collect artifacts run: | mkdir artifacts cp ./internal/api/libwasmvm_muslc.a ./artifacts/libwasmvm_muslc.x86_64.a cp ./internal/api/libwasmvm_muslc.aarch64.a ./artifacts/libwasmvm_muslc.aarch64.a + cp ./internal/api/libwasmvmstatic_darwin.a ./artifacts/libwasmvmstatic_darwin.a - name: Create checksums working-directory: ./artifacts run: sha256sum * > checksums.txt && cat checksums.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index abc52826..21ed01a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## [Unreleased](https://github.com/Finschia/wasmvm/compare/v1.1.1-0.11.2...HEAD) ### Features +* feat: Add static build for macos ([#115](https://github.com/Finschia/wasmvm/pull/115)) ### Fixes diff --git a/Makefile b/Makefile index 196ed8e4..dc2537e4 100644 --- a/Makefile +++ b/Makefile @@ -92,6 +92,17 @@ release-build-macos: cp libwasmvm/artifacts/libwasmvm.dylib internal/api make update-bindings +# Creates a release build in a containerized build environment of the static library for macOS (.a) +release-build-macos-static: + rm -rf libwasmvm/target/x86_64-apple-darwin/release + rm -rf libwasmvm/target/aarch64-apple-darwin/release + docker run --rm -u $(USER_ID):$(USER_GROUP) \ + -v $(shell pwd)/libwasmvm:/code \ + -v $(shell pwd)/builders/guest/build_macos_static.sh:/usr/local/bin/build_macos_static.sh \ + $(BUILDERS_PREFIX)-cross build_macos_static.sh + cp libwasmvm/artifacts/libwasmvmstatic_darwin.a internal/api/libwasmvmstatic_darwin.a + make update-bindings + # Creates a release build in a containerized build environment of the shared library for Windows (.dll) release-build-windows: rm -rf libwasmvm/target/release @@ -110,6 +121,7 @@ release-build: make release-build-linux make release-build-macos make release-build-windows + make release-build-macos-static test-alpine: release-build-alpine # try running go tests using this lib with muslc diff --git a/builders/guest/build_macos_static.sh b/builders/guest/build_macos_static.sh new file mode 100755 index 00000000..45086a5d --- /dev/null +++ b/builders/guest/build_macos_static.sh @@ -0,0 +1,24 @@ +#!/bin/bash +set -o errexit -o nounset -o pipefail + +# ref: https://wapl.es/rust/2019/02/17/rust-cross-compile-linux-to-macos.html +export PATH="/opt/osxcross/target/bin:$PATH" +export LIBZ_SYS_STATIC=1 + +# See https://github.com/CosmWasm/wasmvm/issues/222#issuecomment-880616953 for two approaches to +# enable stripping through cargo (if that is desired). + +echo "Starting aarch64-apple-darwin build" +export CC=aarch64-apple-darwin20.4-clang +export CXX=aarch64-apple-darwin20.4-clang++ +cargo build --release --target aarch64-apple-darwin --example wasmvmstatic + +echo "Starting x86_64-apple-darwin build" +export CC=o64-clang +export CXX=o64-clang++ +cargo build --release --target x86_64-apple-darwin --example wasmvmstatic + +# Create a universal library with both archs +lipo -output artifacts/libwasmvmstatic_darwin.a -create \ + target/x86_64-apple-darwin/release/examples/libwasmvmstatic.a \ + target/aarch64-apple-darwin/release/examples/libwasmvmstatic.a diff --git a/internal/api/link_mac.go b/internal/api/link_mac.go index ddd139e0..e6d841ea 100644 --- a/internal/api/link_mac.go +++ b/internal/api/link_mac.go @@ -1,5 +1,4 @@ -//go:build darwin && !sys_wasmvm -// +build darwin,!sys_wasmvm +//go:build darwin && !static_wasm && !sys_wasmvm package api diff --git a/internal/api/link_mac_static.go b/internal/api/link_mac_static.go new file mode 100644 index 00000000..d9132e51 --- /dev/null +++ b/internal/api/link_mac_static.go @@ -0,0 +1,6 @@ +//go:build darwin && static_wasm && !sys_wasmvm + +package api + +// #cgo LDFLAGS: -L${SRCDIR} -lwasmvmstatic_darwin +import "C" diff --git a/libwasmvm/Cargo.toml b/libwasmvm/Cargo.toml index f8720497..de22d514 100644 --- a/libwasmvm/Cargo.toml +++ b/libwasmvm/Cargo.toml @@ -11,7 +11,7 @@ readme = "README.md" exclude = [".circleci/*", ".gitignore"] [lib] -crate-type = ["cdylib"] +crate-type = ["cdylib", "rlib"] # the example is to allow us to compile a muslc static lib with the same codebase as we compile the # normal dynamic libs (best workaround I could find to override crate-type on the command line) @@ -20,9 +20,10 @@ name = "muslc" path = "src/lib.rs" crate-type = ["staticlib"] -# # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -# [badges] -# maintenance = { status = "actively-developed" } +[[example]] +name = "wasmvmstatic" +path = "src/examples/wasmvmstatic.rs" +crate-type = ["staticlib"] [features] default = [] diff --git a/libwasmvm/src/examples/wasmvmstatic.rs b/libwasmvm/src/examples/wasmvmstatic.rs new file mode 100644 index 00000000..42db554f --- /dev/null +++ b/libwasmvm/src/examples/wasmvmstatic.rs @@ -0,0 +1 @@ +pub use wasmvm::*;