#!/usr/bin/make -f

export V=1

# sets DEBIAN_VERSION variable
include /usr/share/dpkg/pkg-info.mk

# Get the Debian version revision:
DEB_REVISION := $(word 2, $(subst -, ,$(DEB_VERSION)))

# sets DEB_HOST_* variables
include /usr/share/dpkg/architecture.mk

# Ubuntu ld adds -Bsymbolic-functions by default, but that prevents FFmpeg from building.
export DEB_LDFLAGS_MAINT_STRIP=-Wl,-Bsymbolic-functions

# Package name for the extra flavor.
SHLIB_PKGS := $(shell sed -nr '/extra/! s/^Package:[[:space:]]*(lib.*[0-9]+)[[:space:]]*$$/\1/p' debian/control)
EXTRA_PKGS := $(shell sed -nr 's/^Package:[[:space:]]*(.*extra[0-9]+)[[:space:]]*$$/\1/p' debian/control)
FLAVORS = standard extra static

# Most possible features, compatible with effective licensing of GPLv2+
CONFIG := --prefix=/usr \
	--extra-version="$(DEB_REVISION)" \
	--toolchain=hardened \
	--libdir=/usr/lib/$(DEB_HOST_MULTIARCH) \
	--incdir=/usr/include/$(DEB_HOST_MULTIARCH) \
	--arch=$(DEB_HOST_ARCH_CPU) \
	--enable-gpl \
	--disable-stripping \
	--enable-avresample --disable-filter=resample \
	--enable-gnutls \
	--enable-ladspa \
	--enable-libaom \
	--enable-libass \
	--enable-libbluray \
	--enable-libbs2b \
	--enable-libcaca \
	--enable-libcdio \
	--enable-libcodec2 \
	--enable-libdav1d \
	--enable-libflite \
	--enable-libfontconfig \
	--enable-libfreetype \
	--enable-libfribidi \
	--enable-libgme \
	--enable-libgsm \
	--enable-libjack \
	--enable-libmp3lame \
	--enable-libmysofa \
	--enable-libopenjpeg \
	--enable-libopenmpt \
	--enable-libopus \
	--enable-libpulse \
	--enable-librabbitmq \
	--enable-librsvg \
	--enable-librubberband \
	--enable-libshine \
	--enable-libsnappy \
	--enable-libsoxr \
	--enable-libspeex \
	--enable-libsrt \
	--enable-libssh \
	--enable-libtheora \
	--enable-libtwolame \
	--enable-libvidstab \
	--enable-libvorbis \
	--enable-libvpx \
	--enable-libwavpack \
	--enable-libwebp \
	--enable-libx265 \
	--enable-libxml2 \
	--enable-libxvid \
	--enable-libzmq \
	--enable-libzvbi \
	--enable-lv2 \
	--enable-omx \
	--enable-openal \
	--enable-opencl \
	--enable-opengl \
	--enable-sdl2

# avoid pocketsphinx on mips (bug#812335), alpha, ia64 and big-endian (bug#968456)
ifeq (,$(filter mips% alpha ia64,$(DEB_HOST_ARCH))$(filter big,$(DEB_HOST_ARCH_ENDIAN)))
	CONFIG += --enable-pocketsphinx
endif

ifeq (amd64,$(DEB_HOST_ARCH))
CONFIG += --enable-libmfx
endif

# The standard configuration only uses the shared CONFIG.
CONFIG_standard = --enable-shared

# Additional features, compatible with effective licensing of GPLv3+
CONFIG_extra = --enable-shared \
	--enable-version3 \
	--disable-doc \
	--disable-programs \
	--enable-libaribb24 \
	--enable-liblensfun \
	--enable-libopencore_amrnb \
	--enable-libopencore_amrwb \
	--enable-libtesseract \
	--enable-libvo_amrwbenc

# The static libraries should not be built with PIC.
CONFIG_static = --disable-pic \
	--disable-doc \
	--disable-programs

# Disable optimizations if requested.
ifneq (,$(filter noopt,$(DEB_BUILD_OPTIONS)))
	CONFIG += --disable-optimizations
endif

# Respect CC/CXX from the environment, if they differ from the default.
# Don't set them if they equal the default, because that disables autodetection needed for cross-building.
ifneq (cc,$(CC))
	CONFIG += --cc=$(CC)
endif
ifneq (g++,$(CXX))
	CONFIG += --cxx=$(CXX)
endif

# Some libraries are built only on linux.
ifeq (linux,$(DEB_HOST_ARCH_OS))
	CONFIG += --enable-libdc1394 \
		--enable-libdrm \
		--enable-libiec61883
endif

# ffmpeg is involved in build-dependency cycles with x264 and chromaprint, so disable them in stage one.
# Also disable frei0r, which build-depends on opencv.
ifneq (,$(filter pkg.ffmpeg.stage1,$(DEB_BUILD_PROFILES)))
	CONFIG += --disable-frei0r \
		--disable-chromaprint \
		--disable-libx264
else
	CONFIG += --enable-chromaprint \
		--enable-frei0r \
		--enable-libx264
endif

# Disable altivec optimizations on powerpc, because they are not always available on this architecture.
ifeq (powerpc,$(DEB_HOST_ARCH))
	CONFIG += --disable-altivec
	# Build an altivec flavor of the libraries on powerpc.
	# This works around the problem that runtime cpu detection on powerpc currently does not work,
	# because, if altivec is enabled, all files are build with '-maltivec' so that the compiler inserts altivec instructions, wherever it likes.
	CONFIG_altivec = --enable-shared \
		--enable-altivec \
		--disable-doc \
		--disable-programs
	CONFIG_altivec-extra = $(CONFIG_altivec) $(CONFIG_extra)
	FLAVORS += altivec altivec-extra
endif

# Disable assembly optimizations on x32, because they don't work (yet).
ifneq (,$(filter x32,$(DEB_HOST_ARCH)))
	CONFIG += --disable-asm
endif

# Disable some optimizations on mips*, because they are not always available on these architectures
ifneq (,$(filter mips%r6 mips%r6el, $(DEB_HOST_ARCH)))
	MIPS_R2_R6_CONFIG = --disable-mips32r2 \
		--disable-mips64r2
else
	MIPS_R2_R6_CONFIG = --disable-mips32r6 \
		--disable-mips64r6
endif

ifneq (,$(filter mips%,$(DEB_HOST_ARCH)))
	CONFIG += --disable-mipsdsp \
		--disable-mipsdspr2 \
		--disable-loongson2 \
		--disable-loongson3 \
		--disable-mmi \
		--disable-mips32r5 \
		$(MIPS_R2_R6_CONFIG) \
		--disable-msa \
		--disable-msa2
endif

# Disable mipsfpu on mips and mipsel, because it is not compatible with the FPXX ABI
ifneq (,$(filter mips mipsel,$(DEB_HOST_ARCH)))
	CONFIG += --disable-mipsfpu
endif

# Disable some tests which fail when FLT_EVAL_METHOD != 0 (found on i386, m68k and s390x)
ifneq (,$(filter i386 m68k s390x,$(DEB_HOST_ARCH_CPU)))
	CONFIG += --ignore-tests=hapenc-hap-none,hapenc-hapa-none,hapenc-hapq-none
endif

# Set cross-build prefix for compiler, pkg-config...
ifneq ($(DEB_BUILD_GNU_TYPE),$(DEB_HOST_GNU_TYPE))
	CONFIG += --cross-prefix=$(DEB_HOST_GNU_TYPE)- \
		--target-os=$(DEB_HOST_ARCH_OS)
endif

# Use the default debhelper scripts, where possible.
%:
	dh $@ --with pkgkde_symbolshelper

# Add configuration options:
override_dh_auto_configure: $(patsubst %,configure_%,$(FLAVORS))
configure_%:
	$(info $()   debian/rules $@)
	mkdir -p debian/$*
	cd debian/$* && ../../configure $(strip $(CONFIG) $(CONFIG_$*)) || (cat ffbuild/config.log && exit 1)

# Remove the subdirectories generated for the flavors.
override_dh_auto_clean:
	rm -rf $(patsubst %,debian/%,$(FLAVORS))

# Create doxygen documentation:
override_dh_auto_build-indep:
	dh_auto_build -i --sourcedirectory=debian/standard -- apidoc documentation
	# Create the minified CSS files.
	#  Due to https://github.com/nodejs/node/issues/14752 where nodejs will
	#  leave set O_NONBLOCK on stderr, we pipe stderr through cat which will
	#  create a temporary pipe so this doesn't break the rest of the build.
	#  See: #895154
	(lessc debian/missing-sources/ffmpeg-web/src/less/style.less | cleancss > debian/standard/doc/style.min.css) 2>&1 | cat >&2

override_dh_auto_build-arch: $(patsubst %,build_%,$(FLAVORS))

# noop fallback for below more specific targets
prebuild_%:
	:

# Copy built object files to avoid building them again for the extra flavor.
$(patsubst %,prebuild_%,$(filter %extra,$(FLAVORS))): prebuild_%: build_standard
	$(info $()   debian/rules $@)
	$(eval subdir = debian/$(subst extra,standard,$(subst -extra,,$*)))
	cd $(subdir) && find libavcodec libavdevice libavfilter libavformat libavresample libavutil libpostproc libswscale libswresample \
		-type f -name '*.o' \
		-exec install -m 644 -D -T '{}' '../$*/{}' ';'
	rm debian/$*/libavcodec/allcodecs.o
	rm debian/$*/libavfilter/allfilters.o

# Build qt-faststart here, to make it possible to build with 'nocheck'.
prebuild_standard:
	$(info $()   debian/rules $@)
	$(MAKE) -C debian/standard tools/qt-faststart

build_%: prebuild_%
	$(info $()   debian/rules $@)
	dh_auto_build -a --sourcedirectory=debian/$* || (cat debian/$*/config.log && exit 1)

# Set the library path for the dynamic linker, because the tests otherwise don't find the libraries.
override_dh_auto_test-arch:
	export LD_LIBRARY_PATH="libavcodec:libavdevice:libavfilter:libavformat:libavresample:libavutil:libpostproc:libswresample:libswscale"; \
		dh_auto_test -a --sourcedirectory=debian/standard -- -k

# No tests for indep build.
override_dh_auto_test-indep:

override_dh_auto_install-arch:
	dh_auto_install -a --sourcedirectory=debian/standard
ifeq (powerpc,$(DEB_HOST_ARCH))
	install -d debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/altivec
	install -m 644 debian/altivec/*/*.so.* debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)/altivec
endif
	dh_auto_install -a --sourcedirectory=debian/extra --destdir=debian/tmp/extra
ifeq (powerpc,$(DEB_HOST_ARCH))
	install -d debian/tmp/extra/usr/lib/$(DEB_HOST_MULTIARCH)/altivec
	install -m 644 debian/altivec-extra/*/*.so.* debian/tmp/extra/usr/lib/$(DEB_HOST_MULTIARCH)/altivec
endif
	# Use the static libraries from the --disable-pic build
	install -m 644 debian/static/*/lib*.a debian/tmp/usr/lib/$(DEB_HOST_MULTIARCH)

override_dh_auto_install-indep:
	$(MAKE) -C debian/standard DESTDIR=$(CURDIR)/debian/tmp install-doc install-examples
	# Create index.html page for the FFmpeg manual
	cd debian/tmp/usr/share/doc/ffmpeg && tree -H '.' -L 1 -P '*.html' --noreport --charset utf-8 -T 'FFmpeg Manual Index' -o index.html

override_dh_install:
	dh_install $(addprefix -p,$(EXTRA_PKGS)) --sourcedir=debian/tmp/extra
	dh_install --remaining-packages

override_dh_shlibdeps:
	$(RM) debian/shlibs.local
	set -e && for pkg in $(SHLIB_PKGS); do \
		lib=`echo $$pkg | sed 's/\([a-z]*\)\([0-9]*\)/\1/'`; \
		abi=`echo $$pkg | sed 's/\([a-z]*\)\([0-9]*\)/\2/'`; \
		ver=${DEB_VERSION}; \
		echo "$$lib $$abi $$pkg (= $$ver)" >> debian/shlibs.local; \
	done
	set -e && for pkg in $(EXTRA_PKGS); do \
		mainpkg=`echo $$pkg | sed 's/-extra//'`; \
		cp -f debian/$$mainpkg.symbols debian/$$pkg.symbols; \
		dh_shlibdeps -p$$pkg; \
		rm -f debian/$$pkg.symbols; \
	done
	dh_shlibdeps --remaining-packages

# avoid error: Unknown DWARF DW_OP_0
override_dh_dwz:
	dh_dwz -Xlibavcodec -Xlibavfilter -Xlibavresample -Xlibavutil -Xlibswresample -Xlibswscale