Skip to content

Commit

Permalink
fix: Build for darwin-arm64 (Apple M1)
Browse files Browse the repository at this point in the history
- `liblzma-config.sh`: If configure fails, run autogen.sh / autoconf (*)
- refactor `build` action in `bindings.gyp` so that config and build scripts output is shown, making troubleshooting easier
  - `build` action refactored into `build` and `configure` actions with dependencies between them
  - since `configure` is a separate action instead of a command that runs as part of the 'input' key, it is free to output anything
  - script output is made less verbose and more clear, so it's not necessary to send to log file
  - this essentially means that configure & build could be the same script (configure is not run as part of configure stage of gyp)
- for reference, add link to XZ library used to README.md

(*) The drawback of this is that the fallback to autoconf requires a full autoconf type build environment, but it is a last resort fallback.
  • Loading branch information
beorn committed Jan 11, 2022
1 parent 39f18e9 commit 8e7cfb9
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 18 deletions.
2 changes: 2 additions & 0 deletions .gitignore
@@ -1,3 +1,4 @@
*.log
build/
binding*/
node_modules/
Expand All @@ -8,3 +9,4 @@ README.md.xz
.nyc_output
/.idea/
prebuilds/
/.vscode
2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -9,7 +9,7 @@ lzma-native
[![Dependency Status](https://david-dm.org/addaleax/lzma-native.svg?style=flat)](https://david-dm.org/addaleax/lzma-native)
[![devDependency Status](https://david-dm.org/addaleax/lzma-native/dev-status.svg?style=flat)](https://david-dm.org/addaleax/lzma-native#info=devDependencies)

Node.js interface to the native liblzma compression library (.xz file format, among others)
Node.js interface for the native [XZ Utils liblzma native compression library](https://tukaani.org/xz/) (.xz file format, among others)

This package provides interfaces for compression and decompression
of `.xz` (and legacy `.lzma`) files, both stream-based and string-based.
Expand Down
15 changes: 9 additions & 6 deletions binding.gyp
Expand Up @@ -52,14 +52,17 @@
"conditions" : [
[ 'OS!="win"' , {
"actions" : [
{
"action_name" : "configure",
'inputs': ['liblzma-config.sh'],
'outputs': ['build/liblzma'],
'action': ['eval', 'sh liblzma-config.sh build deps/xz-5.2.3.tar.bz2'],
},
{
"action_name" : "build",
# a hack to run deps/xz-5.2.3 ./configure during `node-gyp configure`
'inputs': ['<!@(sh liblzma-config.sh "<(module_root_dir)/build" "<(module_root_dir)/deps/xz-5.2.3.tar.bz2")'],
'outputs': [''],
'action': [
'sh', '<(module_root_dir)/liblzma-build.sh', '<(module_root_dir)/build'
]
'inputs': ['build/liblzma', 'liblzma-build.sh'],
'outputs': ['build/liblzma/Release'],
'action': ['eval', 'sh liblzma-build.sh build'],
}
]
}, {
Expand Down
9 changes: 8 additions & 1 deletion liblzma-build.sh
@@ -1,11 +1,18 @@
#!/bin/sh

echo
echo "--- liblzma-build.sh $*"
echo "--- CWD = $PWD"
echo

set -e

case $(uname | tr '[:upper:]' '[:lower:]') in
*bsd) alias make='gmake';;
*)
esac

cd "$1/liblzma"
set -x
cd "$1" && cd liblzma
make
make install
55 changes: 45 additions & 10 deletions liblzma-config.sh
@@ -1,22 +1,57 @@
#!/bin/sh
set -e

echo
echo "--- liblzma-config.sh $*"
echo "--- CWD = $PWD"
echo

SRC_TARBALL="$2"
TARGET_DIR="$1/liblzma"

mkdir -p "$TARGET_DIR"

tar xjf "$SRC_TARBALL" -C "$TARGET_DIR" || exit 1

cd "$TARGET_DIR"
TARGET_DIR="$(pwd)" # ensure absolute since --prefix needs it

function autoconf() {
( cd xz-* ; sh ./autogen.sh --no-po4a )
return $?
}

tar xvjf "$SRC_TARBALL" >node_liblzma_config.log 2>&1
function configure() {
sh xz-*/configure \
--quiet --enable-silent-rules \
--prefix="$TARGET_DIR/build" \
CFLAGS="-fPIC $CFLAGS" \
--enable-static \
--disable-xz \
--disable-xzdec \
--disable-lzmadec \
--disable-lzmainfo \
--disable-lzma-links \
--disable-rpath \
--disable-shared \
--disable-scripts
return $?
}

export CFLAGS="-fPIC $CFLAGS"
set -x

# Fix build on Apple Silicon
# FIXME: Remove after XZ 5.3 is released
if [ $(uname) = "Darwin" -a $(uname -m) = "arm64" ]; then
XZ_SRC_DIR=$(ls | grep xz-*)
sed -i '' 's/\tnone)/\tarm64-*)\n\t\tbasic_machine=$(echo $basic_machine | sed "s\/arm64\/aarch64\/")\n\t\t;;\n\t\tnone)/g' $XZ_SRC_DIR/build-aux/config.sub
echo "--- Patching config.sub for Apple Silicon"
sed -i \
's/\tnone)/\tarm64-*)\n\t\tbasic_machine=$(echo $basic_machine | sed "s\/arm64\/aarch64\/")\n\t\t;;\n\t\tnone)/g' \
xz-*/build-aux/config.sub
echo
fi

sh xz-*/configure --enable-static --disable-shared --disable-scripts --disable-lzmainfo \
--disable-lzma-links --disable-lzmadec --disable-xzdec --disable-xz --disable-rpath \
--prefix="$TARGET_DIR/build" CFLAGS="$CFLAGS" >>node_liblzma_config.log 2>&1
configure # || exit 1 # uncomment to disable use of autoconf
if [ $? -ne 0 ] ; then
echo
echo "--- ./configure failed => trying to run autoconf first"
echo "--- NOTE: This requires a full autoconf build environment, and so may also fail"
echo
autoconf && configure
fi

0 comments on commit 8e7cfb9

Please sign in to comment.