1#
2#  Tvheadend streaming server.
3#  Copyright (C) 2007-2009 Andreas Öman
4#  Copyright (C) 2012-2015 Adam Sutton
5#  Copyright (C) 2012-2017 Jaroslav Kysela
6#
7#  This program is free software: you can redistribute it and/or modify
8#  it under the terms of the GNU General Public License as published by
9#  the Free Software Foundation, either version 3 of the License, or
10#  (at your option) any later version.
11#
12#  This program is distributed in the hope that it will be useful,
13#  but WITHOUT ANY WARRANTY; without even the implied warranty of
14#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15#  GNU General Public License for more details.
16#
17#  You should have received a copy of the GNU General Public License
18#  along with this program.  If not, see <http://www.gnu.org/licenses/>.
19#
20
21#
22# Configuration
23#
24
25include $(dir $(lastword $(MAKEFILE_LIST))).config.mk
26include $(dir $(lastword $(MAKEFILE_LIST)))Makefile.common
27PROG      := $(BUILDDIR)/tvheadend
28LANGUAGES ?= $(LANGUAGES_ALL)
29
30#
31# Common compiler flags
32#
33
34CFLAGS  += -g
35ifeq ($(CONFIG_CCDEBUG),yes)
36CFLAGS  += -O0
37else
38CFLAGS  += -O2
39endif
40ifeq ($(CONFIG_PIE),yes)
41CFLAGS  += -fPIE
42else
43CFLAGS  += -fPIC
44endif
45ifeq ($(CONFIG_W_UNUSED_RESULT),yes)
46CFLAGS  += -Wunused-result
47endif
48ifneq ($(CFLAGS_NO_WERROR),yes)
49CFLAGS  +=
50endif
51CFLAGS  += -Wall -Wwrite-strings -Wno-deprecated-declarations
52CFLAGS  += -Wmissing-prototypes
53CFLAGS  += -fms-extensions -funsigned-char -fno-strict-aliasing
54CFLAGS  += -D_FILE_OFFSET_BITS=64
55CFLAGS  := -I${BUILDDIR} -I${ROOTDIR}/src -I${ROOTDIR} ${CFLAGS}
56ifeq ($(CONFIG_ANDROID),yes)
57LDFLAGS +=  -lm
58else
59LDFLAGS +=  -lpthread -lm
60endif
61LDFLAGS += -pie -Wl,-z,now
62ifeq ($(CONFIG_LIBICONV),yes)
63LDFLAGS += -liconv
64endif
65ifeq ($(PLATFORM), darwin)
66LDFLAGS += -framework CoreServices
67else
68ifeq ($(CONFIG_ANDROID),no)
69LDFLAGS += -lrt
70endif
71endif
72
73ifeq ($(COMPILER), clang)
74CFLAGS  += -Wno-microsoft -Qunused-arguments -Wno-unused-function
75CFLAGS  += -Wno-unused-value -Wno-tautological-constant-out-of-range-compare
76CFLAGS  += -Wno-parentheses-equality -Wno-incompatible-pointer-types
77endif
78
79
80# LIBAV ########################################################################
81
82ifeq ($(CONFIG_LIBAV),yes)
83
84FFMPEG_LIBS := \
85    libavfilter \
86    libswresample \
87    libavresample \
88    libswscale \
89    libavformat \
90    libavcodec \
91    libavutil
92
93# FFMPEG_STATIC
94ifeq ($(CONFIG_FFMPEG_STATIC),yes)
95
96ifeq (,$(wildcard ${BUILDDIR}/libffmpeg_stamp))
97# build static FFMPEG as first for pkgconfig
98ffmpeg_all: ${BUILDDIR}/libffmpeg_stamp
99	$(MAKE) all
100endif
101
102FFMPEG_PREFIX := $(BUILDDIR)/ffmpeg/build/ffmpeg
103FFMPEG_LIBDIR := $(FFMPEG_PREFIX)/lib
104FFMPEG_INCDIR := $(FFMPEG_PREFIX)/include
105FFMPEG_CONFIG := \
106    PKG_CONFIG_LIBDIR=$(FFMPEG_LIBDIR)/pkgconfig $(PKG_CONFIG) \
107    --define-variable=prefix=$(FFMPEG_PREFIX) \
108    --define-variable=includedir=$(FFMPEG_INCDIR) \
109    --define-variable=libdir=$(FFMPEG_LIBDIR) --static
110
111ifeq ($(CONFIG_LIBX264_STATIC),yes)
112FFMPEG_DEPS += libx264
113endif
114
115ifeq ($(CONFIG_LIBX265_STATIC),yes)
116FFMPEG_DEPS += libx265
117endif
118
119ifeq ($(CONFIG_LIBVPX_STATIC),yes)
120FFMPEG_DEPS += libvpx
121endif
122
123ifeq ($(CONFIG_LIBOGG_STATIC),yes)
124FFMPEG_DEPS += libogg
125endif
126
127ifeq ($(CONFIG_LIBTHEORA_STATIC),yes)
128FFMPEG_DEPS += libtheoraenc libtheoradec libtheora
129endif
130
131ifeq ($(CONFIG_LIBVORBIS_STATIC),yes)
132FFMPEG_DEPS += libvorbisfile libvorbisenc libvorbis
133endif
134
135ifeq ($(CONFIG_LIBFDKAAC_STATIC),yes)
136FFMPEG_DEPS += libfdk-aac
137endif
138
139ifeq ($(CONFIG_LIBMFX_STATIC),yes)
140FFMPEG_DEPS += libmfx
141endif
142
143LDFLAGS += $(foreach lib,$(FFMPEG_LIBS),$(FFMPEG_LIBDIR)/$(lib).a)
144LDFLAGS += $(foreach lib,$(FFMPEG_DEPS),$(FFMPEG_LIBDIR)/$(lib).a)
145
146else # !FFMPEG_STATIC
147
148FFMPEG_CONFIG := $(PKG_CONFIG)
149
150endif # FFMPEG_STATIC
151
152CFLAGS  += `$(FFMPEG_CONFIG) --cflags $(FFMPEG_LIBS)`
153LDFLAGS += `$(FFMPEG_CONFIG) --libs $(FFMPEG_LIBS)`
154
155endif
156
157# LIBAV ########################################################################
158
159
160ifeq ($(CONFIG_HDHOMERUN_STATIC),yes)
161CFLAGS  += -I$(BUILDDIR)/hdhomerun
162LDFLAGS += $(BUILDDIR)/hdhomerun/libhdhomerun/libhdhomerun.a
163endif
164
165vpath %.c $(ROOTDIR)
166vpath %.h $(ROOTDIR)
167
168#
169# Other config
170#
171
172BUNDLE_FLAGS-${CONFIG_ZLIB} += -z
173BUNDLE_FLAGS-${CONFIG_PNGQUANT} += -q
174BUNDLE_FLAGS = ${BUNDLE_FLAGS-yes}
175
176#
177# Binaries/Scripts
178#
179
180MKBUNDLE = $(PYTHON) $(ROOTDIR)/support/mkbundle
181XGETTEXT2 ?= $(XGETTEXT) --language=C --from-code=utf-8 --add-comments=/ -k_ -kN_ -s
182MSGMERGE ?= msgmerge
183
184#
185# Debug/Output
186#
187
188BRIEF  = CC MKBUNDLE
189ifndef V
190ECHO   = printf "%-16s%s\n" $(1) $(2)
191MSG    = $(subst $(BUILDDIR)/,,$@)
192$(foreach VAR,$(BRIEF), \
193	$(eval p$(VAR) = @$$(call ECHO,$(VAR),$$(MSG)); $($(VAR))))
194else
195$(foreach VAR,$(BRIEF), \
196	$(eval p$(VAR) = $($(VAR))))
197endif
198
199#
200# Core
201#
202SRCS-1 = \
203	src/version.c \
204	src/uuid.c \
205	src/main.c \
206	src/tvhlog.c \
207	src/idnode.c \
208	src/prop.c \
209	src/utils.c \
210	src/wrappers.c \
211	src/tvhvfs.c \
212	src/access.c \
213	src/tcp.c \
214	src/udp.c \
215	src/url.c \
216	src/http.c \
217	src/notify.c \
218	src/file.c \
219	src/epg.c \
220	src/epgdb.c\
221	src/epggrab.c\
222	src/spawn.c \
223	src/packet.c \
224	src/streaming.c \
225	src/channels.c \
226	src/subscriptions.c \
227	src/service.c \
228	src/htsp_server.c \
229	src/htsmsg.c \
230	src/htsmsg_binary.c \
231	src/htsmsg_json.c \
232	src/htsmsg_xml.c \
233	src/misc/dbl.c \
234	src/misc/json.c \
235	src/misc/m3u.c \
236	src/settings.c \
237	src/htsbuf.c \
238	src/trap.c \
239	src/htsstr.c \
240	src/tvhpoll.c \
241	src/huffman.c \
242	src/filebundle.c \
243	src/config.c \
244	src/lang_codes.c \
245	src/lang_str.c \
246	src/imagecache.c \
247	src/tvhtime.c \
248	src/service_mapper.c \
249	src/input.c \
250	src/httpc.c \
251	src/rtsp.c \
252	src/download.c \
253	src/fsmonitor.c \
254	src/cron.c \
255	src/esfilter.c \
256	src/intlconv.c \
257	src/profile.c \
258	src/bouquet.c \
259	src/lock.c \
260	src/wizard.c \
261	src/memoryinfo.c
262SRCS = $(SRCS-1)
263I18N-C = $(SRCS-1)
264
265SRCS-ZLIB = \
266	src/zlib.c
267SRCS-${CONFIG_ZLIB} += $(SRCS-ZLIB)
268
269SRCS-UPNP = \
270	src/upnp.c
271SRCS-${CONFIG_UPNP} += $(SRCS-UPNP)
272I18N-C += $(SRCS-UPNP)
273
274# SATIP Server
275SRCS-SATIP-SERVER = \
276	src/satip/server.c \
277	src/satip/rtsp.c \
278	src/satip/rtp.c
279SRCS-${CONFIG_SATIP_SERVER} += $(SRCS-SATIP-SERVER)
280I18N-C += $(SRCS-SATIP-SERVER)
281
282SRCS-2 = \
283	src/api.c \
284	src/api/api_config.c \
285	src/api/api_status.c \
286	src/api/api_idnode.c \
287	src/api/api_input.c \
288	src/api/api_channel.c \
289	src/api/api_service.c \
290	src/api/api_mpegts.c \
291	src/api/api_epg.c \
292	src/api/api_epggrab.c \
293	src/api/api_imagecache.c \
294	src/api/api_esfilter.c \
295	src/api/api_intlconv.c \
296	src/api/api_access.c \
297	src/api/api_dvr.c \
298	src/api/api_caclient.c \
299	src/api/api_profile.c \
300	src/api/api_bouquet.c \
301	src/api/api_language.c \
302	src/api/api_satip.c \
303	src/api/api_timeshift.c \
304	src/api/api_wizard.c
305
306SRCS-2 += \
307	src/parsers/parsers.c \
308	src/parsers/bitstream.c \
309	src/parsers/parser_h264.c \
310	src/parsers/parser_hevc.c \
311	src/parsers/parser_latm.c \
312	src/parsers/parser_avc.c \
313	src/parsers/parser_teletext.c
314
315SRCS-2 += \
316	src/epggrab/module.c \
317	src/epggrab/channel.c \
318	src/epggrab/module/pyepg.c \
319	src/epggrab/module/xmltv.c
320
321SRCS-2 += \
322	src/plumbing/tsfix.c \
323	src/plumbing/globalheaders.c
324
325SRCS-2 += \
326	src/dvr/dvr_db.c \
327	src/dvr/dvr_rec.c \
328	src/dvr/dvr_autorec.c \
329	src/dvr/dvr_timerec.c \
330	src/dvr/dvr_vfsmgr.c \
331	src/dvr/dvr_config.c \
332	src/dvr/dvr_cutpoints.c
333
334SRCS-2 += \
335	src/webui/webui.c \
336	src/webui/comet.c \
337	src/webui/extjs.c \
338	src/webui/simpleui.c \
339	src/webui/statedump.c \
340	src/webui/html.c \
341	src/webui/webui_api.c \
342	src/webui/xmltv.c \
343	src/webui/doc_md.c
344
345SRCS-2 += \
346	src/muxer.c \
347	src/muxer/muxer_pass.c \
348	src/muxer/ebml.c \
349	src/muxer/muxer_mkv.c \
350	src/muxer/muxer_audioes.c
351
352SRCS += $(SRCS-2)
353I18N-C += $(SRCS-2)
354
355#
356# Optional code
357#
358
359# MPEGTS core, order by usage (psi lib, tsdemux)
360SRCS-MPEGTS = \
361	src/descrambler/descrambler.c \
362	src/descrambler/caclient.c \
363	src/descrambler/caid.c \
364	src/input/mpegts.c \
365	src/input/mpegts/mpegts_pid.c \
366	src/input/mpegts/mpegts_input.c \
367	src/input/mpegts/tsdemux.c \
368	src/input/mpegts/dvb_psi_lib.c \
369	src/input/mpegts/mpegts_network.c \
370	src/input/mpegts/mpegts_mux.c \
371	src/input/mpegts/mpegts_service.c \
372	src/input/mpegts/mpegts_table.c \
373	src/input/mpegts/dvb_support.c \
374	src/input/mpegts/dvb_charset.c \
375	src/input/mpegts/dvb_psi.c \
376	src/input/mpegts/fastscan.c \
377	src/input/mpegts/mpegts_mux_sched.c \
378        src/input/mpegts/mpegts_network_scan.c
379SRCS-$(CONFIG_MPEGTS) += $(SRCS-MPEGTS)
380I18N-C += $(SRCS-MPEGTS)
381
382# MPEGTS DVB
383SRCS-MPEGTS-DVB = \
384	src/input/mpegts/mpegts_network_dvb.c \
385	src/input/mpegts/mpegts_mux_dvb.c \
386	src/input/mpegts/scanfile.c
387SRCS-${CONFIG_MPEGTS_DVB} += $(SRCS-MPEGTS-DVB)
388I18N-C += $(SRCS-MPEGTS-DVB)
389
390# MPEGTS EPG
391SRCS-MPEGTS-EPG = \
392	src/epggrab/otamux.c\
393	src/epggrab/module/eit.c \
394	src/epggrab/module/psip.c \
395	src/epggrab/support/freesat_huffman.c \
396	src/epggrab/module/opentv.c
397SRCS-$(CONFIG_MPEGTS) += $(SRCS-MPEGTS-EPG)
398I18N-C += $(SRCS-MPEGTS-EPG)
399
400# LINUX DVB
401SRCS-LINUXDVB = \
402	src/input/mpegts/linuxdvb/linuxdvb.c \
403	src/input/mpegts/linuxdvb/linuxdvb_adapter.c \
404	src/input/mpegts/linuxdvb/linuxdvb_frontend.c \
405	src/input/mpegts/linuxdvb/linuxdvb_satconf.c \
406	src/input/mpegts/linuxdvb/linuxdvb_lnb.c \
407	src/input/mpegts/linuxdvb/linuxdvb_switch.c \
408	src/input/mpegts/linuxdvb/linuxdvb_rotor.c \
409	src/input/mpegts/linuxdvb/linuxdvb_en50494.c
410SRCS-${CONFIG_LINUXDVB} += $(SRCS-LINUXDVB)
411I18N-C += $(SRCS-LINUXDVB)
412
413# SATIP Client
414SRCS-SATIP-CLIENT = \
415	src/input/mpegts/satip/satip.c \
416	src/input/mpegts/satip/satip_frontend.c \
417	src/input/mpegts/satip/satip_satconf.c \
418	src/input/mpegts/satip/satip_rtsp.c
419SRCS-${CONFIG_SATIP_CLIENT} += $(SRCS-SATIP-CLIENT)
420I18N-C += $(SRCS-SATIP-CLIENT)
421
422# HDHOMERUN
423SRCS-HDHOMERUN = \
424	src/input/mpegts/tvhdhomerun/tvhdhomerun.c \
425	src/input/mpegts/tvhdhomerun/tvhdhomerun_frontend.c
426SRCS-${CONFIG_HDHOMERUN_CLIENT} += $(SRCS-HDHOMERUN)
427I18N-C += $(SRCS-HDHOMERUN)
428
429# IPTV
430SRCS-IPTV = \
431	src/input/mpegts/iptv/iptv.c \
432	src/input/mpegts/iptv/iptv_mux.c \
433	src/input/mpegts/iptv/iptv_service.c \
434	src/input/mpegts/iptv/iptv_http.c \
435	src/input/mpegts/iptv/iptv_udp.c \
436	src/input/mpegts/iptv/iptv_rtsp.c \
437	src/input/mpegts/iptv/iptv_rtcp.c \
438	src/input/mpegts/iptv/iptv_pipe.c \
439	src/input/mpegts/iptv/iptv_file.c \
440	src/input/mpegts/iptv/iptv_auto.c
441SRCS-${CONFIG_IPTV} += $(SRCS-IPTV)
442I18N-C += $(SRCS-IPTV)
443
444# TSfile
445SRCS-TSFILE = \
446	src/input/mpegts/tsfile/tsfile.c \
447	src/input/mpegts/tsfile/tsfile_input.c \
448	src/input/mpegts/tsfile/tsfile_mux.c
449SRCS-$(CONFIG_TSFILE) += $(SRCS-TSFILE)
450I18N-C += $(SRCS-TSFILE)
451
452# Timeshift
453SRCS-TIMESHIFT = \
454	src/timeshift.c \
455	src/timeshift/timeshift_filemgr.c \
456	src/timeshift/timeshift_writer.c \
457	src/timeshift/timeshift_reader.c
458SRCS-${CONFIG_TIMESHIFT} += $(SRCS-TIMESHIFT)
459I18N-C += $(SRCS-TIMESHIFT)
460
461# Inotify
462SRCS-INOTIFY = \
463	src/dvr/dvr_inotify.c
464SRCS-${CONFIG_INOTIFY} += $(SRCS-INOTIFY)
465I18N-C += $(SRCS-INOTIFY)
466ifeq ($(CONFIG_INOTIFY), yes)
467ifeq ($(PLATFORM), freebsd)
468LDFLAGS += -linotify
469endif
470endif
471
472# Avahi
473SRCS-AVAHI = \
474	src/avahi.c
475SRCS-$(CONFIG_AVAHI) += $(SRCS-AVAHI)
476I18N-C += $(SRCS-AVAHI)
477
478# Bonjour
479SRCS-BONJOUR = \
480	src/bonjour.c
481SRCS-$(CONFIG_BONJOUR) += $(SRCS-BONJOUR)
482I18N-C += $(SRCS-BONJOUR)
483
484# libav
485DEPS-LIBAV = \
486	src/main.c \
487	src/tvhlog.c
488SRCS-LIBAV = \
489	src/libav.c \
490	src/muxer/muxer_libav.c \
491	src/plumbing/transcoding.c
492SRCS-$(CONFIG_LIBAV) += $(SRCS-LIBAV)
493I18N-C += $(SRCS-LIBAV)
494
495# Tvhcsa
496SRCS-TVHCSA = \
497	src/descrambler/tvhcsa.c
498SRCS-${CONFIG_TVHCSA} += $(SRCS-TVHCSA)
499I18N-C += $(SRCS-TVHCSA)
500
501# CWC
502SRCS-CWC = \
503	src/descrambler/cwc.c \
504	src/descrambler/emm_reass.c
505SRCS-${CONFIG_CWC} += $(SRCS-CWC)
506I18N-C += $(SRCS-CWC)
507
508# CAPMT
509SRCS-CAPMT = \
510	src/descrambler/capmt.c
511SRCS-${CONFIG_CAPMT} += $(SRCS-CAPMT)
512I18N-C += $(SRCS-CAPMT)
513
514# CONSTCW
515SRCS-CONSTCW = \
516	src/descrambler/constcw.c
517SRCS-${CONFIG_CONSTCW} += $(SRCS-CONSTCW)
518I18N-C += $(SRCS-CONSTCW)
519
520# DVB CAM
521SRCS-DVBCAM = \
522	src/input/mpegts/linuxdvb/linuxdvb_ca.c \
523	src/descrambler/dvbcam.c
524SRCS-${CONFIG_LINUXDVB_CA} += $(SRCS-DVBCAM)
525I18N-C += $(SRCS-DVBCAM)
526
527# TSDEBUGCW
528SRCS-TSDEBUG = \
529	src/descrambler/tsdebugcw.c
530SRCS-${CONFIG_TSDEBUG} += $(SRCS-TSDEBUG)
531I18N-C += $(SRCS-TSDEBUG)
532
533# FFdecsa
534ifneq ($(CONFIG_DVBCSA),yes)
535FFDECSA-$(CONFIG_CAPMT)   = yes
536FFDECSA-$(CONFIG_CWC)     = yes
537FFDECSA-$(CONFIG_CONSTCW) = yes
538endif
539
540ifeq ($(FFDECSA-yes),yes)
541SRCS-yes += src/descrambler/ffdecsa/ffdecsa_interface.c \
542	src/descrambler/ffdecsa/ffdecsa_int.c
543SRCS-${CONFIG_MMX}  += src/descrambler/ffdecsa/ffdecsa_mmx.c
544SRCS-${CONFIG_SSE2} += src/descrambler/ffdecsa/ffdecsa_sse2.c
545${BUILDDIR}/src/descrambler/ffdecsa/ffdecsa_mmx.o  : CFLAGS += -mmmx
546${BUILDDIR}/src/descrambler/ffdecsa/ffdecsa_sse2.o : CFLAGS += -msse2
547endif
548
549# libaesdec
550SRCS-${CONFIG_SSL} += src/descrambler/libaesdec/libaesdec.c
551
552# DBUS
553SRCS-${CONFIG_DBUS_1}  += src/dbus.c
554
555# DVB scan
556DVBSCAN-$(CONFIG_DVBSCAN) += check_dvb_scan
557ALL-$(CONFIG_DVBSCAN)     += check_dvb_scan
558
559# File bundles
560SRCS-${CONFIG_BUNDLE}     += bundle.c
561BUNDLES-yes               += src/webui/static
562BUNDLES-yes               += data/conf
563BUNDLES-${CONFIG_DVBSCAN} += data/dvb-scan
564BUNDLES                    = $(BUNDLES-yes)
565
566#
567# Documentation
568#
569
570MD-TO-C    = PYTHONIOENCODING=utf-8 $(PYTHON) support/doc/md_to_c.py
571
572SRCS-yes   += src/docs.c
573I18N-C-DOCS = src/docs_inc.c
574I18N-DOCS   = $(wildcard docs/markdown/*.md)
575I18N-DOCS  += $(wildcard docs/markdown/inc/*.md)
576I18N-DOCS  += $(wildcard docs/class/*.md)
577I18N-DOCS  += $(wildcard docs/property/*.md)
578I18N-DOCS  += $(wildcard docs/wizard/*.md)
579MD-ROOT     = $(patsubst docs/markdown/%.md,%,$(sort $(wildcard docs/markdown/*.md)))
580MD-ROOT    += $(patsubst docs/markdown/inc/%.md,inc/%,$(sort $(wildcard docs/markdown/inc/*.md)))
581MD-CLASS    = $(patsubst docs/class/%.md,%,$(sort $(wildcard docs/class/*.md)))
582MD-PROP     = $(patsubst docs/property/%.md,%,$(sort $(wildcard docs/property/*.md)))
583MD-WIZARD   = $(patsubst docs/wizard/%.md,%,$(sort $(wildcard docs/wizard/*.md)))
584
585#
586# Internationalization
587#
588PO-FILES  = $(wildcard $(foreach f,$(LANGUAGES),intl/tvheadend.$(f).po))
589PO-FILES += $(wildcard $(foreach f,$(LANGUAGES-DOC),intl/docs/tvheadend.doc.$(f).po))
590SRCS += src/tvh_locale.c
591
592POC_PY=PYTHONIOENCODING=utf-8 $(PYTHON) support/poc.py
593
594#
595# Add-on modules
596#
597
598SRCS_EXTRA = src/extra/capmt_ca.c
599
600#
601# Variable transformations
602#
603
604SRCS      += $(SRCS-yes)
605OBJS       = $(SRCS:%.c=$(BUILDDIR)/%.o)
606OBJS_EXTRA = $(SRCS_EXTRA:%.c=$(BUILDDIR)/%.so)
607DEPS       = ${OBJS:%.o=%.d}
608
609ifeq ($(CONFIG_FFMPEG_STATIC),yes)
610ALL-yes   += ${BUILDDIR}/libffmpeg_stamp
611endif
612ifeq ($(CONFIG_HDHOMERUN_STATIC),yes)
613ALL-yes   += ${BUILDDIR}/libhdhomerun_stamp
614endif
615
616SRCS += build.c timestamp.c
617
618#
619# Build Rules
620#
621
622# Default
623.PHONY: all
624all: $(ALL-yes) ${PROG}
625
626# Check configure output is valid
627.config.mk: configure
628	@echo "./configure output is old, please re-run"
629	@false
630
631# Recreate configuration
632.PHONY: reconfigure
633reconfigure:
634	$(ROOTDIR)/configure $(CONFIGURE_ARGS)
635
636# Binary
637${PROG}: .config.mk make_webui $(OBJS)
638	$(pCC) -o $@ $(OBJS) $(CFLAGS) $(LDFLAGS)
639
640# Object
641${BUILDDIR}/%.o: %.c
642	@mkdir -p $(dir $@)
643	$(pCC) -MD -MP $(CFLAGS) -c -o $@ $<
644
645# Add-on
646${BUILDDIR}/%.so: ${SRCS_EXTRA}
647	@mkdir -p $(dir $@)
648	${pCC} -O -fbuiltin -fomit-frame-pointer -fPIC -shared -o $@ $<
649
650# Clean
651.PHONY: clean
652clean:
653	rm -rf ${BUILDDIR}/src ${BUILDDIR}/bundle* ${BUILDDIR}/build.o ${BUILDDIR}/timestamp.* \
654	       src/tvh_locale_inc.c
655	find . -name "*~" | xargs rm -f
656	$(MAKE) -f Makefile.webui clean
657
658# Distclean
659.PHONY: distclean
660distclean: clean
661	rm -rf ${ROOTDIR}/build.*
662	rm -rf ${ROOTDIR}/debian/.debhelper
663	rm -rf ${ROOTDIR}/data/dvb-scan
664	rm -f ${ROOTDIR}/.config.mk
665
666# Create version
667$(BUILDDIR)/src/version.o: $(ROOTDIR)/src/version.c
668$(ROOTDIR)/src/version.c: FORCE
669	@$(ROOTDIR)/support/version $@ > /dev/null
670FORCE:
671
672# Include dependency files if they exist.
673ifeq ($(filter clean distclean, $(MAKECMDGOALS)),)
674-include $(DEPS)
675endif
676
677# Some hardcoded deps
678src/webui/extjs.c: make_webui
679
680# Include OS specific targets
681include ${ROOTDIR}/support/${OSENV}.mk
682
683# Build files
684DATE_FMT = %Y-%m-%dT%H:%M:%S%z
685ifdef SOURCE_DATE_EPOCH
686	BUILD_DATE ?= $(shell date -u -d "@$(SOURCE_DATE_EPOCH)" "+$(DATE_FMT)"  2>/dev/null || date -u -r "$(SOURCE_DATE_EPOCH)" "+$(DATE_FMT)" 2>/dev/null || date -u "+$(DATE_FMT)")
687else
688	BUILD_DATE ?= $(shell date "+$(DATE_FMT)")
689endif
690$(BUILDDIR)/timestamp.c: FORCE
691	@mkdir -p $(dir $@)
692	@echo '#include "build.h"' > $@
693	@echo 'const char* build_timestamp = "'$(BUILD_DATE)'";' >> $@
694
695$(BUILDDIR)/timestamp.o: $(BUILDDIR)/timestamp.c
696	$(pCC) $(CFLAGS) -c -o $@ $<
697
698$(BUILDDIR)/build.o: $(BUILDDIR)/build.c
699	@mkdir -p $(dir $@)
700	$(pCC) $(CFLAGS) -c -o $@ $<
701
702# Documentation
703$(BUILDDIR)/docs-timestamp: $(I18N-DOCS) support/doc/md_to_c.py
704	@-rm -f src/docs_inc.c
705	@for i in $(MD-ROOT); do \
706	   echo "Markdown: docs/markdown/$${i}.md"; \
707	   $(MD-TO-C) --in="docs/markdown/$${i}.md" \
708	              --name="tvh_doc_root_$${i}" >> src/docs_inc.c || exit 1; \
709	 done
710	@for i in $(MD-CLASS); do \
711	   echo "Markdown: docs/class/$${i}.md"; \
712	   $(MD-TO-C) --in="docs/class/$${i}.md" \
713	              --name="tvh_doc_$${i}_class" >> src/docs_inc.c || exit 1; \
714	 done
715	@for i in $(MD-PROP); do \
716	   echo "Markdown: docs/property/$${i}.md"; \
717	   $(MD-TO-C) --in="docs/property/$${i}.md" \
718	              --name="tvh_doc_$${i}_property" >> src/docs_inc.c || exit 1; \
719	 done
720	@for i in $(MD-WIZARD); do \
721	   echo "Markdown: docs/wizard/$${i}.md"; \
722	   $(MD-TO-C) --in="docs/wizard/$${i}.md" \
723	              --name="tvh_doc_wizard_$${i}" >> src/docs_inc.c || exit 1; \
724	 done
725	@$(MD-TO-C) --pages="$(MD-ROOT)" >> src/docs_inc.c
726	@touch $@
727
728src/docs_inc.c: $(BUILDDIR)/docs-timestamp
729
730src/docs_inc.h: $(BUILDDIR)/docs-timestamp
731
732src/docs.c: src/docs_inc.c src/docs_inc.h
733
734$(BUILDDIR)/src/docs.o: $(BUILDDIR)/docs-timestamp $(I18N-DOCS) support/doc/md_to_c.py
735
736# Internationalization
737.PHONY: intl
738intl:
739	@printf "Building tvheadend.pot\n"
740	@$(XGETTEXT2) -o intl/tvheadend.pot.new $(I18N-C)
741	@sed -e 's/^"Language: /"Language: en/' < intl/tvheadend.pot.new > intl/tvheadend.pot
742	$(MAKE) -f Makefile.webui LANGUAGES="$(LANGUAGES)" WEBUI=std intl
743	@printf "Building docs/tvheadend.doc.pot\n"
744	@$(XGETTEXT2) -o intl/docs/tvheadend.doc.pot.new $(I18N-C-DOCS)
745	@sed -e 's/^"Language: /"Language: en/' < intl/docs/tvheadend.doc.pot.new > intl/docs/tvheadend.doc.pot
746	$(MAKE)
747
748
749intl/tvheadend.pot:
750
751$(BUILDDIR)/src/tvh_locale.o: src/tvh_locale_inc.c
752src/tvh_locale_inc.c: $(PO-FILES)
753	@printf "Building $@\n"
754	@$(POC_PY) --in="$(PO-FILES)" > $@.new
755	@mv $@.new $@
756
757# Bundle files
758$(BUILDDIR)/bundle.o: $(BUILDDIR)/bundle.c
759	@mkdir -p $(dir $@)
760	$(pCC) $(CFLAGS) -I${ROOTDIR}/src -c -o $@ $<
761
762$(BUILDDIR)/bundle.c: $(DVBSCAN-yes) make_webui
763	@mkdir -p $(dir $@)
764	$(pMKBUNDLE) -o $@ -d ${BUILDDIR}/bundle.d $(BUNDLE_FLAGS) $(BUNDLES:%=$(ROOTDIR)/%)
765
766.PHONY: make_webui
767make_webui:
768	$(MAKE) -f Makefile.webui LANGUAGES="$(LANGUAGES)" all
769
770# Static FFMPEG
771
772ifeq ($(CONFIG_FFMPEG_STATIC),yes)
773src/libav.h ${SRCS-LIBAV} ${DEPS-LIBAV}: ${BUILDDIR}/libffmpeg_stamp
774endif
775
776${BUILDDIR}/libffmpeg_stamp: ${BUILDDIR}/ffmpeg/build/ffmpeg/lib/libavcodec.a
777	@touch $@
778
779${BUILDDIR}/ffmpeg/build/ffmpeg/lib/libavcodec.a: Makefile.ffmpeg
780ifeq ($(CONFIG_PCLOUD_CACHE),yes)
781	$(MAKE) -f Makefile.ffmpeg libcacheget
782	$(MAKE) -f Makefile.ffmpeg build
783	$(MAKE) -f Makefile.ffmpeg libcacheput
784else
785	$(MAKE) -f Makefile.ffmpeg build
786endif
787
788# Static HDHOMERUN library
789
790ifeq ($(CONFIG_HDHOMERUN_STATIC),yes)
791src/input/mpegts/tvhdhomerun/tvhdhomerun_private.h ${SRCS-HDHOMERUN}: ${BUILDDIR}/libhdhomerun_stamp
792endif
793
794${BUILDDIR}/libhdhomerun_stamp: ${BUILDDIR}/hdhomerun/libhdhomerun/libhdhomerun.a
795	@touch $@
796
797${BUILDDIR}/hdhomerun/libhdhomerun/libhdhomerun.a: Makefile.hdhomerun
798ifeq ($(CONFIG_PCLOUD_CACHE),yes)
799	$(MAKE) -f Makefile.hdhomerun libcacheget
800	$(MAKE) -f Makefile.hdhomerun build
801	$(MAKE) -f Makefile.hdhomerun libcacheput
802else
803	$(MAKE) -f Makefile.hdhomerun build
804endif
805
806.PHONY: ffmpeg_rebuild
807ffmpeg_rebuild:
808	-rm ${BUILDDIR}/ffmpeg/build/ffmpeg/lib/libavcodec.a
809	-rm ${BUILDDIR}/libffmpeg_stamp
810	-rm ${BUILDDIR}/ffmpeg/ffmpeg-*/.tvh_build
811	$(MAKE) all
812
813# linuxdvb git tree
814$(ROOTDIR)/data/dvb-scan/.stamp:
815	@echo "Receiving data/dvb-scan from https://github.com/tvheadend/dtv-scan-tables.git#tvheadend"
816	@rm -rf $(ROOTDIR)/data/dvb-scan/*
817	@$(ROOTDIR)/support/getmuxlist $(ROOTDIR)/data/dvb-scan
818	@touch $@
819
820.PHONY: check_dvb_scan
821check_dvb_scan: $(ROOTDIR)/data/dvb-scan/.stamp
822
823# dvb-s / enigma2 / satellites.xml
824$(ROOTDIR)/data/dvb-scan/dvb-s/.stamp: $(ROOTDIR)/data/satellites.xml \
825                                       $(ROOTDIR)/data/dvb-scan/.stamp
826	@echo "Generating data/dvb-scan/dvb-s from data/satellites.xml"
827	@if ! test -s $(ROOTDIR)/data/satellites.xml ; then echo "Put your satellites.xml file to $(ROOTDIR)/data/satellites.xml"; exit 1; fi
828	@if ! test -d $(ROOTDIR)/data/dvb-scan/dvb-s ; then mkdir $(ROOTDIR)/data/dvb-scan/dvb-s ; fi
829	@rm -rf $(ROOTDIR)/data/dvb-scan/dvb-s/*
830	@PYTHONIOENCODING=utf-8 $(PYTHON) $(ROOTDIR)/support/sat_xml_scan.py \
831		$(ROOTDIR)/data/satellites.xml $(ROOTDIR)/data/dvb-scan/dvb-s
832	@touch $(ROOTDIR)/data/dvb-scan/dvb-s/.stamp
833
834.PHONY: satellites_xml
835satellites_xml: $(ROOTDIR)/data/dvb-scan/dvb-s/.stamp
836