diff options
Diffstat (limited to 'mk')
34 files changed, 3025 insertions, 0 deletions
diff --git a/mk/Makefile b/mk/Makefile new file mode 100644 index 0000000..5e2b695 --- /dev/null +++ b/mk/Makefile @@ -0,0 +1,48 @@ +FILES = sys.mk mkc.configure.mk configure.mk mkc.mk \ + mkc.init.mk mkc_imp.intexts.mk mkc_imp.mk \ + mkc.minitest.mk mkc_imp.pkg-config.mk \ + mkc_imp.files.mk mkc_imp.inc.mk mkc_imp.info.mk mkc_imp.lib.mk \ + mkc_imp.links.mk mkc_imp.man.mk mkc_imp.prog.mk \ + mkc_imp.subprj.mk \ + mkc_imp.final.mk mkc_imp.scripts.mk \ + mkc_imp.platform.sys.mk mkc_imp.dep.mk mkc_imp.lua.mk \ + mkc_imp.arch.mk mkc_imp.pod.mk mkc_imp.preinit.mk \ + mkc.prog.mk mkc.files.mk mkc.lib.mk mkc.subdir.mk mkc.subprj.mk \ + mkc_imp.objdir.mk mkc_imp.obj.mk ${INFILES} + +FILESDIR = ${MKFILESDIR} + +INFILES += mkc_imp.vars.mk + +################################################# +.for i in prog_mkdep prog_nbmkdep +MKC_CHECK_CUSTOM += ${i} +MKC_CUSTOM_FN.${i} = ${.CURDIR}/../custom/${i} +.endfor + +MKC_CHECK_PROGS += makedepend + +.include <mkc.configure.mk> + +.if ${HAVE_PROG.makedepend:U0} +makedepend_cmd = ${PROG.makedepend} +mkdep_cmd = mkdep +mkdep_type = makedepend +.elif !empty(CUSTOM.prog_nbmkdep) +mkdep_cmd = ${CUSTOM.prog_nbmkdep} +mkdep_type = nbmkdep +.elif !empty(CUSTOM.prog_mkdep) +mkdep_cmd = ${CUSTOM.prog_mkdep} +mkdep_type = mkdep +.else +MKC_ERR_MSG += "mkdep(1) cannot be found" +.endif + +makedepend_cmd ?= makedepend + +INTEXTS_REPLS += mkdep_cmd ${mkdep_cmd} +INTEXTS_REPLS += makedepend_cmd ${makedepend_cmd} +INTEXTS_REPLS += mkdep_type ${mkdep_type} + +################################################# +.include <mkc.mk> diff --git a/mk/configure.mk b/mk/configure.mk new file mode 100644 index 0000000..8d7571c --- /dev/null +++ b/mk/configure.mk @@ -0,0 +1,341 @@ +# Copyright (c) 2009-2013, Aleksey Cheusov <vle@gmx.net> +# 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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. + +###################################################################### +# See mk-configure(7) for documentation +# + +# user defined variables +MKC_SHOW_CACHED ?= 0 # set it to `1' to show "...(cached)..." lines +MKC_DELETE_TMPFILES ?= 0 # set it to `1' to delete temporary files +MKC_CACHEDIR ?= ${.OBJDIR} # directory for cache and intermediate files +MKC_COMMON_HEADERS ?= # list of headers always #included +MKC_NOCACHE ?= # 1 or yes for disabling cache +MKC_CUSTOM_DIR ?=${.CURDIR} # directory with custom tests.c + +# +MKC_SOURCE_FUNCLIBS ?= +_MKC_SOURCE_FUNCS = ${MKC_SOURCE_FUNCLIBS:C/:.*//} + +# .endif for the next .if is in the end of file +.if ${MKCHECKS:Uno:tl} == "yes" + +HAVE_FUNCLIB.main ?= 1 + +# +.undef MKC_SRCS +.undef MKC_LDADD +.undef MKC_CFLAGS + +.if defined(MKC_COMMON_DEFINES.${TARGET_OPSYS}) +CPPFLAGS += ${MKC_COMMON_DEFINES.${TARGET_OPSYS}} +.endif +.if defined(MKC_COMMON_DEFINES) +CPPFLAGS += ${MKC_COMMON_DEFINES} +.endif + +# +_MKC_CPPFLAGS := ${CPPFLAGS} +_MKC_CFLAGS := ${CFLAGS} +_MKC_CXXFLAGS := ${CXXFLAGS} +_MKC_FFLAGS := ${FFLAGS} +_MKC_LDFLAGS := ${LDFLAGS} +_MKC_LDADD := ${LDADD} + +mkc.environ=CC='${CC}' CXX='${CXX}' FC='${FC}' CPPFLAGS='${_MKC_CPPFLAGS}' CFLAGS='${_MKC_CFLAGS}' CXXFLAGS='${_MKC_CXXFLAGS}' FFLAGS='${_MKC_FFLAGS}' LDFLAGS='${_MKC_LDFLAGS}' LDADD='${_MKC_LDADD}' LEX='${LEX}' YACC='${YACC}' MKC_CACHEDIR='${MKC_CACHEDIR}' MKC_COMMON_HEADERS='${MKC_COMMON_HEADERS}' MKC_DELETE_TMPFILES='${MKC_DELETE_TMPFILES}' MKC_SHOW_CACHED='${MKC_SHOW_CACHED}' MKC_NOCACHE='${MKC_NOCACHE}' MKC_VERBOSE=1 + +###################################################### +# checking for builtin checks +.for i in ${MKC_CHECK_BUILTINS} ${MKC_REQUIRE_BUILTINS} +MKC_CUSTOM_FN.${i} ?= ${BUILTINSDIR}/${i} +MKC_CHECK_CUSTOM += ${i} +MKC_REQUIRE_CUSTOM += ${MKC_REQUIRE_BUILTINS:M${i}} +.endfor + +###################################################### +# checking for headers +.for h in ${MKC_CHECK_HEADERS} ${MKC_REQUIRE_HEADERS} +.if !defined(HAVE_HEADER.${h:S|.|_|g:S|/|_|g}) +HAVE_HEADER.${h:S|.|_|g:S|/|_|g} != env ${mkc.environ} mkc_check_header ${h} +.endif +.if ${HAVE_HEADER.${h:S|.|_|g:S|/|_|g}} +.if empty(MKC_REQUIRE_HEADERS:U:M${h}) +MKC_CFLAGS += -DHAVE_HEADER_${h:tu:S|.|_|g:S|/|_|g}=${HAVE_HEADER.${h:S|.|_|g:S|/|_|g}} +.endif +.elif !empty(MKC_REQUIRE_HEADERS:U:M${h}) +_fake != env ${mkc.environ} mkc_check_header -d ${h} && echo +MKC_ERR_MSG += "ERROR: cannot find header ${h}" +.endif +.endfor + +.undef MKC_CHECK_HEADERS +.undef MKC_REQUIRE_HEADERS + +###################################################### +# checking for functions in libraries +.for f in ${MKC_CHECK_FUNCLIBS:U} ${MKC_SOURCE_FUNCLIBS:U} ${MKC_REQUIRE_FUNCLIBS:U} +.if !defined(HAVE_FUNCLIB.${f:S/:/./g}) +HAVE_FUNCLIB.${f:S/:/./g} != env ${mkc.environ} mkc_check_funclib ${f:S/:/ /g} +.endif +.if !defined(HAVE_FUNCLIB.${f:C/:.*//}) +HAVE_FUNCLIB.${f:C/:.*//} != env ${mkc.environ} mkc_check_funclib ${f:C/:.*//} +.endif +.if ${HAVE_FUNCLIB.${f:C/:.*//}} != ${HAVE_FUNCLIB.${f:S/:/./g}} +.if empty(MKC_NOAUTO_FUNCLIBS:U:S/:/./g:M${f:S/:/./g}) && empty(MKC_NOAUTO_FUNCLIBS:U:M1) && ${HAVE_FUNCLIB.${f:S/:/./g}} && !${HAVE_FUNCLIB.${f:C/:.*//}} +MKC_LDADD += -l${f:C/^.*://} +.endif +.endif +.if !${HAVE_FUNCLIB.${f:S/:/./g}} && !${HAVE_FUNCLIB.${f:C/:.*//}} && !empty(_MKC_SOURCE_FUNCS:M${f:C/:.*//}) +MKC_SRCS += ${f:C/:.*//}.c +.endif +.endfor # f + +.for f in ${MKC_REQUIRE_FUNCLIBS:U} +.if !${HAVE_FUNCLIB.${f:S/:/./g}} && !${HAVE_FUNCLIB.${f:C/:.*//}} +_fake != env ${mkc.environ} mkc_check_funclib -d ${f:C/:.*//} && echo +_fake != env ${mkc.environ} mkc_check_funclib -d ${f:S/:/ /g} && echo +MKC_ERR_MSG += "ERROR: cannot find function ${f}" +.endif +.endfor # f + +.undef MKC_CHECK_FUNCLIBS +.undef MKC_REQUIRE_FUNCLIBS + +###################################################### +# checking for sizeof(xxx) +.for t in ${MKC_CHECK_SIZEOF:U} +.if !defined(SIZEOF.${t:S|.|_|g:S|-|_|g:S|*|P|g:S|/|_|g:S|:|.|g}) +SIZEOF.${t:S|.|_|g:S|-|_|g:S|*|P|g:S|/|_|g:S|:|.|g} != env ${mkc.environ} mkc_check_sizeof ${t:S/:/ /g} +.endif +.if ${SIZEOF.${t:S|.|_|g:S|-|_|g:S|*|P|g:S|/|_|g:S|:|.|g}} != failed +MKC_CFLAGS += -DSIZEOF_${t:S/-/_/g:S| |_|g:S|*|P|g:S|:|_|g:S|.|_|g:tu}=${SIZEOF.${t:S|.|_|g:S|-|_|g:S|*|P|g:S|/|_|g:S|:|.|g}} +.endif +.endfor + +.undef MKC_CHECK_SIZEOF + +###################################################### +# checking for declared #define +.for d in ${MKC_CHECK_DEFINES:U} ${MKC_REQUIRE_DEFINES:U} +.if !defined(HAVE_DEFINE.${d:S/./_/g:S/:/./g:S|/|_|g}) +HAVE_DEFINE.${d:S/./_/g:S/:/./g:S|/|_|g} != env ${mkc.environ} mkc_check_decl define ${d:S/:/ /g} +.endif +.if ${HAVE_DEFINE.${d:S/./_/g:S/:/./g:S|/|_|g}} +.if empty(MKC_REQUIRE_DEFINES:U:M${d}) +MKC_CFLAGS += -DHAVE_DEFINE_${d:tu:S/:/_/g:S/./_/g:S|/|_|g}=1 +.endif +.endif +.endfor + +.for d in ${MKC_REQUIRE_DEFINES:U} +.if !${HAVE_DEFINE.${d:S/./_/g:S/:/./g:S|/|_|g}} +_fake != env ${mkc.environ} mkc_check_decl -d define ${d:S/:/ /g} && echo +MKC_ERR_MSG += "ERROR: cannot find declaration of define ${d}" +.endif +.endfor + +.undef MKC_CHECK_DEFINES +.undef MKC_REQUIRE_DEFINES + +###################################################### +# checking for declared type +.for t in ${MKC_CHECK_TYPES:U} ${MKC_REQUIRE_TYPES:U} +.if !defined(HAVE_TYPE.${t:S/./_/g:S/:/./g:S|/|_|g}) +HAVE_TYPE.${t:S/./_/g:S/:/./g:S|/|_|g} != env ${mkc.environ} mkc_check_decl type ${t:S/:/ /g} +.endif +.if ${HAVE_TYPE.${t:S/./_/g:S/:/./g:S|/|_|g}} +.if empty(MKC_REQUIRE_TYPES:U:M${t}) +MKC_CFLAGS += -DHAVE_TYPE_${t:tu:S/:/_/g:S/./_/g:S|/|_|g}=1 +.endif +.endif +.endfor + +.for t in ${MKC_REQUIRE_TYPES:U} +.if !${HAVE_TYPE.${t:S/./_/g:S/:/./g:S|/|_|g}} +_fake != env ${mkc.environ} mkc_check_decl -d type ${t:S/:/ /g} && echo +MKC_ERR_MSG += "ERROR: cannot find declaration of type ${t}" +.endif +.endfor + +.undef MKC_CHECK_TYPES +.undef MKC_REQUIRE_TYPES + +###################################################### +# checking for declared variables +.for d in ${MKC_CHECK_VARS:U} ${MKC_REQUIRE_VARS:U} +.if !defined(HAVE_VAR.${d:S/./_/g:S/:/./g:S|/|_|g}) +HAVE_VAR.${d:S/./_/g:S/:/./g:S|/|_|g} != env ${mkc.environ} mkc_check_decl variable ${d:S/:/ /g} +.endif +.if ${HAVE_VAR.${d:S/./_/g:S/:/./g:S|/|_|g}} +.if empty(MKC_REQUIRE_VARS:U:M${d}) +MKC_CFLAGS += -DHAVE_VAR_${d:tu:S/:/_/g:S/./_/g:S|/|_|g}=1 +.endif +.endif +.endfor + +.for d in ${MKC_REQUIRE_VARS:U} +.if !${HAVE_VAR.${d:S/./_/g:S/:/./g:S|/|_|g}} +_fake != env ${mkc.environ} mkc_check_decl -d variable ${d:S/:/ /g} && echo +MKC_ERR_MSG += "ERROR: cannot find declaration of variable ${d}" +.endif +.endfor + +.undef MKC_CHECK_VARS +.undef MKC_REQUIRE_VARS + +###################################################### +# checking for struct members +.for m in ${MKC_CHECK_MEMBERS:U} ${MKC_REQUIRE_MEMBERS:U} +.if !defined(HAVE_MEMBER.${m:S/./_/g:S/:/./g:S|/|_|g:S/-/_/g}) +HAVE_MEMBER.${m:S/./_/g:S/:/./g:S|/|_|g:S/-/_/g} != env ${mkc.environ} mkc_check_decl member ${m:S/:/ /g} +.endif +.if ${HAVE_MEMBER.${m:S/./_/g:S/:/./g:S|/|_|g:S/-/_/g}} +.if empty(MKC_REQUIRE_MEMBERS:U:M${m}) +MKC_CFLAGS += -DHAVE_MEMBER_${m:tu:S/:/_/g:S/./_/g:S|/|_|g:S/-/_/g}=1 +.endif +.endif +.endfor + +.for m in ${MKC_REQUIRE_MEMBERS:U} +.if !${HAVE_MEMBER.${m:S/./_/g:S/:/./g:S|/|_|g:S/-/_/g}} +_fake != env ${mkc.environ} mkc_check_decl -d member ${m:S/:/ /g} && echo +MKC_ERR_MSG += "ERROR: cannot find member ${m}" +.endif +.endfor + +.undef MKC_CHECK_MEMBERS +.undef MKC_REQUIRE_MEMBERS + +###################################################### +# checking for declared functions +.for n in 0 1 2 3 4 5 6 7 8 9 + +.for d in ${MKC_CHECK_FUNCS${n}:U} ${MKC_REQUIRE_FUNCS${n}:U} +.if !defined(HAVE_FUNC${n}.${d:S/./_/g:S/:/./g:S|/|_|g}) +HAVE_FUNC${n}.${d:S/./_/g:S/:/./g:S|/|_|g} != env ${mkc.environ} mkc_check_decl func${n} ${d:S/:/ /g} +.endif +.if ${HAVE_FUNC${n}.${d:S/./_/g:S/:/./g:S|/|_|g}} +.if empty(MKC_REQUIRE_FUNCS${n}:U:M${d}) +MKC_CFLAGS += -DHAVE_FUNC${n}_${d:tu:S/:/_/g:S/./_/g:S|/|_|g}=1 +.endif +.endif +.endfor # d + +.for d in ${MKC_REQUIRE_FUNCS${n}:U} +.if !${HAVE_FUNC${n}.${d:S/./_/g:S/:/./g:S|/|_|g}} +_fake != env ${mkc.environ} mkc_check_decl -d func${n} ${d:S/:/ /g} && echo +MKC_ERR_MSG += "ERROR: cannot find declaration of function ${d}" +.endif +.endfor # d + +.undef MKC_CHECK_FUNCS${n} +.undef MKC_REQUIRE_FUNCS${n} + +.endfor # n + +###################################################### +# custom checks +.for c in ${MKC_CHECK_CUSTOM} ${MKC_REQUIRE_CUSTOM} +.if !defined(CUSTOM.${c}) +.if !defined(MKC_CUSTOM_FN.${c}) +MKC_CUSTOM_FN.${c} = ${c}.c +.endif +.if empty(MKC_CUSTOM_FN.${c}:M/*) +MKC_CUSTOM_FN.${c} := ${MKC_CUSTOM_DIR}/${MKC_CUSTOM_FN.${c}} +.endif +CUSTOM.${c} != env ${mkc.environ} mkc_check_custom ${MKC_CUSTOM_FN.${c}} +.endif +.if !empty(CUSTOM.${c}) && ${CUSTOM.${c}} != 0 +.if empty(MKC_REQUIRE_CUSTOM:U:M${c}) +MKC_CFLAGS += -DCUSTOM_${c:tu}=${CUSTOM.${c}} +.endif +.endif +.endfor + +.for c in ${MKC_REQUIRE_CUSTOM} +.if empty(CUSTOM.${c}) || ${CUSTOM.${c}} == 0 +_fake != env ${mkc.environ} mkc_check_custom -d ${MKC_CUSTOM_FN.${c}} && echo +MKC_ERR_MSG += "ERROR: custom test ${c} failed" +.endif +.endfor + +.for c in ${MKC_CHECK_BUILTINS} +BUILTIN.${c} = ${CUSTOM.${c}} +.endfor + +###################################################### +# checking for programs +.for p in ${MKC_CHECK_PROGS} ${MKC_REQUIRE_PROGS} +p_ := ${p} +prog_id := ${MKC_PROG.id.${p:S|+|x|g}:U${p}:S|/|_|g} +.ifdef PROG.${prog_id} +.elif !empty(p_:M/*) +PROG.${prog_id} = ${p} +.else +PROG.${prog_id} != env ${mkc.environ} mkc_check_prog -i '${prog_id}' '${p}' +.endif # !defined(PROG.${prog_id}) +.ifndef HAVE_PROG.${prog_id} +.if !empty(PROG.${prog_id}) && exists(${PROG.${prog_id}}) +HAVE_PROG.${prog_id} = 1 +.else +HAVE_PROG.${prog_id} = 0 +.endif +.endif # ifndef HAVE_PROG.${prog_id} + +.if !${HAVE_PROG.${prog_id}} && !empty(MKC_REQUIRE_PROGS:U1:M${p}) +_fake != env ${mkc.environ} mkc_check_prog -d -i '${prog_id}' '${p}' && echo +MKC_ERR_MSG += "ERROR: cannot find program ${p}" +.endif +.endfor # p + +.undef MKC_CHECK_PROGS +.undef MKC_REQUIRE_PROGS + +.undef MKC_CHECK_CUSTOM +.undef MKC_REQUIRE_CUSTOM + +###################################################### +# final assignment +.if !${MKC_NOAUTO:U0} +.for i in ${MKC_CFLAGS} +CFLAGS += ${i} +.endfor +.for i in ${MKC_LDADD} +LDADD += ${i} +.endfor +.for i in ${MKC_SRCS} +SRCS += ${i} +.endfor +.endif # .if MKC_AUTO + +.endif # MKCHECKS == yes + +###################################################### +###################################################### +###################################################### +.for i in ${_MKC_SOURCE_FUNCS} +CLEANFILES += ${i}.o +.endfor + +.undef MKC_SOURCE_FUNCLIBS diff --git a/mk/mkc.configure.mk b/mk/mkc.configure.mk new file mode 100644 index 0000000..f93c615 --- /dev/null +++ b/mk/mkc.configure.mk @@ -0,0 +1,12 @@ +# Copyright (c) 2009-2010 by Aleksey Cheusov +# +# See LICENSE file in the distribution. +############################################################ + +.include <mkc_imp.preinit.mk> +.include <mkc.init.mk> + +.include <configure.mk> + +.PHONY: configure +configure: errorcheck diff --git a/mk/mkc.files.mk b/mk/mkc.files.mk new file mode 100644 index 0000000..8974529 --- /dev/null +++ b/mk/mkc.files.mk @@ -0,0 +1,2 @@ +_top_mk := mkc.files.mk +.include <mkc.mk> diff --git a/mk/mkc.init.mk b/mk/mkc.init.mk new file mode 100644 index 0000000..218f57e --- /dev/null +++ b/mk/mkc.init.mk @@ -0,0 +1,674 @@ +# Copyright (c) 2009-2013 by Aleksey Cheusov +# Copyright (c) 1994-2009 The NetBSD Foundation, Inc. +# Copyright (c) 1988, 1989, 1993 The Regents of the University of California +# Copyright (c) 1988, 1989 by Adam de Boor +# Copyright (c) 1989 by Berkeley Softworks +# Copyright (c) 2009-2010 by Aleksey Cheusov +# +# See LICENSE file in the distribution. +############################################################ + +.ifndef OPSYS +OPSYS != uname -s +OPSYS := ${OPSYS:C/^CYGWIN.*$/Cygwin/} +.endif +TARGET_OPSYS ?= ${OPSYS} + +########### +SHORTPRJNAME ?= yes + +.ifdef DPLIBDIRS +.for _dir in ${DPLIBDIRS} +.ifndef DPLIBDIRS.${_dir} +.if ${SHORTPRJNAME:tl} == "yes" +DPLIBDIRS.${_dir} = ${OBJDIR_${_dir:T}} +.else +DPLIBDIRS.${_dir} = ${OBJDIR_${_dir:S,/,_,g}} +.endif +.if ${TARGET_OPSYS} == "HP-UX" +LDFLAGS += ${CFLAGS.cctold}+b ${CFLAGS.cctold}${LIBDIR} +.endif +LDFLAGS += -L${DPLIBDIRS.${_dir}} +.endif +.endfor + +#.undef DPLIBDIRS + +.endif # DPLIBDIRS + +###################################################################### +.ifndef __initialized__ +__initialized__ := 1 + +.MAIN: all + +########### +.sinclude <mkc_imp.vars.mk> # .sinclude for bootstrapping + +#.if defined(MKC_SHELL) +#.SHELL: name=${MKC_SHELL} +#.elif ${OPSYS} == "SunOS" +#.SHELL: name=/usr/xpg4/bin/sh +#.endif + +########### + +.for p in ${PROGS} +SRCS.${p} ?= ${p}.c +SRCS.${p} += ${SRCS} # SRCS may be changed by mkc_imp.configure.mk +_srcsall += ${SRCS.${p}} +.endfor + +.if defined(PROG) +PROGS ?= ${PROG} +SRCS ?= ${PROG}.c +SRCS.${PROG} ?= ${SRCS} +_srcsall += ${SRCS} +.elif defined(LIB) +SRCS ?= ${LIB}.c +_srcsall += ${SRCS} +.endif # defined(PROG) + +.if !empty(_srcsall:U:M*.cxx) || !empty(_srcsall:U:M*.cpp) || !empty(_srcsall:U:M*.C) || !empty(_srcsall:U:M*.cc) +src_type += cxx +LDCOMPILER = yes +LDREAL ?= ${CXX} +.elif !empty(_srcsall:U:M*.pas) || !empty(_srcsall:U:M*.p) +src_type += pas +LDCOMPILER = yes +LDREAL ?= ${PC} +.endif + +LDCOMPILER.Interix = yes +LDCOMPILER.Darwin = yes +#LDCOMPILER.HP-UX= yes +LDCOMPILER ?= ${LDCOMPILER.${TARGET_OPSYS}:Uyes} + +.if !empty(_srcsall:U:M*.c) || !empty(_srcsall:U:M*.l) || !empty(_srcsall:U:M*.y) || defined(MKC_SOURCE_FUNCLIBS) +src_type += c +.endif + +src_type ?= 0 + +.if ${LDCOMPILER:tl} == "yes" +LDREAL ?= ${CC} +.endif + +.if defined(PROGS) +LDREAL ?= ${CC} +.else +LDREAL ?= ${LD} +.endif + +MKC_CACHEDIR ?= ${.OBJDIR} # directory for cache and intermediate files + +init_make_level ?= 0 # for mkc.configure.mk + +.if ${.MAKE.LEVEL} == ${init_make_level} +SRCTOP ?= ${.CURDIR} +OBJTOP ?= ${.OBJDIR} +.endif + +########### +.if exists(${.CURDIR}/Makefile.rec) +REC_MAKEFILES += ${.CURDIR}/Makefile.rec +.endif +.for dir in ${REC_MAKEFILES} +.include "${dir}" +.endfor + +.if ${SRCTOP:U} != ${.CURDIR} && exists(${.CURDIR}/../Makefile.inc) +.include "${.CURDIR}/../Makefile.inc" +.endif + +########### + +PROJECTNAME ?= ${!empty(PROG):?${PROG}:${!empty(LIB):?${LIB}:${.CURDIR:T}}} + +.if defined(MAKECONF) && exists(${MAKECONF}) +.include "${MAKECONF}" +.elif defined(MKC_SYSCONFDIR) && exists(${MKC_SYSCONFDIR}/mk.conf) +.include "${MKC_SYSCONFDIR}/mk.conf" +.elif exists(/etc/mk.conf) +.include "/etc/mk.conf" +.endif + +.if ${OPSYS:Ux} == "SunOS" +_MKC_USER != /usr/xpg4/bin/id -un +_MKC_GROUP != /usr/xpg4/bin/id -gn +.else +_MKC_USER != id -un +_MKC_GROUP != id -gn +.endif + +.if ${_MKC_USER} != root && ${OPSYS}${_MKC_USER} != "InterixAdministrator" +ROOT_USER ?= ${_MKC_USER} +ROOT_GROUP ?= ${_MKC_GROUP} +.endif + +# Define MANZ to have the man pages compressed (gzip) +#MANZ= 1 + +PREFIX ?= /usr/local + +BINDIR ?= ${PREFIX}/bin +SBINDIR ?= ${PREFIX}/sbin +FILESDIR ?= ${PREFIX}/bin +LIBEXECDIR ?= ${PREFIX}/libexec +INCSDIR ?= ${PREFIX}/include +DATADIR ?= ${PREFIX}/share +SYSCONFDIR ?= ${PREFIX}/etc +INFODIR ?= ${PREFIX}/info +MANDIR ?= ${PREFIX}/man +LIBDIR ?= ${PREFIX}/lib +SCRIPTSDIR ?= ${BINDIR} + +DOCDIR? = ${DATADIR}/doc +HTMLDOCDIR ?= ${DOCDIR}/html +HTMLDIR ?= ${MANDIR} + +BINGRP ?= ${ROOT_GROUP} +BINOWN ?= ${ROOT_USER} + +SHLIBMODE.HP-UX = ${BINMODE} +SHLIBMODE.OSF1 = ${BINMODE} +SHLIBMODE.Interix = ${BINMODE} +SHLIBMODE ?= ${SHLIBMODE.${TARGET_OPSYS}:U${NONBINMODE}} + +ROOT_GROUP.NetBSD = wheel +ROOT_GROUP.OpenBSD = wheel +ROOT_GROUP.FreeBSD = wheel +ROOT_GROUP.Darwin = wheel +ROOT_GROUP.DragonFly = wheel +ROOT_GROUP.MirBSD = wheel +ROOT_GROUP.HP-UX = bin +ROOT_GROUP.OSF1 = bin +ROOT_GROUP.Interix = +Administrators +ROOR_GROUP.Haiku = root + +ROOT_USER.HP-UX = bin +ROOT_USER.OSF1 = bin +ROOT_USER.Interix = Administrator +ROOT_USER.Haiku = user + +ROOT_USER ?= ${ROOT_USER.${OPSYS}:Uroot} +ROOT_GROUP ?= ${ROOT_GROUP.${OPSYS}:Uroot} + +BINMODE.Interix.Administrator = 775 +NONBINMODE.Interix.Administrator = 664 + +BINMODE ?= ${BINMODE.${TARGET_OPSYS}.${ROOT_USER}:U755} +NONBINMODE ?= ${BINMODE.${TARGET_OPSYS}.${ROOT_USER}:U644} +DIRMODE ?= ${BINMODE} + +MANGRP ?= ${ROOT_GROUP} +MANOWN ?= ${ROOT_USER} +MANMODE ?= ${NONBINMODE} +MANINSTALL ?= maninstall catinstall + +INFOGRP ?= ${ROOT_GROUP} +INFOOWN ?= ${ROOT_USER} +INFOMODE ?= ${NONBINMODE} + +LIBGRP ?= ${BINGRP} +LIBOWN ?= ${BINOWN} +LIBMODE ?= ${NONBINMODE} + +DOCGRP ?= ${ROOT_GROUP} +DOCOWN ?= ${ROOT_USER} +DOCMODE ?= ${NONBINMODE} + +FILESOWN ?= ${BINOWN} +FILESGRP ?= ${BINGRP} +FILESMODE ?= ${NONBINMODE} + +SCRIPTSOWN ?= ${BINOWN} +SCRIPTSGRP ?= ${BINGRP} +SCRIPTSMODE ?= ${BINMODE} + +COPY ?= -c +PRESERVE ?= +STRIPFLAG ?= -s + +MKINSTALL ?= yes + +MKCATPAGES ?= no +MKHTML ?= no +MKDOC ?= yes +MKINFO ?= yes +MKMAN ?= yes +MKSHARE ?= yes + +# +# MKOBJDIRS controls whether object dirs are created during "make all" or "make obj". +# +MKOBJDIRS ?= auto +MKRELOBJDIR ?= no + +MKPIE ?= no +USE_SSP ?= no +USE_RELRO ?= no +USE_FORT ?= no + +MKDLL ?= no +.if ${MKDLL:tl} == "only" +MKDLL = yes +MKSTATICLIB ?= no +.else +MKSTATICLIB ?= yes +.endif # MKDLL + +SHLIB_MINOR ?= 0 +.if ${MKDLL:tl} != "no" +SHLIB_MAJOR ?= 1 +.endif # MKDLL + +.if defined(SHLIB_MAJOR) +MKSHLIB ?= yes +.else +MKSHLIB ?= no +.endif # SHLIB_MAJOR + +MKPICLIB ?= no +MKPROFILELIB ?= no + +MKINSTALLDIRS ?= yes + +EXPORT_VARNAMES += MKC_CACHEDIR REC_MAKEFILES TARGETS SHORTPRJNAME SRCTOP OBJTOP + +EXPORT_DYNAMIC ?= no + +DISTCLEANFILES += ${MKC_CACHEDIR}/_mkc_* + +.include <mkc_imp.platform.sys.mk> + +###### +.SUFFIXES: .a .o .op .os .s .S .c .cc .cpp .cxx .C .F .f .r .m .y .l .cl .p .h + +.LIBS: .a + +.if ${MKPIE:U:tl} == "yes" +LDFLAGS.prog += ${LDFLAGS.pie} +CFLAGS += ${CFLAGS.pie} +CXXFLAGS += ${CXXFLAGS.pie} +.endif + +.if ${USE_SSP:U:tl} == "yes" +CFLAGS += ${CFLAGS.ssp} +CXXFLAGS += ${CXXFLAGS.ssp} +.endif + +.if ${USE_RELRO:U:tl} == "yes" +LDFLAGS.prog += ${LDFLAGS.relro} +.endif + +.if ${USE_FORT:U:tl} == "yes" +CPPFLAGS += -D_FORTIFY_SOURCE=2 +.endif + +SHRTOUT ?= no + +.if ${SHRTOUT:tl} != "no" +_MESSAGE ?= echo +_MESSAGE_V ?= : +_V ?= @ +.else +_MESSAGE ?= : +_MESSAGE_V ?= echo +_V ?= +.endif + +AR ?= ar +ARFLAGS ?= rl +RANLIB ?= ranlib +MESSAGE.ar ?= @${_MESSAGE} "AR: ${.TARGET}" + +AS ?= as +AFLAGS ?= +COMPILE.s ?= ${_V} ${CC_PREFIX} ${CC} ${AFLAGS} -c +LINK.s ?= ${_V} ${CC} ${AFLAGS} ${LDFLAGS} +MESSAGE.s ?= @${_MESSAGE} "AS: ${.IMPSRC}" + +CC ?= cc +CFLAGS ?= +COMPILE.c ?= ${_V} ${CC_PREFIX} ${CC} ${CFLAGS} ${CPPFLAGS} ${CFLAGS.warnerr} -c +LINK.c ?= ${_V} ${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} ${LDFLAGS.prog} +MESSAGE.c ?= @${_MESSAGE} "CC: ${.IMPSRC}" + +CXX ?= c++ +CXXFLAGS += ${CFLAGS} +COMPILE.cc ?= ${_V} ${CXX_PREFIX} ${CXX} ${CXXFLAGS} ${CPPFLAGS} ${CFLAGS.warnerr} -c +LINK.cc ?= ${_V} ${CXX} ${CXXFLAGS} ${CPPFLAGS} ${LDFLAGS} ${LDFLAGS.prog} +MESSAGE.cc ?= @${_MESSAGE} "CXX: ${.IMPSRC}" + +OBJC ?= ${CC} +OBJCFLAGS ?= ${CFLAGS} +COMPILE.m ?= ${_V} ${OBJC} ${OBJCFLAGS} ${CPPFLAGS} -c +LINK.m ?= ${_V} ${OBJC} ${OBJCFLAGS} ${CPPFLAGS} ${LDFLAGS} +MESSAGE.m ?= @${_MESSAGE} "OBJC: ${.IMPSRC}" + +CPP ?= cpp +CPPFLAGS ?= + +FC ?= f77 +FFLAGS ?= -O +RFLAGS ?= +COMPILE.f ?= ${_V} ${FC} ${FFLAGS} -c +LINK.f ?= ${_V} ${FC} ${FFLAGS} ${LDFLAGS} +MESSAGE.f ?= @${_MESSAGE} "FC: ${.IMPSRC}" +COMPILE.F ?= ${_V} ${FC} ${FFLAGS} ${CPPFLAGS} -c +LINK.F ?= ${_V} ${FC} ${FFLAGS} ${CPPFLAGS} ${LDFLAGS} +MESSAGE.F ?= ${MESSAGE.f} +COMPILE.r ?= ${_V} ${FC} ${FFLAGS} ${RFLAGS} -c +LINK.r ?= ${_V} ${FC} ${FFLAGS} ${RFLAGS} ${LDFLAGS} +MESSAGE.r ?= ${MESSAGE.f} + +MESSAGE.ld ?= @${_MESSAGE} "LD: ${.TARGET}" + +CLEANFILES_CMD ?= ${RM} -f +CLEANDIRS_CMD ?= ${RM} -rf + +INSTALL ?= install +UNINSTALL ?= ${RM} -f + +LEX ?= lex +LFLAGS ?= +LEX.l ?= ${_V} ${LEX} ${LFLAGS} +MESSAGE.l ?= @${_MESSAGE} "LEX: ${.IMPSRC}" + +LD.SunOS ?= /usr/ccs/bin/ld +LD.OSF1 ?= /usr/bin/ld +LD ?= ${LD.${TARGET_OPSYS}:Uld} +LDFLAGS ?= + +LN ?= ln +LN_S ?= ${LN} -s + +LORDER ?= lorder + +NM ?= nm + +MKDIR ?= mkdir + +PC ?= pc +PFLAGS ?= +COMPILE.p ?= ${_V} ${PC} ${PFLAGS} ${CPPFLAGS} -c +LINK.p ?= ${_V} ${PC} ${PFLAGS} ${CPPFLAGS} ${LDFLAGS} +MESSAGE.p ?= @${_MESSAGE} "PC: ${.IMPSRC}" + +SHELL ?= sh + +SIZE ?= size + +TSORT ?= tsort -q + +YACC ?= yacc +YFLAGS ?= +YACC.y ?= ${_V} ${YACC} ${YFLAGS} +MESSAGE.y ?= @${_MESSAGE} "YACC: ${.IMPSRC}" + +TAR ?= tar +GZIP ?= gzip +BZIP2 ?= bzip2 +ZIP ?= zip + +OBJCOPY ?= objcopy + +OBJDUMP ?= objdump + +STRIP ?= strip + +RM ?= rm + +#ADDR2LINE ?= addr2line +#READELF ?= readelf +#STRINGS ?= strings + +# C +_PN = ${PROJECTNAME} # short synonym + +.c.o: + ${MESSAGE.c} + ${COMPILE.c} ${CPPFLAGS_${_PN}} ${CFLAGS_${_PN}} \ + ${COPTS_${_PN}} -o ${.TARGET} ${.IMPSRC} +.c.op: + ${MESSAGE.c} + ${COMPILE.c} -pg ${CPPFLAGS_${_PN}} ${CFLAGS_${_PN}} \ + ${COPTS_${_PN}} -o ${.TARGET} ${.IMPSRC} +.c.os: + ${MESSAGE.c} + ${COMPILE.c} ${CFLAGS.pic} ${CPPFLAGS_${_PN}} \ + ${CFLAGS_${_PN}} ${COPTS_${_PN}} -o ${.TARGET} ${.IMPSRC} + +# C++ +.cc.o .cpp.o .cxx.o .C.o: + ${MESSAGE.cc} + ${COMPILE.cc} ${CPPFLAGS_${_PN}} ${CXXFLAGS_${_PN}} \ + ${COPTS_${_PN}} -o ${.TARGET} ${.IMPSRC} +.cc.op .C.op .cpp.op: + ${MESSAGE.cc} + ${COMPILE.cc} -pg ${CPPFLAGS_${_PN}} ${CXXFLAGS_${_PN}} \ + ${COPTS_${_PN}} -o ${.TARGET} ${.IMPSRC} +.cc.os .C.os .cpp.os: + ${MESSAGE.cc} + ${COMPILE.cc} ${CXXFLAGS.pic} ${CPPFLAGS_${_PN}} \ + ${CXXFLAGS_${_PN}} ${COPTS_${_PN}} -o ${.TARGET} ${.IMPSRC} + +# Fortran/Ratfor +.f.o: + ${MESSAGE.f} + ${COMPILE.f} ${FFLAGS_${_PN}} -o ${.TARGET} ${.IMPSRC} +.f.op: + ${MESSAGE.f} + ${COMPILE.f} -pg ${FFLAGS_${_PN}} -o ${.TARGET} ${.IMPSRC} +.f.os: + ${MESSAGE.f} + ${COMPILE.f} ${FFLAGS.pic} ${FFLAGS_${_PN}} -o ${.TARGET} ${.IMPSRC} + +#.F: +.F.o: + ${MESSAGE.F} + ${COMPILE.F} -o ${.TARGET} ${.IMPSRC} + +#.r: +.r.o: + ${MESSAGE.r} + ${COMPILE.r} -o ${.TARGET} ${.IMPSRC} + +# Pascal +.p.o: + ${MESSAGE.p} + ${COMPILE.p} -o ${.TARGET} ${.IMPSRC} + +# Assembly +.S.o .s.o: + ${MESSAGE.s} + ${COMPILE.s} -o ${.TARGET} ${.IMPSRC} +.S.op .s.op: + ${MESSAGE.s} + ${COMPILE.s} -o ${.TARGET} -pg ${.IMPSRC} +.S.os .s.os: + ${MESSAGE.s} + ${COMPILE.s} ${CAFLAGS.pic} -o ${.TARGET} ${.IMPSRC} + +# Objective-C +.m.o: + ${MESSAGE.m} + ${COMPILE.m} ${.IMPSRC} +.m.op: + ${MESSAGE.m} + ${COMPILE.m} -pg -o ${.TARGET} ${.IMPSRC} +.m.os: + ${MESSAGE.m} + ${COMPILE.m} ${CMFLAGS.pic} -o ${.TARGET} ${.IMPSRC} + +# Lex +LPREFIX ?= yy +.if ${LPREFIX} != "yy" +LFLAGS += -P${LPREFIX} +.endif +LEXLIB ?= -ll + +.l.c: + ${MESSAGE.l} + ${LEX.l} -t ${.IMPSRC} > ${.TARGET} + +# Yacc +YFLAGS += ${YPREFIX:D-p${YPREFIX}} ${YHEADER:D-d} + +.y.h: ${.TARGET:R}.c +.y.c: + ${MESSAGE.y} + ${YACC.y} ${.IMPSRC} + ${_V}mv y.tab.c ${.TARGET} +.ifdef YHEADER + ${_V}mv y.tab.h ${.TARGET:R}.h +.endif + +########### +.include <mkc_imp.obj.mk> + +########### +.if !empty(_srcsall:U:M*.y) +MKC_REQUIRE_PROGS += ${YACC:[1]} +MKC_PROG.id.${YACC:[1]:S/+/x/g} = yacc +.endif + +.if !empty(_srcsall:U:M*.l) +MKC_REQUIRE_PROGS += ${LEX:[1]} +MKC_PROG.id.${LEX:[1]:S/+/x/g} = lex +.endif + +.if !empty(_srcsall:U:M*.c) || !empty(_srcsall:U:M*.l) || !empty(_srcsall:U:M*.y) +MKC_REQUIRE_PROGS += ${CC:[1]} +MKC_PROG.id.${CC:[1]:S|+|x|g} = cc +.endif + +.if !empty(_srcsall:U:M*.cc) || !empty(_srcsall:U:M*.C) || !empty(_srcsall:U:M*.cxx) || !empty(_srcsall:U:M*.cpp) +MKC_REQUIRE_PROGS += ${CXX:[1]} +MKC_PROG.id.${CXX:[1]:S/+/x/g} = cxx +.endif + +.if !empty(_srcsall:U:M*.f) +MKC_REQUIRE_PROGS += ${FC:[1]} +MKC_PROG.id.${FC:[1]:S/+/x/g} = fc +.endif + +.if !empty(_srcsall:U:M*.p) +MKC_REQUIRE_PROGS += ${PC:[1]} +MKC_PROG.id.${PC:[1]:S/+/x/g} = pc +.endif + +########### +.PHONY : print-values +print-values : +.for v in ${VARS} + @printf "%s=%s\n" ${v} ${${v}:Q} +.endfor + +.PHONY : print-values2 +print-values2 : +.for v in ${VARS} + @printf "%s\n" ${${v}:Q} +.endfor + +########### +.PHONY: realall realerrorcheck + +__errorcheck: .USE + @if test -n '${MKC_ERR_MSG}'; then \ + for msg in '' ${MKC_ERR_MSG}; do \ + fn=`printf '%s\n' "$$msg" | sed -n 's/^%%%: //p'`; \ + if test -n "$$fn"; then \ + awk '{print "ERROR: " $$0}' "$$fn"; ex=1; \ + elif test -n "$$msg"; then printf '%s\n' "$$msg"; ex=1; \ + fi; \ + done; \ + exit $$ex; \ + fi + +realall : realerrorcheck +realerrorcheck: __errorcheck + +########### + +.if defined(MKC_REQD) && defined(MKC_VERSION) +_mkc_version_ok != mkc_check_version ${MKC_REQD} ${MKC_VERSION} +.if !${_mkc_version_ok} +MKC_ERR_MSG += "ERROR: We need mk-configure v.${MKC_REQD} while ${MKC_VERSION} is detected" +MKCHECKS = no +.endif +.endif + +########### + +LDLIBS = ${LDFLAGS} ${LDADD} + +########### +# skip uninstalling files and creating destination dirs for mkc.subprj.mk +.if !defined(SUBPRJ) + +uninstall: + -${UNINSTALL} ${UNINSTALLFILES} + +installdirs: + for d in _ ${INSTALLDIRS:O:u:S|/.$||}; do \ + test "$$d" = _ || ${INSTALL} -d -m ${DIRMODE} "$$d"; \ + done + +filelist: + @for d in ${UNINSTALLFILES:O:u}; do \ + echo $$d; \ + done + +test: + +.endif # SUBPRJ + +TARGETS += all all install clean cleandir depend test \ + installdirs uninstall errorcheck filelist obj +TARGETS := ${TARGETS:O:u} + +# Make sure all of the standard targets are defined, even if they do nothing. +.PHONY: ${TARGETS} realinstall realinstall2 realall +${TARGETS} realinstall realinstall2 realall: + +distclean: cleandir + +all: realall + +.if ${MKINSTALLDIRS:tl} == "yes" +install: installdirs .WAIT realinstall .WAIT realinstall2 +.else +install: realinstall .WAIT realinstall2 +.endif + + +########### + +VERBOSE_ECHO ?= echo +### for mkc.subdir.mk and mkc.subprj.mk +__recurse: .USE + @targ=${.TARGET:S/^nodeps-//:C/-.*$//}; \ + dir=${.TARGET:S/^nodeps-//:C/^[^-]*-//}; \ + if ! test -f ${.CURDIR}/$$dir/Makefile; then exit 0; fi; \ + test "$${targ}_${MKINSTALL:tl}" = 'install_no' && exit 0; \ + test "$${targ}_${MKINSTALL:tl}" = 'installdirs_no' && exit 0; \ + ${export_cmd} \ + set -e; \ + ${VERBOSE_ECHO} ================================================== 1>&2;\ + case "$$dir" in /*) \ + ${VERBOSE_ECHO} "$$targ ===> $$dir" 1>&2; \ + cd "$$dir"; \ + env "_THISDIR_=$$dir/" ${MAKE} ${MAKEFLAGS} $$targ; \ + ;; \ + *) \ + ${VERBOSE_ECHO} "$$targ ===> ${_THISDIR_}$$dir" 1>&2; \ + cd "${.CURDIR}/$$dir"; \ + env "_THISDIR_=${_THISDIR_}$$dir/" ${MAKE} ${MAKEFLAGS} $$targ; \ + ;; \ + esac + +########### + +.endif # __initialized__ diff --git a/mk/mkc.lib.mk b/mk/mkc.lib.mk new file mode 100644 index 0000000..299adb6 --- /dev/null +++ b/mk/mkc.lib.mk @@ -0,0 +1,2 @@ +_top_mk := mkc.lib.mk +.include <mkc.mk> diff --git a/mk/mkc.minitest.mk b/mk/mkc.minitest.mk new file mode 100644 index 0000000..e62be8a --- /dev/null +++ b/mk/mkc.minitest.mk @@ -0,0 +1,26 @@ +# Copyright (c) 2009-2013 by Aleksey Cheusov +# +# See LICENSE file in the distribution. +############################################################ + +TEST_PREREQS ?= all + +.PHONY : test +test: ${TEST_PREREQS} + @echo 'Testing ${.CURDIR}... ' 1>&2; \ + set -e; cd ${.CURDIR}; \ + tmp_out=${.OBJDIR}/${.CURDIR:T}.test.out; \ + ${RM} -f $$tmp_out; \ + ${MAKE} ${MAKEFLAGS} test_output > $$tmp_out.tmp; \ + mv $$tmp_out.tmp $$tmp_out; \ + if test -f ${.CURDIR}/expect.${OPSYS}.out; then \ + expect=${.CURDIR}/expect.${OPSYS}.out; \ + else \ + expect=${.CURDIR}/expect.out; \ + fi; \ + diff $$expect $$tmp_out && \ + echo ' succeeded' 1>&2 || \ + { echo ' FAILED' 1>&2; false; } + +CLEANFILES += ${.OBJDIR}/${.CURDIR:T}.test.out +#DISTCLEANFILES+= ${.OBJDIR}/${.CURDIR:T}.test.out.tmp diff --git a/mk/mkc.mk b/mk/mkc.mk new file mode 100644 index 0000000..3528e5a --- /dev/null +++ b/mk/mkc.mk @@ -0,0 +1,21 @@ +# Copyright (c) 2013 by Aleksey Cheusov +# +# See LICENSE file in the distribution. +############################################################ + +.ifndef _MKC_MK +_MKC_MK := 1 + +init_make_level ?= 0 + +.if defined(SRCTOP) && ${SRCTOP:U} != ${.CURDIR} && ${.MAKE.LEVEL} == ${init_make_level} +MKC_CACHEDIR ?= ${SRCTOP} +.export MKC_CACHEDIR +.MAIN: all +.DEFAULT: + @set -e; cd ${SRCTOP}; ${MAKE} ${MAKEFLAGS} ${.TARGET}-${.CURDIR:S,${SRCTOP}/,,} +.else +.include <mkc_imp.mk> +.endif #SRCTOP + +.endif # _MKC_MK diff --git a/mk/mkc.prog.mk b/mk/mkc.prog.mk new file mode 100644 index 0000000..ee33237 --- /dev/null +++ b/mk/mkc.prog.mk @@ -0,0 +1,2 @@ +_top_mk := mkc.prog.mk +.include <mkc.mk> diff --git a/mk/mkc.subdir.mk b/mk/mkc.subdir.mk new file mode 100644 index 0000000..d13879d --- /dev/null +++ b/mk/mkc.subdir.mk @@ -0,0 +1,2 @@ +_top_mk := mkc.subdir.mk +.include <mkc.mk> diff --git a/mk/mkc.subprj.mk b/mk/mkc.subprj.mk new file mode 100644 index 0000000..ef6e0b2 --- /dev/null +++ b/mk/mkc.subprj.mk @@ -0,0 +1,2 @@ +_top_mk := mkc.subprj.mk +.include <mkc.mk> diff --git a/mk/mkc_imp.arch.mk b/mk/mkc_imp.arch.mk new file mode 100644 index 0000000..fda3999 --- /dev/null +++ b/mk/mkc_imp.arch.mk @@ -0,0 +1,38 @@ +# Copyright (c) 2010 by Aleksey Cheusov +# +# See LICENSE file in the distribution. +############################################################ + +.ifndef _MKC_IMP_ARCH_MK +_MKC_IMP_ARCH_MK := 1 + +rnd != echo $$$$ +destdir = ${TMPDIR:U/tmp}/mkc.${rnd} +basefile = ${.CURDIR}/${PROJECTNAME} + +.PHONY: bin_cleanup bin_tar bin_targz bin_tarbz2 + +bin_cleanup: + set -e; ${RM} -rf ${destdir}; ${MKDIR} -m 0700 ${destdir}; \ + ${MAKE} ${MAKEFLAGS} all install DESTDIR=${destdir} + +bin_tar: bin_cleanup + set -e; ${RM} -f ${basefile}.tar; cd ${destdir}; \ + ${TAR} -cf ${basefile}.tar .; cd /; ${RM} -rf ${destdir} + +bin_targz: bin_tar + ${GZIP} ${basefile}.tar + +bin_tarbz2: bin_tar + ${BZIP2} ${basefile}.tar + +bin_zip: bin_cleanup + set -e; ${RM} -f ${basefile}.zip; cd ${destdir}; \ + ${ZIP} -r ${basefile}.zip .; ${RM} -rf ${destdir} + +bin_deb: DEBIAN/control bin_cleanup + set -e; cp -rp DEBIAN ${destdir}; ${RM} -rf ${destdir}/DEBIAN/CVS; \ + dpkg-deb -b ${destdir} ${.CURDIR:T:S/_/-/g}.deb; \ + ${RM} -rf ${destdir} + +.endif # _MKC_IMP_ARCH_MK diff --git a/mk/mkc_imp.dep.mk b/mk/mkc_imp.dep.mk new file mode 100644 index 0000000..bf5c512 --- /dev/null +++ b/mk/mkc_imp.dep.mk @@ -0,0 +1,96 @@ +# Copyright (c) 2010-1013 by Aleksey Cheusov +# Copyright (c) 1994-2009 The NetBSD Foundation, Inc. + +###################################################################### +.ifndef _MKC_IMP_DEP_MK +_MKC_IMP_DEP_MK := 1 + +DISTCLEANFILES += .depend ${__DPSRCS.d} ${CLEANDEPEND} + +##### Basic targets +.PHONY: _beforedepend depend +_beforedepend .depend: # ensure existence + +.ORDER: _beforedepend .depend +depend: _beforedepend .depend + +##### Default values +MKDEP ?= mkdep +MKDEP_SUFFIXES ?= .o .os .op + +##### Build rules +# some of the rules involve .h sources, so remove them from mkdep line + +.if defined(_SRCS_ALL) +__DPSRCS.all = ${_SRCS_ALL:C/\.(c|m|s|S|C|cc|cpp|cxx)$/.d/} \ + ${DPSRCS:C/\.(c|m|s|S|C|cc|cpp|cxx)$/.d/} +__DPSRCS.d = ${__DPSRCS.all:O:u:M*.d} +__DPSRCS.notd = ${__DPSRCS.all:O:u:N*.d} + +_beforedepend: ${DPSRCS} + +MESSAGE.dep ?= @${_MESSAGE} "DEP: ${.TARGET}" + +.NOPATH: .depend ${__DPSRCS.d} + +.if !empty(__DPSRCS.d) +${__DPSRCS.d}: ${__DPSRCS.notd} ${DPSRCS} +.endif # __DPSRCS.d + +.if ${MKDEP_TYPE:U} == "nbmkdep" +ddash=-- +.else +ddash= +.endif + +.if ${MKDEP_TYPE:U} == "makedepend" +MKDEP.c = @${MAKEDEPEND} -f- ${ddash} ${MKDEPFLAGS} \ + ${CFLAGS:C/-([IDU])[ ]*/-\1/Wg:M-[IDU]*} ${CPPFLAGS} > ${.TARGET} +MKDEP.m = @${MKDEP} -f- ${ddash} ${MKDEPFLAGS} \ + ${OBJCFLAGS:C/-([IDU])[ ]*/-\1/Wg:M-[IDU]*} ${CPPFLAGS} > ${.TARGET} +MKDEP.cc = @${MKDEP} -f- ${ddash} ${MKDEPFLAGS} \ + ${CXXFLAGS:C/-([IDU])[ ]*/-\1/Wg:M-[IDU]*} ${CPPFLAGS} > ${.TARGET} +MKDEP.s = @${MKDEP} -f- ${ddash} ${MKDEPFLAGS} \ + ${AFLAGS:C/-([IDU])[ ]*/-\1/Wg:M-[IDU]*} ${CPPFLAGS} > ${.TARGET} +.else +MKDEP.c = @${MKDEP} -f ${.TARGET} ${ddash} ${MKDEPFLAGS} \ + ${CFLAGS:C/-([IDU])[ ]*/-\1/Wg:M-[IDU]*} ${CPPFLAGS} +MKDEP.m = @${MKDEP} -f ${.TARGET} ${ddash} ${MKDEPFLAGS} \ + ${OBJCFLAGS:C/-([IDU])[ ]*/-\1/Wg:M-[IDU]*} ${CPPFLAGS} +MKDEP.cc = @${MKDEP} -f ${.TARGET} ${ddash} ${MKDEPFLAGS} \ + ${CXXFLAGS:C/-([IDU])[ ]*/-\1/Wg:M-[IDU]*} ${CPPFLAGS} +MKDEP.s = @${MKDEP} -f ${.TARGET} ${ddash} ${MKDEPFLAGS} \ + ${AFLAGS:C/-([IDU])[ ]*/-\1/Wg:M-[IDU]*} ${CPPFLAGS} +.endif + +.depend: ${__DPSRCS.d} + ${MESSAGE.dep} + @${RM} -f ${.TARGET} +.if ${MKDEP_TYPE:U} == "nbmkdep" + @${MKDEP} -d -f ${.TARGET} -s ${MKDEP_SUFFIXES:Q} ${__DPSRCS.d} +.else + @sed 's/^\([^ ]*\)[.]o\(.*\)$$/${MKDEP_SUFFIXES:C,^,\\\\1,}\2/' ${__DPSRCS.d} > ${.TARGET} +.endif + +.SUFFIXES: .d .s .S .c .C .cc .cpp .cxx .m + +.c.d: + ${MESSAGE.dep} + @${MKDEP.c} ${.IMPSRC} + +.m.d: + ${MESSAGE.dep} + @${MKDEP.m} ${.IMPSRC} + +.s.d .S.d: + ${MESSAGE.dep} + @${MKDEP.s} ${.IMPSRC} + +.C.d .cc.d .cpp.d .cxx.d: + ${MESSAGE.dep} + @${MKDEP.cc} ${.IMPSRC} + +.endif # defined(SRCS) + +###################################################################### +.endif # _MKC_IMP_DEP_MK diff --git a/mk/mkc_imp.files.mk b/mk/mkc_imp.files.mk new file mode 100644 index 0000000..e1cb16f --- /dev/null +++ b/mk/mkc_imp.files.mk @@ -0,0 +1,49 @@ +# Copyright (c) 2009-2010 by Aleksey Cheusov +# Copyright (c) 1994-2009 The NetBSD Foundation, Inc. +# Copyright (c) 1988, 1989, 1993 The Regents of the University of California +# Copyright (c) 1988, 1989 by Adam de Boor +# Copyright (c) 1989 by Berkeley Softworks +# +# See LICENSE file in the distribution. +############################################################ + +.if !defined(_BSD_FILES_MK) +_BSD_FILES_MK := 1 + +.include <mkc.init.mk> + +.PHONY: filesinstall +realinstall: filesinstall + +.if defined(FILES) && !empty(FILES) + +realall: ${FILES} + +.if ${MKINSTALL:tl} == "yes" +destination_files = ${FILES:@F@${DESTDIR}${FILESDIR_${F}:U${FILESDIR}}/${FILESNAME_${F}:U${FILESNAME:U${F:T}}}@} + +filesinstall: ${destination_files} +.PRECIOUS: ${destination_files} +.PHONY: ${destination_files} + +__fileinstall: .USE + ${INSTALL} ${RENAME} ${PRESERVE} ${COPY} \ + -o ${FILESOWN_${.ALLSRC:T}:U${FILESOWN}} \ + -g ${FILESGRP_${.ALLSRC:T}:U${FILESGRP}} \ + -m ${FILESMODE_${.ALLSRC:T}:U${FILESMODE}} \ + ${.ALLSRC} ${.TARGET} + +.for F in ${FILES:O:u} +${DESTDIR}${FILESDIR_${F}:U${FILESDIR}}/${FILESNAME_${F}:U${FILESNAME:U${F:T}}}: ${F} __fileinstall +.endfor + +UNINSTALLFILES += ${destination_files} +INSTALLDIRS += ${destination_files:H} +.endif # MKINSTALL +.endif # FILES + +.if !target(filesinstall) +filesinstall: +.endif + +.endif # _BSD_FILES_MK diff --git a/mk/mkc_imp.final.mk b/mk/mkc_imp.final.mk new file mode 100644 index 0000000..e7fdb49 --- /dev/null +++ b/mk/mkc_imp.final.mk @@ -0,0 +1,58 @@ +# Copyright (c) 2009-2012 by Aleksey Cheusov +# +# See LICENSE file in the distribution. +############################################################ + +.ifndef MKC_IMP.FINAL.MK +MKC_IMP.FINAL.MK = 1 + +LDADD += ${DPLIBS} # DPLIBS is deprecated (2012-08-13) +LDADD += ${LDADD_${PROJECTNAME}} + +LDFLAGS += ${LDFLAGS_${PROJECTNAME}} + +.if !empty(SRCS:U:M*.l) +LDADD += ${LEXLIB} +.endif + +.for i in ${EXPORT_VARNAMES} +.if empty(NOEXPORT_VARNAMES:U:M${i}) +export_cmd += ${i}=${${i}:Q}; export ${i}; +.endif +.endfor + +.if ${MKRELOBJDIR} == "yes" && defined(SRCTOP) +export_cmd += MAKEOBJDIR=${.OBJDIR}/${.TARGET:C/^.*-//}; \ + export MAKEOBJDIR; ${MKDIR} -p $${MAKEOBJDIR}; +.endif + +########## +.if !commands(clean) +clean: mkc_clean +.endif + +mkc_clean: +.if ${CLEANFILES:U} != "" + -${CLEANFILES_CMD} ${CLEANFILES} +.endif +.if ${CLEANDIRS:U} != "" + -${CLEANDIRS_CMD} ${CLEANDIRS} +.endif + +##### +distclean: cleandir +.if !commands(cleandir) +cleandir: mkc_cleandir +.endif + +mkc_cleandir: +.if ${CLEANFILES:U} != "" || ${DISTCLEANFILES:U} != "" + -${CLEANFILES_CMD} ${DISTCLEANFILES} ${CLEANFILES} +.endif +.if ${CLEANDIRS:U} != "" || ${DISTCLEANDIRS:U} != "" + -${CLEANDIRS_CMD} ${DISTCLEANDIRS} ${CLEANDIRS} +.endif + +########## + +.endif # MKC_IMP.FINAL.MK diff --git a/mk/mkc_imp.inc.mk b/mk/mkc_imp.inc.mk new file mode 100644 index 0000000..0f0a8ba --- /dev/null +++ b/mk/mkc_imp.inc.mk @@ -0,0 +1,37 @@ +# Copyright (c) 2009-2010 by Aleksey Cheusov +# Copyright (c) 1994-2009 The NetBSD Foundation, Inc. +# Copyright (c) 1988, 1989, 1993 The Regents of the University of California +# Copyright (c) 1988, 1989 by Adam de Boor +# Copyright (c) 1989 by Berkeley Softworks +# +# See LICENSE file in the distribution. +############################################################ + +.PHONY: incinstall +realinstall: incinstall +incinstall: # ensure existence + +.if defined(INCS) +INCSSRCDIR ?= . +CPPFLAGS += -I${INCSSRCDIR} + +.if ${MKINSTALL:tl} == "yes" +destination_incs = ${INCS:@I@${DESTDIR}${INCSDIR}/$I@} + +incinstall: ${destination_incs} +.PRECIOUS: ${destination_incs} +.PHONY: ${destination_incs} + +__incinstall: .USE + ${INSTALL} ${RENAME} ${PRESERVE} ${COPY} \ + -o ${BINOWN} \ + -g ${BINGRP} -m ${NONBINMODE} ${.ALLSRC} ${.TARGET} + +.for I in ${INCS:O:u} +${DESTDIR}${INCSDIR}/$I: ${"${INCSSRCDIR}" != ".":?${INCSSRCDIR}/$I:$I} __incinstall +.endfor + +UNINSTALLFILES += ${destination_incs} +INSTALLDIRS += ${destination_incs:H} +.endif # MKINSTALL +.endif # INCS diff --git a/mk/mkc_imp.info.mk b/mk/mkc_imp.info.mk new file mode 100644 index 0000000..3a97ca5 --- /dev/null +++ b/mk/mkc_imp.info.mk @@ -0,0 +1,67 @@ +# Copyright (c) 2009-2010 by Aleksey Cheusov +# Copyright (c) 1994-2009 The NetBSD Foundation, Inc. +# Copyright (c) 1988, 1989, 1993 The Regents of the University of California +# Copyright (c) 1988, 1989 by Adam de Boor +# Copyright (c) 1989 by Berkeley Softworks +# +# See LICENSE file in the distribution. +############################################################ + +.if !defined(_MKC_IMP_INFO_MK) && defined(TEXINFO) +_MKC_IMP_INFO_MK := 1 + +.include <mkc.init.mk> + +MAKEINFO ?= makeinfo +INFOFLAGS ?= +INSTALL_INFO ?= install-info + +.PHONY: infoinstall + +.SUFFIXES: .txi .texi .texinfo .info + +MESSAGE.texinfo ?= @${_MESSAGE} "TEXINFO: ${.TARGET}" + +.txi.info .texi.info .texinfo.info: + ${MESSAGE.texinfo} + ${_V}${MAKEINFO} ${INFOFLAGS} --no-split -o $@ $< + +.if defined(TEXINFO) && !empty(TEXINFO) +realall: ${TEXINFO} +INFOFILES = ${TEXINFO:S/.texinfo/.info/g:S/.texi/.info/g:S/.txi/.info/g} +.NOPATH: ${INFOFILES} + +.if ${MKINFO:tl} != "no" +realall: ${INFOFILES} + +CLEANFILES += ${INFOFILES} + +destination_infos = ${INFOFILES:@F@${DESTDIR}${INFODIR_${F}:U${INFODIR}}/${INFONAME_${F}:U${INFONAME:U${F:T}}}@} + +infoinstall:: ${destination_infos} +.PRECIOUS: ${destination_infos} +.PHONY: ${destination_infos} + +__infoinstall: .USE + ${INSTALL} ${RENAME} ${PRESERVE} ${COPY} ${INSTPRIV} \ + -o ${INFOOWN_${.ALLSRC:T}:U${INFOOWN}} \ + -g ${INFOGRP_${.ALLSRC:T}:U${INFOGRP}} \ + -m ${INFOMODE_${.ALLSRC:T}:U${INFOMODE}} \ + ${.ALLSRC} ${.TARGET} + @${INSTALL_INFO} --remove --info-dir=${DESTDIR}${INFODIR} ${.TARGET} + ${INSTALL_INFO} --info-dir=${DESTDIR}${INFODIR} ${.TARGET} + +.if ${MKINSTALL:tl} == "yes" +realinstall: infoinstall +.for F in ${INFOFILES:O:u} +${DESTDIR}${INFODIR_${F}:U${INFODIR}}/${INFONAME_${F}:U${INFONAME:U${F:T}}}: ${F} __infoinstall +.endfor # F + +UNINSTALLFILES += ${destination_infos} +INSTALLDIRS += ${destination_infos:H} +.endif # MKINSTALL +.endif # MKINFO + +.endif # TEXINFO + +.endif # _MKC_IMP_INFO_MK diff --git a/mk/mkc_imp.intexts.mk b/mk/mkc_imp.intexts.mk new file mode 100644 index 0000000..cdfb2a4 --- /dev/null +++ b/mk/mkc_imp.intexts.mk @@ -0,0 +1,52 @@ +# Copyright (c) 2009-2010 by Aleksey Cheusov +# +# See LICENSE file in the distribution. +############################################################ + +# Given a list of files in INFILES or INSCRIPTS mkc.intexts.mk +# generates them from appropriate *.in files replacing @prefix@, +# @sysconfdir@, @libdir@, @bindir@, @sbindir@, @datadir@ etc. with +# real ${PREFIX}, ${SYSCONFDIR} etc. See examples/ projects. + +.ifndef _MKC_IMP_INTEXTS_MK +_MKC_IMP_INTEXTS_MK := 1 + +MESSAGE.gen ?= @${_MESSAGE} "GEN: ${.TARGET}" + +INTEXTS_SED += -e 's,@sysconfdir@,${SYSCONFDIR},g' +INTEXTS_SED += -e 's,@libdir@,${LIBDIR},g' +INTEXTS_SED += -e 's,@libexecdir@,${LIBEXECDIR},g' +INTEXTS_SED += -e 's,@prefix@,${PREFIX},g' +INTEXTS_SED += -e 's,@bindir@,${BINDIR},g' +INTEXTS_SED += -e 's,@sbindir@,${SBINDIR},g' +INTEXTS_SED += -e 's,@datadir@,${DATADIR},g' +INTEXTS_SED += -e 's,@mandir@,${MANDIR},g' +INTEXTS_SED += -e 's,@incsdir@,${INCSDIR},g' + +.if !make(clean) && !make(cleandir) && !make(distclean) +.for _pattern _repl in ${INTEXTS_REPLS} +INTEXTS_SED += -e 's,@${_pattern}@,${_repl},g' +.endfor +.endif + +.for i in ${INFILES} +.NOPATH: ${i:T} +${i:T} : ${i}.in + ${MESSAGE.gen} + ${_V} sed ${INTEXTS_SED} ${.ALLSRC} > ${.TARGET} && \ + chmod 0644 ${.TARGET} +.endfor + +.for i in ${INSCRIPTS} +.NOPATH: ${i:T} +${i:T} : ${i}.in + ${MESSAGE.gen} + ${_V} sed ${INTEXTS_SED} ${.ALLSRC} > ${.TARGET} && \ + chmod 0755 ${.TARGET} +.endfor + +CLEANFILES += ${INSCRIPTS:T} ${INFILES:T} +realall: ${INSCRIPTS:T} ${INFILES:T} + +###################################################################### +.endif # _MKC_IMP_INTEXTS_MK diff --git a/mk/mkc_imp.lib.mk b/mk/mkc_imp.lib.mk new file mode 100644 index 0000000..b7977f6 --- /dev/null +++ b/mk/mkc_imp.lib.mk @@ -0,0 +1,179 @@ +# Copyright (c) 2009-2010 by Aleksey Cheusov +# Copyright (c) 1994-2009 The NetBSD Foundation, Inc. +# Copyright (c) 1988, 1989, 1993 The Regents of the University of California +# Copyright (c) 1988, 1989 by Adam de Boor +# Copyright (c) 1989 by Berkeley Softworks +# +# See LICENSE file in the distribution. +############################################################ + +.if !defined(_MKC_IMP_LIB_MK) +_MKC_IMP_LIB_MK := 1 + +.PHONY: libinstall +.if ${MKINSTALL:tl} == "yes" +realinstall: libinstall +INSTALLDIRS += ${DESTDIR}${LIBDIR} +UNINSTALLFILES += ${UNINSTALLFILES.lib} +.endif # MKINSTALL + +# Set PICFLAGS to cc flags for producing position-independent code, +# if not already set. Includes -DPIC, if required. + +# Data-driven table using make variables to control how shared libraries +# are built for different platforms and object formats. +# OBJECT_FMT: currently either "ELF" or "a.out", from <bsd.own.mk> +# LDFLAGS.soname: Flags to tell ${LD} to emit shared library. +# with ELF, also set shared-lib version for ld.so. +# +# FFLAGS.pic: flags for ${FC} to compile .[fF] files to .os objects. +# CPPICFLAGS: flags for ${CPP} to preprocess .[sS] files for ${AS} +# CFLAGS.pic: flags for ${CC} to compile .[cC] files to .os objects. +# CAFLAGS.pic flags for {$CC} to compiling .[Ss] files +# (usually just ${CPPFLAGS.pic} ${CFLAGS.pic}) +# AFLAGS.pic: flags for ${AS} to assemble .[sS] to .os objects. + +CFLAGS += ${COPTS} +FFLAGS += ${FOPTS} + +OBJS += ${SRCS:N*.h:N*.sh:T:R:S/$/.o/g} +SOBJS = ${OBJS:.o=.os} +POBJS = ${OBJS:.o=.op} + +.if ${MKSTATICLIB:tl} != "no" +_LIBS += lib${LIB}.a +.endif + +.if ${MKPROFILELIB:tl} != "no" +_LIBS += lib${LIB}_p.a +.endif + +.if ${MKPICLIB:tl} != "no" +_LIBS += lib${LIB}_pic.a +.endif # MKPICLIB + +.if ${MKSHLIB:tl} != "no" +.if ${MKDLL:tl} == "no" +SHLIBFN = lib${LIB}${SHLIB_EXTFULL} +.else +SHLIBFN = ${LIB}${DLL_EXT} +.endif +_LIBS += ${SHLIBFN} +.endif + +.NOPATH: ${_LIBS} + +realall: ${SRCS} ${_LIBS} + +_SRCS_ALL = ${SRCS} + +__archivebuild: .USE + @${RM} -f ${.TARGET} + ${MESSAGE.ar} + ${_V} ${AR} cq ${.TARGET} ${.ALLSRC}; \ + ${RANLIB} ${.TARGET} + +__archiveinstall: .USE + ${INSTALL} ${RENAME} ${PRESERVE} ${COPY} -o ${LIBOWN} \ + -g ${LIBGRP} -m ${LIBMODE} ${.ALLSRC} ${.TARGET} + +DPSRCS += ${SRCS:M*.l:.l=.c} ${SRCS:M*.y:.y=.c} +CLEANFILES += ${DPSRCS} +.if defined(YHEADER) +CLEANFILES += ${SRCS:M*.y:.y=.h} +.endif + +lib${LIB}.a:: ${OBJS} __archivebuild + @${_MESSAGE_V} "building standard ${LIB} library" + +lib${LIB}_p.a:: ${POBJS} __archivebuild + @${_MESSAGE_V} "building profiled ${LIB} library" + +lib${LIB}_pic.a:: ${SOBJS} __archivebuild + @${_MESSAGE_V} "building shared object ${LIB} library" + +${SHLIBFN}: ${SOBJS} ${DPADD} +.if !commands(${SHLIBFN}) + @${_MESSAGE_V} building shared ${LIB} library \(version ${SHLIB_FULLVERSION}\) + @${RM} -f ${.TARGET} + @${_MESSAGE} "LD: ${.TARGET}" + ${_V} $(LDREAL) ${LDFLAGS.shlib} -o ${.TARGET} \ + ${SOBJS} ${LDFLAGS} ${LDADD} +.if ${OBJECT_FMT} == "ELF" && ${MKDLL:tl} == "no" + @${LN_S} -f ${SHLIBFN} lib${LIB}${SHLIB_EXT} + @${LN_S} -f ${SHLIBFN} lib${LIB}${SHLIB_EXT1} +.endif # ELF +.endif # !commands(...) + +CLEANFILES += \ + ${OBJS} ${POBJS} ${SOBJS} \ + lib${LIB}${SHLIB_EXT} lib${LIB}${SHLIB_EXT1} \ + lib${LIB}${SHLIB_EXT2} lib${LIB}${SHLIB_EXT3} ${SHLIBFN} + +.if !target(libinstall) +# Make sure it gets defined +libinstall:: + + # MKSTATICLIB +.if ${MKSTATICLIB:tl} != "no" +libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}.a +.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}.a +.PHONY: ${DESTDIR}${LIBDIR}/lib${LIB}.a +UNINSTALLFILES.lib += ${DESTDIR}${LIBDIR}/lib${LIB}.a +CLEANFILES += lib${LIB}.a + +${DESTDIR}${LIBDIR}/lib${LIB}.a: lib${LIB}.a __archiveinstall +.endif + + # MKPROFILELIB +.if ${MKPROFILELIB:tl} != "no" +libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}_p.a +.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}_p.a +.PHONY: ${DESTDIR}${LIBDIR}/lib${LIB}_p.a +UNINSTALLFILES.lib += ${DESTDIR}${LIBDIR}/lib${LIB}_p.a +CLEANFILES += lib${LIB}_p.a + +${DESTDIR}${LIBDIR}/lib${LIB}_p.a: lib${LIB}_p.a __archiveinstall +.endif + + # MKPICLIB +.if ${MKPICLIB:tl} != "no" +CLEANFILES += lib${LIB}_pic.a +.endif + +.if ${MKPICLIB:tl} != "no" +libinstall:: ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a +.PRECIOUS: ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a +.PHONY: ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a +UNINSTALLFILES.lib += ${DESTDIR}${LIBDIR}/lib${LIB}_pic.a + +${DESTDIR}${LIBDIR}/lib${LIB}_pic.a: lib${LIB}_pic.a __archiveinstall +.endif + + # MKSHLIB +.if ${MKSHLIB:tl} != "no" +libinstall:: ${DESTDIR}${LIBDIR}/${SHLIBFN} +.PRECIOUS: ${DESTDIR}${LIBDIR}/${SHLIBFN} +.PHONY: ${DESTDIR}${LIBDIR}/${SHLIBFN} +UNINSTALLFILES.lib += ${DESTDIR}${LIBDIR}/${SHLIBFN} +.if ${MKDLL:tl} == "no" +UNINSTALLFILES.lib += ${DESTDIR}${LIBDIR}/lib${LIB}${SHLIB_EXT} \ + ${DESTDIR}${LIBDIR}/lib${LIB}${SHLIB_EXT1} +.endif + +${DESTDIR}${LIBDIR}/${SHLIBFN}: ${SHLIBFN} + ${INSTALL} ${RENAME} ${PRESERVE} ${COPY} -o ${LIBOWN} \ + -g ${LIBGRP} -m ${SHLIBMODE} ${.ALLSRC} ${.TARGET} +.if ${OBJECT_FMT} == "a.out" && !defined(DESTDIR) && ${MKDLL:tl} == "no" + /sbin/ldconfig -m ${LIBDIR} +.endif +.if ${OBJECT_FMT} == "ELF" && ${MKDLL:tl} == "no" + ${LN_S} -f ${SHLIBFN} \ + ${DESTDIR}${LIBDIR}/lib${LIB}${SHLIB_EXT1} + ${LN_S} -f ${SHLIBFN} \ + ${DESTDIR}${LIBDIR}/lib${LIB}${SHLIB_EXT} +.endif +.endif +.endif + +.endif #_MKC_IMP_LIB_MK diff --git a/mk/mkc_imp.links.mk b/mk/mkc_imp.links.mk new file mode 100644 index 0000000..c9f6eb3 --- /dev/null +++ b/mk/mkc_imp.links.mk @@ -0,0 +1,35 @@ +# Copyright (c) 2009-2013 by Aleksey Cheusov +# +# See LICENSE file in the distribution. +############################################################ + +.if !defined(_MKC_IMP_LINKS_MK) +_MKC_IMP_LINKS_MK := 1 + +.PHONY: linksinstall +linksinstall: + +realinstall2: linksinstall + +.if ${MKINSTALL:tl} == "yes" + +linksinstall: +.for l r in ${LINKS} + ${RM} -f ${DESTDIR}${r}; ${LN} ${DESTDIR}${l} ${DESTDIR}${r} +.endfor +.for l r in ${SYMLINKS} + ${RM} -f ${DESTDIR}${r}; ${LN_S} ${l} ${DESTDIR}${r} +.endfor + +.for l r in ${LINKS} +UNINSTALLFILES += ${DESTDIR}${r} +INSTALLDIRS += ${DESTDIR}${r:H} +.endfor + +.for l r in ${SYMLINKS} +UNINSTALLFILES += ${DESTDIR}${r} +INSTALLDIRS += ${DESTDIR}${r:H} +.endfor + +.endif # MKINSTALL=yes +.endif # _MKC_IMP_LINKS_MK diff --git a/mk/mkc_imp.lua.mk b/mk/mkc_imp.lua.mk new file mode 100644 index 0000000..0c8f6d8 --- /dev/null +++ b/mk/mkc_imp.lua.mk @@ -0,0 +1,61 @@ +# Copyright (c) 2010 by Aleksey Cheusov +# +# See LICENSE file in the distribution. +############################################################ + +.for i in ${LUA_LMODULES} +LUA_MODULES += ${i:T:R} +LUA_SRCS.${i:T:R} = ${i} +.endfor + +.if defined(LUA_MODULES) || defined(LUA_CMODULE) + +#### .lua modules +.if defined(LUA_MODULES) +.if !defined(LUA_LMODDIR) +PKG_CONFIG_DEPS += lua +PKG_CONFIG_VARS.lua += INSTALL_LMOD +LUA_LMODDIR ?= ${PKG_CONFIG.var.lua.INSTALL_LMOD} +.endif +.for i in ${LUA_MODULES} +LUA_SRCS.${i} ?= ${i:S/./_/g}.lua +FILES += ${LUA_SRCS.${i}} +FILESDIR_${LUA_SRCS.${i}} = ${LUA_LMODDIR}/${i:S|.|/|g:H} +FILESNAME_${LUA_SRCS.${i}} = ${i:S|.|/|g:T}.lua +.endfor # i +.endif # defined(LUA_MODULES) + +### .c module +.if defined(LUA_CMODULE) +PKG_CONFIG_DEPS += lua + +.if !defined(LUA_CMODDIR) +PKG_CONFIG_VARS.lua += INSTALL_CMOD +LUA_CMODDIR ?= ${PKG_CONFIG.var.lua.INSTALL_CMOD} +.endif +LIB = ${LUA_CMODULE:S|.|/|:T} +SRCS ?= ${LUA_CMODULE:S/./_/g}.c +MKDLL = Only +LDCOMPILER = Yes +DLL_EXT = .so +LIBDIR = ${LUA_CMODDIR}/${LUA_CMODULE:S|.|/|g:H} +.endif # defined(LUA_CMODULES) + +###################### +.include <mkc_imp.pkg-config.mk> + +.if defined(LUA_MODULES) && empty(LUA_LMODDIR) +MKC_ERR_MSG += "ERROR: pkg-config --variable=INSTALL_LMOD lua failed" +.endif # LUA_MODULES + +.ifdef LUA_CMODULE +.if empty(LUA_CMODDIR) +MKC_ERR_MSG += "ERROR: pkg-config --variable=INSTALL_CMOD lua failed" +.endif + +.if empty(MKC_ERR_MSG) +MKC_REQUIRE_HEADERS += lua.h +.endif # !empty(MKC_ERR_MSG) +.endif # LUA_CMODULE + +.endif # LUA_MODULES) || LUA_CMODULE diff --git a/mk/mkc_imp.man.mk b/mk/mkc_imp.man.mk new file mode 100644 index 0000000..15203d4 --- /dev/null +++ b/mk/mkc_imp.man.mk @@ -0,0 +1,189 @@ +# Copyright (c) 2009-2010 by Aleksey Cheusov +# Copyright (c) 1994-2009 The NetBSD Foundation, Inc. +# Copyright (c) 1988, 1989, 1993 The Regents of the University of California +# Copyright (c) 1988, 1989 by Adam de Boor +# Copyright (c) 1989 by Berkeley Softworks +# +# See LICENSE file in the distribution. +############################################################ + +.if !defined(_MKC_IMP_MAN_MK) +_MKC_IMP_MAN_MK := 1 + +MESSAGE.nroff ?= @${_MESSAGE} "NROFF: ${.TARGET}" + +.if ${MKSHARE:tl} == "no" +MKCATPAGES = no +MKDOC = no +MKINFO = no +MKMAN = no +.endif + +.if ${MKMAN:tl} == "no" +MKCATPAGES = no +.endif + +.if defined(USETBL) && ${USETBL:U:tl} == "no" +.undef USETBL +.endif + +.if defined(MANZ) && ${MANZ:U:tl} == "no" +.undef MANZ +.endif + +.PHONY: catinstall maninstall catpages manpages catlinks \ + manlinks html installhtml +.if ${MKMAN:tl} != "no" +realinstall: ${MANINSTALL} +.endif + +MANTARGET ?= cat +NROFF ?= nroff +GROFF ?= groff +TBL ?= tbl + +.SUFFIXES: .1 .2 .3 .4 .5 .6 .7 .8 .9 \ + .cat1 .cat2 .cat3 .cat4 .cat5 .cat6 .cat7 .cat8 .cat9 \ + .html1 .html2 .html3 .html4 .html5 .html6 .html7 .html8 .html9 + +.9.cat9 .8.cat8 .7.cat7 .6.cat6 .5.cat5 .4.cat4 .3.cat3 .2.cat2 .1.cat1: + ${MESSAGE.nroff} +.if !defined(USETBL) + ${_V} ${NROFF} ${NROFF_MAN2CAT} ${.IMPSRC} > ${.TARGET} || \ + (${RM} -f ${.TARGET}; false) +.else + ${_V} ${TBL} ${.IMPSRC} | ${NROFF} ${NROFF_MAN2CAT} > ${.TARGET} || \ + (${RM} -f ${.TARGET}; false) +.endif + +.9.html9 .8.html8 .7.html7 .6.html6 .5.html5 .4.html4 .3.html3 .2.html2 .1.html1: +.if !defined(USETBL) + @echo "${GROFF} -Tascii -mdoc2html -P-b -P-u -P-o ${.IMPSRC} > ${.TARGET}" + @${GROFF} -Tascii -mdoc2html -P-b -P-u -P-o ${.IMPSRC} > ${.TARGET} || \ + (${RM} -f ${.TARGET}; false) +.else + @echo "${TBL} ${.IMPSRC} | ${GROFF} -mdoc2html -P-b -P-u -P-o > ${.TARGET}" + @cat ${.IMPSRC} | ${GROFF} -mdoc2html -P-b -P-u -P-o > ${.TARGET} || \ + (${RM} -f ${.TARGET}; false) +.endif + +.if defined(MAN) && !empty(MAN) +realall: ${MAN} +MANPAGES = ${MAN} +CATPAGES = ${MANPAGES:C/(.*).([1-9])/\1.cat\2/} +CLEANFILES += ${CATPAGES} +.NOPATH: ${CATPAGES} +HTMLPAGES = ${MANPAGES:C/(.*).([1-9])/\1.html\2/} +.endif + +MINSTALL = ${INSTALL} ${RENAME} ${PRESERVE} ${COPY} \ + -o ${MANOWN} -g ${MANGRP} -m ${MANMODE} + +.if defined(MANZ) +# chown and chmod are done afterward automatically +MCOMPRESS = gzip -cf +MCOMPRESSSUFFIX = .gz +.endif + +catinstall: catlinks +maninstall: manlinks + +__installpage: .USE +.if defined(MCOMPRESS) && !empty(MCOMPRESS) + @${RM} -f ${.TARGET} + ${MCOMPRESS} ${.ALLSRC} > ${.TARGET} + @chown ${MANOWN}:${MANGRP} ${.TARGET} + @chmod ${MANMODE} ${.TARGET} +.else + ${MINSTALL} ${.ALLSRC} ${.TARGET} +.endif + + +# Rules for cat'ed man page installation +.if defined(CATPAGES) && !empty(CATPAGES) && ${MKCATPAGES:tl} != "no" +realall: ${CATPAGES} + +.if ${MKINSTALL:tl} == "yes" +destination_capages = ${CATPAGES:@P@${DESTDIR}${MANDIR}/${P:T:E}${MANSUBDIR}/${P:T:R}.0${MCOMPRESSSUFFIX}@} +UNINSTALLFILES += ${destination_capages} +INSTALLDIRS += ${destination_capages:H} +.endif # MKINSTALL + +catpages:: ${destination_capages} +.PRECIOUS: ${destination_capages} +.PHONY: ${destination_capages} + +.for P in ${CATPAGES:O:u} +${DESTDIR}${MANDIR}/${P:T:E}${MANSUBDIR}/${P:T:R}.0${MCOMPRESSSUFFIX}: ${P} __installpage +.endfor + +.else +catpages:: +.endif # CATPAGES + +# Rules for source page installation +.if defined(MANPAGES) && !empty(MANPAGES) + +.if ${MKINSTALL:tl} == "yes" +destination_manpages = ${MANPAGES:@P@${DESTDIR}${MANDIR}/man${P:T:E}${MANSUBDIR}/${P}${MCOMPRESSSUFFIX}@} +UNINSTALLFILES += ${destination_manpages} +INSTALLDIRS += ${destination_manpages:H} +.endif # MKINSTALL + +manpages:: ${destination_manpages} +.PRECIOUS: ${destination_manpages} +.PHONY: ${destination_manpages} + +.for P in ${MANPAGES:O:u} +${DESTDIR}${MANDIR}/man${P:T:E}${MANSUBDIR}/${P}${MCOMPRESSSUFFIX}: ${P} __installpage +.endfor + +.else +manpages:: +.endif # MANPAGES + +.if ${MKCATPAGES:tl} != "no" +.for s d in ${MLINKS} +LINKS += ${MANDIR}/cat${s:T:E}${MANSUBDIR}/${s:R}.0${MCOMPRESSSUFFIX} \ + ${MANDIR}/cat${d:T:E}${MANSUBDIR}/${d:R}.0${MCOMPRESSSUFFIX} +UNINSTALLFILES += ${DESTDIR}${MANDIR}/cat${d:T:E}${MANSUBDIR}/${d:R}.0${MCOMPRESSSUFFIX} +.endfor +catlinks: catpages +.endif +catlinks: + +.for s d in ${MLINKS} +LINKS += ${MANDIR}/man${s:T:E}${MANSUBDIR}/${s}${MCOMPRESSSUFFIX} \ + ${MANDIR}/man${d:T:E}${MANSUBDIR}/${d}${MCOMPRESSSUFFIX} +UNINSTALLFILES += ${DESTDIR}${MANDIR}/man${d:T:E}${MANSUBDIR}/${d}${MCOMPRESSSUFFIX} +.endfor +manlinks: manpages + +# Html rules +.PHONY: html +html: ${HTMLPAGES} + +.if defined(HTMLPAGES) && !empty(HTMLPAGES) +.for P in ${HTMLPAGES:O:u} +${DESTDIR}${HTMLDIR}/${P:T:E}/${P:T:R}.html: ${P} + ${MINSTALL} ${.ALLSRC} ${.TARGET} +.endfor + +.if ${MKINSTALL:tl} == "yes" +destination_htmls = ${HTMLPAGES:@P@${DESTDIR}${HTMLDIR}/${P:T:E}/${P:T:R}.html@} +.endif + +installhtml: ${destination_htmls} +CLEANFILES += ${HTMLPAGES} + +.if ${MKHTML:tl} == "yes" +realinstall: installhtml +realall: ${HTMLPAGES} +UNINSTALLFILES += ${destination_htmls} +INSTALLDIRS += ${destination_htmls:H} +.endif # MKHTML +.endif # HTMLPAGES + +realall: + +.endif # _MKC_IMP_MAN_MK diff --git a/mk/mkc_imp.mk b/mk/mkc_imp.mk new file mode 100644 index 0000000..eee09fd --- /dev/null +++ b/mk/mkc_imp.mk @@ -0,0 +1,68 @@ +# Copyright (c) 2009-2013 by Aleksey Cheusov +# +# See LICENSE file in the distribution. +############################################################ +.include <mkc_imp.preinit.mk> + +.ifdef SUBDIR +SUBPRJ = ${SUBDIR} +.endif + +.ifdef SUBPRJS +SUBPRJ += ${SUBPRJS} # for backward compatility only, use SUBPRJ! +.endif # defined(SUBPRJS) + +.if !defined(LIB) && !defined(SUBPRJ) +_use_prog := 1 +.endif + +.if defined(_use_prog) || defined(LIB) +.include <mkc_imp.lua.mk> +.include <mkc_imp.pod.mk> +.endif # _use_prog || LIB + +.include <mkc.init.mk> + +.include <configure.mk> + +.if !defined(MKC_ERR_MSG) || make(clean) || make(cleandir) || make(distclean) + +.if defined(LIB) +.include <mkc_imp.lib.mk> +.elif defined(_use_prog) +.include <mkc_imp.prog.mk> +.endif + +.if defined(_use_prog) || defined(LIB) +.include <mkc_imp.man.mk> +.include <mkc_imp.info.mk> +.include <mkc_imp.inc.mk> +.include <mkc_imp.intexts.mk> +.include <mkc_imp.pkg-config.mk> +.include <mkc_imp.dep.mk> +.include <mkc_imp.files.mk> +.include <mkc_imp.scripts.mk> +.include <mkc_imp.links.mk> +.endif # _use_prog || LIB + +######################################## +.if defined(SUBPRJ) +.include <mkc_imp.subprj.mk> + +# +.PHONY: subprj-clean subprj-distclean +clean: subprj-clean +subprj-clean: + -${CLEANFILES_CMD} -f ${CLEANFILES} +cleandir: subprj-distclean +subprj-distclean: + -${CLEANFILES_CMD} ${DISTCLEANFILES} + +.endif # SUBPRJ +######################################## + +.include <mkc_imp.arch.mk> +.include <mkc_imp.final.mk> +# + +.endif # MKC_ERR_MSG diff --git a/mk/mkc_imp.obj.mk b/mk/mkc_imp.obj.mk new file mode 100644 index 0000000..77d6f44 --- /dev/null +++ b/mk/mkc_imp.obj.mk @@ -0,0 +1,34 @@ +# Copyright (c) 2013 by Aleksey Cheusov +# +# See LICENSE file in the distribution. +############################################################ + +.ifndef _MKC_IMP_OBJ_MK +_MKC_IMP_OBJ_MK := 1 + +obj: # ensure existence + +.ifdef MAKEOBJDIRPREFIX +__objdir := ${MAKEOBJDIRPREFIX}${.CURDIR} +.elif defined(MAKEOBJDIR) +__objdir := ${MAKEOBJDIR} +.endif # defined(MAKEOBJDIRPREFIX) + +.if defined(__objdir) + +.if ${MKOBJDIRS:tl} == "yes" +.if !defined(SUBPRJ) +obj: + @${MKDIR} -p ${__objdir} +.endif # !defined(SUBPRJ) +.elif ${MKOBJDIRS:tl} == "auto" && !exists(${__objdir}/) +__objdir_made != if ${MKDIR} -p ${__objdir}; then echo 1; else echo 0; fi + +.if !${__objdir_made} +.error could not create ${__objdir} +.endif # ${__objdir_made} + +.endif # MKOBJDIRS + +.endif # defined(__objdir)... +.endif # _MKC_IMP_OBJ_MK diff --git a/mk/mkc_imp.objdir.mk b/mk/mkc_imp.objdir.mk new file mode 100644 index 0000000..98c8039 --- /dev/null +++ b/mk/mkc_imp.objdir.mk @@ -0,0 +1,43 @@ +# Copyright (c) 2012 by Aleksey Cheusov +# +# See LICENSE file in the distribution. + +.if !defined(_MKC_IMP_OBJDIR_MK) +_MKC_IMP_OBJDIR_MK := 1 + + +.if ${:!if test -d ${.CURDIR}/obj.${MACHINE}; then echo 1; else echo 0; fi!} + _OBJ_MACHINE_DIR := 1 +.elif ${:!if test -d ${.CURDIR}/obj; then echo 1; else echo 0; fi!} + _OBJ_DIR := 1 +.endif + +.for i in ${__REALSUBPRJ} +j:=${i:S,/,_,g} +.if empty(j:U:M*[.]*) +EXPORT_VARNAMES += OBJDIR_${i:S,/,_,g} +. if ${MKRELOBJDIR:tl} == "yes" +OBJDIR_${j} = ${.OBJDIR}/${i} +. elif defined(MAKEOBJDIRPREFIX) +OBJDIR_${j} = ${MAKEOBJDIRPREFIX}${.CURDIR} +. elif defined(MAKEOBJDIR) +OBJDIR_${j} = ${MAKEOBJDIR} +. elif defined(_OBJ_MACHINE_DIR) +OBJDIR_${j} = ${.CURDIR}/obj.${MACHINE} +. elif defined(_OBJ_DIR) +OBJDIR_${j} = ${.CURDIR}/obj +. else +OBJDIR_${j} = ${.CURDIR}/${i} +. endif # MAKEOBJDIRPREFIX... +. if ${SHORTPRJNAME:tl} == "yes" && ${i} != ${j} +OBJDIR_${i:T} := ${OBJDIR_${j}} +EXPORT_VARNAMES += OBJDIR_${i:T} +. endif +.endif + +.endfor # i + +.undef _OBJ_MACHINE_DIR +.undef _OBJ_DIR + +.endif # _MKC_IMP_OBJDIR_MK diff --git a/mk/mkc_imp.pkg-config.mk b/mk/mkc_imp.pkg-config.mk new file mode 100644 index 0000000..60190b9 --- /dev/null +++ b/mk/mkc_imp.pkg-config.mk @@ -0,0 +1,80 @@ +# Copyright (c) 2009-2010 by Aleksey Cheusov +# +# See LICENSE file in the distribution. +############################################################ + +# +# Sample of Makefile: +# PKG_CONFIG_DEPS = glib-2.0>=2.22 +# +# PROG = main +# +# CFLAGS+= -DG_DISABLE_DEPRECATED=1 +# CFLAGS+= -DG_DISABLE_SINGLE_INCLUDES +# +# .include <mkc.prog.mk> +# + +############################################################ + +# .endif for the next line is in the end of file +.if defined(PKG_CONFIG_DEPS) && !make(clean) && !make(cleandir) && !make(distclean) + +MKC_REQUIRE_PROGS+= pkg-config +.include <configure.mk> + +.if ${HAVE_PROG.pkg-config} + +.for l in ${PKG_CONFIG_DEPS} +_lpair = ${l:C/(>=|<=|=|>|<)/ & /g} +_pcname = ${PCNAME.${_lpair:[1]:S/-/_/g:S/+/p/g:S/./_/g}:U${_lpair:[1]}} +_lp := ${_pcname} ${_lpair:[2]} ${_lpair:[3]} +_ln = ${l:S/>=/_ge_/:S/>/_gt_/:S/<=/_le_/:S/</_lt_/:S/=/_eq_/} + +PKG_CONFIG.exists.${_ln} != env ${mkc.environ} mkc_check_custom \ + -p pkgconfig -s -n '${_ln}' -m '[pkg-config] ${_lp}' \ + ${PROG.pkg-config} --print-errors --exists "${_lp}" + +.if !${PKG_CONFIG.exists.${_ln}} +MKC_ERR_MSG := ${MKC_ERR_MSG} "%%%: ${MKC_CACHEDIR}/_mkc_pkgconfig_${_ln}.err" +.else + +# --cflags and --libs +.if defined(PROGS) || defined(LIB) +.if !defined(CPPFLAGS.pkg-config.${_ln}) +CPPFLAGS.pkg-config.${_ln} != env ${mkc.environ} mkc_check_custom \ + -p pkgconfig -n '${_ln}_cflags' -m '[pkg-config] ${_lp} --cflags' \ + ${PROG.pkg-config} --cflags "${_lp}" +.endif # CPPFLAGS.pkg-config.${l} + +.if !defined(LDADD.pkg-config.${_ln}) +LDADD.pkg-config.${_ln} != env ${mkc.environ} mkc_check_custom \ + -p pkgconfig -n '${_ln}_libs' -m '[pkg-config] ${_lp} --libs' \ + ${PROG.pkg-config} --libs "${_lp}" +.endif # LDADD.pkg-config.${l} + +CPPFLAGS := ${CPPFLAGS} ${CPPFLAGS.pkg-config.${_ln}} +LDADD := ${LDADD} ${LDADD.pkg-config.${_ln}} +.endif # PROGS || LIB + +.for i in ${PKG_CONFIG_VARS.${_ln}} +.if !defined(PKG_CONFIG.var.${_ln}.${i}) +PKG_CONFIG.var.${_ln}.${i} != env ${mkc.environ} mkc_check_custom \ + -p pkgconfig -n '${_ln}_${i}' -m '[pkg-config] ${_lp} --variable=${i}' \ + ${PROG.pkg-config} --variable=${i} "${_lp}" +.endif # PKG_CONFIG.var.${_ln}.${i} +.endfor # i + +.endif # PKG-CONFIG.exists + +.endfor # .for l in PKG_CONFIG_DEPS +.undef PKG_CONFIG_DEPS + +.undef _ln +.undef _lp +.undef _pcname +.undef _lpair + +.endif # HAVE_PROG.pkg-config + +.endif # !make(clean) && !make(cleandir) && !make(distclean) diff --git a/mk/mkc_imp.platform.sys.mk b/mk/mkc_imp.platform.sys.mk new file mode 100644 index 0000000..0fb511f --- /dev/null +++ b/mk/mkc_imp.platform.sys.mk @@ -0,0 +1,503 @@ +# Copyright (c) 2009-2010 by Aleksey Cheusov +# Copyright (c) 1994-2009 The NetBSD Foundation, Inc. +# Copyright (c) 1988, 1989, 1993 The Regents of the University of California +# Copyright (c) 1988, 1989 by Adam de Boor +# Copyright (c) 1989 by Berkeley Softworks +# +# See LICENSE file in the distribution. +############################################################ + +.ifndef _MKC_PLATFORM_MK +_MKC_PLATFORM_MK := 1 + +#################### +# cross tools +.ifdef SYSROOT +CFLAGS.sysroot ?= --sysroot=${SYSROOT} +LDFLAGS.sysroot ?= --sysroot=${SYSROOT} +CFLAGS += ${CFLAGS.sysroot} +LDFLAGS += ${LDFLAGS.sysroot} + +TOOLCHAIN_PREFIX ?= ${MACHINE_GNU_PLATFORM}- +TOOLCHAIN_DIR ?= ${TOOLDIR}/bin + +NM = ${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}nm +#ADDR2LINE = ${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}addr2line +AR = ${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}ar +AS = ${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}as +CXX = ${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}g++ +CPP = ${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}cpp +CC = ${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}gcc +INSTALL = ${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}install +LD = ${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}ld +OBJCOPY = ${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}objcopy +OBJDUMP = ${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}objdump +RANLIB = ${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}ranlib +#READELF = ${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}readelf +SIZE = ${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}size +#STRINGS = ${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}strings +STRIP = ${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}strip +.endif + +#################### +SHLIB_EXT.Darwin = .dylib +SHLIB_EXT.HP-UX = .sl + +SHLIB_EXT ?= ${SHLIB_EXT.${TARGET_OPSYS}:U.so} + +DLL_EXT.Darwin = .bundle +DLL_EXT ?= ${DLL_EXT.${TARGET_OPSYS}:U${SHLIB_EXT}} + +#################### +INSTALL.NetBSD = /usr/bin/install +INSTALL.OpenBSD = /usr/bin/install +INSTALL.FreeBSD = /usr/bin/install +INSTALL.DragonFly = /usr/bin/install +INSTALL.MirBSD = /usr/bin/install +INSTALL.Haiku = /bin/install + +INSTALL ?= ${INSTALL.${TARGET_OPSYS}:Umkc_install} + +# The following line is for debugging only +#INSTALL= mkc_install + +#################### + +.if !defined(CC.SunOS) +.if exists(/usr/ccs/bin/cc) +CC.SunOS = /usr/ccs/bin/cc +.elif exists(/opt/SUNWspro/bin/cc) +CC.SunOS = /opt/SUNWspro/bin/cc +.elif exists(/usr/sfw/bin/gcc) +CC.SunOS = /usr/sfw/bin/gcc +.else +CC.SunOS = cc +.endif # exists... +.endif # defined(CC.SunOS) + +.if !defined(CXX.SunOS) +.if exists(/usr/ccs/bin/CC) +CXX.SunOS = /usr/ccs/bin/CC +.elif exists(/opt/SUNWspro/bin/CC) +CXX.SunOS = /opt/SUNWspro/bin/CC +.elif exists(/usr/sfw/bin/g++) +CXX.SunOS = /usr/sfw/bin/g++ +.else +CXX.SunOS = c++ +.endif # exists... +.endif # defined(CC.SunOS) + +CPP.SunOS = ${CC} -E + +CC.UnixWare = gcc +CXX.UnixWare = g++ +CPP.UnixWare = ${CC} -E + +CC.OSF1 = gcc +CXX.OSF1 = g++ +CPP.OSF1 = ${CC} -E + +CC.Interix = gcc +CXX.Interix = g++ +CPP.Interix = cpp + +CC.IRIX64 = cc +CXX.IRIX64 = CC +CPP.IRIX64 = ${CC} -E + +CC.QNX = gcc +CXX.QNX = g++ +CPP.QNX = ${CC} -E + +CPP.AIX = ${CC} -E + +CC ?= ${CC.${TARGET_OPSYS}:Ucc} +CXX ?= ${CXX.${TARGET_OPSYS}:Uc++} +CPP ?= ${CPP.${TARGET_OPSYS}:Ucpp} + +#################### +CPPFLAGS.Interix = -D_ALL_SOURCE +CPPFLAGS.UnixWare = -DUNIXWARE + +CPPFLAGS += ${CPPFLAGS.${TARGET_OPSYS}:U} + +############################################################ +# CC compiler type +.if make(cleandir) || make(distclean) || make(clean) +.elif ${MKCHECKS:Uno:tl} == "yes" && !defined(CC_TYPE) && (defined(PROGS) || defined(LIB)) +mkc.cc_type.environ = CC='${CC}' CXX='${CXX}' CPPFLAGS='${CPPFLAGS}' CFLAGS='${CFLAGS}' LDFLAGS='${LDFLAGS}' LDADD='${LDADD}' MKC_CACHEDIR='${MKC_CACHEDIR}' MKC_DELETE_TMPFILES='${MKC_DELETE_TMPFILES}' MKC_SHOW_CACHED='${MKC_SHOW_CACHED}' MKC_NOCACHE='${MKC_NOCACHE}' MKC_VERBOSE=1 +.if !empty(src_type:Mc) +CC_TYPE != env ${mkc.cc_type.environ} mkc_check_compiler +.elif !empty(src_type:Mcxx) +CXX_TYPE != env ${mkc.cc_type.environ} mkc_check_compiler -x +.endif # src_type +.endif # cleandir|distclean|... + +CC_TYPE ?= unknown +CXX_TYPE ?= unknown + +#################### +# Default compiler-specific options + +# C +CFLAGS.dflt.clang = -Qunused-arguments + +CFLAGS += ${CFLAGS.dflt.${CC_TYPE}} + +# C++ +CXXFLAGS.dflt.clang = ${CFLAGS.dflt.clang} + +CXXFLAGS += ${CXXFLAGS.dflt.${CXX_TYPE}} + +#################### +# Warnings as error +CFLAGS.warnerr.gcc = -Werror +CFLAGS.warnerr.icc = -Werror +CFLAGS.warnerr.sunpro = -errwarn=%all +CFLAGS.warnerr.clang = -Werror + +#WARNERR?= ${${WARNS:U0}==4:?yes:no} # Eh, buggy bmake :-( +.if ${WARNS:U0} == 4 +WARNERR ?= yes +.else +WARNERR ?= no +.endif + +.if ${WARNERR:tl} == "yes" +CFLAGS.warnerr = ${CFLAGS.warnerr.${CC_TYPE}} +CXXFLAGS.warnerr = ${CFLAGS.warnerr.${CXX_TYPE}} +.endif + +#################### +# C warns for GCC +CFLAGS.warns.gcc.1 = -Wall -Wstrict-prototypes -Wmissing-prototypes \ + -Wpointer-arith +CFLAGS.warns.gcc.2 = ${CFLAGS.warns.gcc.1} -Wreturn-type -Wswitch -Wshadow +CFLAGS.warns.gcc.3 = ${CFLAGS.warns.gcc.2} -Wcast-qual -Wwrite-strings \ + -Wno-unused-parameter +CFLAGS.warns.gcc.4 = ${CFLAGS.warns.gcc.3} + +# C++ warns +CXXFLAGS.warns.gcc.1 = -Wabi -Wold-style-cast -Wctor-dtor-privacy \ + -Wnon-virtual-dtor -Wreorder -Wno-deprecated \ + -Wno-non-template-friend -Woverloaded-virtual \ + -Wno-pmf-conversions -Wsign-promo -Wsynth +CXXFLAGS.warns.gcc.2 = ${CXXFLAGS.warns.gcc.1} -Wreturn-type -Wswitch -Wshadow +CXXFLAGS.warns.gcc.3 = ${CXXFLAGS.warns.gcc.2} -Wcast-qual -Wwrite-strings \ + -Wno-unused-parameter +CXXFLAGS.warns.gcc.4 = ${CXXFLAGS.warns.gcc.3} + +#################### +# C warns for ICC +CFLAGS.warns.icc.1 = -Wall -we1011 +CFLAGS.warns.icc.2 = ${CFLAGS.warns.icc.1} +CFLAGS.warns.icc.3 = ${CFLAGS.warns.icc.2} +CFLAGS.warns.icc.4 = ${CFLAGS.warns.icc.3} + +# C++ warns +CXXFLAGS.warns.icc.1 = ${CFLAGS.warns.icc.1} +CXXFLAGS.warns.icc.2 = ${CFLAGS.warns.icc.2} +CXXFLAGS.warns.icc.3 = ${CFLAGS.warns.icc.3} +CXXFLAGS.warns.icc.4 = ${CFLAGS.warns.icc.4} + +#################### +# C warns for clang +CFLAGS.warns.clang.1 = -Wall +CFLAGS.warns.clang.2 = ${CFLAGS.warns.clang.1} +CFLAGS.warns.clang.3 = ${CFLAGS.warns.clang.2} +CFLAGS.warns.clang.4 = ${CFLAGS.warns.clang.3} + +CXXFLAGS.warns.clang.1 = ${CFLAGS.warns.clang.1} +CXXFLAGS.warns.clang.2 = ${CFLAGS.warns.clang.2} +CXXFLAGS.warns.clang.3 = ${CFLAGS.warns.clang.3} +CXXFLAGS.warns.clang.4 = ${CFLAGS.warns.clang.4} + +#################### +# C warns for HP-UX +CFLAGS.warns.hpc.0 = -w3 +CFLAGS.warns.hpc.1 = -w2 +CFLAGS.warns.hpc.2 = -w2 +CFLAGS.warns.hpc.3 = -w2 +CFLAGS.warns.hpc.4 = -w2 + +# C++ warns +CXXFLAGS.warns.hpc.0 = ${CFLAGS.warns.hpc.0} +CXXFLAGS.warns.hpc.1 = ${CFLAGS.warns.hpc.1} +CXXFLAGS.warns.hpc.2 = ${CFLAGS.warns.hpc.2} +CXXFLAGS.warns.hpc.3 = ${CFLAGS.warns.hpc.3} +CXXFLAGS.warns.hpc.4 = ${CFLAGS.warns.hpc.4} + +#################### + +CFLAGS += ${CFLAGS.warns.${CC_TYPE}.${WARNS}} +CXXFLAGS += ${CXXFLAGS.warns.${CXX_TYPE}.${WARNS}} + +#################### +CFLAGS.pic.gcc.Interix = +CFLAGS.pic.gcc = -fPIC -DPIC +CFLAGS.pic.icc = -fPIC -DPIC +CFLAGS.pic.clang = -fPIC -DPIC +CFLAGS.pic.pcc = -k -DPIC +CFLAGS.pic.mipspro = -KPIC +CFLAGS.pic.sunpro = -xcode=pic32 # -KPIC +CFLAGS.pic.hpc = +Z # +z +CFLAGS.pic.ibmc = -qpic=large # -qpic=small +CFLAGS.pic.decc = # ? + +CFLAGS.pic ?= ${CFLAGS.pic.${CC_TYPE}.${TARGET_OPSYS}:U${CFLAGS.pic.${CC_TYPE}:U}} +CXXFLAGS.pic ?= ${CFLAGS.pic.${CXX_TYPE}.${TARGET_OPSYS}:U${CFLAGS.pic.${CXX_TYPE}:U}} + +#################### +CFLAGS.pie.gcc.Interix = +CFLAGS.pie.gcc = -fPIE -DPIC +CFLAGS.pie.icc = -fPIE -DPIC +CFLAGS.pie.clang = -fPIE -DPIC + +CFLAGS.pie ?= ${CFLAGS.pie.${CC_TYPE}.${TARGET_OPSYS}:U${CFLAGS.pie.${CC_TYPE}}:U${CFLAGS.pic}} +CXXFLAGS.pie ?= ${CFLAGS.pie.${CC_TYPE}.${TARGET_OPSYS}:U${CFLAGS.pie.${CC_TYPE}}:U${CXXFLAGS.pic}} + +#################### +CFLAGS.ssp.gcc = -fstack-protector -Wstack-protector --param ssp-buffer-size=1 +CFLAGS.ssp.icc = -fstack-security-check +CFLAGS.ssp.ibmc = -qstackprotect +CFLAGS.ssp.clang = ${CFLAGS.ssp.gcc} + +CFLAGS.ssp ?= ${CFLAGS.ssp.${CC_TYPE}.${TARGET_OPSYS}:U${CFLAGS.ssp.${CC_TYPE}:U}} +CXXFLAGS.ssp ?= ${CFLAGS.ssp.${CXX_TYPE}.${TARGET_OPSYS}:U${CFLAGS.ssp.${CXX_TYPE}:U}} + +#################### +RANLIB.IRIX64 = true + +RANLIB ?= ${RANLIB.${TARGET_OPSYS}:Uranlib} + +#################### +NROFF_MAN2CAT.SunOS ?= -man +NROFF_MAN2CAT.HP-UX ?= -man +NROFF_MAN2CAT.OSF1 ?= -man + +NROFF_MAN2CAT ?= ${NROFF_MAN2CAT.${OPSYS}:U-mandoc -Tascii} + +#################### +LD_TYPE.UnixWare = scold +LD_TYPE.AIX = aixld +LD_TYPE.HP-UX = hpld +LD_TYPE.SunOS = sunld +LD_TYPE.Darwin = darwinld +LD_TYPE.Interix = interixld +LD_TYPE.OSF1 = osf1ld +LD_TYPE.IRIX64 = irixld + +LD_TYPE ?= ${LD_TYPE.${TARGET_OPSYS}:Ugnuld} + +#################### +OBJECT_FMT ?= ELF + +#################### +LDFLAGS.shared.sunld = -G +LDFLAGS.soname.sunld = -h lib${LIB}.so.${SHLIB_MAJOR} + +LDFLAGS.shared.darwinld = -dylib +LDFLAGS.soname.darwinld = # + +LDFLAGS.shared.gnuld = -shared +LDFLAGS.soname.gnuld = -soname lib${LIB}${SHLIB_EXT}.${SHLIB_MAJOR} + +LDFLAGS.shared.hpld = -b +b ${LIBDIR} +LDFLAGS.soname.hpld = +h lib${LIB}.sl.${SHLIB_MAJOR} + +LDFLAGS.shared.aixld = -G +LDFLAGS.soname.aixld = # + +LDFLAGS.shared.irixld = -shared +LDFLAGS.soname.irixld = # + +LDFLAGS.shared.osf1ld = -shared -msym -expect_unresolved '*' +LDFLAGS.soname.osf1ld = -soname lib${LIB}${SHLIB_EXT}.${SHLIB_MAJOR} \ + -set_version ${SHLIB_MAJOR}.${SHLIB_MINOR} \ + -update_registry ${.OBJDIR}/${LIB}_so_locations + +LDFLAGS.shared.irixld = -shared +LDFLAGS.soname.irixld = -soname lib${LIB}${SHLIB_EXT}.${SHLIB_MAJOR} + +LDFLAGS.shared.interixld = -shared --image-base,`expr $${RANDOM-$$$$} % 4096 / 2 \* 262144 + 1342177280` +LDFLAGS.soname.interixld = -h lib${LIB}${SHLIB_EXT}.${SHLIB_MAJOR} + +LDFLAGS.shared.gcc.Interix = -shared --image-base,`expr $${RANDOM-$$$$} % 4096 / 2 \* 262144 + 1342177280` +LDFLAGS.shared.gcc = -shared +LDFLAGS.shared.clang = -shared +LDFLAGS.shared.pcc = -shared +LDFLAGS.shared.icc = -shared +LDFLAGS.shared.hpc = -b +LDFLAGS.shared.imbc = -qmkshrobj +LDFLAGS.shared.mipspro = -shared +LDFLAGS.shared.sunpro = -G +LDFLAGS.shared.decc = -shared + +LDFLAGS.soname.sunpro = ${LDFLAGS.soname.sunld} + +.if ${TARGET_OPSYS:Unone} == "Darwin" +.if ${MKDLL:U} == "no" +LDFLAGS.shared.gcc.Darwin = -dynamiclib -install_name ${LIBDIR}/lib${LIB}${SHLIB_EXTFULL} +SHLIB_MAJORp1 != expr 1 + ${SHLIB_MAJOR:U0} +LDFLAGS.soname.gcc = -current_version ${SHLIB_MAJORp1}${SHLIB_MINOR:D.${SHLIB_MINOR}}${SHLIB_TEENY:D.${SHLIB_TEENY}} +LDFLAGS.soname.gcc += -compatibility_version ${SHLIB_MAJORp1} +.else +LDFLAGS.shared.gcc.Darwin = -flat_namespace -bundle -undefined suppress +.endif +.elif ${TARGET_OPSYS:Unone} == "OSF1" && defined(LIB) +CLEANFILES += ${.OBJDIR}/${LIB}_so_locations +.endif + +CFLAGS.cctold ?= ${CFLAGS.cctold.${CC_TYPE}:U-Wl,} +CXXFLAGS.cctold ?= ${CFLAGS.cctold.${CXX_TYPE}:U-Wl,} + +LDFLAGS.soname.ld = ${LDFLAGS.soname.${LD_TYPE}:U} + +.if ${LDREAL:U0} == ${LD:U0} +LDFLAGS.shared ?= ${LDFLAGS.shared.${LD_TYPE}:U-shared} +LDFLAGS.soname ?= ${LDFLAGS.soname.ld} +.elif ${LDREAL:U0} == ${CC:U0} +LDFLAGS.shared ?= ${LDFLAGS.shared.${CC_TYPE}.${TARGET_OPSYS}:U${LDFLAGS.shared.${CC_TYPE}:U-shared}} +LDFLAGS.soname ?= ${LDFLAGS.soname.${CC_TYPE}:U${LDFLAGS.soname.ld:@v@${CFLAGS.cctold}${v}@}} +.elif ${LDREAL:U0} == ${CXX:U0} +LDFLAGS.shared ?= ${LDFLAGS.shared.${CXX_TYPE}.${TARGET_OPSYS}:U${LDFLAGS.shared.${CXX_TYPE}:U-shared}} +LDFLAGS.soname ?= ${LDFLAGS.soname.${CXX_TYPE}:U${LDFLAGS.soname.ld:@v@${CXXFLAGS.cctold}${v}@}} +.endif + +#################### +LDFLAGS.pie.gcc = -pie + +.if ${LDREAL:U0} == ${CC:U0} +LDFLAGS.pie ?= ${LDFLAGS.pie.${CC_TYPE}} +.elif ${LDREAL:U0} == ${CXX:U0} +LDFLAGS.pie ?= ${LDFLAGS.pie.${CXX_TYPE}} +.endif +#################### +LDFLAGS.relro.gnuld = -zrelro -znow + +LDFLAGS.relro ?= ${LDFLAGS.relro.${LD_TYPE}} + +#################### +.if ${LDREAL:U0} != ${LD:U0} +.if !empty(LDFLAGS.relro) +LDFLAGS.relro := ${LDFLAGS.relro:S/^/-Wl,/g} +.endif +.endif + +############################################################ +############################################################ +.if ${TARGET_OPSYS:Unone} == "Darwin" + +COMPILE.s ?= ${AS} ${AFLAGS} +COMPILE.S ?= ${CC} ${AFLAGS} ${CPPFLAGS} -c + +.if ${MKDLL:U} != "no" + +SHLIB_EXTFULL ?= .bundle + +.else # MKDLL + +.if defined(SHLIB_MAJOR) && !empty(SHLIB_MAJOR) +SHLIB_EXT1 ?= .${SHLIB_MAJOR}.dylib +.if defined(SHLIB_MINOR) && !empty(SHLIB_MINOR) +SHLIB_EXT2 ?= .${SHLIB_MAJOR}.${SHLIB_MINOR}.dylib +.if defined(SHLIB_TEENY) && !empty(SHLIB_TEENY) +SHLIB_EXT3 ?= .${SHLIB_FULLVERSION}.dylib +SHLIB_FULLVERSION = ${SHLIB_MAJOR}.${SHLIB_MINOR}.${SHLIB_TEENY} +.else +SHLIB_FULLVERSION = ${SHLIB_MAJOR}.${SHLIB_MINOR} +.endif # SHLIB_TEENY +.else +SHLIB_FULLVERSION = ${SHLIB_MAJOR} +.endif # SHLIB_MINOR +.endif # SHLIB_MAJOR + +SHLIB_EXTFULL ?= .${SHLIB_FULLVERSION}.dylib +.endif + +.endif # Darwin! + +############################################################ +############################################################ + +.if ${SHLIB_EXT:U} == ".so" || ${SHLIB_EXT:U} == ".sl" + +.if defined(SHLIB_MAJOR) && !empty(SHLIB_MAJOR) +SHLIB_EXT1 = ${SHLIB_EXT}.${SHLIB_MAJOR} +.if defined(SHLIB_MINOR) && !empty(SHLIB_MINOR) +SHLIB_EXT2 = ${SHLIB_EXT}.${SHLIB_MAJOR}.${SHLIB_MINOR} +.if defined(SHLIB_TEENY) && !empty(SHLIB_TEENY) +SHLIB_FULLVERSION=${SHLIB_MAJOR}.${SHLIB_MINOR}.${SHLIB_TEENY} +SHLIB_EXT3 = ${SHLIB_EXT}.${SHLIB_FULLVERSION} +.else +SHLIB_FULLVERSION = ${SHLIB_MAJOR}.${SHLIB_MINOR} +.endif # SHLIB_TEENY +.else +SHLIB_FULLVERSION = ${SHLIB_MAJOR} +.endif # SHLIB_MINOR +.endif # SHLIB_MAJOR + +SHLIB_EXTFULL = ${SHLIB_EXT}.${SHLIB_FULLVERSION} + +.endif # SHLIB_EXT + +############################################################ +############################################################ + +.ifdef EXPORT_SYMBOLS +.if ${LD_TYPE} == "sunld" || ${LD_TYPE} == "gnuld" +CLEANFILES += ${EXPORT_SYMBOLS}.tmp +lib${LIB}${SHLIB_EXTFULL}: ${EXPORT_SYMBOLS}.tmp +${EXPORT_SYMBOLS}.tmp: ${EXPORT_SYMBOLS} + awk 'BEGIN {print "{ global:"} \ + {print $$0 ";"} \ + END {print "local: *; };"}' ${.ALLSRC} > ${.TARGET} +.elif ${LD_TYPE} == "darwinld" +CLEANFILES += ${EXPORT_SYMBOLS}.tmp +lib${LIB}${SHLIB_EXTFULL}: ${EXPORT_SYMBOLS}.tmp +${EXPORT_SYMBOLS}.tmp: ${EXPORT_SYMBOLS} + awk '{print "_" $$0}' ${.ALLSRC} > ${.TARGET} +.endif # sunld or darwinld + +LDFLAGS.expsym.gnuld = --version-script ${EXPORT_SYMBOLS}.tmp +LDFLAGS.expsym.sunld = -M ${EXPORT_SYMBOLS}.tmp +LDFLAGS.expsym.darwinld = -exported_symbols_list ${EXPORT_SYMBOLS}.tmp +.endif # EXPORT_SYMBOLS + +.if ${LDREAL:U0} == ${LD:U0} +LDFLAGS.expsym ?= ${LDFLAGS.expsym.${LD_TYPE}} +.elif defined(LDFLAGS.expsym.${LD_TYPE}) +LDFLAGS.expsym ?= ${LDFLAGS.expsym.${LD_TYPE}:S/^/-Wl,/} +.endif # LDREAL == LD + +############################################################ +############################################################ + +.if ${EXPORT_DYNAMIC:U:tl} == "yes" +LDFLAGS.expdyn.gnuld ?= -Wl,-E +LDFLAGS.expdyn.hpld ?= -Wl,-E +LDFLAGS.expdyn.interixld ?= -Wl,-E +LDFLAGS.expdyn.darwinld ?= +LDFLAGS.expdyn.irixld ?= +LDFLAGS.expdyn.gcc ?= -rdynamic +LDFLAGS.expdyn.clang ?= -rdynamic +.ifndef LDFLAGS.expdyn +.if defined(LDFLAGS.expdyn.${LD_TYPE}) +LDFLAGS.expdyn = ${LDFLAGS.expdyn.${LD_TYPE}} +.elif defined(LDFLAGS.expdyn.${CC_TYPE}) && ${LDREAL:U0} == ${CC:U0} +LDFLAGS.expdyn = ${LDFLAGS.expdyn.${CC_TYPE}} +.elif defined(LDFLAGS.expdyn.${CXX_TYPE}) && ${LDREAL:U0} == ${CXX:U0} +LDFLAGS.expdyn = ${LDFLAGS.expdyn.${CXX_TYPE}} +.endif # LDFLAGS.expdyn.xxx +.endif # LDFLAGS.expdyn +.endif # EXPORT_DYNAMIC + +############################################################ +############################################################ + +LDFLAGS.shlib = ${LDFLAGS.shared} ${LDFLAGS.soname} ${LDFLAGS.expsym} +LDFLAGS.prog = ${LDFLAGS.expdyn} +############################################################ +############################################################ + +.endif #_MKC_PLATFORM_MK diff --git a/mk/mkc_imp.pod.mk b/mk/mkc_imp.pod.mk new file mode 100644 index 0000000..5a4fb32 --- /dev/null +++ b/mk/mkc_imp.pod.mk @@ -0,0 +1,34 @@ +# Copyright (c) 2010-2013 by Aleksey Cheusov +# +# See LICENSE file in the distribution. +############################################################ + +.if !defined(_MKC_IMP_POD_MK) +_MKC_IMP_POD_MK := 1 + +POD2MAN ?= pod2man +POD2MAN_FLAGS := -r '' -n '${.TARGET:T:R}' -c '' +MESSAGE.pod2man ?= @${_MESSAGE} "POD2MAN: ${.TARGET}" +COMPILE.pod2man ?= ${_V} ${POD2MAN} ${POD2MAN_FLAGS} + +POD2HTML ?= pod2html +POD2HTML_FLAGS ?= +MESSAGE.pod2html ?= @${_MESSAGE} "POD2HTML: ${.TARGET}" +COMPILE.pod2html ?= ${_V} ${POD2HTML} ${POD2HTML_FLAGS} + +.SUFFIXES: .pod +.for i in 1 2 3 4 5 6 7 8 9 +.SUFFIXES: .${i} +.pod.${i}: + ${MESSAGE.pod2man} + ${COMPILE.pod2man} -s ${i} ${.IMPSRC} > ${.TARGET} +.endfor + +.SUFFIXES: .html +.pod.html: + ${MESSAGE.pod2html} + ${COMPILE.pod2html} < ${.IMPSRC} > ${.TARGET} + +CLEANFILES += pod2htmd.tmp pod2htmi.tmp + +.endif # _MKC_IMP_POD_MK diff --git a/mk/mkc_imp.preinit.mk b/mk/mkc_imp.preinit.mk new file mode 100644 index 0000000..81cdc1f --- /dev/null +++ b/mk/mkc_imp.preinit.mk @@ -0,0 +1,32 @@ +# Copyright (c) 2010 by Aleksey Cheusov +# +# See LICENSE file in the distribution. +############################################################ + +#################### +BMAKE_REQD ?= 20110606 + +.ifdef MAKE_VERSION +_bmake_ok != test ${MAKE_VERSION} -ge ${BMAKE_REQD} && echo 1 || echo 0 +.else +_bmake_ok = 0 +.endif + +.if !${_bmake_ok} +.error "bmake-${BMAKE_REQD} or newer is required" +.endif + +.ifdef _top_mk +.for i in SUBDIR SUBPRJ PROG LIB +.if defined(${i}) && ${_top_mk} != "mkc.${i:tl}.mk" +.error "${i} is not allowed for ${_top_mk}" +.endif +.endfor +.endif + +#################### +.if !make(clean) && !make(cleandir) && !make(distclean) && !make(obj) +MKCHECKS ?= yes +.else +MKCHECKS ?= no +.endif # clean/cleandir/distclean diff --git a/mk/mkc_imp.prog.mk b/mk/mkc_imp.prog.mk new file mode 100644 index 0000000..65db125 --- /dev/null +++ b/mk/mkc_imp.prog.mk @@ -0,0 +1,73 @@ +# Copyright (c) 2009-2010 by Aleksey Cheusov +# Copyright (c) 1994-2009 The NetBSD Foundation, Inc. +# Copyright (c) 1988, 1989, 1993 The Regents of the University of California +# Copyright (c) 1988, 1989 by Adam de Boor +# Copyright (c) 1989 by Berkeley Softworks +# +# See LICENSE file in the distribution. +############################################################ + +.if !defined(_MKC_IMP_PROG_MK) +_MKC_IMP_PROG_MK := 1 + +.PHONY: proginstall +proginstall: + +CFLAGS += ${COPTS} + +__proginstall: .USE + ${INSTALL} ${RENAME} ${PRESERVE} ${COPY} ${STRIPFLAG} \ + -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} ${.ALLSRC} ${.TARGET} + +.for p in ${PROGS} +realinstall: proginstall + +_SRCS_ALL += ${SRCS.${p}} + +DPSRCS.${p} = ${SRCS.${p}:M*.l:.l=.c} ${SRCS.${p}:M*.y:.y=.c} +CLEANFILES += ${DPSRCS.${p}} +.if defined(YHEADER) +CLEANFILES += ${SRCS.${p}:M*.y:.y=.h} +.endif # defined(YHEADER) + +OBJS.${p} = ${SRCS.${p}:N*.h:N*.sh:N*.fth:T:R:S/$/.o/g} + +.if defined(OBJS.${p}) && !empty(OBJS.${p}) +.NOPATH: ${OBJS.${p}} + +${p}: ${LIBCRT0} ${DPSRCS.${p}} ${OBJS.${p}} ${LIBC} ${LIBCRTBEGIN} ${LIBCRTEND} ${DPADD} +.if !commands(${p}) + ${MESSAGE.ld} + ${_V}${LDREAL} ${LDFLAGS} ${LDFLAGS.prog} ${LDSTATIC} \ + -o ${.TARGET} ${OBJS.${p}} ${LDADD} +.endif # !commands(...) + +.endif # defined(OBJS.${p}) && !empty(OBJS.${p}) + +.if !defined(MAN) && exists(${p}.1) +MAN += ${p}.1 +.endif # !defined(MAN) + +PROGNAME.${p} ?= ${PROGNAME:U${p}} + +.if ${MKINSTALL:tl} == "yes" +dest_prog.${p} = ${DESTDIR}${BINDIR}/${PROGNAME.${p}} +UNINSTALLFILES += ${dest_prog.${p}} +INSTALLDIRS += ${dest_prog.${p}:H} + +proginstall: ${dest_prog.${p}} +.PRECIOUS: ${dest_prog.${p}} +.PHONY: ${dest_prog.${p}} +.endif # ${MKINSTALL:tl} == "yes" + +${DESTDIR}${BINDIR}/${PROGNAME.${p}}: ${p} __proginstall + +CLEANFILES += ${OBJS.${p}} + +.endfor # ${PROGS} + +realall: ${PROGS} + +CLEANFILES += ${PROGS} + +.endif # _MKC_IMP_PROG_MK diff --git a/mk/mkc_imp.scripts.mk b/mk/mkc_imp.scripts.mk new file mode 100644 index 0000000..f066275 --- /dev/null +++ b/mk/mkc_imp.scripts.mk @@ -0,0 +1,44 @@ +# Copyright (c) 2009-2010 by Aleksey Cheusov +# Copyright (c) 1994-2009 The NetBSD Foundation, Inc. +# Copyright (c) 1988, 1989, 1993 The Regents of the University of California +# Copyright (c) 1988, 1989 by Adam de Boor +# Copyright (c) 1989 by Berkeley Softworks +# +# See LICENSE file in the distribution. +############################################################ + +.if !defined(_MKC_IMP_SCRIPTS_MK) +_MKC_IMP_SCRIPTS_MK := 1 + +.PHONY: scriptsinstall +realinstall: scriptsinstall + +realall: ${SCRIPTS} + +.if defined(SCRIPTS) +.if ${MKINSTALL:tl} == "yes" +destination_scripts = ${SCRIPTS:@S@${DESTDIR}${SCRIPTSDIR_${S:S|/|_|g}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S:S|/|_|g}:U${SCRIPTSNAME:U${S:T}}}@} +UNINSTALLFILES += ${destination_scripts} +INSTALLDIRS += ${destination_scripts:H} +.endif # MKINSTALL + +scriptsinstall:: ${destination_scripts} +.PRECIOUS: ${destination_scripts} +.PHONY: ${destination_scripts} + +__scriptinstall: .USE + ${INSTALL} ${RENAME} ${PRESERVE} ${COPY} \ + -o ${SCRIPTSOWN_${.ALLSRC:T}:U${SCRIPTSOWN}} \ + -g ${SCRIPTSGRP_${.ALLSRC:T}:U${SCRIPTSGRP}} \ + -m ${SCRIPTSMODE_${.ALLSRC:T}:U${SCRIPTSMODE}} \ + ${.ALLSRC} ${.TARGET} + +.for S in ${SCRIPTS:O:u} +${DESTDIR}${SCRIPTSDIR_${S:S|/|_|g}:U${SCRIPTSDIR}}/${SCRIPTSNAME_${S:S|/|_|g}:U${SCRIPTSNAME:U${S:T}}}: ${S} __scriptinstall +.endfor + +.else # defined(SCRIPTS) +scriptsinstall: +.endif # defined(SCRIPTS) + +.endif # _MKC_IMP_SCRIPTS_MK diff --git a/mk/mkc_imp.subprj.mk b/mk/mkc_imp.subprj.mk new file mode 100644 index 0000000..df94d6d --- /dev/null +++ b/mk/mkc_imp.subprj.mk @@ -0,0 +1,92 @@ +# Copyright (c) 2010-2013 by Aleksey Cheusov +# Copyright (c) 1994-2009 The NetBSD Foundation, Inc. +# Copyright (c) 1988, 1989, 1993 The Regents of the University of California +# Copyright (c) 1988, 1989 by Adam de Boor +# Copyright (c) 1989 by Berkeley Softworks +# +# See LICENSE file in the distribution. +############################################################ + +.if !defined(_MKC_IMP_SUBPRJ_MK) +_MKC_IMP_SUBPRJ_MK := 1 + +.for dir in ${SUBPRJ:S/:/ /g} +.if empty(NOSUBDIR:U:M${dir}) +__REALSUBPRJ += ${dir} +.endif +.endfor + +.ifndef SUBDIR +__REALSUBPRJ := ${__REALSUBPRJ:O:u} +.endif + +.if !empty(__REALSUBPRJ:M*-*) +.error "Dash symbol is not allowed inside subdir (${__REALSUBPRJ:M*-*})" +.endif + +SUBPRJ_DFLT ?= ${__REALSUBPRJ} + +.for targ in ${TARGETS} +.for dir in ${__REALSUBPRJ:N.WAIT} +.PHONY: nodeps-${targ}-${dir} subdir-${targ}-${dir} ${targ}-${dir} +nodeps-${targ}-${dir}: .MAKE __recurse + ${targ}-${dir}: .MAKE __recurse +subdir-${targ}-${dir}: .MAKE __recurse +.if ${SHORTPRJNAME:tl} == "yes" && ${dir} != ${dir:T} +.PHONY: nodeps-${targ}-${dir:T} subdir-${targ}-${dir:T} ${targ}-${dir:T} +nodeps-${targ}-${dir:T}: nodeps-${targ}-${dir} + ${targ}-${dir:T}: ${targ}-${dir} +subdir-${targ}-${dir:T}: subdir-${targ}-${dir} +.endif +.endfor # dir + +.if !commands(${targ}) +. for dir in ${SUBPRJ_DFLT} +dir_ = ${dir} +. if ${dir_} == ".WAIT" +_SUBDIR_${targ} += .WAIT +. else +_SUBDIR_${targ} += ${targ}-${dir}:${targ} +. endif # .WAIT +. endfor # dir +.for excl in ${NODEPS} +_SUBDIR_${targ} := ${_SUBDIR_${targ}:N${excl}} +.endfor # excl +_ALLTARGDEPS2 += ${_SUBDIR_${targ}} +${targ}: ${_SUBDIR_${targ}:S/:${targ}$//} +.endif #!command(${targ}) + +.for dep prj in ${SUBPRJ:M*\:*:S/:/ /} +_ALLTARGDEPS += ${targ}-${dep}:${targ}-${prj} +.endfor + +.endfor # targ + +.for dir in ${__REALSUBPRJ} +.if ${SHORTPRJNAME:tl} == "yes" && ${dir:T} != ${dir} +_ALLTARGDEPS += all-${dir}:${dir:T} +.endif +_ALLTARGDEPS += all-${dir}:${dir} +.endfor # dir + +.for excl in ${NODEPS} +_ALLTARGDEPS := ${_ALLTARGDEPS:N${excl}} +.endfor # excl + +.for deptarg prjtarg in ${_ALLTARGDEPS:S/:/ /} +.PHONY: ${prjtarg} ${deptarg} +${prjtarg}: ${deptarg} +.endfor + +# Make sure all of the standard targets are defined, even if they do nothing. +${TARGETS}: + +.PHONY: output_deps +output_deps: +.for i in ${_ALLTARGDEPS} ${_ALLTARGDEPS2} + @echo ${i} +.endfor + +.include <mkc_imp.objdir.mk> + +.endif # _MKC_IMP_SUBPRJ_MK diff --git a/mk/mkc_imp.vars.mk.in b/mk/mkc_imp.vars.mk.in new file mode 100644 index 0000000..2e642e3 --- /dev/null +++ b/mk/mkc_imp.vars.mk.in @@ -0,0 +1,7 @@ +MKC_VERSION = @version@ +BUILTINSDIR ?= @syscustomdir@ +MKC_LIBEXECDIR = @libexecdir@ +MKC_SYSCONFDIR = @sysconfdir@ +MKDEP = @mkdep_cmd@ +MKDEP_TYPE = @mkdep_type@ +MAKEDEPEND = @makedepend_cmd@ diff --git a/mk/sys.mk b/mk/sys.mk new file mode 100644 index 0000000..0e6f63e --- /dev/null +++ b/mk/sys.mk @@ -0,0 +1,22 @@ +# +# mk-configure can not know everything about your platform. +# This file is a system-wide default configuration file. +# In addition, @sysconfdir@/etc/mk.conf and /etc/mk.conf +# may be used by system administrator. +# +# Example is below: +# +# CC ?= /usr/bin/cc +# CXX ?= /usr/bin/CC +# YACC ?= /usr/sfw/bin/bison -y +# LEX ?= /usr/sfw/bin/flex +# INSTALL ?= /usr/ucb/install +# STRIP ?= /usr/ccs/bin/strip +# LD ?= /usr/ccs/bin/ld +# AR ?= /usr/ccs/bin/ar +# AS ?= /usr/ccs/bin/as +# LORDER ?= /usr/ccs/bin/lorder +# RANLIB ?= /usr/ccs/bin/ranlib +# LUA_LMODDIR ?= /usr/share/lua/5.1 +# LUA_CMODDIR ?= /usr/lib/lua/5.1 +# ... |