################################################################################
# Makefile for Motion                                                          #
################################################################################
# Copyright 2000 by Jeroen Vreeken                                             #
#                                                                              #
# This program is published under the GNU public license version 2.0 or later. #
# Please read the file COPYING for more info.                                  #
################################################################################
# Please visit the Motion home page:                                           #
# https://motion-project.github.io/                                            #
################################################################################

CC      = @CC@
INSTALL = install
INSTALL_DATA = ${INSTALL} -m 644

################################################################################
# Install locations, controlled by setting configure flags.                    #
################################################################################
prefix      = @prefix@
exec_prefix = @exec_prefix@
bindir      = @bindir@
mandir      = @mandir@
sysconfdir  = @sysconfdir@
datadir     = @datadir@
datarootdir = @datarootdir@
docdir      = $(datadir)/doc/@PACKAGE_NAME@ 
examplesdir = $(datadir)/@PACKAGE_NAME@/examples

################################################################################
# These variables contain compiler flags, object files to build and files to   #
# install.                                                                     #
################################################################################
CFLAGS       = @CFLAGS@ -Wall -DVERSION=\"@PACKAGE_VERSION@\" -Dsysconfdir=\"$(sysconfdir)\" @FFMPEG_CFLAGS@ @MMAL_CFLAGS@
LDFLAGS      = @LDFLAGS@
LIBS         = @LIBS@  @MMAL_LIBS@ @FFMPEG_LIBS@
VIDEO_OBJ    = @VIDEO@
OBJ          = motion.o logger.o conf.o draw.o jpegutils.o vloopback_motion.o $(VIDEO_OBJ) \
			   netcam.o netcam_ftp.o netcam_jpeg.o netcam_wget.o track.o \
			   alg.o event.o picture.o rotate.o webhttpd.o \
			   stream.o md5.o netcam_rtsp.o \
			   @FFMPEG_OBJ@ @MMAL_OBJ@ @SDL_OBJ@
SRC          = $(OBJ:.o=.c)
DOC          = CHANGELOG COPYING CREDITS README.md motion_guide.html mask1.png normal.jpg outputmotion1.jpg outputnormal1.jpg
EXAMPLES     = *.conf motion.service
EXAMPLES_BIN = motion.init-Debian motion.init-FreeBSD.sh
PROGS        = motion
DEPEND_FILE  = .depend

################################################################################
# ALL and PROGS build Motion and, possibly, Motion-control.                    #
################################################################################
all: progs
ifneq (,$(findstring freebsd,$(VIDEO_OBJ)))
	@echo "Build complete, run \"gmake install\" to install Motion!"
else
	@echo "Build complete, run \"make install\" to install Motion!"
endif
	@echo

progs: pre-build-info $(PROGS)

################################################################################
# PRE-BUILD-INFO outputs some general info before the build process starts.    #
################################################################################
pre-build-info: 
	@echo "Welcome to the setup procedure for Motion, the motion detection daemon! If you get"
	@echo "error messages during this procedure, please report them to the mailing list. The"
	@echo "Motion Guide contains all information you should need to get Motion up and running."
	@echo
	@echo "Version: @PACKAGE_VERSION@"
ifneq (,$(findstring freebsd,$(VIDEO_OBJ)))
	@echo "Platform: FreeBSD"
else
	@echo "Platform: Linux (if this is incorrect, please read README.FreeBSD)"
endif
	@echo

################################################################################
# MOTION builds motion. MOTION-OBJECTS and PRE-MOBJECT-INFO are helpers.       #
################################################################################
motion: motion-objects
	@echo "Linking Motion..."
	@echo "--------------------------------------------------------------------------------"
	$(CC) $(LDFLAGS) -o $@ $(OBJ) $(LIBS)
	@echo "--------------------------------------------------------------------------------"
	@echo "Motion has been linked."
	@echo

motion-objects: dep pre-mobject-info $(OBJ)
	@echo "--------------------------------------------------------------------------------"
	@echo "Motion object files compiled."
	@echo
	
pre-mobject-info:
	@echo "Compiling Motion object files..."
	@echo "--------------------------------------------------------------------------------"

################################################################################
# Define the compile command for C files.                                      #
################################################################################
#%.o: %.c
#	@echo -e "\tCompiling $< into $@..."
#	@$(CC) -c $(CFLAGS) $< -o $@

################################################################################
# Include the dependency file if it exists.                                    #
################################################################################
ifeq ($(DEPEND_FILE), $(wildcard $(DEPEND_FILE)))
ifeq (,$(findstring clean,$(MAKECMDGOALS)))
-include $(DEPEND_FILE)
endif
endif

################################################################################
# Make the dependency file depend on all header files and all relevant source  #
# files. This forces the file to be re-generated if the source/header files    #
# change. Note, however, that the existing version will be included before     #
# re-generation.                                                               #
################################################################################
$(DEPEND_FILE): *.h $(SRC)
	@echo "Generating dependencies, please wait..."
	@$(CC) $(CFLAGS) -M $(SRC) > .tmp
	@mv -f .tmp $(DEPEND_FILE)
	@echo

################################################################################
# DEP, DEPEND and FASTDEP generate the dependency file.                        #
################################################################################
dep depend fastdep: $(DEPEND_FILE)


################################################################################
# DEV, BUILD with developer flags                                              #
################################################################################
dev: distclean autotools all

################################################################################
# DEV-GIT, BUILD with developer flags                                          #
################################################################################
dev-git: distclean autotools-git all


################################################################################
# GIT, BUILD with developer flags                                              #
################################################################################
build-commit-git: distclean set-version-git all

################################################################################
# CURRENT, BUILD current svn trunk.                                            #
################################################################################
current: distclean svn autotools all

svn:
	svn update

autotools:
	@sed -e 's/.\/commit-version.sh/.\/version.sh/g' configure.ac > configure.ac.tmp && mv -f configure.ac.tmp configure.ac
	autoconf
	./configure --with-developer-flags 

autotools-git:
	@sed -e 's/.\/git-commit-version.sh/.\/version.sh/g' configure.ac > configure.ac.tmp && mv -f configure.ac.tmp configure.ac
	autoconf
	./configure --with-developer-flags 


build-commit: distclean svn set-version all

set-version:
	@sed -e 's/.\/version.sh/.\/commit-version.sh/g' configure.ac > configure.ac.tmp && mv -f configure.ac.tmp configure.ac
	autoconf
	@sed -e 's/.\/commit-version.sh/.\/version.sh/g' configure.ac > configure.ac.tmp && mv -f configure.ac.tmp configure.ac
	./configure --with-developer-flags

set-version-git:
	@sed -e 's/.\/version.sh/.\/git-commit-version.sh/g' configure.ac > configure.ac.tmp && mv -f configure.ac.tmp configure.ac
	autoconf
	@sed -e 's/.\/git-commit-version.sh/.\/version.sh/g' configure.ac > configure.ac.tmp && mv -f configure.ac.tmp configure.ac
	./configure --with-developer-flags


help:
	@echo "--------------------------------------------------------------------------------"
	@echo "make                   Build motion from local copy in your computer"	
	@echo "make current           Build last version of motion from svn"
	@echo "make dev               Build motion with dev flags"
	@echo "make dev-git           Build motion with dev flags for git"
	@echo "make build-commit      Build last version of motion and prepare to commit to svn"
	@echo "make build-commit-git  Build last version of motion and prepare to commit to git"
	@echo "make clean             Clean objects" 
	@echo "make distclean         Clean everything"	
	@echo "make install           Install binary , examples , docs and config files"
	@echo "make uninstall         Uninstall all installed files"
	@echo "--------------------------------------------------------------------------------"
	@echo

	
################################################################################
# INSTALL installs all relevant files.                                         #
################################################################################
install:
	@echo "Installing files..."
	@echo "--------------------------------------------------------------------------------"
	mkdir -p $(DESTDIR)$(bindir)
	mkdir -p $(DESTDIR)$(mandir)/man1
	mkdir -p $(DESTDIR)$(sysconfdir)/motion
	mkdir -p $(DESTDIR)$(docdir)
	mkdir -p $(DESTDIR)$(examplesdir)
	@sed -e 's|$${prefix}|$(prefix)|' motion-dist.conf > motion-dist.conf.tmp && mv -f motion-dist.conf.tmp motion-dist.conf
	@sed -e 's|$${prefix}|$(prefix)|' camera1-dist.conf > camera1-dist.conf.tmp && mv -f camera1-dist.conf.tmp camera1-dist.conf
	@sed -e 's|$${prefix}|$(prefix)|' camera2-dist.conf > camera2-dist.conf.tmp && mv -f camera2-dist.conf.tmp camera2-dist.conf
	@sed -e 's|$${prefix}|$(prefix)|' camera3-dist.conf > camera3-dist.conf.tmp && mv -f camera3-dist.conf.tmp camera3-dist.conf
	@sed -e 's|$${prefix}|$(prefix)|' camera4-dist.conf > camera4-dist.conf.tmp && mv -f camera4-dist.conf.tmp camera4-dist.conf
	$(INSTALL_DATA) motion.1 $(DESTDIR)$(mandir)/man1
	$(INSTALL_DATA) $(DOC) $(DESTDIR)$(docdir)
	$(INSTALL_DATA) $(EXAMPLES) $(DESTDIR)$(examplesdir)
	$(INSTALL) $(EXAMPLES_BIN) $(DESTDIR)$(examplesdir)
	$(INSTALL_DATA) motion-dist.conf $(DESTDIR)$(sysconfdir)/motion
	$(INSTALL_DATA) camera1-dist.conf $(DESTDIR)$(sysconfdir)/motion
	$(INSTALL_DATA) camera2-dist.conf $(DESTDIR)$(sysconfdir)/motion
	$(INSTALL_DATA) camera3-dist.conf $(DESTDIR)$(sysconfdir)/motion
	$(INSTALL_DATA) camera4-dist.conf $(DESTDIR)$(sysconfdir)/motion
	for prog in $(PROGS); \
	do \
	($(INSTALL) $$prog $(DESTDIR)$(bindir) ); \
	done
	@echo "--------------------------------------------------------------------------------"
	@echo "Install complete! The default configuration file, motion-dist.conf, has been"
	@echo "installed to $(sysconfdir)/motion. You need to rename/copy it to motion.conf"
	@echo "for Motion to find it. More configuration examples as well as init scripts"
	@echo "can be found in $(examplesdir)."
	@echo

################################################################################
# UNINSTALL and REMOVE uninstall already installed files.                      #
################################################################################
uninstall remove: pre-build-info
	@echo "Uninstalling files..."
	@echo "--------------------------------------------------------------------------------"
	for prog in $(PROGS); \
	do \
		($ rm -f $(bindir)/$$prog ); \
	done
	rm -f $(mandir)/man1/motion.1
	rm -f $(sysconfdir)/motion/motion-dist.conf
	rm -f $(sysconfdir)/motion/camera1-dist.conf
	rm -f $(sysconfdir)/motion/camera2-dist.conf
	rm -f $(sysconfdir)/motion/camera3-dist.conf
	rm -f $(sysconfdir)/motion/camera4-dist.conf
	rm -rf $(docdir)
	rm -rf $(examplesdir)
	@echo "--------------------------------------------------------------------------------"
	@echo "Uninstall complete!"
	@echo

################################################################################
# CLEAN is basic cleaning; removes object files and executables, but does not  #
# remove files generated from the configure step.                              #
################################################################################
clean: pre-build-info
	@echo "Removing compiled files and binaries..."
	@rm -f *~ *.o $(PROGS) combine $(DEPEND_FILE)

################################################################################
# DIST restores the directory to distribution state.                           #
################################################################################
dist: distclean updateguide
	@chmod -R 644 *
	@chmod 755 configure
	@chmod 755 version.sh

################################################################################
# DISTCLEAN removes all files generated during the configure step in addition  #
# to basic cleaning.                                                           #
################################################################################
distclean: clean
	@echo "Removing files generated by configure..."
	@rm -f config.status config.log config.cache Makefile motion.service motion.init-Debian motion.init-FreeBSD.sh
	@rm -f camera1-dist.conf camera2-dist.conf camera3-dist.conf camera4-dist.conf motion-dist.conf motion-help.conf motion.spec
	@rm -rf autom4te.cache config.h
	@echo "You will need to re-run configure if you want to build Motion."
	@echo


