#!/usr/bin/make -f

DEBIAN_NAME		:= $(shell dpkg-parsechangelog | sed -n 's/^Source: *\(.*\)$$/\1/ p')
DEBIAN_VERSION		:= $(shell dpkg-parsechangelog | sed -n 's/^Version: *\(.*\)$$/\1/ p')
DEBIAN_UPSTREAM_VERSION	:= $(shell echo $(DEBIAN_VERSION) | sed 's/^\(.*\)-[^-]*$$/\1/')
DEBIAN_REVISION		:= $(shell echo $(DEBIAN_VERSION) | sed 's/^.*r\([^-]*\)-.*/\1/')
DEBIAN_DIST             := $(shell lsb_release -ds | tr -d '()')

# We can follow either trunk or the revision required by Chromium
FOLLOW_CHROMIUM ?= 1

SRC_DIR        := $(CURDIR)
SOURCES_DIR    := src/source/patched-ffmpeg-mt
LIB_DIR        := usr/lib/nickel-browser

pre-build:: debian/stamp-unpack
include /usr/share/cdbs/1/rules/patchsys-quilt.mk
include /usr/share/cdbs/1/rules/debhelper.mk

# for hardy
DEB_QUILT_PATCHDIR_LINK = $(NULL)
export QUILT_PATCHES=$(SRC_DIR)/debian/patches

MAKE_ARGS := BUILDTYPE=Release
# MAKE_ARGS += CFLAGS="$(CFLAGS)" CXXFLAGS="$(CXXFLAGS)" CPPFLAGS="$(CPPFLAGS)" LDFLAGS="$(LDFLAGS)"

# Disable SSE2
GYP_DEFINES = disable_sse2=1

ifeq (armel,$(DEB_BUILD_ARCH))
GYP_DEFINES += \
	target_arch=arm \
	arm_thumb=1 \
	arm_neon=0 \
	$(NULL)
ifneq (,$(filter 10.10 unstable development,$(DEBIAN_DIST)))
# on $(DEB_BUILD_ARCH) and $(DEBIAN_DIST), enforce an armv7 with thumb build
GYP_DEFINES += \
	armv7=1 \
	$(NULL)
endif
else
ifeq (x86_64,$(DEB_BUILD_GNU_CPU))
GYP_DEFINES += target_arch=x64
else
GYP_DEFINES += target_arch=ia32
endif
endif

GYP_DEFINES += \
	release_extra_cflags=-g \
	use_system_yasm=1 \
	use_system_vpx=1 \
	$(NULL)

# the ffmpeg_branding variable controls which codecs are built inside the sumo lib.
# By default, ffmpeg_branding equals to "Chromium" and only builds the ogg/vorbis/theora codecs.
# When set to "Chrome", it also builds aac/ac3/mpeg4audio/h264/mov/mp3
FFMPEG_MT_STD_FLAGS   = $(NULL)
FFMPEG_MT_EXTRA_FLAGS = ffmpeg_branding=Chrome

DEB_DH_SHLIBDEPS_ARGS_$(DEBIAN_NAME) := -l$(CURDIR)/debian/$(DEBIAN_NAME)/$(LIB_DIR)
DEB_DH_SHLIBDEPS_ARGS_$(DEBIAN_NAME)-extra := -l$(CURDIR)/debian/$(DEBIAN_NAME)-extra/$(LIB_DIR)

# Build a custom ffmpeg from the multi-threaded branch, and do it twice
# with different flags
common-build-arch:: debian/stamp-build-ffmpeg-std debian/stamp-build-ffmpeg-extra

debian/stamp-unpack:
	rm -rf $(SRC_DIR)/ffmpeg-mt $(SRC_DIR)/$(SOURCES_DIR)
	cd $(SRC_DIR) && tar zxf ffmpeg-mt.tar.gz
	@set -e; $(foreach patch,$(sort $(notdir $(wildcard $(SRC_DIR)/patches/*.patch $(SRC_DIR)/patches/*/*.patch))),echo "# Apply $(patch) ..." ; \
	  cd $(SRC_DIR)/ffmpeg-mt && patch -p1 < $(wildcard $(SRC_DIR)/patches/$(patch) $(SRC_DIR)/patches/*/$(patch));)
	mkdir -p $(SRC_DIR)/$(dir $(SOURCES_DIR))
	mv $(SRC_DIR)/ffmpeg-mt $(SRC_DIR)/$(SOURCES_DIR)
	touch $@
	
debian/stamp-configure-ffmpeg-%: GYP_DEFINES += $(FFMPEG_MT_$(subst std,STD,$(subst extra,EXTRA,$*))_FLAGS)
debian/stamp-configure-ffmpeg-%: debian/stamp-unpack
	rm -rf $(SRC_DIR)/*.mk $(SRC_DIR)/src/out
	cd $(SRC_DIR)/src && GYP_DEFINES="$(GYP_DEFINES)" GYP_GENERATORS=make build/gyp_chromium --depth=../src source/ffmpeg.gyp
	touch $@

debian/stamp-build-ffmpeg-%: debian/stamp-configure-ffmpeg-%
	cd $(SRC_DIR)/src ; $(MAKE) $(MAKE_ARGS) libffmpegsumo.so
	install -d -m 755 $(CURDIR)/debian/tmp-$*/$(LIB_DIR)
	install -m 644 $(SRC_DIR)/src/out/Release/lib.target/libffmpegsumo.so $(CURDIR)/debian/tmp-$*/$(LIB_DIR)
	touch $@

clean::
	rm -rf debian/stamp-* debian/tmp-*
	rm -rf $(addprefix $(SRC_DIR)/,ffmpeg-mt src/out src/*.mk src/Makefile src/source/patched-ffmpeg-mt)

###############################################################################################

# Tarball (get-orig-source & get-current-source)
FFMPEG_URL   := http://src.chromium.org/svn/trunk/deps/third_party/ffmpeg/
BUILD_URL    := http://src.chromium.org/svn/trunk/src/build/

SRC_FILES    := \
	src/build/common.gypi \
	src/build/release.gypi \
	src/build/compiler_version.py \
	src/build/features_override.gypi \
	src/build/internal/release_defaults.gypi \
	src/build/internal/release_impl.gypi \
	src/build/internal/release_impl_official.gypi \
	src/build/gyp_chromium \
	src/build/linux \
	ffmpeg/ffmpeg-mt.tar.gz \
	ffmpeg/patches \
	ffmpeg/README.chromium \
	ffmpeg/source \
	$(NULL)

TMP_DDIR     := $(DEBIAN_NAME)-$(shell echo $$$$)
ifeq (,$(LOCAL_BRANCH))
TMP_DIR      := $(TMP_DDIR)
else
TMP_DIR      := $(LOCAL_BRANCH)
endif

DO = (echo "$(1)" ; $(1))
# usage: $(call CO,options,src,dst)
CO = ( if [ ! -d "$(3)" ] ; then $(call DO,mkdir -p "$(3)") ; $(call DO,svn co $(1) $(2) $(3)) ; else $(call DO,svn update $(1) $(3)) ; fi )

ifneq (,$(DEBIAN_TAG))
get-orig-source: TAG1  = $(NULL)
get-orig-source: TAG2  = $(NULL)
else
ifeq (1,$(FOLLOW_CHROMIUM))
get-orig-source: TAG1  = -r $(shell wget -qO- http://src.chromium.org/svn/trunk/src/DEPS | grep '"ffmpeg_revision":' | cut -d'"' -f4)
else
get-orig-source: TAG1  = -r $(shell svn log --limit 1 $(FFMPEG_URL) | grep ^r | head -1 | sed -e 's/^r\([^ ]*\).*/\1/')
endif
get-orig-source: TAG2  = -r $(shell svn log --limit 1 $(BUILD_URL)  | grep ^r | head -1 | sed -e 's/^r\([^ ]*\).*/\1/')
endif
get-orig-source: gos-all

get-current-source: TAG1 = -r $(shell echo $(DEBIAN_REVISION) | cut -d+ -f1)
get-current-source: TAG2 = -r $(shell echo $(DEBIAN_REVISION) | cut -d+ -f2)
get-current-source: gos-all

gos-all: gos-co gos-pack
ifneq (,$(DEBIAN_TAG))
gos-all: LOCAL_BRANCH = $(NULL)
endif
gos-co:
ifeq (,$(LOCAL_BRANCH))
	rm -rf $(TMP_DIR)
endif
	@$(call CO,$(TAG1) -N,$(FFMPEG_URL),$(TMP_DIR)/ffmpeg)
	@$(call CO,$(TAG1),$(FFMPEG_URL)/patches,$(TMP_DIR)/ffmpeg/patches)
	@$(call CO,$(TAG1) -N,$(FFMPEG_URL)/source,$(TMP_DIR)/ffmpeg/source)
	@$(call CO,$(TAG1),$(FFMPEG_URL)/source/config/Chromium/linux,$(TMP_DIR)/ffmpeg/source/config/Chromium/linux)
	@$(call CO,$(TAG1),$(FFMPEG_URL)/source/config/Chrome/linux,$(TMP_DIR)/ffmpeg/source/config/Chrome/linux)
	@$(call CO,$(TAG1),$(FFMPEG_URL)/source/config/libavutil,$(TMP_DIR)/ffmpeg/source/config/libavutil)

	@$(call CO,$(TAG2),$(BUILD_URL),$(TMP_DIR)/src/build)
ifneq (,$(LOCAL_BRANCH))
	rm -rf $(TMP_DDIR)
	cp -la $(TMP_DIR) $(TMP_DDIR)
endif
	cd $(TMP_DDIR)/ffmpeg && tar zxvf ffmpeg-mt.tar.gz ffmpeg-mt/Changelog

gos-pack: TMP_DIR  = $(TMP_DDIR)
ifneq (,$(DEBIAN_TAG))
gos-pack: VERSION  = $(shell echo $(DEBIAN_TAG) | cut -d= -f2)
else
gos-pack: REVISION = $(shell cd $(TMP_DIR)/ffmpeg && svn log --xml --limit 1 | grep -E '^( *revision=|<date>)' | tr -d '\n' | \
	             sed -e 's/.*"\([0-9]*\)".*>\(....\)-\(..\)-\(..\)T.*/\2\3\4r\1/')+$(shell cd $(TMP_DIR)/src/build && \
	             svn log --limit 1 | grep ^r | head -1 | sed -e 's/^r\([^ ]*\).*/\1/')
gos-pack: VERSION  = $(shell grep -E '^version [0-9][^:]*:.*' $(TMP_DIR)/ffmpeg/ffmpeg-mt/Changelog | head -1 | sed -e 's/.* \(.*\):/\1/')+svn$(REVISION)
endif
gos-pack:
	# Pack
	rm -rf  $(TMP_DIR)/ffmpeg-mt
	mkdir $(TMP_DIR)/$(DEBIAN_NAME)-$(VERSION)
	tar -cf - -C $(TMP_DIR) $(SRC_FILES) --exclude .svn | tar -xf - -C $(TMP_DIR)/$(DEBIAN_NAME)-$(VERSION)
	@$(call DO,mv $(TMP_DIR)/$(DEBIAN_NAME)-$(VERSION)/ffmpeg/* $(TMP_DIR)/$(DEBIAN_NAME)-$(VERSION)/src); rmdir $(TMP_DIR)/$(DEBIAN_NAME)-$(VERSION)/ffmpeg
	@$(foreach ent,*.tar.gz patches,$(call DO,mv $(TMP_DIR)/$(DEBIAN_NAME)-$(VERSION)/src/$(ent) $(TMP_DIR)/$(DEBIAN_NAME)-$(VERSION));)
	cd $(TMP_DIR) && tar zcf ../$(DEBIAN_NAME)_$(VERSION).orig.tar.gz --exclude=.svn $(DEBIAN_NAME)-$(VERSION)
	rm -rf $(TMP_DIR)
	@echo "# Done (created $(DEBIAN_NAME)_$(VERSION).orig.tar.gz)"
	@ls -l $(DEBIAN_NAME)_$(VERSION).orig.tar.gz
