# Copyright (c) 2015 Cisco and/or its affiliates.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Pick up per-platform makefile fragments
$(foreach d,$(SOURCE_PATH_BUILD_DATA_DIRS),	\
  $(eval -include $(d)/platforms/*.mk))

.PHONY: install-deb
install-deb: $(patsubst %,%-find-source,$(ROOT_PACKAGES))
	@$(BUILD_ENV) ;							\
	set -eu$(BUILD_DEBUG) ;						\
	$(MAKE) -C $(MU_BUILD_ROOT_DIR)					\
	    $(patsubst %,%-install,					\
	      $(ROOT_PACKAGES))	|| exit 1;				\
									\
	: generate file manifests ;					\
	find $(INSTALL_PREFIX)$(ARCH)/*/bin -type f -print		\
	  | sed -e 's:.*:../& /usr/bin:' | grep -v vppapigen		\
	    > deb/debian/vpp.install ;					\
									\
	: core api definitions ;					\
	./scripts/find-api-core-contents $(INSTALL_PREFIX)$(ARCH)	\
	 deb/debian/vpp.install ;					\
									\
	: need symbolic links in the lib pkg ; 				\
	find $(INSTALL_PREFIX)$(ARCH)/*/lib* \( -type f -o  -type l \)  \
	  -print | egrep -e '*\.so\.*\.*\.*'				\
	  | grep -v plugins\/						\
	  | sed -e 's:.*:../& /usr/lib/x86_64-linux-gnu:'		\
	    > deb/debian/vpp-lib.install ;				\
									\
	: vnet api definitions ;					\
	./scripts/find-api-lib-contents $(INSTALL_PREFIX)$(ARCH)	\
	 deb/debian/vpp-lib.install ;					\
									\
	: dev package ;							\
	./scripts/find-dev-contents $(INSTALL_PREFIX)$(ARCH)		\
	 deb/debian/vpp-dev.install ;					\
									\
	: plugins package ;						\
	./scripts/find-plugins-contents $(INSTALL_PREFIX)$(ARCH)	\
	 deb/debian/vpp-plugins.install ;				\
									\
	: vpp-api-lua package ;						\
	./scripts/find-vpp-api-lua-contents $(INSTALL_PREFIX)$(ARCH)	\
	 deb/debian/vpp-api-lua.install ;				\
									\
	: vpp-api-java package ;					\
	./scripts/find-vpp-api-java-contents $(INSTALL_PREFIX)$(ARCH)	\
	 deb/debian/vpp-api-java.install ;				\
									\
	: vpp-api-python package ;					\
	./scripts/find-vpp-api-python-contents $(INSTALL_PREFIX)$(ARCH)	\
	 deb/debian/vpp-api-python.install ;				\
									\
	: bin package needs startup config ; 				\
	echo ../../src/vpp/conf/startup.conf /etc/vpp 			\
	   >> deb/debian/vpp.install ;					\
									\
	: and sysctl config ; 						\
	echo ../../src/vpp/conf/80-vpp.conf /etc/sysctl.d 		\
	   >> deb/debian/vpp.install ;					\
									\
	: bash completion for vppctl ;					\
	echo ../../src/scripts/vppctl_completion /etc/bash_completion.d	\
	   >> deb/debian/vpp.install ;					\
									\
	: move dictionary of vppctl commands ;				\
	echo ../../src/scripts/vppctl-cmd-list /usr/share/vpp		\
	   >> deb/debian/vpp.install ;					\
									\
	: dev package needs a couple of additions ;			\
	echo ../$(INSTALL_PREFIX)$(ARCH)/vpp/bin/vppapigen /usr/bin	\
	   >> deb/debian/vpp-dev.install ;				\
	echo ../../src/vpp-api/java/jvpp/gen/jvpp_gen.py /usr/bin	\
	   >> deb/debian/vpp-dev.install ;				\
	for i in $$(ls ../src/vpp-api/java/jvpp/gen/jvppgen/*.py); do	\
	   echo ../$${i} /usr/lib/python2.7/dist-packages/jvppgen	\
	       >> deb/debian/vpp-dev.install;				\
	done;								\
									\
	: generate changelog;						\
	./scripts/generate-deb-changelog 				\
									\
	: Go fabricate the actual Debian packages ;			\
	(								\
	cd deb &&							\
	dpkg-buildpackage -us -uc -b					\
	)

.PHONY: install-rpm
install-rpm: $(patsubst %,%-find-source,$(ROOT_PACKAGES))
	@$(BUILD_ENV) ;							\
	set -eu$(BUILD_DEBUG) ;						\
	$(MAKE) -C $(MU_BUILD_ROOT_DIR)					\
	    $(patsubst %,%-install,					\
	      $(ROOT_PACKAGES))	|| exit 1;				\
									\
	cd rpm ;							\
	mkdir -p SOURCES ;                                              \
	if test -f *.tar.gz ; then mv *.tar.gz SOURCES ; fi ;           \
	rpmbuild -bb --define "_topdir $$PWD" --define			\
		"_install_dir $(INSTALL_PREFIX)$(ARCH)"                 \
		--define "_mu_build_root_dir $(MU_BUILD_ROOT_DIR)"      \
		vpp.spec ;                                              \
	mv $$(find RPMS -name \*.rpm -type f) ..

