Compare commits

...

5 Commits

Author SHA1 Message Date
Samantaz Fox
4625cf80ce
Merge b99dabd9f6 into d8b893e9ad 2024-10-18 21:33:42 +02:00
syeopite
d8b893e9ad
Bump CI matrix (#5015) 2024-10-18 21:33:38 +02:00
Samantaz Fox
b99dabd9f6
Crystal: Force using PCRE (legacy) for cross-compilation
PCRE2 support was added in Crystal v1.7.0, and used by default
in Crystal v1.8.0.

As we don't want to have to guess what version of the PCRE was
used on the build host, force the use of the legacy version until
we drop support for older versions of Crystal.
2024-10-09 16:30:40 +02:00
Samantaz Fox
8d30ac2c71
CI: Add docker file for arm64 cross-compilation 2024-10-09 16:30:40 +02:00
Samantaz Fox
d87ab6bbd1
Makefile: Add cross-compilation targets 2024-10-09 16:30:40 +02:00
3 changed files with 133 additions and 8 deletions

View File

@ -38,10 +38,11 @@ jobs:
matrix:
stable: [true]
crystal:
- 1.9.2
- 1.10.1
- 1.11.2
- 1.12.1
- 1.13.2
- 1.14.0
include:
- crystal: nightly
stable: false
@ -122,7 +123,7 @@ jobs:
uses: docker/build-push-action@v5
with:
context: .
file: docker/Dockerfile.arm64
file: docker/Dockerfile.arm64-musl-cross
platforms: linux/arm64/v8
build-args: release=0

101
Makefile
View File

@ -9,6 +9,7 @@ NO_DBG_SYMBOLS := 0
FLAGS ?=
LDFLAGS ?=
ifeq ($(RELEASE), 1)
@ -17,6 +18,7 @@ endif
ifeq ($(STATIC), 1)
FLAGS += --static
LDFLAGS += -static
endif
@ -31,6 +33,13 @@ ifeq ($(API_ONLY), 1)
endif
#FLAGS += --progress --stats --error-trace
LIBS_SSL = $(shell command -v pkg-config > /dev/null && pkg-config --libs --silence-errors libssl || printf %s '-lssl -lcrypto')
LIBS_CRYPTO = $(shell command -v pkg-config > /dev/null && pkg-config --libs --silence-errors libcrypto || printf %s '-lcrypto')
# -----------------------
# Main
# -----------------------
@ -40,19 +49,80 @@ all: invidious
get-libs:
shards install --production
# TODO: add support for ARM64 via cross-compilation
invidious: get-libs
crystal build src/invidious.cr $(FLAGS) --progress --stats --error-trace
crystal build src/invidious.cr $(FLAGS)
run: invidious
./invidious
# -----------------------
# Development
# Cross-compilation (Host)
# -----------------------
# Supported cross-sompilation targets:
# - amd64-glibc (x86_64-linux-gnu)
# - amd64-musl (x86_64-linux-musl)
# - arm64-glibc (aarch64-linux-gnu)
# - arm64-musl (aarch64-linux-musl)
# - armhf (arm-linux-gnueabihf)
invidious-cross-amd64-glibc:
crystal build src/invidious.cr $(FLAGS) -Duse_pcre -Dskip_videojs_download \
--cross-compile --target='x86_64-linux-gnu' -o invidious-amd64-glibc
invidious-cross-amd64-musl:
crystal build src/invidious.cr $(FLAGS) -Duse_pcre -Dskip_videojs_download \
--cross-compile --target='x86_64-linux-musl' -o invidious-amd64-musl
invidious-cross-arm64-glibc:
crystal build src/invidious.cr $(FLAGS) -Duse_pcre -Dskip_videojs_download \
--cross-compile --target='aarch64-linux-gnu' -o invidious-arm64-glibc
invidious-cross-arm64-musl:
crystal build src/invidious.cr $(FLAGS) -Duse_pcre -Dskip_videojs_download \
--cross-compile --target='aarch64-linux-musl' -o invidious-arm64-musl
invidious-cross-armhf:
crystal build src/invidious.cr $(FLAGS) -Duse_pcre -Dskip_videojs_download \
--cross-compile --target='arm-linux-gnueabihf' -o invidious-armhf
# Build everything at once
invidious-cross-all: invidious-cross-amd64-glibc
invidious-cross-all: invidious-cross-amd64-musl
invidious-cross-all: invidious-cross-arm64-glibc
invidious-cross-all: invidious-cross-arm64-musl
invidious-cross-all: invidious-cross-armhf
# -----------------------
# Cross-compilation (Target)
# -----------------------
invidious-amd64-glibc:
invidious-arm64-glibc:
cc "$@.o" -o "$@" -rdynamic $(LDFLAGS) \
-lyaml -lxml2 -lsqlite3 -lz -llzma $(LIBS_SSL) $(LIBS_CRYPTO) \
-lpcre -lm -lgc -lpthread -levent -lrt -lpthread -ldl
invidious-amd64-musl:
invidious-arm64-musl:
cc "$@.o" -o "$@" -rdynamic $(LDFLAGS) \
-lyaml -lxml2 -lsqlite3 -lz -llzma $(LIBS_SSL) $(LIBS_CRYPTO) \
-lpcre -lgc -levent
invidious-armhf:
cc "$@.o" -o "$@" -rdynamic $(LDFLAGS) \
-lyaml -lxml2 -lsqlite3 -lz -llzma $(LIBS_SSL) $(LIBS_CRYPTO) \
-lpcre -lm -lgc -lpthread -levent -lpthread -ldl
# -----------------------
# Development
# -----------------------
format:
crystal tool format
@ -77,7 +147,7 @@ verify:
# -----------------------
clean:
rm invidious
rm -f invidious invidious-*
distclean: clean
rm -rf libs
@ -111,9 +181,28 @@ help:
@echo ""
@echo " API_ONLY Build invidious without a GUI (Default: 0)"
@echo " NO_DBG_SYMBOLS Strip debug symbols (Default: 0)"
@echo ""
@echo ""
@echo "Cross-compiling"
@echo ""
@echo "To cross compile, run 'make invidious-cross-{arch}' on the build host,"
@echo "then move the .o file to the target host and run 'make invidious-{arch}'"
@echo "on there (requires crystal and all the dependencies to be installed)"
@echo ""
@echo "Note: If 'STATIC=1' was used on the build host, then it MUST be used on"
@echo " 'the target host too!"
@echo ""
@echo "Supported cross-sompilation archs:"
@echo " - amd64-glibc (x86_64-linux-gnu)"
@echo " - amd64-musl (x86_64-linux-musl)"
@echo " - arm64-glibc (aarch64-linux-gnu)"
@echo " - arm64-musl (aarch64-linux-musl)"
@echo " - armhf (arm-linux-gnueabihf)"
# No targets generates an output named after themselves
.PHONY: all get-libs build amd64 run
.PHONY: format test verify clean distclean help
.PHONY: invidious-cross-amd64-glibc invidious-cross-amd64-musl
.PHONY: invidious-cross-arm64-glibc invidious-cross-arm64-musl
.PHONY: invidious-cross-armhf

View File

@ -0,0 +1,35 @@
FROM alpine:3.18 AS builder
RUN apk add --no-cache gcc make yaml-static libxml2-static sqlite-static zlib-static \
xz-static openssl-libs-static openssl-dev pcre-dev pcre2-dev gc-dev libevent-static musl-dev
ARG release
COPY ./Makefile .
COPY ./invidious-arm64-musl.o .
RUN make invidious-arm64-musl STATIC=1
FROM alpine:3.18
RUN apk add --no-cache librsvg ttf-opensans tini
WORKDIR /invidious
RUN addgroup -g 1000 -S invidious && \
adduser -u 1000 -S invidious -G invidious
COPY --chown=invidious ./config/ ./config/
RUN mv -n config/config.example.yml config/config.yml
RUN sed -i 's/host: \(127.0.0.1\|localhost\)/host: invidious-db/' config/config.yml
COPY ./locales/ ./locales/
COPY ./assets ./assets/
RUN chmod o+rX -R ./assets ./config ./locales
COPY --from=builder /invidious-arm64-musl .
EXPOSE 3000
USER invidious
ENTRYPOINT ["/sbin/tini", "--"]
CMD [ "/invidious/invidious-arm64-musl" ]