@@ -6,14 +6,18 @@ PKG_CONFIG=$(shell which pkg-config)
66# Default parallelism
77JOBS ?= $(shell nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 1)
88
9+ # Locations
10+ BUILD_DIR ?= build
11+ CMD_DIR := $(wildcard cmd/* )
12+ PREFIX ?= ${BUILD_DIR}/install
13+
914# Source version
10- # FFMPEG_VERSION ?= ffmpeg-7.1.1
11- # SYS_VERSION ?= ffmpeg71
1215FFMPEG_VERSION ?= ffmpeg-8.0.3
1316SYS_VERSION ?= ffmpeg80
1417CHROMAPRINT_VERSION ?= chromaprint-1.5.1
1518LIBEXIF_VERSION ?= 0.6.26
1619LIBRAW_VERSION ?= 0.22.1
20+ LIBHEIF_VERSION ?= 1.23.1
1721
1822# Set OS and Architecture (must be before CGO configuration)
1923ARCH ?= $(shell arch | tr A-Z a-z | sed 's/x86_64/amd64/' | sed 's/i386/amd64/' | sed 's/armv7l/arm/' | sed 's/aarch64/arm64/')
2832CGO_ENV=PKG_CONFIG_PATH ="$(shell realpath ${PREFIX}) /lib/pkgconfig" CGO_LDFLAGS_ALLOW="-(W|D).*" CGO_LDFLAGS="-lstdc++"
2933endif
3034
31- # Build flags
32- BUILD_MODULE := $(shell cat go.mod | head -1 | cut -d ' ' -f 2)
33- BUILD_LD_FLAGS += -X $(BUILD_MODULE ) /pkg/version.GitSource=${BUILD_MODULE}
34- BUILD_LD_FLAGS += -X $(BUILD_MODULE ) /pkg/version.GitTag=$(shell git describe --tags --always)
35- BUILD_LD_FLAGS += -X $(BUILD_MODULE ) /pkg/version.GitBranch=$(shell git name-rev HEAD --name-only --always)
36- BUILD_LD_FLAGS += -X $(BUILD_MODULE ) /pkg/version.GitHash=$(shell git rev-parse HEAD)
37- BUILD_LD_FLAGS += -X $(BUILD_MODULE ) /pkg/version.GoBuildTime=$(shell date -u '+% Y-% m-% dT% H:% M:% SZ')
38- BUILD_FLAGS = -ldflags "-s -w $(BUILD_LD_FLAGS ) "
39-
40- # Paths to locations, etc
41- BUILD_DIR := "build"
42- CMD_DIR := $(filter-out cmd/README.md, $(wildcard cmd/* ) )
43- BUILD_TAG := ${DOCKER_REGISTRY}/go-media-${OS}-${ARCH}:${VERSION}
44- PREFIX ?= ${BUILD_DIR}/install
35+
36+ # Set build flags
37+ VERSION_PKG = github.com/mutablelogic/go-server/pkg/version
38+ BUILD_LD_FLAGS += -X $(VERSION_PKG ) .GitTag=$(shell git describe --tags --always)
39+ BUILD_LD_FLAGS += -X $(VERSION_PKG ) .GitBranch=$(shell git name-rev HEAD --name-only --always)
40+ BUILD_FLAGS = -ldflags "-s -w ${BUILD_LD_FLAGS}"
41+
42+ # Docker
43+ DOCKER_REPO ?= ghcr.io/mutablelogic/gomedia
44+ DOCKER_SOURCE ?= $(shell cat go.mod | head -1 | cut -d ' ' -f 2)
45+ DOCKER_TAG = ${DOCKER_REPO}:${VERSION}-${OS}-${ARCH}
46+
4547
4648# ##############################################################################
4749# TARGETS
@@ -50,9 +52,9 @@ PREFIX ?= ${BUILD_DIR}/install
5052all : clean cmd
5153
5254.PHONY : cmd
53- cmd : ffmpeg chromaprint libexif $(CMD_DIR )
55+ cmd : ffmpeg chromaprint libexif libraw libheif $(CMD_DIR )
5456
55- $(CMD_DIR ) : go-dep go-tidy sdl-dep mkdir
57+ $(CMD_DIR ) : go-dep go-tidy sdl-dep chromaprint-dep mkdir
5658 @echo Build cmd $(notdir $@ )
5759 @${CGO_ENV} ${GO} build ${BUILD_FLAGS} -o ${BUILD_DIR} /$(notdir $@ ) ./$@
5860
@@ -218,34 +220,86 @@ libexif: libexif-build
218220 @sed -i.bak ' s|-lexif$$|-lexif -lm|' " ${PREFIX} /lib/pkgconfig/libexif.pc"
219221 @rm -f " ${PREFIX} /lib/pkgconfig/libexif.pc.bak"
220222
223+ # ##############################################################################
224+ # LIBHEIF
225+
226+ # Download libheif sources
227+ ${BUILD_DIR}/libheif-${LIBHEIF_VERSION} :
228+ @if [ ! -d " $( BUILD_DIR) /libheif-$( LIBHEIF_VERSION) " ]; then \
229+ echo " Downloading $( LIBHEIF_VERSION) " ; \
230+ mkdir -p $(BUILD_DIR ) /libheif-${LIBHEIF_VERSION} ; \
231+ curl -L -o $(BUILD_DIR ) /libheif.tar.gz https://github.com/strukturag/libheif/releases/download/v$(LIBHEIF_VERSION ) /libheif-$(LIBHEIF_VERSION ) .tar.gz; \
232+ tar -xzf $(BUILD_DIR ) /libheif.tar.gz -C $(BUILD_DIR ) ; \
233+ rm -f $(BUILD_DIR ) /libheif.tar.gz; \
234+ fi
235+
236+ .PHONY : libheif-configure
237+ libheif-configure : mkdir pkconfig-dep ${BUILD_DIR}/libheif-${LIBHEIF_VERSION} ffmpeg libheif-dep
238+ @echo " Configuring libheif-${LIBHEIF_VERSION} => ${PREFIX} "
239+ @cmake \
240+ -DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
241+ -DCMAKE_BUILD_TYPE=Release \
242+ -DBUILD_SHARED_LIBS=0 \
243+ -DCMAKE_INSTALL_PREFIX=" $( shell realpath ${PREFIX} ) " \
244+ -DCMAKE_PREFIX_PATH=" $( shell realpath ${PREFIX} ) " \
245+ -DCMAKE_LIBRARY_PATH=" $( shell realpath ${PREFIX} ) /lib" \
246+ -DCMAKE_INCLUDE_PATH=" $( shell realpath ${PREFIX} ) /include" \
247+ ${LIBHEIF_CONFIG} \
248+ -S ${BUILD_DIR} /libheif-${LIBHEIF_VERSION} \
249+ -B ${BUILD_DIR} /libheif-${LIBHEIF_VERSION}
250+
251+ # Build libheif
252+ .PHONY : libheif-build
253+ libheif-build : libheif-configure
254+ @echo " Building libheif-${LIBHEIF_VERSION} with ${JOBS} jobs"
255+ @cmake --build ${BUILD_DIR} /libheif-${LIBHEIF_VERSION} -j$(JOBS )
256+
257+ # Install libheif
258+ .PHONY : libheif
259+ libheif : libheif-build
260+ @echo " Installing libheif-${LIBHEIF_VERSION} => ${PREFIX} "
261+ @cmake --install ${BUILD_DIR} /libheif-${LIBHEIF_VERSION}
262+ @if ! grep -q ' libavcodec' " ${PREFIX} /lib/pkgconfig/libheif.pc" ; then \
263+ sed -i.bak ' s/^Requires.private:[[:space:]]*/Requires.private: libavcodec libavformat libavutil /' " ${PREFIX} /lib/pkgconfig/libheif.pc" ; \
264+ rm -f " ${PREFIX} /lib/pkgconfig/libheif.pc.bak" ; \
265+ fi
266+
221267# ##############################################################################
222268# DOCKER
223269
270+ # Build the docker image
271+ .PHONY : docker
224272docker : docker-dep
225- @echo build docker image: ${BUILD_TAG} for ${OS} / ${ARCH}
273+ @echo build docker image ${DOCKER_TAG} OS= ${OS} ARCH= ${ARCH} SOURCE= ${DOCKER_SOURCE} VERSION= ${VERSION }
226274 @${DOCKER} build \
227- --tag ${BUILD_TAG} \
275+ --tag ${DOCKER_TAG} \
276+ --provenance=false \
228277 --build-arg ARCH=${ARCH} \
229278 --build-arg OS=${OS} \
230- --build-arg SOURCE=${BUILD_MODULE } \
279+ --build-arg SOURCE=${DOCKER_SOURCE } \
231280 --build-arg VERSION=${VERSION} \
232281 -f etc/docker/Dockerfile .
233282
234- docker-push : docker-dep
235- @echo push docker image: ${BUILD_TAG}
236- @${DOCKER} push ${BUILD_TAG}
283+ # Push docker container
284+ .PHONY : docker-push
285+ docker-push : docker-dep
286+ @echo push docker image: ${DOCKER_TAG}
287+ @${DOCKER} push ${DOCKER_TAG}
288+
289+ # Print out the version
290+ .PHONY : docker-version
291+ docker-version : docker-dep
292+ @echo " tag=${VERSION} "
237293
238294# ##############################################################################
239295# TESTS
240296
241297.PHONY : test
242- test : ffmpeg chromaprint libexif libraw test-ffmpeg test-chromaprint test-exif test-raw
243- @echo ... test pkg/file
244- @${GO} test ${ARGS} ./pkg/file
298+ test : ffmpeg chromaprint libexif libraw libheif test-ffmpeg test-chromaprint test-exif test-raw test-heif test-metadata test-gomedia
245299
246300.PHONY : test-chromaprint
247301test-chromaprint :
248- @echo ... test pkg/chromaprint
302+ @echo ... test pkg/segmenter pkg/ chromaprint
249303 @${CGO_ENV} ${GO} test ${ARGS} ./pkg/segmenter
250304 @${CGO_ENV} ${GO} test ${ARGS} ./pkg/chromaprint
251305
@@ -261,26 +315,27 @@ test-raw:
261315 @${CGO_ENV} ${GO} test ${ARGS} ./sys/libraw
262316 @${CGO_ENV} ${GO} test ${ARGS} ./pkg/raw
263317
264- .PHONY : test-sys
265- test-sys : go-dep go-tidy
266- @echo Test
267- @echo ... test sys/ ${SYS_VERSION}
268- @${CGO_ENV} ${GO} test ${ARGS} ./sys/ ${SYS_VERSION}
318+ .PHONY : test-heif
319+ test-heif :
320+ @echo ... test sys/libheif pkg/heif
321+ @${CGO_ENV} ${GO} test ${ARGS} ./sys/libheif
322+ @${CGO_ENV} ${GO} test ${ARGS} ./pkg/heif
269323
270324.PHONY : test-ffmpeg
271- test-ffmpeg : test-sys
272- @echo Test
273- @echo ... test pkg/ffmpeg/...
325+ test-ffmpeg : go-dep go-tidy
326+ @echo ... test sys/ ${SYS_VERSION} pkg/ffmpeg
327+ @${CGO_ENV} ${GO} test ${ARGS} ./sys/ ${SYS_VERSION}
274328 @${CGO_ENV} ${GO} test ${ARGS} ./pkg/ffmpeg/...
275329
276- .PHONY : coverage
277- coverage : ffmpeg chromaprint sdl-dep mkdir
278- @echo " Running tests with coverage..."
279- @${CGO_ENV} ${GO} test ${ARGS} ${BUILD_FLAGS} -coverprofile=${BUILD_DIR} /coverage.out -covermode=atomic ./sys/${SYS_VERSION} ./pkg/...
280- @${GO} tool cover -func=${BUILD_DIR} /coverage.out | tail -1
281- @${GO} tool cover -html=${BUILD_DIR} /coverage.out -o ${BUILD_DIR} /coverage.html
282- @echo " Coverage report: ${BUILD_DIR} /coverage.html"
330+ .PHONY : test-metadata
331+ test-metadata :
332+ @echo ... test metadata/...
333+ @${CGO_ENV} ${GO} test ${ARGS} ./metadata/...
283334
335+ .PHONY : test-gomedia
336+ test-gomedia :
337+ @echo ... test gomedia/...
338+ @${CGO_ENV} ${GO} test ${ARGS} ./gomedia/...
284339
285340# ##############################################################################
286341# DEPENDENCIES, ETC
@@ -346,7 +401,31 @@ ffmpeg-dep:
346401 $(eval FFMPEG_CONFIG := $(FFMPEG_CONFIG ) $(shell ${PKG_CONFIG} --exists openh264 && echo "--enable-libopenh264") )
347402 @echo " FFmpeg configuration: $( FFMPEG_CONFIG) "
348403
404+ # Check for libheif dependencies
405+ .PHONY : libheif-dep
406+ libheif-dep :
407+ $(eval LIBHEIF_CONFIG := -DENABLE_PLUGIN_LOADING=OFF -DWITH_EXAMPLES=OFF -DBUILD_TESTING=OFF -DBUILD_DOCUMENTATION=OFF)
408+ $(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG ) -DWITH_GDK_PIXBUF=OFF)
409+ $(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG ) -DWITH_LIBSHARPYUV=OFF)
410+ $(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG ) -DWITH_LIBDE265=$(shell ${PKG_CONFIG} --exists libde265 && echo ON || echo OFF) )
411+ $(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG ) -DWITH_X265=$(shell ${PKG_CONFIG} --exists x265 && echo ON || echo OFF) )
412+ $(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG ) -DWITH_AOM_DECODER=$(shell ${PKG_CONFIG} --exists aom && echo ON || echo OFF) )
413+ $(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG ) -DWITH_AOM_ENCODER=$(shell ${PKG_CONFIG} --exists aom && echo ON || echo OFF) )
414+ $(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG ) -DWITH_DAV1D=$(shell ${PKG_CONFIG} --exists dav1d && echo ON || echo OFF) )
415+ $(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG ) -DWITH_SvtEnc=$(shell ${PKG_CONFIG} --exists SvtAv1Enc && echo ON || echo OFF) )
416+ $(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG ) -DWITH_OpenH264_DECODER=$(shell ${PKG_CONFIG} --exists openh264 && echo ON || echo OFF) )
417+ $(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG ) -DWITH_X264=$(shell ${PKG_CONFIG} --exists x264 && echo ON || echo OFF) )
418+ $(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG ) -DWITH_FFMPEG_DECODER=$(shell ${PKG_CONFIG} --exists libavcodec libavformat libavutil && echo ON || echo OFF) )
419+ $(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG ) -DWITH_JPEG_DECODER=$(shell ${PKG_CONFIG} --exists libjpeg && echo ON || echo OFF) )
420+ $(eval LIBHEIF_CONFIG := $(LIBHEIF_CONFIG ) -DWITH_JPEG_ENCODER=$(shell ${PKG_CONFIG} --exists libjpeg && echo ON || echo OFF) )
421+ @echo " libheif configuration: $( LIBHEIF_CONFIG) "
422+
349423# Check for SDL dependencies
350424.PHONY : sdl-dep
351425sdl-dep :
352426 $(eval BUILD_FLAGS := $(BUILD_FLAGS ) $(shell $(PKG_CONFIG ) --exists sdl2 && echo "--tags sdl2") )
427+
428+ # Check for Chromaprint dependencies
429+ .PHONY : chromaprint-dep
430+ chromaprint-dep :
431+ $(eval BUILD_FLAGS := $(BUILD_FLAGS ) $(shell PKG_CONFIG_PATH="$(shell realpath ${PREFIX}) /lib/pkgconfig:$$PKG_CONFIG_PATH" $(PKG_CONFIG ) --exists libchromaprint && echo "--tags chromaprint") )
0 commit comments