Merge #1491: Enable cross compilation to windows and macos with nix
6b4e7b0521c7328647738b46afd67386273c403e fix reproducible dpkg-deb (edouardparis)
cc083f9be6f6dd2f50a60572d09872913ece5dd0 Remove docker reproducible build (edouardparis)
34e6afd54351178fdfae6eca01ee24e744d21fa1 Add script contrib/release/sign.sh for signing binaries (edouardparis)
a2917c5bd73e230d9b2cb13ec25250bd36b6d5ad Add SOURCE_DATE_EPOCH and TAR_OPTIONS for reproducibility (edouardparis)
2c70aba2d573d80a9b4ed78c0914e3996a6352ca nix build and nix shells for release (edouardparis)
Pull request description:
The nix build replace the docker build. Sadly zip is not fully deterministic so release_assets may not have always the same hash, but users can still audit the binaries reproducible build.
ACKs for top commit:
edouardparis:
Self-ACK 6b4e7b0521c7328647738b46afd67386273c403e
Tree-SHA512: cc66465073aa15c23e941cc41ec03918ee604adb40a3a65de524ff03a1651ababf0d40287f749a03aea9c8c165172b1e9a3b3aaffb120074a152697a0920b2f8
This commit is contained in:
commit
fec4baeb58
@ -1,4 +0,0 @@
|
||||
*
|
||||
!Cargo.*
|
||||
!gui/Cargo.*
|
||||
!contrib/reproducible/docker/cargo_config.toml
|
||||
3
.gitignore
vendored
3
.gitignore
vendored
@ -12,3 +12,6 @@ TODO
|
||||
Xcode_12.2.xip
|
||||
.idea/
|
||||
fuzz/corpus
|
||||
result
|
||||
release_build
|
||||
release_assets
|
||||
|
||||
@ -15,14 +15,27 @@ WINDOWS_DIR_NAME="$LIANA_PREFIX-x86_64-windows-gnu"
|
||||
WINDOWS_ARCHIVE="$WINDOWS_DIR_NAME.zip"
|
||||
MAC_DIR_NAME="$LIANA_PREFIX-x86_64-apple-darwin"
|
||||
MAC_ARCHIVE="$MAC_DIR_NAME.tar.gz"
|
||||
MAC_CODESIGN="${MAC_CODESIGN:-"0"}"
|
||||
RCODESIGN_BIN="${RCODESIGN_BIN:-"$PWD/../../macos_codesigning/apple-codesign-0.22.0-x86_64-unknown-linux-musl/rcodesign"}"
|
||||
CODESIGN_KEY="${CODESIGN_KEY:-"$PWD/../../macos_codesigning/wizardsardine_liana.key"}"
|
||||
CODESIGN_CERT="${CODESIGN_CERT:-"$PWD/../../macos_codesigning/antoine_devid_liana_codesigning.cer"}"
|
||||
NOTARY_API_CREDS_FILE="${NOTARY_API_CREDS_FILE:-"$PWD/../../macos_codesigning/encoded_appstore_api_key.json"}"
|
||||
|
||||
create_dir() {
|
||||
test -d "$1" || mkdir "$1"
|
||||
if [ -d "$1" ]; then
|
||||
rm -rf "$1"
|
||||
fi
|
||||
mkdir "$1"
|
||||
}
|
||||
|
||||
|
||||
|
||||
# Determine the reference time used for determinism (overridable by environment)
|
||||
export SOURCE_DATE_EPOCH="$(git -c log.showsignature=false log --format=%at -1)"
|
||||
export TZ=UTC
|
||||
export TAR_OPTIONS="--owner=0 --group=0 --numeric-owner --sort=name"
|
||||
|
||||
zip_archive () {
|
||||
local archive="$1"
|
||||
shift
|
||||
touch -d "@$SOURCE_DATE_EPOCH" "$@"
|
||||
find "$@" -type f -exec touch -d "@$SOURCE_DATE_EPOCH" {} +
|
||||
find "$@" -type f | sort | zip -oX "$archive" -@
|
||||
}
|
||||
|
||||
# We'll use a folder for the builds output and another one for the final assets.
|
||||
@ -32,22 +45,24 @@ create_dir "$RELEASE_DIR"
|
||||
create_dir "$BUILD_DIR"
|
||||
|
||||
OUT_DIR="$BUILD_DIR" ./contrib/reproducible/guix/guix-build.sh
|
||||
TARGET_DIR="$BUILD_DIR" ./contrib/reproducible/docker/docker-build.sh
|
||||
|
||||
# Create the Linux archive and Debian binary package.
|
||||
nix build .#release
|
||||
NIX_BUILD_DIR="$(nix path-info .#release)"
|
||||
|
||||
#Create the Linux archive and Debian binary package.
|
||||
(
|
||||
cd "$BUILD_DIR"
|
||||
create_dir "$LINUX_DIR_NAME"
|
||||
cp "$BUILD_DIR/x86_64-unknown-linux-gnu/release/lianad" "$BUILD_DIR/x86_64-unknown-linux-gnu/release/liana-cli" "$BUILD_DIR/x86_64-unknown-linux-gnu/release/liana-gui" ../README.md "$LINUX_DIR_NAME"
|
||||
tar -czf "$LINUX_ARCHIVE" "$LINUX_DIR_NAME"
|
||||
cp "$LINUX_ARCHIVE" "$RELEASE_DIR"
|
||||
tar --mtime="@${SOURCE_DATE_EPOCH}" -czf "$LINUX_ARCHIVE" "$LINUX_DIR_NAME"
|
||||
mv "$LINUX_ARCHIVE" "$RELEASE_DIR"
|
||||
|
||||
unzip ../contrib/release/debian/package.zip
|
||||
sed -i "s/VERSION_PLACEHOLDER/$VERSION/g" ./package/DEBIAN/control
|
||||
cp "$BUILD_DIR/x86_64-unknown-linux-gnu/release/lianad" "$BUILD_DIR/x86_64-unknown-linux-gnu/release/liana-cli" "$BUILD_DIR/x86_64-unknown-linux-gnu/release/liana-gui" ../README.md ./package/usr/bin/
|
||||
DIRNAME="liana_$VERSION-1_amd64"
|
||||
mv ./package "$DIRNAME"
|
||||
dpkg-deb -Zxz --build "$DIRNAME"
|
||||
dpkg-deb -Zxz --build --root-owner-group "$DIRNAME"
|
||||
mv "$DIRNAME.deb" "$RELEASE_DIR"
|
||||
)
|
||||
|
||||
@ -55,40 +70,27 @@ TARGET_DIR="$BUILD_DIR" ./contrib/reproducible/docker/docker-build.sh
|
||||
(
|
||||
cd "$BUILD_DIR"
|
||||
create_dir "$WINDOWS_DIR_NAME"
|
||||
cp "$BUILD_DIR/x86_64-pc-windows-gnu/release/liana-gui.exe" ../README.md "$WINDOWS_DIR_NAME"
|
||||
zip -r "$WINDOWS_ARCHIVE" "$WINDOWS_DIR_NAME"
|
||||
cp "$WINDOWS_ARCHIVE" "$RELEASE_DIR"
|
||||
cp "$BUILD_DIR/x86_64-pc-windows-gnu/release/liana-gui.exe" "$RELEASE_DIR/$LIANA_PREFIX.exe"
|
||||
cp "$NIX_BUILD_DIR/x86_64-pc-windows-gnu/liana-gui.exe" ../README.md "$WINDOWS_DIR_NAME"
|
||||
zip_archive "$WINDOWS_ARCHIVE" "$WINDOWS_DIR_NAME"
|
||||
mv "$WINDOWS_ARCHIVE" "$RELEASE_DIR"
|
||||
cp "$NIX_BUILD_DIR/x86_64-pc-windows-gnu/liana-gui.exe" "$RELEASE_DIR/$LIANA_PREFIX.exe"
|
||||
)
|
||||
|
||||
# Create the MacOS archive and a zipped application bundle of liana-gui.
|
||||
(
|
||||
cd "$BUILD_DIR"
|
||||
create_dir "$MAC_DIR_NAME"
|
||||
cp "$BUILD_DIR/x86_64-apple-darwin/release/lianad" "$BUILD_DIR/x86_64-apple-darwin/release/liana-cli" "$BUILD_DIR/x86_64-apple-darwin/release/liana-gui" ../README.md "$MAC_DIR_NAME"
|
||||
tar -czf "$MAC_ARCHIVE" "$MAC_DIR_NAME"
|
||||
cp "$MAC_ARCHIVE" "$RELEASE_DIR"
|
||||
cp "$NIX_BUILD_DIR/x86_64-apple-darwin/lianad" "$NIX_BUILD_DIR/x86_64-apple-darwin/liana-cli" "$NIX_BUILD_DIR/x86_64-apple-darwin/liana-gui" ../README.md "$MAC_DIR_NAME"
|
||||
tar --mtime="@${SOURCE_DATE_EPOCH}" -czf "$MAC_ARCHIVE" "$MAC_DIR_NAME"
|
||||
mv "$MAC_ARCHIVE" "$RELEASE_DIR"
|
||||
|
||||
unzip ../contrib/release/macos/Liana.app.zip
|
||||
sed -i "s/VERSION_PLACEHOLDER/$VERSION/g" ./Liana.app/Contents/Info.plist
|
||||
cp "$BUILD_DIR/x86_64-apple-darwin/release/liana-gui" ./Liana.app/Contents/MacOS/Liana
|
||||
zip -ry Liana-noncodesigned.zip Liana.app
|
||||
cp ./Liana-noncodesigned.zip "$RELEASE_DIR/"
|
||||
|
||||
if [ "$MAC_CODESIGN" = "1" ]; then
|
||||
$RCODESIGN_BIN sign --digest sha256 --code-signature-flags runtime --pem-source "$CODESIGN_KEY" --der-source "$CODESIGN_CERT" Liana.app/
|
||||
$RCODESIGN_BIN notary-submit --max-wait-seconds 600 --api-key-path "$NOTARY_API_CREDS_FILE" --staple Liana.app
|
||||
zip -ry Liana.zip Liana.app
|
||||
cp ./Liana.zip "$RELEASE_DIR/"
|
||||
fi
|
||||
cp "$NIX_BUILD_DIR/x86_64-apple-darwin/liana-gui" ./Liana.app/Contents/MacOS/Liana
|
||||
zip_archive "Liana-$VERSION-noncodesigned.zip" Liana.app
|
||||
mv "Liana-$VERSION-noncodesigned.zip" "$RELEASE_DIR/"
|
||||
)
|
||||
|
||||
# Finally, sign all the assets
|
||||
(
|
||||
cd "$RELEASE_DIR"
|
||||
for asset in $(ls); do
|
||||
gpg --detach-sign --armor "$asset"
|
||||
done
|
||||
)
|
||||
find "$RELEASE_DIR" -type f ! -name "shasums.txt" -exec sha256sum {} + | tee "$RELEASE_DIR/shasums.txt"
|
||||
|
||||
set +ex
|
||||
|
||||
115
contrib/release/sign.sh
Executable file
115
contrib/release/sign.sh
Executable file
@ -0,0 +1,115 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
set -e # Exit immediately if a command exits with a non-zero status
|
||||
set -x # Print commands and their arguments as they are executed
|
||||
|
||||
VERSION="${VERSION:-"8.0"}"
|
||||
# Define the release directory
|
||||
RELEASE_DIR="$PWD/release_assets"
|
||||
RELEASE_BUILD_DIR="$PWD/release_build"
|
||||
|
||||
# Function to perform GPG signing
|
||||
sign_with_gpg() {
|
||||
(
|
||||
cd "$RELEASE_DIR"
|
||||
gpg --detach-sign --armor "shasums.txt"
|
||||
)
|
||||
}
|
||||
|
||||
# Function to convert a path to an absolute path
|
||||
absolute_path() {
|
||||
local path="$1"
|
||||
if [[ "$path" = /* ]]; then
|
||||
echo "$path"
|
||||
else
|
||||
echo "$PWD/$path"
|
||||
fi
|
||||
}
|
||||
|
||||
# Determine the reference time used for determinism (overridable by environment)
|
||||
export SOURCE_DATE_EPOCH="$(git -c log.showsignature=false log --format=%at -1)"
|
||||
export TZ=UTC
|
||||
|
||||
zip_archive () {
|
||||
local archive="$1"
|
||||
shift
|
||||
touch -d "@$SOURCE_DATE_EPOCH" "$@"
|
||||
find "$@" -type f -exec touch -d "@$SOURCE_DATE_EPOCH" {} +
|
||||
zip -r -oX - "$@" > "$archive"
|
||||
}
|
||||
|
||||
|
||||
|
||||
# Function to perform rcodesign signing
|
||||
sign_with_rcodesign() {
|
||||
# Ensure the correct number of arguments are provided
|
||||
if [ "$#" -ne 3 ]; then
|
||||
echo "Usage: $0 rcodesign <cert_path> <key_path> <apikey_json_path>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Assign arguments to variables
|
||||
CODESIGN_CERT="$(absolute_path $1)"
|
||||
CODESIGN_KEY="$(absolute_path $2)"
|
||||
NOTARY_API_CREDS_FILE="$(absolute_path $3)"
|
||||
|
||||
# Verify that the provided files exist
|
||||
if [ ! -f "$CODESIGN_CERT" ]; then
|
||||
echo "Certificate file not found: $CODESIGN_CERT"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "$CODESIGN_KEY" ]; then
|
||||
echo "Key file not found: $CODESIGN_KEY"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "$NOTARY_API_CREDS_FILE" ]; then
|
||||
echo "API credentials file not found: $NOTARY_API_CREDS_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cd "$RELEASE_BUILD_DIR"
|
||||
chmod u+w ./Liana.app/Contents/MacOS/Liana
|
||||
|
||||
rcodesign sign \
|
||||
--digest sha256 \
|
||||
--code-signature-flags runtime \
|
||||
--pem-source "$CODESIGN_KEY" \
|
||||
--der-source "$CODESIGN_CERT" \
|
||||
Liana.app/
|
||||
|
||||
rcodesign notary-submit \
|
||||
--max-wait-seconds 600 \
|
||||
--api-key-path "$NOTARY_API_CREDS_FILE" \
|
||||
--staple Liana.app
|
||||
|
||||
zip_archive "Liana-$VERSION.zip" Liana.app
|
||||
mv "Liana-$VERSION.zip" "$RELEASE_DIR/"
|
||||
sha256sum "$RELEASE_DIR/Liana-$VERSION.zip" | tee -a "$RELEASE_DIR/shasums.txt"
|
||||
}
|
||||
|
||||
if [ "$#" -lt 1 ]; then
|
||||
echo "Usage: $0 <gpg|rcodesign> [args...]"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
COMMAND="$1"
|
||||
shift # Shift the arguments to access any additional parameters
|
||||
|
||||
case "$COMMAND" in
|
||||
gpg)
|
||||
sign_with_gpg
|
||||
;;
|
||||
rcodesign)
|
||||
sign_with_rcodesign "$@"
|
||||
;;
|
||||
*)
|
||||
echo "Invalid command: $COMMAND"
|
||||
echo "Usage: $0 <gpg|rcodesign> [args...]"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# Disable debugging and exit on success
|
||||
set +ex
|
||||
@ -1,5 +1,7 @@
|
||||
# Liana reproducible builds
|
||||
|
||||
## Reproducible build of linux binaries with GUIX
|
||||
|
||||
Releases of Liana are built in a reproducible manner, providing an assurance the binary a user is
|
||||
going to run corresponds to the sources published. It enables the possibility for the user, or a
|
||||
third party, to audit the code being ran.
|
||||
@ -13,5 +15,55 @@ builds [here](https://bootstrappable.org/).
|
||||
|
||||
For instructions on bootstrappable builds of Linux releases, see the [`guix`](./guix) folder.
|
||||
|
||||
For instructions on reproducible builds of Windows and MacOS releases, see the [`docker`](./docker)
|
||||
folder.
|
||||
|
||||
## Reproducible build of windows and macos binaries with NIX
|
||||
|
||||
You will have to install [Nix](https://nixos.org/download/#download-nix), a package manager.
|
||||
We rely on nix flakes, so you may need to activate this feature by setting in your `~/.config/nix/nix.conf`:
|
||||
|
||||
```
|
||||
experimental-features = nix-command flakes
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
Simply run:
|
||||
|
||||
```
|
||||
nix build .#x86_64-pc-windows-gnu
|
||||
```
|
||||
|
||||
Binary will be present in the `./result` folder.
|
||||
|
||||
|
||||
### MACOS
|
||||
|
||||
First you need get the MacOS SDK. It is required to be able to build the MacOS binaries. The `12_2` version is
|
||||
required (`Xcode_12.2.xip`). You need to download it from Apple's website. An Apple ID and cookies
|
||||
enabled for the hostname are required. You can create one for free. (Note it is illegal to
|
||||
distribute the archive.) Once logged in you can use the [direct
|
||||
link](https://download.developer.apple.com/Developer_Tools/Xcode_12.2/Xcode_12.2.xip) to download
|
||||
the archive. Alternatively, go to 'Downloads', then 'More' and search for [`Xcode
|
||||
12.2`](https://developer.apple.com/download/all/?q=Xcode%2012.2).
|
||||
The `sha256sum` of the downloaded XIP archive should be
|
||||
`28d352f8c14a43d9b8a082ac6338dc173cb153f964c6e8fb6ba389e5be528bd0`.
|
||||
|
||||
Then you have to extract the SDK and add it to the nix store:
|
||||
|
||||
```
|
||||
nix run github:edouardparis/unxip#unxip -- Xcode_12.2.xip Xcode_12.2
|
||||
cd Xcode_12.2
|
||||
nix-store --add-fixed --recursive sha256 Xcode.app
|
||||
```
|
||||
It may take a long time.
|
||||
|
||||
Then to compile binaries for new apple CPUs:
|
||||
```
|
||||
nix build .#aarch64-apple-darwin
|
||||
```
|
||||
Or for legacy CPUs:
|
||||
```
|
||||
nix build .#x86_64-apple-darwin
|
||||
```
|
||||
|
||||
Binaries will be present in the `./result` folder.
|
||||
|
||||
@ -1,33 +0,0 @@
|
||||
## Reproducible Liana builds
|
||||
|
||||
This repository contains the scripts to [reproducibly build](https://reproducible-builds.org/) Liana
|
||||
on Windows and MacOS, for which we are missing [bootstrapable Guix builds](../guix/).
|
||||
|
||||
In order to perform the builds you will need [Docker](https://www.docker.com/).
|
||||
|
||||
The [`docker-build.sh`](./docker-build.sh) script will create a Docker image containing the build
|
||||
environment for both Mac and Windows (see the respective `Dockerfile`s). It will then build the GUI
|
||||
on Windows (the daemon isn't supported there) and both the daemon and the GUI on MacOS. The output
|
||||
will be placed in a given `TARGET_DIR` (whose default value is `deter_build_target`).
|
||||
|
||||
### Build instructions
|
||||
|
||||
First of all, get [Docker](https://www.docker.com/).
|
||||
|
||||
Then get the MacOS SDK. It is required to be able to build the MacOS binaries. The `12_2` version is
|
||||
required (`Xcode_12.2.xip`). You need to download it from Apple's website. An Apple ID and cookies
|
||||
enabled for the hostname are required. You can create one for free. (Note it is illegal to
|
||||
distribute the archive.) Once logged in you can use the [direct
|
||||
link](https://download.developer.apple.com/Developer_Tools/Xcode_12.2/Xcode_12.2.xip) to download
|
||||
the archive. Alternatively, go to 'Downloads', then 'More' and search for [`Xcode
|
||||
12.2`](https://developer.apple.com/download/all/?q=Xcode%2012.2).
|
||||
The `sha256sum` of the downloaded XIP archive should be
|
||||
`28d352f8c14a43d9b8a082ac6338dc173cb153f964c6e8fb6ba389e5be528bd0`.
|
||||
|
||||
Copy the downloaded `Xcode_12.2.xip` archive at the root of this repository (or provide a custom
|
||||
path to the script by setting the `XCODE_PATH` env var).
|
||||
|
||||
Finally, run the script from the root of the repository:
|
||||
```
|
||||
./contrib/reproducible/docker/docker-build.sh
|
||||
```
|
||||
@ -1,58 +0,0 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
set -ex
|
||||
|
||||
TARGET_DIR="${TARGET_DIR:-"$PWD/deter_build_target"}"
|
||||
|
||||
XCODE_PATH="${XCODE_PATH:-"$PWD/Xcode_12.2.xip"}"
|
||||
XCODE_FILENAME="$(basename $XCODE_PATH)"
|
||||
XCODE_SHASUM="28d352f8c14a43d9b8a082ac6338dc173cb153f964c6e8fb6ba389e5be528bd0"
|
||||
|
||||
# Build (only) the Liana GUI on Windows.
|
||||
docker build . -t liana_cross_win -f contrib/reproducible/docker/windows.Dockerfile
|
||||
docker run --rm -ti \
|
||||
-v "$TARGET_DIR":/liana/target \
|
||||
-v "$PWD/contrib/reproducible/docker":/liana/docker \
|
||||
-v "$PWD/Cargo.toml":/liana/Cargo.toml \
|
||||
-v "$PWD/Cargo.lock":/liana/Cargo.lock \
|
||||
-v "$PWD/liana/Cargo.toml":/liana/liana/Cargo.toml \
|
||||
-v "$PWD/liana/src":/liana/liana/src \
|
||||
-v "$PWD/lianad/Cargo.toml":/liana/lianad/Cargo.toml \
|
||||
-v "$PWD/lianad/src":/liana/lianad/src \
|
||||
-v "$PWD/liana-gui/Cargo.toml":/liana/liana-gui/Cargo.toml \
|
||||
-v "$PWD/liana-gui/src":/liana/liana-gui/src \
|
||||
-v "$PWD/liana-ui/Cargo.toml":/liana/liana-ui/Cargo.toml \
|
||||
-v "$PWD/liana-ui/src":/liana/liana-ui/src \
|
||||
-v "$PWD/liana-ui/static":/liana/liana-ui/static \
|
||||
-v "$PWD/fuzz/Cargo.toml":/liana/fuzz/Cargo.toml \
|
||||
liana_cross_win
|
||||
|
||||
|
||||
# Sanity check the given MacOS SDK is the expected one.
|
||||
if ! $(echo "$XCODE_SHASUM $XCODE_PATH" | sha256sum -c --status); then
|
||||
echo "No or invalid Xcode SDK found. Need an Xcode_X.Y.xip archive whose hash is $XCODE_SHASUM. You can configure the path using \$XCODE_PATH.";
|
||||
exit 1;
|
||||
fi
|
||||
|
||||
# Build both the Liana daemon and GUI on MacOS.
|
||||
docker build . -t liana_cross_mac -f contrib/reproducible/docker/macos.Dockerfile
|
||||
docker run -ti \
|
||||
-v "$TARGET_DIR":/liana/target \
|
||||
-v "$PWD/contrib/reproducible/docker":/liana/docker \
|
||||
-v "$PWD/Cargo.toml":/liana/Cargo.toml \
|
||||
-v "$PWD/Cargo.lock":/liana/Cargo.lock \
|
||||
-v "$PWD/liana/Cargo.toml":/liana/liana/Cargo.toml \
|
||||
-v "$PWD/liana/src":/liana/liana/src \
|
||||
-v "$PWD/lianad/Cargo.toml":/liana/lianad/Cargo.toml \
|
||||
-v "$PWD/lianad/src":/liana/lianad/src \
|
||||
-v "$PWD/liana-gui/Cargo.toml":/liana/liana-gui/Cargo.toml \
|
||||
-v "$PWD/liana-gui/src":/liana/liana-gui/src \
|
||||
-v "$PWD/liana-ui/Cargo.toml":/liana/liana-ui/Cargo.toml \
|
||||
-v "$PWD/liana-ui/src":/liana/liana-ui/src \
|
||||
-v "$PWD/liana-ui/static":/liana/liana-ui/static \
|
||||
-v "$PWD/fuzz/Cargo.toml":/liana/fuzz/Cargo.toml \
|
||||
-v "$XCODE_PATH":"/liana/$XCODE_FILENAME" \
|
||||
-e XCODE_PATH="/liana/$XCODE_FILENAME" \
|
||||
liana_cross_mac
|
||||
|
||||
set +ex
|
||||
@ -1,50 +0,0 @@
|
||||
FROM debian:bullseye
|
||||
|
||||
WORKDIR /liana
|
||||
|
||||
# We try to pin our dependencies to avoid potential sources of non-determinism, but we don't go
|
||||
# out of our way to pin the whole tree of deps. Instead invest time in getting Guix cross-compilation.
|
||||
RUN apt update && apt satisfy -y \
|
||||
"clang (>=11.0, <=11.0)" \
|
||||
"make (<=4.3-*)" \
|
||||
"libssl-dev (>=1.1, <=1.1)" \
|
||||
"liblzma-dev (>=5.2, <=5.2)" \
|
||||
"libxml2 (>=2.9, <= 2.9)" \
|
||||
"libxml2-dev (>=2.9, <=2.9)" \
|
||||
"cmake (>=3.18, <=3.18)" \
|
||||
"git (>=2.30, <=2.30)" \
|
||||
"patch (>=2.7, <=2.7)" \
|
||||
"python3 (>=3.9, <=3.9)" \
|
||||
"llvm-dev (>=11.0, <=11.0)" \
|
||||
"cpio (<=2.13+*)" \
|
||||
"zlib1g-dev (>=1.2, <=1.2)" \
|
||||
"libbz2-dev (>=1.0, <=1.0)" \
|
||||
"xz-utils (>=5.2, <=5.2)" \
|
||||
"bzip2 (>=1.0, <=1.0)" \
|
||||
"curl (>=7.74, <=7.74)"
|
||||
|
||||
# Download the cargo binary and compiled stdlib from the distributed releases to make sure to build with
|
||||
# the very same toolchain. We use 1.71.1 because it is unfortunately the MSRV of the GUI.
|
||||
RUN curl -O "https://static.rust-lang.org/dist/rust-1.71.1-x86_64-unknown-linux-gnu.tar.gz" && \
|
||||
echo "34778d1cda674990dfc0537bc600066046ae9cb5d65a07809f7e7da31d4689c4 rust-1.71.1-x86_64-unknown-linux-gnu.tar.gz" | sha256sum -c && \
|
||||
tar -xzf rust-1.71.1-x86_64-unknown-linux-gnu.tar.gz && \
|
||||
curl -O "https://static.rust-lang.org/dist/rust-1.71.1-x86_64-apple-darwin.tar.gz" && \
|
||||
echo "916056603da88336aba68bbeab49711cc8fdb9cfb46a49b04850c0c09761f58c rust-1.71.1-x86_64-apple-darwin.tar.gz" | sha256sum -c && \
|
||||
tar -xzf rust-1.71.1-x86_64-apple-darwin.tar.gz && \
|
||||
rm -r *.tar.gz
|
||||
|
||||
# NOTE: we were previously caching dependencies here (through `cargo vendor`). It's a tradeoff between the image size
|
||||
# and not needing internet access when running the image to build the software.
|
||||
|
||||
# For some reason, we can't just set the RUSTFLAGS environment variable to add `-L` for compiling dependencies.
|
||||
# This doesn't work: RUSTFLAGS="-L/liana/rust-1.71.1-x86_64-apple-darwin/rust-std-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/"
|
||||
# As a workaround, we use a wrapped `rustc` binary that always links against the macOS stdlib we just downloaded.
|
||||
# Some issues that seem to be related:
|
||||
# https://github.com/rust-lang/rust/issues/40717
|
||||
# https://github.com/rust-lang/rust/issues/48409
|
||||
RUN echo "#!/bin/sh" > rustc_wrapper.sh && \
|
||||
echo "/liana/rust-1.71.1-x86_64-unknown-linux-gnu/rustc/bin/rustc \"\$@\" -L/liana/rust-1.71.1-x86_64-apple-darwin/rust-std-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib/ -L/liana/rust-1.71.1-x86_64-unknown-linux-gnu/rust-std-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/" >> rustc_wrapper.sh && \
|
||||
chmod +x rustc_wrapper.sh
|
||||
ENV RUSTC="/liana/rustc_wrapper.sh"
|
||||
|
||||
CMD ["./docker/macos_cmd.sh"]
|
||||
@ -1,46 +0,0 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
# ==========================================================
|
||||
# The script ran within the Docker container to build Liana.
|
||||
# ==========================================================
|
||||
|
||||
set -xe
|
||||
|
||||
test -f "$XCODE_PATH" || exit 1
|
||||
|
||||
# Build the SDK and the toolchain using osxcross. It is expected to be located at $XCODE_PATH
|
||||
# It's not part of the image to be able to share the $XCODE_PATH instead of copying it in the Docker context
|
||||
# and then to the image.
|
||||
git clone https://github.com/darosior/osxcross -b dependencies_pinning
|
||||
cd osxcross
|
||||
git checkout 50e86ebca7d14372febd0af8cd098705049161b9
|
||||
DARLING_DMG_REVISION=241238313a47d3cf6427ac5a75b7a0311a3a4cb4 \
|
||||
P7ZIP_REVISION=2f60a51ac3aa2507d36df3c4f58f71a3716b1357 \
|
||||
PBZX_REVISION=2a4d7c3300c826d918def713a24d25c237c8ed53 \
|
||||
XAR_REVISION=c2111a9a9cabc50d2b9c604aff41a481ae3f1989 ./tools/gen_sdk_package_pbzx.sh "$XCODE_PATH"
|
||||
mv MacOSX* tarballs/
|
||||
DARLING_DMG_REVISION=241238313a47d3cf6427ac5a75b7a0311a3a4cb4 \
|
||||
P7ZIP_REVISION=2f60a51ac3aa2507d36df3c4f58f71a3716b1357 \
|
||||
PBZX_REVISION=2a4d7c3300c826d918def713a24d25c237c8ed53 \
|
||||
XAR_REVISION=c2111a9a9cabc50d2b9c604aff41a481ae3f1989 \
|
||||
UNATTENDED=1 ./build.sh
|
||||
cd ..
|
||||
|
||||
# Finally build the projects using the toolchain just created.
|
||||
alias cargo="/liana/rust-1.71.1-x86_64-unknown-linux-gnu/cargo/bin/cargo"
|
||||
|
||||
for package_name in "lianad" "liana-gui"; do
|
||||
PATH="$PATH:$PWD/osxcross/target/bin/" \
|
||||
CC=o64-clang \
|
||||
CXX=o64-clang++ \
|
||||
RUSTFLAGS="$RUSTFLAGS -Clinker=o64-clang" \
|
||||
cargo rustc \
|
||||
-p "$package_name" \
|
||||
--target x86_64-apple-darwin \
|
||||
--release
|
||||
done
|
||||
|
||||
# Avoid having to get root on the host to remove the target dir.
|
||||
chmod -R a+rw target/
|
||||
|
||||
set +xe
|
||||
@ -1,36 +0,0 @@
|
||||
FROM debian:bullseye
|
||||
|
||||
WORKDIR /liana
|
||||
|
||||
# We try to pin our dependencies to avoid potential sources of non-determinism, but we don't go
|
||||
# out of our way to pin the whole tree of deps. Instead invest time in getting Guix cross-compilation.
|
||||
RUN apt update && apt satisfy -y \
|
||||
"gcc-mingw-w64-x86-64 (>=10.2, <=10.2)" \
|
||||
"curl (>=7.74, <=7.74)" \
|
||||
"gcc (>=10.2, <=10.2)"
|
||||
|
||||
# Download the cargo binary and compiled stdlib from the distributed releases to make sure to build with
|
||||
# the very same toolchain. We use 1.71.1 because it is unfortunately the MSRV of the GUI.
|
||||
RUN curl -O "https://static.rust-lang.org/dist/rust-1.71.1-x86_64-unknown-linux-gnu.tar.gz" && \
|
||||
echo "34778d1cda674990dfc0537bc600066046ae9cb5d65a07809f7e7da31d4689c4 rust-1.71.1-x86_64-unknown-linux-gnu.tar.gz" | sha256sum -c && \
|
||||
tar -xzf rust-1.71.1-x86_64-unknown-linux-gnu.tar.gz && \
|
||||
curl -O "https://static.rust-lang.org/dist/rust-1.71.1-x86_64-pc-windows-gnu.tar.gz" && \
|
||||
echo "15289233721ad7c3d697890d9c6079ca3b8a0f6740c080fbec3e8ae3a5ea5c8c rust-1.71.1-x86_64-pc-windows-gnu.tar.gz" | sha256sum -c && \
|
||||
tar -xzf rust-1.71.1-x86_64-pc-windows-gnu.tar.gz && \
|
||||
rm -r *.tar.gz
|
||||
|
||||
# NOTE: we were previously caching dependencies here (through `cargo vendor`). It's a tradeoff between the image size
|
||||
# and not needing internet access when running the image to build the software.
|
||||
|
||||
# For some reason, we can't just set the RUSTFLAGS environment variable to add `-L` for compiling dependencies.
|
||||
# This doesn't work: RUSTFLAGS="-L /liana/rust-1.71.1-x86_64-pc-windows-gnu/rust-std-x86_64-pc-windows-gnu/lib/rustlib/x86_64-pc-windows-gnu/lib/ -L /liana/rust-1.71.1-x86_64-unknown-linux-gnu/rust-std-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/"
|
||||
# As a workaround, we use a wrapped `rustc` binary that always links against the windows stdlib we just downloaded.
|
||||
# Some issues that seem to be related:
|
||||
# https://github.com/rust-lang/rust/issues/40717
|
||||
# https://github.com/rust-lang/rust/issues/48409
|
||||
RUN echo "#!/bin/sh" > rustc_wrapper.sh && \
|
||||
echo "/liana/rust-1.71.1-x86_64-unknown-linux-gnu/rustc/bin/rustc \"\$@\" -L /liana/rust-1.71.1-x86_64-pc-windows-gnu/rust-std-x86_64-pc-windows-gnu/lib/rustlib/x86_64-pc-windows-gnu/lib/ -L /liana/rust-1.71.1-x86_64-unknown-linux-gnu/rust-std-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/" >> rustc_wrapper.sh && \
|
||||
chmod +x rustc_wrapper.sh
|
||||
ENV RUSTC="/liana/rustc_wrapper.sh"
|
||||
|
||||
CMD ["./docker/windows_cmd.sh"]
|
||||
@ -1,21 +0,0 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
# =================================================================
|
||||
# The script ran within the Docker container to build the Liana GUI.
|
||||
# =================================================================
|
||||
|
||||
set -xe
|
||||
|
||||
# Build the GUI for Windows. The Windows Portable Execution (PE) format contains some timestamps.
|
||||
# Instruct ld to set them to 0.
|
||||
alias cargo="/liana/rust-1.71.1-x86_64-unknown-linux-gnu/cargo/bin/cargo"
|
||||
RUSTFLAGS="-Clink-arg=-Wl,--no-insert-timestamp" \
|
||||
cargo rustc \
|
||||
-p liana-gui \
|
||||
--release \
|
||||
--target x86_64-pc-windows-gnu
|
||||
|
||||
# Avoid having to get root on the host to remove the target dir.
|
||||
chmod -R a+rw target/
|
||||
|
||||
set +xe
|
||||
@ -44,3 +44,10 @@ This document details the release process.
|
||||
- Update the package managers with the new version. As of this writing we only update the [AUR
|
||||
package](https://aur.archlinux.org/packages/liana-bin) ourselves.
|
||||
- Celebrate.
|
||||
|
||||
In order to build the release assets:
|
||||
|
||||
```
|
||||
nix develop .#release
|
||||
./contrib/release/release.sh
|
||||
```
|
||||
|
||||
55
flake.lock
generated
55
flake.lock
generated
@ -1,5 +1,41 @@
|
||||
{
|
||||
"nodes": {
|
||||
"crane": {
|
||||
"locked": {
|
||||
"lastModified": 1732407143,
|
||||
"narHash": "sha256-qJOGDT6PACoX+GbNH2PPx2ievlmtT1NVeTB80EkRLys=",
|
||||
"owner": "ipetkov",
|
||||
"repo": "crane",
|
||||
"rev": "f2b4b472983817021d9ffb60838b2b36b9376b20",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "ipetkov",
|
||||
"repo": "crane",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"fenix": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"rust-analyzer-src": "rust-analyzer-src"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1732689334,
|
||||
"narHash": "sha256-yKI1KiZ0+bvDvfPTQ1ZT3oP/nIu3jPYm4dnbRd6hYg4=",
|
||||
"owner": "nix-community",
|
||||
"repo": "fenix",
|
||||
"rev": "a8a983027ca02b363dfc82fbe3f7d9548a8d3dce",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "fenix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
@ -36,10 +72,29 @@
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"crane": "crane",
|
||||
"fenix": "fenix",
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
},
|
||||
"rust-analyzer-src": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1732633904,
|
||||
"narHash": "sha256-7VKcoLug9nbAN2txqVksWHHJplqK9Ou8dXjIZAIYSGc=",
|
||||
"owner": "rust-lang",
|
||||
"repo": "rust-analyzer",
|
||||
"rev": "8d5e91c94f80c257ce6dbdfba7bd63a5e8a03fa6",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "rust-lang",
|
||||
"ref": "nightly",
|
||||
"repo": "rust-analyzer",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
|
||||
149
flake.nix
149
flake.nix
@ -4,13 +4,127 @@
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
crane.url = "github:ipetkov/crane";
|
||||
fenix = {
|
||||
url = "github:nix-community/fenix";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs, flake-utils, ... }:
|
||||
outputs = { self, nixpkgs, flake-utils, crane, fenix, ... }:
|
||||
flake-utils.lib.eachDefaultSystem (system:
|
||||
let
|
||||
pkgs = import nixpkgs { inherit system; };
|
||||
in {
|
||||
pkgs = import nixpkgs { inherit system; config = { allowUnfree = true; };};
|
||||
|
||||
inherit (pkgs) lib;
|
||||
|
||||
toolchain = with fenix.packages.${system};
|
||||
combine [
|
||||
minimal.rustc
|
||||
minimal.cargo
|
||||
targets.x86_64-pc-windows-gnu.latest.rust-std
|
||||
targets.aarch64-apple-darwin.latest.rust-std
|
||||
targets.x86_64-apple-darwin.latest.rust-std
|
||||
];
|
||||
|
||||
craneLib = (crane.mkLib pkgs).overrideToolchain toolchain;
|
||||
commonBuildSettings = {
|
||||
src = lib.fileset.toSource {
|
||||
root = ./.;
|
||||
fileset = lib.fileset.unions [
|
||||
(craneLib.fileset.commonCargoSources ./.)
|
||||
(lib.fileset.maybeMissing ./liana-ui/static)
|
||||
];
|
||||
};
|
||||
strictDeps = true;
|
||||
doCheck = false;
|
||||
};
|
||||
|
||||
x86_64-pc-windows-gnu = craneLib.buildPackage {
|
||||
inherit (commonBuildSettings) src strictDeps doCheck;
|
||||
|
||||
CARGO_BUILD_TARGET = "x86_64-pc-windows-gnu";
|
||||
CARGO_BUILD_RUSTFLAGS = "-C link-arg=-Wl,--no-insert-timestamp";
|
||||
TARGET_CC = "${pkgs.pkgsCross.mingwW64.stdenv.cc}/bin/${pkgs.pkgsCross.mingwW64.stdenv.cc.targetPrefix}cc";
|
||||
|
||||
pname = "liana-gui";
|
||||
cargoExtraArgs = "-p liana-gui";
|
||||
depsBuildBuild = with pkgs; [
|
||||
pkgsCross.mingwW64.stdenv.cc
|
||||
pkgsCross.mingwW64.windows.pthreads
|
||||
];
|
||||
|
||||
installPhaseCommand = ''
|
||||
mkdir -p $out/x86_64-pc-windows-gnu
|
||||
cp target/x86_64-pc-windows-gnu/release/liana-gui.exe $out/x86_64-pc-windows-gnu
|
||||
'';
|
||||
};
|
||||
|
||||
x86_64-apple-darwin = craneLib.buildPackage {
|
||||
inherit (commonBuildSettings) src strictDeps doCheck;
|
||||
|
||||
CARGO_BUILD_TARGET = "x86_64-apple-darwin";
|
||||
buildPhaseCargoCommand = "cargo zigbuild --release --message-format json-render-diagnostics";
|
||||
|
||||
depsBuildBuild = [
|
||||
pkgs.zig
|
||||
pkgs.cargo-zigbuild
|
||||
pkgs.darwin.xcode_12_2
|
||||
];
|
||||
|
||||
preBuild = ''
|
||||
export SDKROOT=${pkgs.darwin.xcode_12_2}/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
|
||||
|
||||
export XDG_CACHE_HOME=$TMPDIR/xdg_cache
|
||||
mkdir -p $XDG_CACHE_HOME
|
||||
export CARGO_ZIGBUILD_CACHE_DIR=$TMPDIR/cargo-zigbuild-cache
|
||||
mkdir -p $CARGO_ZIGBUILD_CACHE_DIR
|
||||
export CC=zigcc
|
||||
export CXX=zigc++
|
||||
|
||||
# rcodesign needs place to sign binary
|
||||
export RUSTFLAGS="-C link-arg=-Wl,-headerpad_max_install_names"
|
||||
'';
|
||||
|
||||
installPhaseCommand = ''
|
||||
mkdir -p $out/x86_64-apple-darwin
|
||||
cp target/x86_64-apple-darwin/release/liana-gui $out/x86_64-apple-darwin
|
||||
cp target/x86_64-apple-darwin/release/lianad $out/x86_64-apple-darwin
|
||||
cp target/x86_64-apple-darwin/release/liana-cli $out/x86_64-apple-darwin
|
||||
'';
|
||||
};
|
||||
|
||||
aarch64-apple-darwin = craneLib.buildPackage {
|
||||
inherit (commonBuildSettings) src strictDeps doCheck;
|
||||
|
||||
CARGO_BUILD_TARGET = "aarch64-apple-darwin";
|
||||
buildPhaseCargoCommand = "cargo zigbuild --release --message-format json-render-diagnostics";
|
||||
|
||||
depsBuildBuild = [
|
||||
pkgs.zig
|
||||
pkgs.cargo-zigbuild
|
||||
pkgs.darwin.xcode_12_2
|
||||
];
|
||||
|
||||
preBuild = ''
|
||||
export SDKROOT=${pkgs.darwin.xcode_12_2}/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
|
||||
|
||||
export XDG_CACHE_HOME=$TMPDIR/xdg_cache
|
||||
mkdir -p $XDG_CACHE_HOME
|
||||
export CARGO_ZIGBUILD_CACHE_DIR=$TMPDIR/cargo-zigbuild-cache
|
||||
mkdir -p $CARGO_ZIGBUILD_CACHE_DIR
|
||||
export CC=zigcc
|
||||
export CXX=zigc++
|
||||
'';
|
||||
|
||||
installPhaseCommand = ''
|
||||
mkdir -p $out/aarch64-apple-darwin
|
||||
cp target/aarch64-apple-darwin/release/liana-gui $out/aarch64-apple-darwin
|
||||
cp target/aarch64-apple-darwin/release/lianad $out/aarch64-apple-darwin
|
||||
cp target/aarch64-apple-darwin/release/liana-cli $out/aarch64-apple-darwin
|
||||
'';
|
||||
};
|
||||
|
||||
devShell = pkgs.mkShell rec {
|
||||
buildInputs = with pkgs; [
|
||||
expat
|
||||
@ -31,7 +145,34 @@
|
||||
LD_LIBRARY_PATH =
|
||||
builtins.foldl' (a: b: "${a}:${b}/lib") "${pkgs.vulkan-loader}/lib" buildInputs;
|
||||
};
|
||||
|
||||
releaseShell = pkgs.mkShell {
|
||||
buildInputs = [
|
||||
pkgs.zip
|
||||
pkgs.unzip
|
||||
pkgs.gnutar
|
||||
pkgs.dpkg
|
||||
pkgs.rcodesign
|
||||
];
|
||||
};
|
||||
|
||||
in {
|
||||
packages = {
|
||||
x86_64-pc-windows-gnu = x86_64-pc-windows-gnu;
|
||||
x86_64-apple-darwin = x86_64-apple-darwin;
|
||||
aarch64-apple-darwin = aarch64-apple-darwin;
|
||||
release = pkgs.buildEnv {
|
||||
name = "release";
|
||||
paths = [ x86_64-pc-windows-gnu x86_64-apple-darwin aarch64-apple-darwin ];
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
devShells = {
|
||||
dev = devShell;
|
||||
release = releaseShell;
|
||||
default = devShell;
|
||||
};
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user