summaryrefslogtreecommitdiff
path: root/debian/rules
blob: 31af258d1dd0d930b9eeed2bd31619b838e4130e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
#!/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.
EXTRA_PKGS := $(shell sed -nr 's/^Package:[[:space:]]*(.*extra[0-9]+)[[:space:]]*$$/\1/p' debian/control)
FLAVORS = standard extra static

# Enable as many features as possible, as long as the result is still GPLv2+ (a GPLv3+ variant is built as libavcodec-extra/libavfilter-extra flavor).
# The following flags (and build-dependencies) are not added, because they would require a libavformat-extra flavor:
#   --enable-libsmbclient           (libsmbclient-dev [!hurd-i386 !m68k !sparc64])
# The following flags are not added, because the necessary libraries are not in Debian:
#   --enable-decklink
#   --enable-libcelt                (see #676592: removed from Debian as abandoned upstream, replaced by opus)
#   --enable-libdcadec
#   --enable-libilbc                (see #675959 for the RFP bug)
#   --enable-libkvazaar
#   --enable-libmfx
#   --enable-libmodplug             (see #849840: replaced with libopenmpt)
#   --enable-libnut
#   --enable-libopenh264
#   --enable-libschroedinger        (see #845037: removal due to security issues)
#   --enable-libutvideo
#   --enable-libvidstab             (see #709193 for the RFP bug)
#   --enable-libxavs
#   --enable-libzimg
# The following flags are not added for various reasons:
#   * --enable-librtmp:             ffmpeg has better built-in RTMP support with listen mode.
#   * --enable-libv4l2 [!hurd-any]: This is only needed for very old devices and may cause problems for others.
#                                   Should anyone need it, using LD_PRELOAD pointing on libv4l2 has the same effect.
#   * --enable-opencl [!hurd-any]:  This is considered an experimental API.
CONFIG := --prefix=/usr \
	--extra-version="$(DEB_REVISION)" \
	--toolchain=hardened \
	--libdir=/usr/lib/$(DEB_HOST_MULTIARCH) \
	--incdir=/usr/include/$(DEB_HOST_MULTIARCH) \
	--enable-gpl \
	--disable-stripping \
	--enable-avresample \
	--enable-avisynth \
	--enable-gnutls \
	--enable-ladspa \
	--enable-libass \
	--enable-libbluray \
	--enable-libbs2b \
	--enable-libcaca \
	--enable-libcdio \
	--enable-libebur128 \
	--enable-libflite \
	--enable-libfontconfig \
	--enable-libfreetype \
	--enable-libfribidi \
	--enable-libgme \
	--enable-libgsm \
	--enable-libmp3lame \
	--enable-libopenjpeg \
	--enable-libopenmpt \
	--enable-libopus \
	--enable-libpulse \
	--enable-librubberband \
	--enable-libshine \
	--enable-libsnappy \
	--enable-libsoxr \
	--enable-libspeex \
	--enable-libssh \
	--enable-libtheora \
	--enable-libtwolame \
	--enable-libvorbis \
	--enable-libvpx \
	--enable-libwavpack \
	--enable-libwebp \
	--enable-libx265 \
	--enable-libxvid \
	--enable-libzmq \
	--enable-libzvbi \
	--enable-omx \
	--enable-openal \
	--enable-opengl \
	--enable-sdl2

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

# With these enabled, resulting binaries are effectively licensed as GPLv3+.
CONFIG_extra = --enable-shared \
	--enable-version3 \
	--disable-doc \
	--disable-programs \
	--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 $(DEB_BUILD_OPTIONS),noopt))
	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 ($(CXX),g++)
	CONFIG += --cxx=$(CXX)
endif

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

# Some build-dependencies are not installable on some architectures.
ifeq (,$(filter $(DEB_HOST_ARCH),powerpcspe))
	CONFIG_extra += --enable-netcdf
endif

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

# Disable altivec optimizations on powerpc, because they are not always available on this architecture.
ifeq ($(DEB_HOST_ARCH),powerpc)
	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 $(DEB_HOST_ARCH),x32))
	CONFIG += --disable-asm
endif

# Disable optimizations on mips(el) and some on mips64(el), because they are not always available on these architectures.
ifneq (,$(filter $(DEB_HOST_ARCH),mips mipsel mips64 mips64el))
	CONFIG += --disable-mipsdsp \
		--disable-mipsdspr2 \
		--disable-loongson3 \
		--disable-mips32r6 \
		--disable-mips64r6
endif
ifneq (,$(filter $(DEB_HOST_ARCH),mips mipsel))
	CONFIG += --disable-mipsfpu
endif

# Set cross-build prefix for compiler, pkg-config...
# Cross-building also requires to manually set architecture/OS.
ifneq ($(DEB_BUILD_GNU_TYPE),$(DEB_HOST_GNU_TYPE))
	CONFIG += --cross-prefix=$(DEB_HOST_GNU_TYPE)- \
		--arch=$(DEB_HOST_ARCH) \
		--target-os=$(DEB_HOST_ARCH_OS)
endif

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

# Add configuration options:
override_dh_auto_configure:
	$(foreach flavor,$(FLAVORS),mkdir -p debian/$(flavor);)
	$(foreach flavor,$(FLAVORS),set -e; echo " *** $(flavor) ***"; cd debian/$(flavor); ../../configure $(CONFIG) $(CONFIG_$(flavor)) || (cat config.log && exit 1); cd ../.. ;)
	touch override_dh_auto_configure

# Remove the subdirectories generated for the flavors.
override_dh_auto_clean:
	$(foreach flavor,$(FLAVORS),[ ! -d debian/$(flavor) ] || rm -r debian/$(flavor);)

# Create doxygen documentation:
override_dh_auto_build-indep:
	dh_auto_build -i --sourcedirectory=debian/standard -- apidoc
	# Create the minified CSS files.
	lessc debian/missing-sources/ffmpeg-web/src/less/style.less | cleancss > debian/standard/doc/style.min.css
	rm override_dh_auto_configure

override_dh_auto_build-arch:
	# Copy built object files to avoid building them again for the extra flavor.
	# Build qt-faststart here, to make it possible to build with 'nocheck'.
	set -e && for flavor in $(FLAVORS); do \
		echo " *** $$flavor ***"; \
		if echo "$$flavor" | grep -q "extra"; then \
			subdir=`[ "$$flavor" = "extra" ] && echo "debian/standard/" || echo "debian/altivec/"`; \
			for dir in `cd ./$$subdir; find libavcodec libavdevice libavfilter libavformat libavresample libavutil libpostproc libswscale libswresample -type d`; do \
				mkdir -p debian/"$$flavor"/"$$dir"; \
				echo "$$subdir$$dir"/*.o | grep -q '*' || cp "$$subdir$$dir"/*.o debian/"$$flavor"/"$$dir"; \
			done; \
			rm debian/"$$flavor"/libavcodec/allcodecs.o; \
			rm debian/"$$flavor"/libavfilter/allfilters.o; \
		fi; \
		if [ "$$flavor" = "standard" ]; then \
			$(MAKE) -C debian/standard tools/qt-faststart; \
		fi; \
		dh_auto_build -a --sourcedirectory=debian/"$$flavor" || (cat debian/"$$flavor"/config.log && exit 1); \
	done

# 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 ($(DEB_HOST_ARCH),powerpc)
	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 ($(DEB_HOST_ARCH),powerpc)
	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:
	dh_auto_install -i --sourcedirectory=debian/standard

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

override_dh_makeshlibs:
	set -e && for pkg in $(shell dh_listpackages -a) ; do \
		case $$pkg in \
			ffmpeg|*-dev) \
				continue \
				;; \
			*avcodec*) \
				soversion=$$(echo $$pkg | sed -nr 's/^[^0-9]*([0-9]+)$$/\1/p'); \
				dh_makeshlibs -p $$pkg -V"libavcodec$$soversion (>= ${DEB_VERSION_EPOCH_UPSTREAM}) | libavcodec-extra$$soversion (>= ${DEB_VERSION_EPOCH_UPSTREAM})" \
				;; \
			*avfilter*) \
				soversion=$$(echo $$pkg | sed -nr 's/^[^0-9]*([0-9]+)$$/\1/p'); \
				dh_makeshlibs -p $$pkg -V"libavfilter$$soversion (>= ${DEB_VERSION_EPOCH_UPSTREAM}) | libavfilter-extra$$soversion (>= ${DEB_VERSION_EPOCH_UPSTREAM})" \
				;; \
			*) \
				dh_makeshlibs -p $$pkg -V \
				;; \
		esac \
	done

# Don't compress the example source code files.
override_dh_compress:
	dh_compress -Xexamples