mirror of
https://github.com/spacedriveapp/spacedrive
synced 2024-07-07 04:23:29 +00:00
[ENG-1054] libheif for Linux (plus fixes) + Webp update (#1405)
* Move postinstall script to a preprep script
- Fix libheif crate failing to build with our libheif
- Rework CI due to postinstall to preprep changes
* Linux heif build script + Update webp
* Fix ctrl+c/ctrl+v bug
* Improve libheif linux script
- Add support for linux aarch64
- Add CI workflow to build libheif for linux
- Some other misc fixes
* Fix libheif CI requires sudo
* Fix wrong path for libheif build.rs override in Windows
* Fix wrong path manipulations in libheif build script
* 🤦
* Use ubuntu-latest in libheif action
- Specify glib version in target triple to support old distros
- Fix libheif artifact publishing
* Fix artifact upload path again
* Add musl support for libheif
- Remove unused files from libheif artifact
- Add setup logic for libheif in postinstall script
* Build libheif for linux as a shared lib
* Fix meson not building the correct arch
- Add logic to get git branch from githubs CI env vars
* libheif finnaly works on linux
- Make spacedrive binary rpath point to where appimage and deb expects our libs to be
- Add some logic to tauri.js to convince tauri to bundle our shared libs
- Work-around appimage bundling step breaking sometimes
- Add logic to handle sigint in tauri.js to ensure we clean up after ourselves
- Rename postinstall.mjs to setup.mjs
- Add logic to setup.mjs to point our dev build to our shared libs in linux
* Fix windows dekstop dev
- Rename setup.mjs to preprep.mjs
* test cache-factory
* Fix preprep script not parsing the cross compilation target triple and always using the host info to download dependencies
- Fix action env vars not being correctly passed
- Remove possibility to pass multiple targests to rust action
* Don't compile mobile crates on desktop targets
* Remove cache-factory pull_request trigger
* remove patched tauri cli
* Use git plumbing command to get remote branch name
- Fallback to reading .git/HEAD if remote name was not retrieved
* fix type
---------
Co-authored-by: Brendan Allan <brendonovich@outlook.com>
This commit is contained in:
parent
8af1019850
commit
d75a6e9b12
|
@ -10,21 +10,41 @@ FFMPEG_DIR = "{{{ffmpeg}}}"
|
||||||
[target.x86_64-apple-darwin]
|
[target.x86_64-apple-darwin]
|
||||||
rustflags = ["-L", "{{{projectRoot}}}/target/Frameworks/lib"]
|
rustflags = ["-L", "{{{projectRoot}}}/target/Frameworks/lib"]
|
||||||
|
|
||||||
|
[target.x86_64-apple-darwin.heif]
|
||||||
|
rustc-link-search = ["{{{projectRoot}}}/target/Frameworks/lib"]
|
||||||
|
rustc-link-lib = ["heif"]
|
||||||
|
|
||||||
[target.aarch64-apple-darwin]
|
[target.aarch64-apple-darwin]
|
||||||
rustflags = ["-L", "{{{projectRoot}}}/target/Frameworks/lib"]
|
rustflags = ["-L", "{{{projectRoot}}}/target/Frameworks/lib"]
|
||||||
|
|
||||||
|
[target.aarch64-apple-darwin.heif]
|
||||||
|
rustc-link-search = ["{{{projectRoot}}}/target/Frameworks/lib"]
|
||||||
|
rustc-link-lib = ["heif"]
|
||||||
{{/isMacOS}}
|
{{/isMacOS}}
|
||||||
|
|
||||||
{{#isWin}}
|
{{#isWin}}
|
||||||
[target.x86_64-pc-windows-msvc]
|
[target.x86_64-pc-windows-msvc]
|
||||||
rustflags = ["-L", "{{{projectRoot}}}\\target\\Frameworks\\lib"]
|
rustflags = ["-L", "{{{projectRoot}}}\\target\\Frameworks\\lib"]
|
||||||
|
|
||||||
|
[target.x86_64-pc-windows-msvc.heif]
|
||||||
|
rustc-link-search = ["{{{projectRoot}}}\\target\\Frameworks\\lib"]
|
||||||
|
rustc-link-lib = ["heif"]
|
||||||
{{/isWin}}
|
{{/isWin}}
|
||||||
|
|
||||||
{{#isLinux}}
|
{{#isLinux}}
|
||||||
[target.x86_64-unknown-linux-gnu]
|
[target.x86_64-unknown-linux-gnu]
|
||||||
rustflags = ["-L", "{{{projectRoot}}}/target/Frameworks/lib"]
|
rustflags = ["-L", "{{{projectRoot}}}/target/Frameworks/lib", "-C", "link-arg=-Wl,-rpath=${ORIGIN}/../lib/spacedrive"]
|
||||||
|
|
||||||
|
[target.x86_64-unknown-linux-gnu.heif]
|
||||||
|
rustc-link-search = ["{{{projectRoot}}}/target/Frameworks/lib"]
|
||||||
|
rustc-link-lib = ["heif"]
|
||||||
|
|
||||||
[target.aarch64-unknown-linux-gnu]
|
[target.aarch64-unknown-linux-gnu]
|
||||||
rustflags = ["-L", "{{{projectRoot}}}/target/Frameworks/lib"]
|
rustflags = ["-L", "{{{projectRoot}}}/target/Frameworks/lib", "-C", "link-arg=-Wl,-rpath=${ORIGIN}/../lib/spacedrive"]
|
||||||
|
|
||||||
|
[target.aarch64-unknown-linux-gnu.heif]
|
||||||
|
rustc-link-search = ["{{{projectRoot}}}/target/Frameworks/lib"]
|
||||||
|
rustc-link-lib = ["heif"]
|
||||||
{{/isLinux}}
|
{{/isLinux}}
|
||||||
|
|
||||||
[alias]
|
[alias]
|
||||||
|
|
5
.github/actions/setup-pnpm/action.yml
vendored
5
.github/actions/setup-pnpm/action.yml
vendored
|
@ -5,10 +5,6 @@ inputs:
|
||||||
description: Github token
|
description: Github token
|
||||||
required: false
|
required: false
|
||||||
default: ''
|
default: ''
|
||||||
ignorePostInstall:
|
|
||||||
description: Don't run post install
|
|
||||||
required: false
|
|
||||||
default: 'false'
|
|
||||||
runs:
|
runs:
|
||||||
using: 'composite'
|
using: 'composite'
|
||||||
steps:
|
steps:
|
||||||
|
@ -29,5 +25,4 @@ runs:
|
||||||
env:
|
env:
|
||||||
NODE_ENV: debug
|
NODE_ENV: debug
|
||||||
GITHUB_TOKEN: ${{ inputs.token }}
|
GITHUB_TOKEN: ${{ inputs.token }}
|
||||||
IGNORE_POSTINSTALL: ${{ inputs.ignorePostInstall }}
|
|
||||||
run: pnpm i --frozen-lockfile
|
run: pnpm i --frozen-lockfile
|
||||||
|
|
8
.github/actions/setup-rust/action.yaml
vendored
8
.github/actions/setup-rust/action.yaml
vendored
|
@ -1,8 +1,8 @@
|
||||||
name: Setup Rust and Prisma
|
name: Setup Rust and Prisma
|
||||||
description: Setup Rust and Prisma
|
description: Setup Rust and Prisma
|
||||||
inputs:
|
inputs:
|
||||||
targets:
|
target:
|
||||||
description: Comma-separated list of target triples to install for this toolchain
|
description: toolchain target triple
|
||||||
required: false
|
required: false
|
||||||
save-cache:
|
save-cache:
|
||||||
description: Whether to save the Rust cache
|
description: Whether to save the Rust cache
|
||||||
|
@ -15,7 +15,7 @@ runs:
|
||||||
id: toolchain
|
id: toolchain
|
||||||
uses: dtolnay/rust-toolchain@stable
|
uses: dtolnay/rust-toolchain@stable
|
||||||
with:
|
with:
|
||||||
targets: ${{ inputs.targets }}
|
target: ${{ inputs.target }}
|
||||||
toolchain: stable
|
toolchain: stable
|
||||||
components: clippy, rustfmt
|
components: clippy, rustfmt
|
||||||
|
|
||||||
|
@ -24,7 +24,7 @@ runs:
|
||||||
with:
|
with:
|
||||||
save-if: ${{ inputs.save-cache }}
|
save-if: ${{ inputs.save-cache }}
|
||||||
prefix-key: 'v0-rust-deps'
|
prefix-key: 'v0-rust-deps'
|
||||||
shared-key: ${{ inputs.targets }}
|
shared-key: ${{ inputs.target }}
|
||||||
|
|
||||||
- name: Cargo config.toml
|
- name: Cargo config.toml
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
19
.github/actions/setup-system/action.yml
vendored
19
.github/actions/setup-system/action.yml
vendored
|
@ -5,8 +5,8 @@ inputs:
|
||||||
description: Github token
|
description: Github token
|
||||||
required: false
|
required: false
|
||||||
default: ''
|
default: ''
|
||||||
targets:
|
target:
|
||||||
description: Comma-separated list of target triples to install for this toolchain
|
description: toolchain target triple
|
||||||
required: false
|
required: false
|
||||||
setup-arg:
|
setup-arg:
|
||||||
description: Argument for the system setup script
|
description: Argument for the system setup script
|
||||||
|
@ -45,21 +45,26 @@ runs:
|
||||||
- name: Setup Rust and Dependencies
|
- name: Setup Rust and Dependencies
|
||||||
uses: ./.github/actions/setup-rust
|
uses: ./.github/actions/setup-rust
|
||||||
with:
|
with:
|
||||||
targets: ${{ inputs.targets }}
|
target: ${{ inputs.target }}
|
||||||
save-cache: ${{ inputs.save-cache }}
|
save-cache: ${{ inputs.save-cache }}
|
||||||
|
|
||||||
- name: Run setup.sh script
|
- name: Run setup.sh script
|
||||||
shell: bash
|
shell: bash
|
||||||
if: ${{ runner.os == 'Linux' || runner.os == 'macOS' }}
|
if: ${{ runner.os == 'Linux' || runner.os == 'macOS' }}
|
||||||
run: ./scripts/setup.sh ${{ inputs.setup-arg }}
|
run: ./scripts/setup.sh ${{ inputs.setup-arg }}
|
||||||
env:
|
|
||||||
TARGET: ${{ inputs.targets }}
|
|
||||||
GITHUB_TOKEN: ${{ inputs.token }}
|
|
||||||
APPLE_SIGNING_IDENTITY: ${{ env.APPLE_SIGNING_IDENTITY }}
|
|
||||||
|
|
||||||
- name: Run setup.ps1 script
|
- name: Run setup.ps1 script
|
||||||
shell: powershell
|
shell: powershell
|
||||||
if: ${{ runner.os == 'Windows' }}
|
if: ${{ runner.os == 'Windows' }}
|
||||||
run: ./scripts/setup.ps1
|
run: ./scripts/setup.ps1
|
||||||
|
|
||||||
|
- name: Setup shared libraries
|
||||||
|
shell: bash
|
||||||
env:
|
env:
|
||||||
|
TARGET_TRIPLE: ${{ inputs.target }}
|
||||||
GITHUB_TOKEN: ${{ inputs.token }}
|
GITHUB_TOKEN: ${{ inputs.token }}
|
||||||
|
run: |
|
||||||
|
pushd ..
|
||||||
|
npm i archive-wasm mustache
|
||||||
|
popd
|
||||||
|
node scripts/preprep.mjs
|
||||||
|
|
2
.github/scripts/ffmpeg-macos/Dockerfile
vendored
2
.github/scripts/ffmpeg-macos/Dockerfile
vendored
|
@ -1,7 +1,7 @@
|
||||||
ARG FAKE_DEPS="gettext-runtime libiconv ncurses" \
|
ARG FAKE_DEPS="gettext-runtime libiconv ncurses" \
|
||||||
FFMPEG_DEPS="brotli bzip2 dav1d libde265 libjxl libopus libpng libvorbis libvpx-devel openjpeg \
|
FFMPEG_DEPS="brotli bzip2 dav1d libde265 libjxl libopus libpng libvorbis libvpx-devel openjpeg \
|
||||||
soxr xz zimg" \
|
soxr xz zimg" \
|
||||||
LIBWEBP_VERSION=1.3.1 \
|
LIBWEBP_VERSION=1.3.2 \
|
||||||
FFMPEG_VERSION=6.0 \
|
FFMPEG_VERSION=6.0 \
|
||||||
LIBHEIF_VERSION=1.16.2
|
LIBHEIF_VERSION=1.16.2
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
SCRIPT_REPO="https://github.com/madler/zlib.git"
|
SCRIPT_REPO="https://github.com/madler/zlib.git"
|
||||||
SCRIPT_TAG="v1.2.13"
|
SCRIPT_TAG="v1.3"
|
||||||
|
|
||||||
ffbuild_dockerbuild() {
|
ffbuild_dockerbuild() {
|
||||||
git-mini-clone "$SCRIPT_REPO" "$SCRIPT_TAG" zlib
|
git-mini-clone "$SCRIPT_REPO" "$SCRIPT_TAG" zlib
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
SCRIPT_REPO="https://github.com/strukturag/libde265.git"
|
SCRIPT_REPO="https://github.com/strukturag/libde265.git"
|
||||||
SCRIPT_TAG="v1.0.11"
|
SCRIPT_TAG="v1.0.12"
|
||||||
|
|
||||||
ffbuild_dockerbuild() {
|
ffbuild_dockerbuild() {
|
||||||
git-mini-clone "$SCRIPT_REPO" "$SCRIPT_TAG" libde265
|
git-mini-clone "$SCRIPT_REPO" "$SCRIPT_TAG" libde265
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
SCRIPT_REPO="https://github.com/webmproject/libwebp.git"
|
SCRIPT_REPO="https://github.com/webmproject/libwebp.git"
|
||||||
SCRIPT_TAG="1.3.1"
|
SCRIPT_TAG="1.3.2"
|
||||||
|
|
||||||
ffbuild_dockerbuild() {
|
ffbuild_dockerbuild() {
|
||||||
git-mini-clone "$SCRIPT_REPO" "$SCRIPT_TAG" libwebp
|
git-mini-clone "$SCRIPT_REPO" "$SCRIPT_TAG" libwebp
|
||||||
|
|
321
.github/scripts/libheif-linux.sh
vendored
Executable file
321
.github/scripts/libheif-linux.sh
vendored
Executable file
|
@ -0,0 +1,321 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
case "${1:-}" in
|
||||||
|
'' | x86_64-linux-gnu)
|
||||||
|
export TARGET_TRIPLE='x86_64-linux-gnu.2.23'
|
||||||
|
;;
|
||||||
|
aarch64-linux-gnu)
|
||||||
|
export TARGET_TRIPLE='aarch64-linux-gnu.2.23'
|
||||||
|
;;
|
||||||
|
x86_64-linux-musl)
|
||||||
|
export TARGET_TRIPLE='x86_64-linux-musl'
|
||||||
|
;;
|
||||||
|
aarch64-linux-musl)
|
||||||
|
export TARGET_TRIPLE='aarch64-linux-musl'
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unsupported target triple '${1}'"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Change CWD to script dir
|
||||||
|
CDPATH='' cd "$(dirname "$0")"
|
||||||
|
|
||||||
|
echo "Install required build dependencies..."
|
||||||
|
apt-get update -yqq
|
||||||
|
apt-get install -yqq -o=Dpkg::Use-Pty=0 ninja-build cmake curl nasm pkg-config xz-utils patch python3
|
||||||
|
|
||||||
|
echo "Configure sysroot and prefix..."
|
||||||
|
mkdir -p "./src/prefix/bin" "./src/sysroot/bin"
|
||||||
|
_prefix="$(CDPATH='' cd ./src/prefix && pwd)"
|
||||||
|
_sysroot="$(CDPATH='' cd ./src/sysroot && pwd)"
|
||||||
|
|
||||||
|
# Configure PATH to use our sysroot bin
|
||||||
|
export PATH="${_sysroot}/bin:$PATH"
|
||||||
|
|
||||||
|
# Configure pkgconfig to look for our built libs
|
||||||
|
export PKG_CONFIG_LIBDIR="${_prefix}/lib/pkgconfig:${_prefix}/share/pkgconfig"
|
||||||
|
|
||||||
|
# Download zig to use as a C/C++ cross compiler
|
||||||
|
echo "Download zig..."
|
||||||
|
curl -LSs "https://ziglang.org/download/0.11.0/zig-linux-$(uname -m)-0.11.0.tar.xz" \
|
||||||
|
| tar -xJf- --strip-component 1 -C "$_sysroot"
|
||||||
|
|
||||||
|
mv "${_sysroot}/zig" "${_sysroot}/bin/zig"
|
||||||
|
|
||||||
|
# Create scripts for some zig internal commands, because cmake doesn't allow passing arguments to tools
|
||||||
|
for _arg in ar ranlib; do
|
||||||
|
cat <<EOF >"${_sysroot}/bin/${_arg}"
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
exec zig $_arg "\$@"
|
||||||
|
EOF
|
||||||
|
chmod +x "${_sysroot}/bin/${_arg}"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "Download meson..."
|
||||||
|
mkdir -p ./src/meson
|
||||||
|
|
||||||
|
curl -LSs 'https://github.com/mesonbuild/meson/archive/refs/tags/1.2.1.tar.gz' \
|
||||||
|
| tar -xzf- --strip-component 1 -C ./src/meson
|
||||||
|
|
||||||
|
pushd ./src/meson
|
||||||
|
|
||||||
|
# Patch meson to support zig as a C/C++ compiler
|
||||||
|
curl -LSs 'https://github.com/mesonbuild/meson/pull/12293.patch' | patch -p1
|
||||||
|
# Install meson binary
|
||||||
|
./packaging/create_zipapp.py --outfile "${_sysroot}/bin/meson" --compress
|
||||||
|
|
||||||
|
popd
|
||||||
|
|
||||||
|
cat <<EOF >./src/cross.meson
|
||||||
|
[binaries]
|
||||||
|
c = ['zig', 'cc', '-s', '-target', '$TARGET_TRIPLE']
|
||||||
|
cpp = ['zig', 'c++', '-s', '-target', '$TARGET_TRIPLE']
|
||||||
|
ar = ['zig', 'ar']
|
||||||
|
ranlib = ['zig', 'ranlib']
|
||||||
|
lib = ['zig', 'lib']
|
||||||
|
dlltool = ['zig', 'dlltool']
|
||||||
|
|
||||||
|
[properties]
|
||||||
|
sys_root = '${_sysroot}'
|
||||||
|
pkg_config_libdir = ['${_prefix}/lib/pkgconfig', '${_prefix}/share/pkgconfig']
|
||||||
|
|
||||||
|
EOF
|
||||||
|
|
||||||
|
case "$TARGET_TRIPLE" in
|
||||||
|
x86_64-*)
|
||||||
|
cat <<EOF >>./src/cross.meson
|
||||||
|
[host_machine]
|
||||||
|
system = 'linux'
|
||||||
|
cpu_family = 'x86_64'
|
||||||
|
cpu = 'x86_64'
|
||||||
|
endian = 'little'
|
||||||
|
|
||||||
|
EOF
|
||||||
|
;;
|
||||||
|
aarch64-*)
|
||||||
|
cat <<EOF >>./src/cross.meson
|
||||||
|
[host_machine]
|
||||||
|
system = 'linux'
|
||||||
|
cpu_family = 'aarch64'
|
||||||
|
cpu = 'arm64'
|
||||||
|
endian = 'little'
|
||||||
|
|
||||||
|
EOF
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unsupported target triple '${1}'"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
cat <<EOF >./src/toolchain.cmake
|
||||||
|
set(CMAKE_SYSTEM_NAME Linux)
|
||||||
|
set(CMAKE_SYSTEM_PROCESSOR x86_64)
|
||||||
|
|
||||||
|
set(triple $TARGET_TRIPLE)
|
||||||
|
|
||||||
|
set(CMAKE_CROSSCOMPILING TRUE)
|
||||||
|
set_property(GLOBAL PROPERTY TARGET_SUPPORTS_SHARED_LIBS FALSE)
|
||||||
|
|
||||||
|
# Do a no-op access on the CMAKE_TOOLCHAIN_FILE variable so that CMake will not
|
||||||
|
# issue a warning on it being unused.
|
||||||
|
if (CMAKE_TOOLCHAIN_FILE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(CMAKE_C_COMPILER zig cc -s -target $TARGET_TRIPLE)
|
||||||
|
set(CMAKE_CXX_COMPILER zig c++ -s -target $TARGET_TRIPLE)
|
||||||
|
set(CMAKE_RANLIB ranlib)
|
||||||
|
set(CMAKE_C_COMPILER_RANLIB ranlib)
|
||||||
|
set(CMAKE_CXX_COMPILER_RANLIB ranlib)
|
||||||
|
set(CMAKE_AR ar)
|
||||||
|
set(CMAKE_C_COMPILER_AR ar)
|
||||||
|
set(CMAKE_CXX_COMPILER_AR ar)
|
||||||
|
|
||||||
|
set(CMAKE_FIND_ROOT_PATH ${_prefix} ${_sysroot})
|
||||||
|
set(CMAKE_SYSTEM_PREFIX_PATH /)
|
||||||
|
|
||||||
|
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
|
||||||
|
set(CMAKE_INSTALL_PREFIX "${_prefix}" CACHE PATH
|
||||||
|
"Install path prefix, prepended onto install directories." FORCE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# To find programs to execute during CMake run time with find_program(), e.g.
|
||||||
|
# 'git' or so, we allow looking into system paths.
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
|
|
||||||
|
if (NOT CMAKE_FIND_ROOT_PATH_MODE_LIBRARY)
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||||
|
endif()
|
||||||
|
if (NOT CMAKE_FIND_ROOT_PATH_MODE_INCLUDE)
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||||||
|
endif()
|
||||||
|
if (NOT CMAKE_FIND_ROOT_PATH_MODE_PACKAGE)
|
||||||
|
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# TODO: CMake appends <sysroot>/usr/include to implicit includes; switching to use usr/include will make this redundant.
|
||||||
|
if ("\${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES}" STREQUAL "")
|
||||||
|
set(CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES "${_prefix}/include")
|
||||||
|
endif()
|
||||||
|
if ("\${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}" STREQUAL "")
|
||||||
|
set(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES "${_prefix}/include")
|
||||||
|
endif()
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# --
|
||||||
|
|
||||||
|
echo "Download zlib..."
|
||||||
|
mkdir -p ./src/zlib/build
|
||||||
|
|
||||||
|
curl -LSs 'https://github.com/madler/zlib/archive/refs/tags/v1.3.tar.gz' \
|
||||||
|
| tar -xzf- --strip-component 1 -C ./src/zlib
|
||||||
|
|
||||||
|
pushd ./src/zlib/build
|
||||||
|
|
||||||
|
echo "Build zlib..."
|
||||||
|
cmake \
|
||||||
|
-GNinja \
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE=../../toolchain.cmake \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DBUILD_SHARED_LIBS=Off \
|
||||||
|
-DCMAKE_POSITION_INDEPENDENT_CODE=On \
|
||||||
|
-DCMAKE_SKIP_INSTALL_ALL_DEPENDENCY=On \
|
||||||
|
-DCMAKE_INSTALL_PREFIX="$_prefix" \
|
||||||
|
..
|
||||||
|
ninja -j"$(nproc)" zlibstatic
|
||||||
|
# Stub .so files so install doesn't fail
|
||||||
|
touch libz.so.1.3 libz.so.1 libz.so
|
||||||
|
ninja install
|
||||||
|
|
||||||
|
# Remove stub .so files
|
||||||
|
rm "${_prefix}"/lib/{libz.so.1.3,libz.so.1,libz.so}
|
||||||
|
|
||||||
|
popd
|
||||||
|
|
||||||
|
# --
|
||||||
|
|
||||||
|
echo "Download dav1d..."
|
||||||
|
mkdir -p ./src/dav1d/build
|
||||||
|
|
||||||
|
curl -LSs 'https://code.videolan.org/videolan/dav1d/-/archive/1.2.1/dav1d-1.2.1.tar.gz' \
|
||||||
|
| tar -xzf- --strip-component 1 -C ./src/dav1d
|
||||||
|
|
||||||
|
pushd ./src/dav1d/build
|
||||||
|
|
||||||
|
echo "Build dav1d..."
|
||||||
|
meson setup \
|
||||||
|
--cross-file=../../cross.meson \
|
||||||
|
-Denable_docs=false \
|
||||||
|
-Denable_tools=false \
|
||||||
|
-Denable_tests=false \
|
||||||
|
-Denable_examples=false \
|
||||||
|
--prefix="$_prefix" \
|
||||||
|
--buildtype=release \
|
||||||
|
--default-library=static \
|
||||||
|
..
|
||||||
|
ninja -j"$(nproc)"
|
||||||
|
ninja install
|
||||||
|
|
||||||
|
popd
|
||||||
|
|
||||||
|
# --
|
||||||
|
|
||||||
|
echo "Download libde265..."
|
||||||
|
mkdir -p ./src/libde265/build
|
||||||
|
|
||||||
|
curl -#LSs 'https://github.com/strukturag/libde265/archive/refs/tags/v1.0.12.tar.gz' \
|
||||||
|
| tar -xzf- --strip-component 1 -C ./src/libde265
|
||||||
|
|
||||||
|
pushd ./src/libde265/build
|
||||||
|
|
||||||
|
echo "Build libde265..."
|
||||||
|
cmake \
|
||||||
|
-GNinja \
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE=../../toolchain.cmake \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DBUILD_SHARED_LIBS=Off \
|
||||||
|
-DCMAKE_POSITION_INDEPENDENT_CODE=On \
|
||||||
|
-DCMAKE_INSTALL_PREFIX="$_prefix" \
|
||||||
|
-DENABLE_SDL=Off \
|
||||||
|
-DENABLE_DECODER=Off \
|
||||||
|
-DENABLE_ENCODER=Off \
|
||||||
|
..
|
||||||
|
ninja -j"$(nproc)"
|
||||||
|
ninja install
|
||||||
|
|
||||||
|
popd
|
||||||
|
|
||||||
|
# --
|
||||||
|
|
||||||
|
echo "Download libwebp..."
|
||||||
|
mkdir -p ./src/libwebp/build
|
||||||
|
|
||||||
|
curl -#LSs 'https://github.com/webmproject/libwebp/archive/refs/tags/v1.3.2.tar.gz' \
|
||||||
|
| tar -xzf- --strip-component 1 -C ./src/libwebp
|
||||||
|
|
||||||
|
pushd ./src/libwebp/build
|
||||||
|
|
||||||
|
echo "Build libwebp..."
|
||||||
|
cmake \
|
||||||
|
-GNinja \
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE=../../toolchain.cmake \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DBUILD_SHARED_LIBS=Off \
|
||||||
|
-DCMAKE_POSITION_INDEPENDENT_CODE=On \
|
||||||
|
-DCMAKE_INSTALL_PREFIX="$_prefix" \
|
||||||
|
-DWEBP_LINK_STATIC=On \
|
||||||
|
-DWEBP_BUILD_CWEBP=Off \
|
||||||
|
-DWEBP_BUILD_DWEBP=Off \
|
||||||
|
-DWEBP_BUILD_GIF2WEBP=Off \
|
||||||
|
-DWEBP_BUILD_IMG2WEBP=Off \
|
||||||
|
-DWEBP_BUILD_VWEBP=Off \
|
||||||
|
-DWEBP_BUILD_WEBPINFO=Off \
|
||||||
|
-DWEBP_BUILD_WEBPMUX=Off \
|
||||||
|
-DWEBP_BUILD_EXTRAS=Off \
|
||||||
|
-DWEBP_BUILD_ANIM_UTILS=Off \
|
||||||
|
..
|
||||||
|
ninja -j"$(nproc)"
|
||||||
|
ninja install
|
||||||
|
|
||||||
|
popd
|
||||||
|
|
||||||
|
# --
|
||||||
|
|
||||||
|
echo "Download libheif..."
|
||||||
|
mkdir -p ./src/libheif/build
|
||||||
|
|
||||||
|
curl -#LSs 'https://github.com/strukturag/libheif/archive/refs/tags/v1.16.2.tar.gz' \
|
||||||
|
| tar -xzf- --strip-component 1 -C ./src/libheif
|
||||||
|
|
||||||
|
pushd ./src/libheif/build
|
||||||
|
|
||||||
|
echo "Build libheif..."
|
||||||
|
cmake \
|
||||||
|
-GNinja \
|
||||||
|
-DCMAKE_TOOLCHAIN_FILE=../../toolchain.cmake \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-DBUILD_SHARED_LIBS=On \
|
||||||
|
-DCMAKE_POSITION_INDEPENDENT_CODE=On \
|
||||||
|
-DCMAKE_INSTALL_PREFIX="$_prefix" \
|
||||||
|
-DBUILD_TESTING=OFF \
|
||||||
|
-DWITH_DAV1D=ON \
|
||||||
|
-DWITH_DAV1D_PLUGIN=OFF \
|
||||||
|
-DWITH_LIBDE265=ON \
|
||||||
|
-DWITH_LIBDE265_PLUGIN=OFF \
|
||||||
|
-DWITH_LIBSHARPYUV=ON \
|
||||||
|
-DWITH_FUZZERS=OFF \
|
||||||
|
-DWITH_EXAMPLES=OFF \
|
||||||
|
-DWITH_UNCOMPRESSED_CODEC=ON \
|
||||||
|
-DWITH_REDUCED_VISIBILITY=ON \
|
||||||
|
-DWITH_DEFLATE_HEADER_COMPRESSION=ON \
|
||||||
|
-DENABLE_PLUGIN_LOADING=OFF \
|
||||||
|
-DENABLE_MULTITHREADING_SUPPORT=ON \
|
||||||
|
..
|
||||||
|
ninja -j"$(nproc)"
|
||||||
|
ninja install
|
||||||
|
|
||||||
|
popd
|
2
.github/workflows/cache-factory.yaml
vendored
2
.github/workflows/cache-factory.yaml
vendored
|
@ -74,7 +74,7 @@ jobs:
|
||||||
uses: ./.github/actions/setup-system
|
uses: ./.github/actions/setup-system
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
targets: ${{ matrix.settings.target }}
|
target: ${{ matrix.settings.target }}
|
||||||
save-cache: 'true'
|
save-cache: 'true'
|
||||||
|
|
||||||
- name: Clippy
|
- name: Clippy
|
||||||
|
|
13
.github/workflows/ci.yml
vendored
13
.github/workflows/ci.yml
vendored
|
@ -24,7 +24,6 @@ jobs:
|
||||||
uses: ./.github/actions/setup-pnpm
|
uses: ./.github/actions/setup-pnpm
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
ignorePostInstall: true
|
|
||||||
|
|
||||||
- name: Perform typechecks
|
- name: Perform typechecks
|
||||||
run: pnpm typecheck
|
run: pnpm typecheck
|
||||||
|
@ -40,7 +39,6 @@ jobs:
|
||||||
uses: ./.github/actions/setup-pnpm
|
uses: ./.github/actions/setup-pnpm
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
ignorePostInstall: true
|
|
||||||
|
|
||||||
- name: Perform linting
|
- name: Perform linting
|
||||||
run: pnpm lint
|
run: pnpm lint
|
||||||
|
@ -144,17 +142,6 @@ jobs:
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
- name: Setup shared libraries
|
|
||||||
if: steps.filter.outputs.changes == 'true'
|
|
||||||
env:
|
|
||||||
NODE_ENV: debug
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
run: |
|
|
||||||
pushd ..
|
|
||||||
npm i archive-wasm mustache
|
|
||||||
popd
|
|
||||||
node scripts/post-install.mjs
|
|
||||||
|
|
||||||
- name: Run Clippy
|
- name: Run Clippy
|
||||||
if: steps.filter.outputs.changes == 'true'
|
if: steps.filter.outputs.changes == 'true'
|
||||||
uses: actions-rs/clippy-check@v1
|
uses: actions-rs/clippy-check@v1
|
||||||
|
|
4
.github/workflows/ffmpeg-macos.yml
vendored
4
.github/workflows/ffmpeg-macos.yml
vendored
|
@ -3,13 +3,13 @@ name: Build ffmpeg macos
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
paths:
|
paths:
|
||||||
- '.github/workflows/ffmpeg.yml'
|
- '.github/workflows/ffmpeg-macos.yml'
|
||||||
- '.github/scripts/ffmpeg-macos/**'
|
- '.github/scripts/ffmpeg-macos/**'
|
||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
- '.github/workflows/ffmpeg.yml'
|
- '.github/workflows/ffmpeg-macos.yml'
|
||||||
- '.github/scripts/ffmpeg-macos/**'
|
- '.github/scripts/ffmpeg-macos/**'
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
|
|
64
.github/workflows/libheif-linux.yml
vendored
Normal file
64
.github/workflows/libheif-linux.yml
vendored
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
name: Build libheif for linux
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- '.github/workflows/libheif-linux.yml'
|
||||||
|
- '.github/scripts/libheif-linux.sh'
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- '.github/workflows/libheif-linux.yml'
|
||||||
|
- '.github/scripts/libheif-linux.sh'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
# Cancel previous runs of the same workflow on the same branch.
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-libheif-linux:
|
||||||
|
strategy:
|
||||||
|
fail-fast: true
|
||||||
|
matrix:
|
||||||
|
settings:
|
||||||
|
- host: ubuntu-latest
|
||||||
|
target: x86_64-linux-gnu
|
||||||
|
- host: ubuntu-latest
|
||||||
|
target: aarch64-linux-gnu
|
||||||
|
- host: ubuntu-latest
|
||||||
|
target: x86_64-linux-musl
|
||||||
|
- host: ubuntu-latest
|
||||||
|
target: aarch64-linux-musl
|
||||||
|
name: Build LibHeif Linux ${{ matrix.settings.target }}
|
||||||
|
runs-on: ${{ matrix.settings.host }}
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Build libheif
|
||||||
|
run: |
|
||||||
|
set -euxo pipefail
|
||||||
|
|
||||||
|
sudo .github/scripts/libheif-linux.sh ${{ matrix.settings.target }}
|
||||||
|
|
||||||
|
sudo chown -R "$(id -u):$(id -g)" .github/scripts/src/prefix
|
||||||
|
|
||||||
|
# Remove uneeded files
|
||||||
|
rm -rf .github/scripts/src/prefix/{share,lib/{cmake,pkgconfig}}
|
||||||
|
find .github/scripts/src/prefix -empty -delete
|
||||||
|
|
||||||
|
find .github/scripts/src/prefix -name 'libheif.so*' -exec realpath -s --relative-to=.github/scripts/src/prefix {} + \
|
||||||
|
| xargs env XZ_OPT='-T0 -9' tar -cJf "libheif-${{ matrix.settings.target }}.tar.xz" -C .github/scripts/src/prefix include/libheif
|
||||||
|
|
||||||
|
- name: Publish libheif
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: libheif-${{ matrix.settings.target }}
|
||||||
|
path: libheif-${{ matrix.settings.target }}.tar.xz
|
||||||
|
if-no-files-found: error
|
2
.github/workflows/release.yml
vendored
2
.github/workflows/release.yml
vendored
|
@ -86,7 +86,7 @@ jobs:
|
||||||
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
|
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
targets: ${{ matrix.settings.target }}
|
target: ${{ matrix.settings.target }}
|
||||||
|
|
||||||
- name: Setup Node.js, pnpm and dependencies
|
- name: Setup Node.js, pnpm and dependencies
|
||||||
uses: ./.github/actions/setup-pnpm
|
uses: ./.github/actions/setup-pnpm
|
||||||
|
|
69
.github/workflows/tauri-patched-cli-js.yml
vendored
69
.github/workflows/tauri-patched-cli-js.yml
vendored
|
@ -1,69 +0,0 @@
|
||||||
# Copyright 2019-2023 Tauri Programme within The Commons Conservancy
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
# SPDX-License-Identifier: MIT
|
|
||||||
|
|
||||||
name: publish cli.js
|
|
||||||
env:
|
|
||||||
DEBUG: napi:*
|
|
||||||
APP_NAME: cli
|
|
||||||
MACOSX_DEPLOYMENT_TARGET: '10.13'
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: tooling/cli/node/
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
strategy:
|
|
||||||
fail-fast: true
|
|
||||||
matrix:
|
|
||||||
settings:
|
|
||||||
- host: macos-latest
|
|
||||||
target: x86_64-apple-darwin
|
|
||||||
architecture: x64
|
|
||||||
build: |
|
|
||||||
yarn build:release --features rustls
|
|
||||||
strip -x *.node
|
|
||||||
|
|
||||||
- host: macos-latest
|
|
||||||
target: aarch64-apple-darwin
|
|
||||||
build: |
|
|
||||||
yarn build:release --features rustls --target=aarch64-apple-darwin
|
|
||||||
strip -x *.node
|
|
||||||
|
|
||||||
name: stable - ${{ matrix.settings.target }} - node@16
|
|
||||||
runs-on: ${{ matrix.settings.host }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
repository: 'dceddia/tauri'
|
|
||||||
ref: 'dd32f97335a6105b134e70dad02d269e49a75b56'
|
|
||||||
|
|
||||||
- name: Setup node
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: 16
|
|
||||||
check-latest: true
|
|
||||||
architecture: ${{ matrix.settings.architecture }}
|
|
||||||
|
|
||||||
- name: Install
|
|
||||||
uses: dtolnay/rust-toolchain@stable
|
|
||||||
with:
|
|
||||||
targets: ${{ matrix.settings.target }}
|
|
||||||
toolchain: stable
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: yarn install --ignore-scripts --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: ${{ matrix.settings.build }}
|
|
||||||
shell: bash
|
|
||||||
|
|
||||||
- name: Upload artifact
|
|
||||||
uses: actions/upload-artifact@v3
|
|
||||||
with:
|
|
||||||
name: bindings-${{ matrix.settings.target }}
|
|
||||||
path: tooling/cli/node/${{ env.APP_NAME }}.*.node
|
|
||||||
if-no-files-found: error
|
|
8
Cargo.lock
generated
8
Cargo.lock
generated
|
@ -3777,9 +3777,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libwebp-sys"
|
name = "libwebp-sys"
|
||||||
version = "0.9.2"
|
version = "0.9.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a5df1e76f0acef0058aa2164ccf74e610e716e7f9eeb3ee2283de7d43659d823"
|
checksum = "3e0df0a0f9444d52aee6335cd724d21a2ee3285f646291799a72be518ec8ee3c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc",
|
"cc",
|
||||||
"glob",
|
"glob",
|
||||||
|
@ -9094,9 +9094,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "webp"
|
name = "webp"
|
||||||
version = "0.2.5"
|
version = "0.2.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "12ff0ebb440d1db63b778cb609db8a8abfda825a7841664a76a70b628502c7e1"
|
checksum = "4bb5d8e7814e92297b0e1c773ce43d290bef6c17452dafd9fc49e5edb5beba71"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"image",
|
"image",
|
||||||
"libwebp-sys",
|
"libwebp-sys",
|
||||||
|
|
4
apps/desktop/src-tauri/.gitignore
vendored
4
apps/desktop/src-tauri/.gitignore
vendored
|
@ -2,3 +2,7 @@
|
||||||
# will have compiled files and executables
|
# will have compiled files and executables
|
||||||
/target/
|
/target/
|
||||||
WixTools
|
WixTools
|
||||||
|
*.dll
|
||||||
|
*.dll.*
|
||||||
|
*.so
|
||||||
|
*.so.*
|
||||||
|
|
|
@ -23,9 +23,11 @@ const tauriConf = JSON.parse(
|
||||||
fs.readFileSync(path.resolve(__dirname, '..', 'tauri.conf.json'), 'utf-8')
|
fs.readFileSync(path.resolve(__dirname, '..', 'tauri.conf.json'), 'utf-8')
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const framework = path.join(workspace, 'target/Frameworks');
|
||||||
|
|
||||||
switch (args[0]) {
|
switch (args[0]) {
|
||||||
case 'dev': {
|
case 'dev': {
|
||||||
if (process.platform === 'win32') setupFFMpegDlls(true);
|
if (process.platform === 'win32') setupSharedLibs('dll', path.join(framework, 'bin'), true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'build': {
|
case 'build': {
|
||||||
|
@ -51,40 +53,11 @@ switch (args[0]) {
|
||||||
.flatMap((target) => target.split(','));
|
.flatMap((target) => target.split(','));
|
||||||
|
|
||||||
const tauriPatch = {
|
const tauriPatch = {
|
||||||
tauri: { bundle: { macOS: {} } }
|
tauri: { bundle: { macOS: {}, resources: [] } }
|
||||||
};
|
};
|
||||||
|
|
||||||
switch (process.platform) {
|
switch (process.platform) {
|
||||||
case 'darwin': {
|
case 'darwin': {
|
||||||
// Workaround while https://github.com/tauri-apps/tauri/pull/3934 is not merged
|
|
||||||
const cliNode =
|
|
||||||
process.arch === 'arm64' ? 'cli.darwin-arm64.node' : 'cli.darwin-x64.node';
|
|
||||||
const tauriCliPatch = path.join(workspace, 'target/Frameworks/bin/', cliNode);
|
|
||||||
if (!fs.existsSync(tauriCliPatch)) {
|
|
||||||
throw new Error(
|
|
||||||
`Tauri cli patch not found at ${path.relative(
|
|
||||||
workspace,
|
|
||||||
tauriCliPatch
|
|
||||||
)}. Did you run \`pnpm i\`?`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
const tauriBin = path.join(
|
|
||||||
workspace,
|
|
||||||
'node_modules/@tauri-apps',
|
|
||||||
cliNode.replace(/\.[^.]+$/, '').replace(/\./g, '-'),
|
|
||||||
cliNode
|
|
||||||
);
|
|
||||||
if (!fs.existsSync(tauriBin)) {
|
|
||||||
throw new Error('tauri bin not found at ${tauriBin}. Did you run `pnpm i`?');
|
|
||||||
}
|
|
||||||
console.log(
|
|
||||||
`WORKAROUND tauri-apps/tauri#3933: Replace ${path.relative(
|
|
||||||
workspace,
|
|
||||||
tauriBin
|
|
||||||
)} -> ${path.relative(workspace, tauriCliPatch)}`
|
|
||||||
);
|
|
||||||
fs.copyFileSync(tauriCliPatch, tauriBin);
|
|
||||||
|
|
||||||
// ARM64 support was added in macOS 11, but we need at least 11.2 due to our ffmpeg build
|
// ARM64 support was added in macOS 11, but we need at least 11.2 due to our ffmpeg build
|
||||||
let macOSMinimumVersion = tauriConf?.tauri?.bundle?.macOS?.minimumSystemVersion;
|
let macOSMinimumVersion = tauriConf?.tauri?.bundle?.macOS?.minimumSystemVersion;
|
||||||
let macOSArm64MinimumVersion = '11.2';
|
let macOSArm64MinimumVersion = '11.2';
|
||||||
|
@ -125,16 +98,29 @@ switch (args[0]) {
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 'linux':
|
||||||
|
fs.rmSync(path.join(workspace, 'target/release/bundle/appimage'), {
|
||||||
|
recursive: true,
|
||||||
|
force: true
|
||||||
|
});
|
||||||
|
// Point tauri to the ffmpeg DLLs
|
||||||
|
tauriPatch.tauri.bundle.resources.push(
|
||||||
|
...setupSharedLibs('so', path.join(framework, 'lib'))
|
||||||
|
);
|
||||||
|
break;
|
||||||
case 'win32':
|
case 'win32':
|
||||||
// Point tauri to the ffmpeg DLLs
|
// Point tauri to the ffmpeg DLLs
|
||||||
tauriPatch.tauri.bundle.resources = setupFFMpegDlls();
|
tauriPatch.tauri.bundle.resources.push(
|
||||||
|
...setupSharedLibs('dll', path.join(framework, 'bin'))
|
||||||
|
);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
toRemove.push(
|
toRemove.push(
|
||||||
...tauriPatch.tauri.bundle.resources.map((file) =>
|
...tauriPatch.tauri.bundle.resources.map((file) =>
|
||||||
path.join(workspace, 'apps/desktop/src-tauri', file)
|
path.join(workspace, 'apps/desktop/src-tauri', file)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
const tauriPatchConf = path.resolve(__dirname, '..', 'tauri.conf.patch.json');
|
const tauriPatchConf = path.resolve(__dirname, '..', 'tauri.conf.patch.json');
|
||||||
fs.writeFileSync(tauriPatchConf, JSON.stringify(tauriPatch, null, 2));
|
fs.writeFileSync(tauriPatchConf, JSON.stringify(tauriPatch, null, 2));
|
||||||
|
@ -144,9 +130,34 @@ switch (args[0]) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
process.on('SIGINT', () => {
|
||||||
|
for (const file of toRemove)
|
||||||
|
try {
|
||||||
|
fs.unlinkSync(file);
|
||||||
|
} catch (e) {}
|
||||||
|
});
|
||||||
|
|
||||||
let code = 0;
|
let code = 0;
|
||||||
spawn('pnpm', ['exec', 'tauri', ...args])
|
spawn('pnpm', ['exec', 'tauri', ...args])
|
||||||
.catch((exitCode) => {
|
.catch((exitCode) => {
|
||||||
|
if (args[0] === 'build' || process.platform === 'linux') {
|
||||||
|
// Work around appimage buindling not working sometimes
|
||||||
|
appimageDir = path.join(workspace, 'target/release/bundle/appimage');
|
||||||
|
appDir = path.join(appimageDir, 'spacedrive.AppDir');
|
||||||
|
if (
|
||||||
|
fs.existsSync(path.join(appimageDir, 'build_appimage.sh')) &&
|
||||||
|
fs.existsSync(appDir) &&
|
||||||
|
!fs.readdirSync(appimageDir).filter((file) => file.endsWith('.AppImage')).length
|
||||||
|
) {
|
||||||
|
process.chdir(appimageDir);
|
||||||
|
fs.rmSync(appDir, { recursive: true, force: true });
|
||||||
|
return spawn('bash', ['build_appimage.sh']).catch((exitCode) => {
|
||||||
|
code = exitCode;
|
||||||
|
console.error(`tauri ${args[0]} failed with exit code ${exitCode}`);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
code = exitCode;
|
code = exitCode;
|
||||||
console.error(`tauri ${args[0]} failed with exit code ${exitCode}`);
|
console.error(`tauri ${args[0]} failed with exit code ${exitCode}`);
|
||||||
console.error(
|
console.error(
|
||||||
|
@ -162,10 +173,10 @@ spawn('pnpm', ['exec', 'tauri', ...args])
|
||||||
process.exit(code);
|
process.exit(code);
|
||||||
});
|
});
|
||||||
|
|
||||||
function setupFFMpegDlls(dev = false) {
|
function setupSharedLibs(sufix, binDir, dev = false) {
|
||||||
if (!process.env.FFMPEG_DIR) throw new Error('Missing envvar FFMPEG_DIR');
|
const sharedLibs = fs
|
||||||
const ffmpegBinDir = path.join(process.env.FFMPEG_DIR, 'bin');
|
.readdirSync(binDir)
|
||||||
const ffmpegDlls = fs.readdirSync(ffmpegBinDir).filter((file) => file.endsWith('.dll'));
|
.filter((file) => file.endsWith(`.${sufix}`) || file.includes(`.${sufix}.`));
|
||||||
|
|
||||||
let targetDir = path.join(workspace, 'apps/desktop/src-tauri');
|
let targetDir = path.join(workspace, 'apps/desktop/src-tauri');
|
||||||
if (dev) {
|
if (dev) {
|
||||||
|
@ -174,9 +185,9 @@ function setupFFMpegDlls(dev = false) {
|
||||||
fs.mkdirSync(targetDir, { recursive: true });
|
fs.mkdirSync(targetDir, { recursive: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy all DLLs from the $FFMPEG_DIR/bin to targetDir
|
// Copy all shared libs to targetDir
|
||||||
for (const dll of ffmpegDlls)
|
for (const dll of sharedLibs)
|
||||||
fs.copyFileSync(path.join(ffmpegBinDir, dll), path.join(targetDir, dll));
|
fs.copyFileSync(path.join(binDir, dll), path.join(targetDir, dll));
|
||||||
|
|
||||||
return ffmpegDlls;
|
return sharedLibs;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#![cfg(target_os = "android")]
|
||||||
|
|
||||||
use std::panic;
|
use std::panic;
|
||||||
|
|
||||||
use jni::{
|
use jni::{
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
#![cfg(target_os = "ios")]
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
ffi::{CStr, CString},
|
ffi::{CStr, CString},
|
||||||
os::raw::{c_char, c_void},
|
os::raw::{c_char, c_void},
|
||||||
|
|
|
@ -69,7 +69,7 @@ thiserror = "1.0.48"
|
||||||
include_dir = { version = "0.7.3", features = ["glob"] }
|
include_dir = { version = "0.7.3", features = ["glob"] }
|
||||||
async-trait = "^0.1.73"
|
async-trait = "^0.1.73"
|
||||||
image = "0.24.7"
|
image = "0.24.7"
|
||||||
webp = "0.2.5"
|
webp = "0.2.6"
|
||||||
tracing = { workspace = true }
|
tracing = { workspace = true }
|
||||||
tracing-subscriber = { workspace = true, features = ["env-filter"] }
|
tracing-subscriber = { workspace = true, features = ["env-filter"] }
|
||||||
async-stream = "0.3.5"
|
async-stream = "0.3.5"
|
||||||
|
|
|
@ -14,7 +14,7 @@ ffmpeg-sys-next = "6.0.1"
|
||||||
tracing = { workspace = true }
|
tracing = { workspace = true }
|
||||||
|
|
||||||
thiserror = "1.0.48"
|
thiserror = "1.0.48"
|
||||||
webp = "0.2.5"
|
webp = "0.2.6"
|
||||||
tokio = { workspace = true, features = ["fs", "rt"] }
|
tokio = { workspace = true, features = ["fs", "rt"] }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
|
|
|
@ -16,9 +16,7 @@ heif = ["dep:libheif-rs", "dep:libheif-sys"]
|
||||||
image = "0.24.7"
|
image = "0.24.7"
|
||||||
thiserror = "1.0.48"
|
thiserror = "1.0.48"
|
||||||
resvg = "0.35.0"
|
resvg = "0.35.0"
|
||||||
|
|
||||||
[target.'cfg(any(not(any(target_os = "linux", target_os = "windows")), heif_images))'.dependencies]
|
|
||||||
# both of these added *default* bindgen features in 0.22.0 and 2.0.0+1.16.2 respectively
|
# both of these added *default* bindgen features in 0.22.0 and 2.0.0+1.16.2 respectively
|
||||||
# this broke builds as we build our own liibheif, so i disabled their default features
|
# this broke builds as we build our own liibheif, so i disabled their default features
|
||||||
libheif-rs = { version = "0.22.0", default-features = false, optional = true }
|
libheif-rs = { version = "0.22.0", default-features = false, optional = true }
|
||||||
libheif-sys = { version = "2.0.0+1.16.2", default-features = false, optional = true }
|
libheif-sys = { version = "2.0.0", default-features = false, optional = true }
|
||||||
|
|
|
@ -1,19 +1,13 @@
|
||||||
/// The size of 1MiB in bytes
|
/// The size of 1MiB in bytes
|
||||||
const MIB: u64 = 1_048_576;
|
const MIB: u64 = 1_048_576;
|
||||||
|
|
||||||
#[cfg(all(
|
#[cfg(feature = "heif")]
|
||||||
feature = "heif",
|
|
||||||
any(not(any(target_os = "linux", target_os = "windows")), heif_images)
|
|
||||||
))]
|
|
||||||
pub const HEIF_EXTENSIONS: [&str; 7] = ["heif", "heifs", "heic", "heics", "avif", "avci", "avcs"];
|
pub const HEIF_EXTENSIONS: [&str; 7] = ["heif", "heifs", "heic", "heics", "avif", "avci", "avcs"];
|
||||||
|
|
||||||
/// The maximum file size that an image can be in order to have a thumbnail generated.
|
/// The maximum file size that an image can be in order to have a thumbnail generated.
|
||||||
///
|
///
|
||||||
/// This value is in MiB.
|
/// This value is in MiB.
|
||||||
#[cfg(all(
|
#[cfg(feature = "heif")]
|
||||||
feature = "heif",
|
|
||||||
any(not(any(target_os = "linux", target_os = "windows")), heif_images)
|
|
||||||
))]
|
|
||||||
pub const HEIF_MAXIMUM_FILE_SIZE: u64 = MIB * 32;
|
pub const HEIF_MAXIMUM_FILE_SIZE: u64 = MIB * 32;
|
||||||
|
|
||||||
pub const SVG_EXTENSIONS: [&str; 2] = ["svg", "svgz"];
|
pub const SVG_EXTENSIONS: [&str; 2] = ["svg", "svgz"];
|
||||||
|
|
|
@ -4,10 +4,7 @@ pub type Result<T> = std::result::Result<T, Error>;
|
||||||
|
|
||||||
#[derive(thiserror::Error, Debug)]
|
#[derive(thiserror::Error, Debug)]
|
||||||
pub enum Error {
|
pub enum Error {
|
||||||
#[cfg(all(
|
#[cfg(feature = "heif")]
|
||||||
feature = "heif",
|
|
||||||
any(not(any(target_os = "linux", target_os = "windows")), heif_images)
|
|
||||||
))]
|
|
||||||
#[error("error with libheif: {0}")]
|
#[error("error with libheif: {0}")]
|
||||||
LibHeif(#[from] libheif_rs::HeifError),
|
LibHeif(#[from] libheif_rs::HeifError),
|
||||||
|
|
||||||
|
|
|
@ -11,10 +11,7 @@ use std::{
|
||||||
path::Path,
|
path::Path,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(all(
|
#[cfg(feature = "heif")]
|
||||||
feature = "heif",
|
|
||||||
any(not(any(target_os = "linux", target_os = "windows")), heif_images)
|
|
||||||
))]
|
|
||||||
use crate::heif::HeifHandler;
|
use crate::heif::HeifHandler;
|
||||||
|
|
||||||
pub fn format_image(path: impl AsRef<Path>) -> Result<DynamicImage> {
|
pub fn format_image(path: impl AsRef<Path>) -> Result<DynamicImage> {
|
||||||
|
@ -29,10 +26,7 @@ pub fn format_image(path: impl AsRef<Path>) -> Result<DynamicImage> {
|
||||||
fn match_to_handler(ext: &OsStr) -> Box<dyn ImageHandler> {
|
fn match_to_handler(ext: &OsStr) -> Box<dyn ImageHandler> {
|
||||||
let mut handler: Box<dyn ImageHandler> = Box::new(GenericHandler {});
|
let mut handler: Box<dyn ImageHandler> = Box::new(GenericHandler {});
|
||||||
|
|
||||||
#[cfg(all(
|
#[cfg(feature = "heif")]
|
||||||
feature = "heif",
|
|
||||||
any(not(any(target_os = "linux", target_os = "windows")), heif_images)
|
|
||||||
))]
|
|
||||||
if consts::HEIF_EXTENSIONS
|
if consts::HEIF_EXTENSIONS
|
||||||
.iter()
|
.iter()
|
||||||
.map(OsString::from)
|
.map(OsString::from)
|
||||||
|
|
|
@ -24,10 +24,7 @@ mod consts;
|
||||||
mod error;
|
mod error;
|
||||||
mod formatter;
|
mod formatter;
|
||||||
mod generic;
|
mod generic;
|
||||||
#[cfg(all(
|
#[cfg(feature = "heif")]
|
||||||
feature = "heif",
|
|
||||||
any(not(any(target_os = "linux", target_os = "windows")), heif_images)
|
|
||||||
))]
|
|
||||||
mod heif;
|
mod heif;
|
||||||
mod svg;
|
mod svg;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"postinstall": "pnpm exec node scripts/post-install.mjs",
|
"preprep": "pnpm exec node scripts/preprep.mjs",
|
||||||
"prep": "pnpm gen:prisma",
|
"prep": "pnpm gen:prisma",
|
||||||
"postprep": "pnpm codegen",
|
"postprep": "pnpm codegen",
|
||||||
"build": "turbo run build",
|
"build": "turbo run build",
|
||||||
|
@ -40,7 +40,7 @@
|
||||||
"@cspell/dict-typescript": "^2.0.2",
|
"@cspell/dict-typescript": "^2.0.2",
|
||||||
"@ianvs/prettier-plugin-sort-imports": "^4.1.0",
|
"@ianvs/prettier-plugin-sort-imports": "^4.1.0",
|
||||||
"@storybook/react-vite": "^7.0.20",
|
"@storybook/react-vite": "^7.0.20",
|
||||||
"archive-wasm": "^1.5.1",
|
"archive-wasm": "^1.5.3",
|
||||||
"cspell": "^6.31.1",
|
"cspell": "^6.31.1",
|
||||||
"mustache": "^4.2.0",
|
"mustache": "^4.2.0",
|
||||||
"prettier": "^3.0.3",
|
"prettier": "^3.0.3",
|
||||||
|
|
|
@ -27,8 +27,8 @@ importers:
|
||||||
specifier: ^7.0.20
|
specifier: ^7.0.20
|
||||||
version: 7.0.20(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(vite@4.3.9)
|
version: 7.0.20(react-dom@18.2.0)(react@18.2.0)(typescript@5.0.4)(vite@4.3.9)
|
||||||
archive-wasm:
|
archive-wasm:
|
||||||
specifier: ^1.5.1
|
specifier: ^1.5.3
|
||||||
version: 1.5.1
|
version: 1.5.3
|
||||||
cspell:
|
cspell:
|
||||||
specifier: ^6.31.1
|
specifier: ^6.31.1
|
||||||
version: 6.31.1
|
version: 6.31.1
|
||||||
|
@ -5812,7 +5812,7 @@ packages:
|
||||||
magic-string: 0.27.0
|
magic-string: 0.27.0
|
||||||
react-docgen-typescript: 2.2.2(typescript@5.0.4)
|
react-docgen-typescript: 2.2.2(typescript@5.0.4)
|
||||||
typescript: 5.0.4
|
typescript: 5.0.4
|
||||||
vite: 4.3.9(@types/node@18.15.1)
|
vite: 4.3.9(less@4.2.0)
|
||||||
|
|
||||||
/@jridgewell/gen-mapping@0.3.3:
|
/@jridgewell/gen-mapping@0.3.3:
|
||||||
resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
|
resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
|
||||||
|
@ -8862,7 +8862,7 @@ packages:
|
||||||
remark-slug: 6.1.0
|
remark-slug: 6.1.0
|
||||||
rollup: 3.28.1
|
rollup: 3.28.1
|
||||||
typescript: 5.0.4
|
typescript: 5.0.4
|
||||||
vite: 4.3.9(@types/node@18.15.1)
|
vite: 4.3.9(less@4.2.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
@ -9462,7 +9462,7 @@ packages:
|
||||||
react: 18.2.0
|
react: 18.2.0
|
||||||
react-docgen: 6.0.0-alpha.3
|
react-docgen: 6.0.0-alpha.3
|
||||||
react-dom: 18.2.0(react@18.2.0)
|
react-dom: 18.2.0(react@18.2.0)
|
||||||
vite: 4.3.9(@types/node@18.15.1)
|
vite: 4.3.9(less@4.2.0)
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- '@preact/preset-vite'
|
- '@preact/preset-vite'
|
||||||
- supports-color
|
- supports-color
|
||||||
|
@ -11179,8 +11179,8 @@ packages:
|
||||||
/aproba@2.0.0:
|
/aproba@2.0.0:
|
||||||
resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==}
|
resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==}
|
||||||
|
|
||||||
/archive-wasm@1.5.1:
|
/archive-wasm@1.5.3:
|
||||||
resolution: {integrity: sha512-jETuTnp7lcJ4OQhqvyE5PHw8izUWDArj/TPzPL2hu4ylGwc9coIOT214uRTETF3uoQwPPJcV8GTa14yfTqrEhg==}
|
resolution: {integrity: sha512-dxAKM63Y+1dXYIH7t3rgIj1/w/q0CdujmW3WIoIJVFdgAMhAdTcmbkPdw/Gj9xZ2J0DcdW5fZOukYEIrN6DYQg==}
|
||||||
engines: {node: '>=18'}
|
engines: {node: '>=18'}
|
||||||
dev: true
|
dev: true
|
||||||
|
|
||||||
|
@ -23523,6 +23523,7 @@ packages:
|
||||||
rollup: 3.28.1
|
rollup: 3.28.1
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
fsevents: 2.3.3
|
fsevents: 2.3.3
|
||||||
|
dev: true
|
||||||
|
|
||||||
/vite@4.3.9(less@4.2.0):
|
/vite@4.3.9(less@4.2.0):
|
||||||
resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==}
|
resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==}
|
||||||
|
|
|
@ -15,9 +15,10 @@ import {
|
||||||
FFMPEG_WORKFLOW,
|
FFMPEG_WORKFLOW,
|
||||||
getConst,
|
getConst,
|
||||||
getSuffix,
|
getSuffix,
|
||||||
|
LIBHEIF_SUFFIX,
|
||||||
|
LIBHEIF_WORKFLOW,
|
||||||
PDFIUM_SUFFIX,
|
PDFIUM_SUFFIX,
|
||||||
PROTOC_SUFFIX,
|
PROTOC_SUFFIX
|
||||||
TAURI_CLI_SUFFIX
|
|
||||||
} from './suffix.mjs';
|
} from './suffix.mjs';
|
||||||
import { which } from './which.mjs';
|
import { which } from './which.mjs';
|
||||||
|
|
||||||
|
@ -160,40 +161,37 @@ export async function downloadFFMpeg(machineId, framework, branches) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Workaround while https://github.com/tauri-apps/tauri/pull/3934 is not available in a Tauri stable release
|
* Download and extract libheif libs for heif thumbnails
|
||||||
* @param {string[]} machineId
|
* @param {string[]} machineId
|
||||||
* @param {string} framework
|
* @param {string} framework
|
||||||
* @param {string[]} branches
|
* @param {string[]} branches
|
||||||
*/
|
*/
|
||||||
export async function downloadPatchedTauriCLI(machineId, framework, branches) {
|
export async function downloadLibHeif(machineId, framework, branches) {
|
||||||
console.log('Dowloading patched tauri CLI...');
|
const workflow = getConst(LIBHEIF_WORKFLOW, machineId);
|
||||||
|
if (workflow == null) return;
|
||||||
|
|
||||||
const tauriCliSuffix = getSuffix(TAURI_CLI_SUFFIX, machineId);
|
console.log('Downloading LibHeif...');
|
||||||
if (tauriCliSuffix == null) throw new Error('NO_TAURI_CLI');
|
|
||||||
|
const libHeifSuffix = getSuffix(LIBHEIF_SUFFIX, machineId);
|
||||||
|
if (libHeifSuffix == null) throw new Error('NO_LIBHEIF');
|
||||||
|
|
||||||
let found = false;
|
let found = false;
|
||||||
for await (const artifact of getGhWorkflowRunArtifacts(
|
for await (const artifact of getGhWorkflowRunArtifacts(SPACEDRIVE_REPO, workflow, branches)) {
|
||||||
SPACEDRIVE_REPO,
|
if (!libHeifSuffix.test(artifact.name)) continue;
|
||||||
'tauri-patched-cli-js.yml',
|
|
||||||
branches
|
|
||||||
)) {
|
|
||||||
if (!tauriCliSuffix.test(artifact.name)) continue;
|
|
||||||
try {
|
try {
|
||||||
await extractTo(
|
const data = await getGhArtifactContent(SPACEDRIVE_REPO, artifact.id);
|
||||||
await getGhArtifactContent(SPACEDRIVE_REPO, artifact.id),
|
await extractTo(data, framework, {
|
||||||
path.join(framework, 'bin'),
|
chmod: 0o600,
|
||||||
{
|
recursive: true,
|
||||||
chmod: 0o700,
|
|
||||||
overwrite: true
|
overwrite: true
|
||||||
}
|
});
|
||||||
);
|
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.warn('Failed to download patched tauri cli.js, re-trying...');
|
console.warn('Failed to download LibHeif, re-trying...');
|
||||||
if (__debug) console.error(error);
|
if (__debug) console.error(error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!found) throw new Error('NO_TAURI_CLI');
|
if (!found) throw new Error('NO_LIBHEIF');
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,54 @@
|
||||||
|
import { exec as execCb } from 'node:child_process';
|
||||||
import * as fs from 'node:fs/promises';
|
import * as fs from 'node:fs/promises';
|
||||||
import * as path from 'node:path';
|
import * as path from 'node:path';
|
||||||
|
import { env } from 'node:process';
|
||||||
|
import { promisify } from 'node:util';
|
||||||
|
|
||||||
const REF_REGEX = /ref:\s+refs\/heads\/(?<branch>\s+)/;
|
const __debug = env.NODE_ENV === 'debug';
|
||||||
|
|
||||||
|
const exec = promisify(execCb);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} repoPath
|
||||||
|
* @returns {string?}
|
||||||
|
*/
|
||||||
|
async function getRemoteBranchName(repoPath) {
|
||||||
|
let branchName;
|
||||||
|
try {
|
||||||
|
branchName = (await exec('git symbolic-ref --short HEAD', { cwd: repoPath })).stdout.trim();
|
||||||
|
if (!branchName) throw 'Empty local branch name';
|
||||||
|
} catch (error) {
|
||||||
|
if (__debug) {
|
||||||
|
console.warn(`Failed to read git local branch name`);
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
let remoteBranchName;
|
||||||
|
try {
|
||||||
|
remoteBranchName = (
|
||||||
|
await exec(`git for-each-ref --format="%(upstream:short)" refs/heads/${branchName}`, {
|
||||||
|
cwd: repoPath
|
||||||
|
})
|
||||||
|
).stdout.trim();
|
||||||
|
const [remote, branch] = remoteBranchName.split('/');
|
||||||
|
if (!branch) throw 'Empty remote branch name';
|
||||||
|
remoteBranchName = branch;
|
||||||
|
} catch (error) {
|
||||||
|
if (__debug) {
|
||||||
|
console.warn(`Failed to read git remote branch name`);
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return remoteBranchName;
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://stackoverflow.com/q/3651860#answer-67151923
|
||||||
|
const REF_REGEX = /ref:\s+refs\/heads\/(?<branch>[^\s\x00-\x1F\:\?\[\\\^\~]+)/;
|
||||||
|
const GITHUB_REF_REGEX = /^refs\/heads\//;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {string} repoPath
|
* @param {string} repoPath
|
||||||
|
@ -10,15 +57,30 @@ const REF_REGEX = /ref:\s+refs\/heads\/(?<branch>\s+)/;
|
||||||
export async function getGitBranches(repoPath) {
|
export async function getGitBranches(repoPath) {
|
||||||
const branches = ['main', 'master'];
|
const branches = ['main', 'master'];
|
||||||
|
|
||||||
|
if (env.GITHUB_HEAD_REF) {
|
||||||
|
branches.unshift(env.GITHUB_HEAD_REF);
|
||||||
|
} else if (env.GITHUB_REF) {
|
||||||
|
branches.unshift(env.GITHUB_REF.replace(GITHUB_REF_REGEX, ''));
|
||||||
|
}
|
||||||
|
|
||||||
|
const remoteBranchName = await getRemoteBranchName(repoPath);
|
||||||
|
if (remoteBranchName) {
|
||||||
|
branches.unshift(remoteBranchName);
|
||||||
|
} else {
|
||||||
let head;
|
let head;
|
||||||
try {
|
try {
|
||||||
head = await fs.readFile(path.join(repoPath, '.git', 'HEAD'), { encoding: 'utf8' });
|
head = await fs.readFile(path.join(repoPath, '.git', 'HEAD'), { encoding: 'utf8' });
|
||||||
} catch {
|
} catch (error) {
|
||||||
|
if (__debug) {
|
||||||
|
console.warn(`Failed to read git HEAD file`);
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
return branches;
|
return branches;
|
||||||
}
|
}
|
||||||
|
|
||||||
const match = REF_REGEX.exec(head);
|
const match = REF_REGEX.exec(head);
|
||||||
if (match?.groups?.branch) branches.unshift(match.groups.branch);
|
if (match?.groups?.branch) branches.unshift(match.groups.branch);
|
||||||
|
}
|
||||||
|
|
||||||
return branches;
|
return branches;
|
||||||
}
|
}
|
||||||
|
|
60
scripts/machineId.mjs
Normal file
60
scripts/machineId.mjs
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
import { exec as execCb } from 'node:child_process';
|
||||||
|
import * as os from 'node:os';
|
||||||
|
import { env } from 'node:process';
|
||||||
|
import { promisify } from 'node:util';
|
||||||
|
|
||||||
|
const __debug = env.NODE_ENV === 'debug';
|
||||||
|
|
||||||
|
let libc = 'glibc';
|
||||||
|
if (os.type() === 'Linux') {
|
||||||
|
try {
|
||||||
|
const exec = promisify(execCb);
|
||||||
|
if ((await exec('ldd /bin/ls')).stdout.includes('musl')) {
|
||||||
|
libc = 'musl';
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
if (__debug) {
|
||||||
|
console.warn(`Failed to check libc type`);
|
||||||
|
console.error(error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const OS_TYPE = {
|
||||||
|
darwin: 'Darwin',
|
||||||
|
windows: 'Windows_NT',
|
||||||
|
linux: 'Linux'
|
||||||
|
};
|
||||||
|
|
||||||
|
export function getMachineId() {
|
||||||
|
let machineId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Possible TARGET_TRIPLE:
|
||||||
|
* x86_64-apple-darwin
|
||||||
|
* aarch64-apple-darwin
|
||||||
|
* x86_64-pc-windows-msvc
|
||||||
|
* aarch64-pc-windows-msvc
|
||||||
|
* x86_64-unknown-linux-gnu
|
||||||
|
* x86_64-unknown-linux-musl
|
||||||
|
* aarch64-unknown-linux-gnu
|
||||||
|
* aarch64-unknown-linux-musl
|
||||||
|
* armv7-unknown-linux-gnueabihf
|
||||||
|
*/
|
||||||
|
if (env.TARGET_TRIPLE) {
|
||||||
|
const target = env.TARGET_TRIPLE.split('-');
|
||||||
|
const osType = OS_TYPE[target[2]];
|
||||||
|
|
||||||
|
if (!osType) throw new Error(`Unknown OS type: ${target[2]}`);
|
||||||
|
if (!target[0]) throw new Error(`Unknown machine type: ${target[0]}`);
|
||||||
|
|
||||||
|
machineId = [osType, target[0]];
|
||||||
|
if (machineId[0] === 'Linux') machineId.push(target[3].includes('musl') ? 'musl' : 'glibc');
|
||||||
|
} else {
|
||||||
|
// Current machine identifiers
|
||||||
|
machineId = [os.type(), os.machine()];
|
||||||
|
if (machineId[0] === 'Linux') machineId.push(libc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return machineId;
|
||||||
|
}
|
|
@ -1,13 +0,0 @@
|
||||||
import { exec as execCb } from 'node:child_process';
|
|
||||||
import { promisify } from 'node:util';
|
|
||||||
|
|
||||||
const exec = promisify(execCb);
|
|
||||||
|
|
||||||
/** @returns {Promise<boolean>} */
|
|
||||||
export async function isMusl() {
|
|
||||||
try {
|
|
||||||
return (await exec('ldd /bin/ls')).stdout.includes('musl');
|
|
||||||
} catch {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -7,15 +7,13 @@ import { fileURLToPath } from 'node:url';
|
||||||
import { promisify } from 'node:util';
|
import { promisify } from 'node:util';
|
||||||
import mustache from 'mustache';
|
import mustache from 'mustache';
|
||||||
|
|
||||||
import { downloadFFMpeg, downloadPatchedTauriCLI, downloadPDFium, downloadProtc } from './deps.mjs';
|
import { downloadFFMpeg, downloadLibHeif, downloadPDFium, downloadProtc } from './deps.mjs';
|
||||||
import { getGitBranches } from './git.mjs';
|
import { getGitBranches } from './git.mjs';
|
||||||
import { isMusl } from './musl.mjs';
|
import { getMachineId } from './machineId.mjs';
|
||||||
import { which } from './which.mjs';
|
import { which } from './which.mjs';
|
||||||
|
|
||||||
umask(0o026);
|
umask(0o026);
|
||||||
|
|
||||||
if (env.IGNORE_POSTINSTALL === 'true') process.exit(0);
|
|
||||||
|
|
||||||
if (/^(msys|mingw|cygwin)$/i.test(env.OSTYPE ?? '')) {
|
if (/^(msys|mingw|cygwin)$/i.test(env.OSTYPE ?? '')) {
|
||||||
console.error('Bash for windows is not supported, please execute this from Powershell or CMD');
|
console.error('Bash for windows is not supported, please execute this from Powershell or CMD');
|
||||||
process.exit(255);
|
process.exit(255);
|
||||||
|
@ -31,8 +29,7 @@ const __dirname = path.dirname(__filename);
|
||||||
const __root = path.resolve(path.join(__dirname, '..'));
|
const __root = path.resolve(path.join(__dirname, '..'));
|
||||||
|
|
||||||
// Current machine identifiers
|
// Current machine identifiers
|
||||||
const machineId = [os.type(), os.machine()];
|
const machineId = getMachineId();
|
||||||
if (machineId[0] === 'Linux') machineId.push((await isMusl()) ? 'musl' : 'glibc');
|
|
||||||
|
|
||||||
// Basic dependeny check
|
// Basic dependeny check
|
||||||
if (
|
if (
|
||||||
|
@ -64,7 +61,7 @@ await Promise.all(
|
||||||
);
|
);
|
||||||
|
|
||||||
// Download all necessary external dependencies
|
// Download all necessary external dependencies
|
||||||
const deps = [
|
await Promise.all([
|
||||||
downloadProtc(machineId, framework).catch((e) => {
|
downloadProtc(machineId, framework).catch((e) => {
|
||||||
console.error(
|
console.error(
|
||||||
'Failed to download protoc, this is required for Spacedrive to compile. ' +
|
'Failed to download protoc, this is required for Spacedrive to compile. ' +
|
||||||
|
@ -85,21 +82,15 @@ const deps = [
|
||||||
'https://github.com/spacedriveapp/spacedrive/issues/new/choose'
|
'https://github.com/spacedriveapp/spacedrive/issues/new/choose'
|
||||||
);
|
);
|
||||||
throw e;
|
throw e;
|
||||||
})
|
}),
|
||||||
];
|
downloadLibHeif(machineId, framework, branches).catch((e) => {
|
||||||
|
|
||||||
if (machineId[0] === 'Darwin')
|
|
||||||
deps.push(
|
|
||||||
downloadPatchedTauriCLI(machineId, framework, branches).catch((e) => {
|
|
||||||
console.error(
|
console.error(
|
||||||
'Failed to download patched tauri CLI. This is probably a bug, please open a issue with you system info at: ' +
|
'Failed to download libheif. This is probably a bug, please open a issue with you system info at: ' +
|
||||||
'https://github.com/spacedriveapp/spacedrive/issues/new/choose'
|
'https://github.com/spacedriveapp/spacedrive/issues/new/choose'
|
||||||
);
|
);
|
||||||
throw e;
|
throw e;
|
||||||
})
|
})
|
||||||
);
|
]).catch((e) => {
|
||||||
|
|
||||||
await Promise.all(deps).catch((e) => {
|
|
||||||
if (__debug) console.error(e);
|
if (__debug) console.error(e);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
});
|
});
|
||||||
|
@ -141,8 +132,14 @@ try {
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setup macOS Frameworks
|
if (machineId[0] === 'Linux') {
|
||||||
if (machineId[0] === 'Darwin') {
|
// Setup Linux libraries
|
||||||
|
const libDir = path.join(__root, 'target', 'lib');
|
||||||
|
await fs.rm(libDir, { force: true, recursive: true });
|
||||||
|
await fs.mkdir(libDir, { recursive: true, mode: 0o751 });
|
||||||
|
await fs.symlink(path.join(framework, 'lib'), path.join(__root, 'target', 'lib', 'spacedrive'));
|
||||||
|
} else if (machineId[0] === 'Darwin') {
|
||||||
|
// Setup macOS Frameworks
|
||||||
try {
|
try {
|
||||||
console.log('Setup Frameworks & Sign libraries...');
|
console.log('Setup Frameworks & Sign libraries...');
|
||||||
const ffmpegFramework = path.join(framework, 'FFMpeg.framework');
|
const ffmpegFramework = path.join(framework, 'FFMpeg.framework');
|
|
@ -46,7 +46,7 @@ if [ "${CI:-}" != "true" ]; then
|
||||||
'https://pnpm.io/installation'
|
'https://pnpm.io/installation'
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! has rustc cargo; then
|
if ! has rustup rustc cargo; then
|
||||||
err 'Rust was not found.' \
|
err 'Rust was not found.' \
|
||||||
"Ensure the 'rustc' and 'cargo' binaries are in your \$PATH." \
|
"Ensure the 'rustc' and 'cargo' binaries are in your \$PATH." \
|
||||||
'https://rustup.rs'
|
'https://rustup.rs'
|
||||||
|
@ -127,7 +127,7 @@ case "$(uname)" in
|
||||||
libgstreamer-plugins-bad1.0-dev
|
libgstreamer-plugins-bad1.0-dev
|
||||||
|
|
||||||
# Bindgen dependencies - it's used by a dependency of Spacedrive
|
# Bindgen dependencies - it's used by a dependency of Spacedrive
|
||||||
set -- "$@" pkg-config clang
|
set -- "$@" llvm-dev libclang-dev clang
|
||||||
|
|
||||||
sudo apt-get -y update
|
sudo apt-get -y update
|
||||||
sudo apt-get -y install "$@"
|
sudo apt-get -y install "$@"
|
||||||
|
@ -139,14 +139,14 @@ case "$(uname)" in
|
||||||
set -- base-devel curl wget file patchelf openssl gtk3 librsvg webkit2gtk libayatana-appindicator
|
set -- base-devel curl wget file patchelf openssl gtk3 librsvg webkit2gtk libayatana-appindicator
|
||||||
|
|
||||||
# FFmpeg dependencies
|
# FFmpeg dependencies
|
||||||
set -- "$@" libheif ffmpeg
|
set -- "$@" ffmpeg
|
||||||
|
|
||||||
# Webkit2gtk requires gstreamer plugins for video playback to work
|
# Webkit2gtk requires gstreamer plugins for video playback to work
|
||||||
set -- "$@" gst-libav gst-plugins-bad gst-plugins-base gst-plugins-good gst-plugins-ugly \
|
set -- "$@" gst-libav gst-plugins-bad gst-plugins-base gst-plugins-good gst-plugins-ugly \
|
||||||
gst-plugin-pipewire gstreamer-vaapi
|
gst-plugin-pipewire gstreamer-vaapi
|
||||||
|
|
||||||
# Bindgen dependencies - it's used by a dependency of Spacedrive
|
# Bindgen dependencies - it's used by a dependency of Spacedrive
|
||||||
set -- "$@" pkgconf clang
|
set -- "$@" clang
|
||||||
|
|
||||||
sudo pacman -Sy --needed "$@"
|
sudo pacman -Sy --needed "$@"
|
||||||
elif has dnf; then
|
elif has dnf; then
|
||||||
|
@ -180,12 +180,12 @@ case "$(uname)" in
|
||||||
streamer1-plugins-bad-free-extras
|
streamer1-plugins-bad-free-extras
|
||||||
|
|
||||||
# Bindgen dependencies - it's used by a dependency of Spacedrive
|
# Bindgen dependencies - it's used by a dependency of Spacedrive
|
||||||
set -- "$@" clang pkgconf clang-devel
|
set -- "$@" clang clang-devel
|
||||||
|
|
||||||
sudo dnf install "$@"
|
sudo dnf install "$@"
|
||||||
|
|
||||||
# FFmpeg dependencies
|
# FFmpeg dependencies
|
||||||
if ! sudo dnf install libheif-devel ffmpeg ffmpeg-devel; then
|
if ! sudo dnf install ffmpeg ffmpeg-devel; then
|
||||||
err 'We were unable to install the FFmpeg and FFmpeg-devel packages.' \
|
err 'We were unable to install the FFmpeg and FFmpeg-devel packages.' \
|
||||||
'This is likely because the RPM Fusion free repository is not enabled.' \
|
'This is likely because the RPM Fusion free repository is not enabled.' \
|
||||||
'https://docs.fedoraproject.org/en-US/quick-docs/setup_rpmfusion'
|
'https://docs.fedoraproject.org/en-US/quick-docs/setup_rpmfusion'
|
||||||
|
|
|
@ -56,12 +56,25 @@ export const FFMPEG_WORKFLOW = {
|
||||||
Windows_NT: 'ffmpeg-windows.yml'
|
Windows_NT: 'ffmpeg-windows.yml'
|
||||||
};
|
};
|
||||||
|
|
||||||
export const TAURI_CLI_SUFFIX = {
|
export const LIBHEIF_SUFFIX = {
|
||||||
Darwin: {
|
Linux: {
|
||||||
x86_64: 'x86_64-apple-darwin',
|
x86_64: {
|
||||||
arm64: 'aarch64-apple-darwin',
|
musl: 'x86_64-linux-musl',
|
||||||
aarch64: 'aarch64-apple-darwin'
|
glibc: 'x86_64-linux-gnu'
|
||||||
|
},
|
||||||
|
arm64: {
|
||||||
|
musl: 'aarch64-linux-musl',
|
||||||
|
glibc: 'aarch64-linux-gnu'
|
||||||
|
},
|
||||||
|
aarch64: {
|
||||||
|
musl: 'aarch64-linux-musl',
|
||||||
|
glibc: 'aarch64-linux-gnu'
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export const LIBHEIF_WORKFLOW = {
|
||||||
|
Linux: 'libheif-linux.yml'
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue