wmfs/mk/build.prog.mk
2011-05-01 13:06:15 +02:00

411 lines
13 KiB
Makefile

#
# Copyright (c) 2001-2009 Hypertriton, Inc. <http://hypertriton.com/>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR
# ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
# USE OF THIS SOFTWARE EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# Compile executables from source.
#
PROG?=
GMONOUT?= gmon.out
WINRES?=
CC?= cc
ASM?= nasm
LEX?= lex
YACC?= yacc
WINDRES?=
CFLAGS?= -O2 -g
CPPFLAGS?=
CXXFLAGS?=
OBJCFLAGS?= ${CFLAGS}
ASMFLAGS?= -g -w-orphan-labels
LFLAGS?=
LIBL?= -ll
YFLAGS?= -d
PROG_INSTALL?= Yes
PROG_TYPE?= "CLI"
PROG_GUID?=
SHARE?=none
SHARESRC?=none
SRCS?=none
OBJS?=none
POBJS?=none
SHOBJS?=none
CONF?=none
CONF_OVERWRITE?=No
CLEANFILES?=
CTAGS?=
CTAGSFLAGS?=
DPADD+=prog-tags
all: all-subdir ${PROG}
install: install-prog install-subdir
deinstall: deinstall-prog deinstall-subdir
clean: clean-prog clean-subdir
cleandir: clean-prog clean-subdir cleandir-prog cleandir-subdir
regress: regress-subdir
depend: depend-subdir
.SUFFIXES: .o .po .c .cc .cpp .asm .l .y .m
# Compile C code into an object file
.c.o:
${CC} ${CFLAGS} ${CPPFLAGS} -o $@ -c $<
.c.po:
${CC} -pg -DPROF ${CFLAGS} ${CPPFLAGS} -o $@ -c $<
# Compile C++ code into an object file
.cc.o:
${CXX} ${CXXFLAGS} ${CPPFLAGS} -o $@ -c $<
.cc.po:
${CXX} -pg -DPROF ${CXXFLAGS} ${CPPFLAGS} -o $@ -c $<
.cpp.o:
${CXX} ${CXXFLAGS} ${CPPFLAGS} -o $@ -c $<
.cpp.po:
${CXX} -pg -DPROF ${CXXFLAGS} ${CPPFLAGS} -o $@ -c $<
# Compile C+Objective-C code into an object file
.m.o:
${CC} ${OBJCFLAGS} ${CPPFLAGS} -o $@ -c $<
.m.po:
${CC} -pg -DPROF ${OBJCFLAGS} ${CPPFLAGS} -o $@ -c $<
# Compile assembly code into an object file
.asm.o:
${ASM} ${ASMFLAGS} ${CPPFLAGS} -o $@ $<
# Compile a Lex lexer into an object file
.l:
${LEX} ${LFLAGS} -o$@.yy.c $<
${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} -o $@ $@.yy.c ${LIBL} ${LIBS}
@rm -f $@.yy.c
.l.o:
${LEX} ${LFLAGS} -o$@.yy.c $<
${CC} ${CFLAGS} ${CPPFLAGS} -o $@ -c $@.yy.c
@mv -f $@.yy.o $@
@rm -f $@.yy.c
.l.po:
${LEX} ${LFLAGS} -o$@.yy.c $<
${CC} -pg -DPROF ${CFLAGS} ${CPPFLAGS} -o $@ -c $@.yy.c
@mv -f $@.yy.o $@
@rm -f $@.yy.c
# Compile a Yacc parser into an object file
.y:
${YACC} ${YFLAGS} -b $@ $<
${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} -o $@ $@.tab.c ${LIBS}
@rm -f $@.tab.c
.y.o:
${YACC} ${YFLAGS} -b $@ $<
${CC} ${CFLAGS} ${CPPFLAGS} -o $@ -c $@.tab.c
@mv -f $@.tab.o $@
@rm -f $@.tab.c
.y.po:
${YACC} ${YFLAGS} -b $@ $<
${CC} -pg -DPROF ${CFLAGS} ${CPPFLAGS} -o $@ -c $@.tab.c
@mv -f $@.tab.o $@
@rm -f $@.tab.c
# Build the program's object files
_prog_objs:
@if [ "${PROG}" != "" -a "${OBJS}" = "none" \
-a "${SRCS}" != "none" ]; then \
for F in ${SRCS}; do \
F=`echo $$F | sed 's/.[clym]$$/.o/'`; \
F=`echo $$F | sed 's/.cc$$/.o/'`; \
F=`echo $$F | sed 's/.cpp$$/.o/'`; \
F=`echo $$F | sed 's/.asm$$/.o/'`; \
${MAKE} $$F; \
if [ $$? != 0 ]; then \
echo "${MAKE}: failure"; \
exit 1; \
fi; \
done; \
fi
@if [ "${WINRES}" != "" -a "${WINDRES}" != "" ]; then \
echo "${WINDRES} -o ${WINRES}.o ${WINRES}"; \
${WINDRES} -o ${WINRES}.o ${WINRES}; \
fi
# Build profiled versions of the program's object files
_prog_pobjs:
@if [ "${GMONOUT}" != "" -a "${POBJS}" = "none" \
-a "${SRCS}" != "none" ]; then \
for F in ${SRCS}; do \
F=`echo $$F | sed 's/.[clym]$$/.po/'`; \
F=`echo $$F | sed 's/.cc$$/.po/'`; \
F=`echo $$F | sed 's/.cpp$$/.po/'`; \
F=`echo $$F | sed 's/.asm$$/.po/'`; \
${MAKE} $$F; \
if [ $$? != 0 ]; then \
echo "${MAKE}: failure"; \
exit 1; \
fi; \
done; \
fi
# Compile and link the program
${PROG}: _prog_objs ${OBJS}
@if [ "${PROG}" != "" -a "${SRCS}" != "none" ]; then \
if [ "${OBJS}" = "none" ]; then \
export _objs=""; \
for F in ${SRCS}; do \
F=`echo $$F | sed 's/.[clym]$$/.o/'`; \
F=`echo $$F | sed 's/.cc$$/.o/'`; \
F=`echo $$F | sed 's/.cpp$$/.o/'`; \
F=`echo $$F | sed 's/.asm$$/.o/'`; \
_objs="$$_objs $$F"; \
done; \
if [ "${WINRES}" != "" ]; then \
echo "${CC} ${CFLAGS} ${LDFLAGS} -o ${PROG} $$_objs ${LIBS} \
${WINRES}.o"; \
${CC} ${CFLAGS} ${LDFLAGS} -o ${PROG} $$_objs ${LIBS} \
${WINRES}.o; \
else \
echo "${CC} ${CFLAGS} ${LDFLAGS} -o ${PROG} $$_objs ${LIBS}"; \
${CC} ${CFLAGS} ${LDFLAGS} -o ${PROG} $$_objs ${LIBS}; \
fi; \
else \
if [ "${WINRES}" != "" ]; then \
echo "${CC} ${CFLAGS} ${LDFLAGS} -o ${PROG} ${OBJS} ${LIBS} \
${WINRES}.o"; \
${CC} ${CFLAGS} ${LDFLAGS} -o ${PROG} ${OBJS} ${LIBS} \
${WINRES}.o; \
else \
echo "${CC} ${CFLAGS} ${LDFLAGS} -o ${PROG} ${OBJS} ${LIBS}"; \
${CC} ${CFLAGS} ${LDFLAGS} -o ${PROG} ${OBJS} ${LIBS}; \
fi; \
fi; \
fi
# Compile and link a profiled version of the program
${GMONOUT}: _prog_pobjs ${POBJS}
@if [ "${GMONOUT}" != "" -a "${SRCS}" != "none" ]; then \
if [ "${POBJS}" = "none" ]; then \
export _pobjs=""; \
for F in ${SRCS}; do \
F=`echo $$F | sed 's/.[clym]$$/.po/'`; \
F=`echo $$F | sed 's/.cc$$/.po/'`; \
F=`echo $$F | sed 's/.cpp$$/.po/'`; \
F=`echo $$F | sed 's/.asm$$/.po/'`; \
_pobjs="$$_pobjs $$F"; \
done; \
echo "${CC} -pg -DPROF ${LDFLAGS} -o ${GMONOUT} $$_pobjs \
${LIBS}"; \
${CC} -pg -DPROF ${LDFLAGS} -o ${GMONOUT} $$_pobjs ${LIBS}; \
else \
echo "${CC} -pg -DPROF ${LDFLAGS} -o ${GMONOUT} ${POBJS} \
${LIBS}"; \
${CC} -pg -DPROF ${LDFLAGS} -o ${GMONOUT} ${POBJS} ${LIBS}; \
fi; \
fi
clean-prog:
@if [ "${PROG}" != "" -a "${SRCS}" != "none" ]; then \
if [ "${SHOBJS}" = "none" ]; then \
export _objs=""; \
for F in ${SRCS}; do \
F=`echo $$F | sed 's/.[clym]$$/.lo/'`; \
F=`echo $$F | sed 's/.cc$$/.lo/'`; \
F=`echo $$F | sed 's/.cpp$$/.lo/'`; \
F=`echo $$F | sed 's/.asm$$/.lo/'`; \
_objs="$$_objs $$F"; \
done; \
echo "rm -f $$_objs"; \
rm -f $$_objs; \
else \
export _objs=""; \
for F in ${SHOBJS}; do \
F=`echo $$F | sed 's/.lo$$/.o/'`; \
_objs="$$_objs $$F"; \
done; \
echo "rm -f $$_objs ${SHOBJS}"; \
rm -f $$_objs ${SHOBJS}; \
fi; \
if [ "${OBJS}" = "none" ]; then \
export _objs=""; \
for F in ${SRCS}; do \
F=`echo $$F | sed 's/.[clym]$$/.o/'`; \
F=`echo $$F | sed 's/.cc$$/.o/'`; \
F=`echo $$F | sed 's/.cpp$$/.o/'`; \
F=`echo $$F | sed 's/.asm$$/.o/'`; \
_objs="$$_objs $$F"; \
done; \
echo "rm -f $$_objs"; \
rm -f $$_objs; \
else \
echo "rm -f ${OBJS}"; \
rm -f ${OBJS}; \
fi; \
if [ "${POBJS}" = "none" ]; then \
export _objs=""; \
for F in ${SRCS}; do \
F=`echo $$F | sed 's/.[clym]$$/.po/'`; \
F=`echo $$F | sed 's/.cc$$/.po/'`; \
F=`echo $$F | sed 's/.cpp$$/.po/'`; \
F=`echo $$F | sed 's/.asm$$/.po/'`; \
_objs="$$_objs $$F"; \
done; \
echo "rm -f $$_objs"; \
rm -f $$_objs; \
else \
echo "rm -f ${POBJS}"; \
rm -f ${OBJS}; \
fi; \
echo "rm -f ${PROG}${EXECSUFFIX} ${GMONOUT} ${WINRES}.o"; \
rm -f ${PROG}${EXECSUFFIX} ${GMONOUT} ${WINRES}.o; \
fi
@if [ "${CLEANFILES}" != "" ]; then \
echo "rm -f ${CLEANFILES}"; \
rm -f ${CLEANFILES}; \
fi
@if [ -e ".depend" ]; then \
echo "echo >.depend"; \
echo >.depend; \
fi
cleandir-prog:
rm -f *.core config.log configure.lua tags
if [ -e "./config/prefix.h" ]; then rm -fr ./config; fi
if [ -e "Makefile.config" ]; then echo >Makefile.config; fi
if [ -e ".depend" ]; then echo >.depend; fi
install-prog:
@if [ ! -e "${BINDIR}" ]; then \
echo "${INSTALL_PROG_DIR} ${BINDIR}"; \
${SUDO} ${INSTALL_PROG_DIR} ${DESTDIR}${BINDIR}; \
fi
@if [ "${PROG}" != "" -a "${PROG_INSTALL}" != "No" ]; then \
echo "${INSTALL_PROG} ${PROG}${EXECSUFFIX} ${BINDIR}"; \
${SUDO} ${INSTALL_PROG} ${PROG}${EXECSUFFIX} ${DESTDIR}${BINDIR}; \
fi
@if [ "${SHARE}" != "none" ]; then \
if [ ! -d "${SHAREDIR}" ]; then \
echo "${INSTALL_DATA_DIR} ${SHAREDIR}"; \
${SUDO} ${INSTALL_DATA_DIR} ${DESTDIR}${SHAREDIR}; \
fi; \
for F in ${SHARE}; do \
echo "${INSTALL_DATA} $$F ${SHAREDIR}"; \
${SUDO} ${INSTALL_DATA} $$F ${DESTDIR}${SHAREDIR}; \
done; \
fi
@if [ "${SHARESRC}" != "none" ]; then \
if [ ! -d "${SHAREDIR}" ]; then \
echo "${INSTALL_DATA_DIR} ${SHAREDIR}"; \
${SUDO} ${INSTALL_DATA_DIR} ${DESTDIR}${SHAREDIR}; \
fi; \
if [ "${SRC}" != "" ]; then \
for F in ${SHARESRC}; do \
echo "${INSTALL_DATA} $$F ${SHAREDIR}"; \
${SUDO} ${INSTALL_DATA} ${SRC}/${BUILDREL}/$$F \
${DESTDIR}${SHAREDIR}; \
done; \
else \
for F in ${SHARESRC}; do \
echo "${INSTALL_DATA} $$F ${SHAREDIR}"; \
${SUDO} ${INSTALL_DATA} $$F ${DESTDIR}${SHAREDIR}; \
done; \
fi; \
fi
@if [ "${CONF}" != "none" ]; then \
if [ ! -d "${SYSCONFDIR}" ]; then \
echo "${INSTALL_DATA_DIR} ${SYSCONFDIR}"; \
${SUDO} ${INSTALL_DATA_DIR} ${DESTDIR}${SYSCONFDIR}; \
fi; \
if [ "${CONF_OVERWRITE}" != "Yes" ]; then \
echo "+----------------"; \
echo "| The following configuration files exist and "; \
echo "| will not be overwritten:"; \
echo "|"; \
for F in ${CONF}; do \
if [ -e "${DESTDIR}${SYSCONFDIR}/$$F" ]; then \
echo "| - $$F"; \
else \
${SUDO} ${INSTALL_DATA} $$F ${DESTDIR}${SYSCONFDIR}; \
fi; \
done; \
echo "+----------------"; \
else \
for F in ${CONF}; do \
echo "${INSTALL_DATA} $$F ${SYSCONFDIR}"; \
${SUDO} ${INSTALL_DATA} $$F ${DESTDIR}${SYSCONFDIR}; \
done; \
fi; \
fi
deinstall-prog:
@if [ "${PROG}" != "" -a "${PROG_INSTALL}" != "No" ]; then \
echo "${DEINSTALL_PROG} ${BINDIR}/${PROG}${EXECSUFFIX}"; \
${SUDO} ${DEINSTALL_PROG} ${DESTDIR}${BINDIR}/${PROG}${EXECSUFFIX}; \
fi
@if [ "${SHARE}" != "none" ]; then \
for F in ${SHARE}; do \
echo "${DEINSTALL_DATA} ${SHAREDIR}/$$F"; \
${SUDO} ${DEINSTALL_DATA} ${DESTDIR}${SHAREDIR}/$$F; \
done; \
fi
@if [ "${CONF}" != "none" ]; then \
echo "+----------------"; \
echo "| To completely deinstall ${PROG} you need to perform."; \
echo "| the following steps as root:"; \
echo "|"; \
for F in ${CONF}; do \
if [ -e "${DESTDIR}${SYSCONFDIR}/$$F" ]; then \
echo "| rm -f $$F"; \
fi; \
done; \
echo "|"; \
echo "| Do not do this if you plan on re-installing ${PROG}"; \
echo "| at some future time."; \
echo "+----------------"; \
fi
none:
prog-tags:
-@if [ "${CTAGS}" != "" ]; then \
if [ "${SRC}" != "" ]; then \
(cd ${SRC}; \
echo "${CTAGS} ${CTAGSFLAGS} -R"; \
${CTAGS} ${CTAGSFLAGS} -R); \
else \
echo "${CTAGS} ${CTAGSFLAGS} -R"; \
${CTAGS} ${CTAGSFLAGS} -R; \
fi; \
fi
.PHONY: install deinstall clean cleandir regress depend
.PHONY: install-prog deinstall-prog clean-prog cleandir-prog
.PHONY: _prog_objs _prog_pobjs prog-tags none
include ${TOP}/mk/build.common.mk
include ${TOP}/mk/build.dep.mk
include ${TOP}/mk/build.proj.mk
include ${TOP}/mk/build.subdir.mk
include .depend