diff options
author | Glen Barber <gjb@FreeBSD.org> | 2016-01-04 19:19:48 +0000 |
---|---|---|
committer | Glen Barber <gjb@FreeBSD.org> | 2016-01-04 19:19:48 +0000 |
commit | b626f5a73a48f44a31a200291b141e1da408a2ff (patch) | |
tree | 3882b41d5bbb0e4ad065fa3392bf2eab80a3d4e3 /share/mk | |
parent | 5b7774f3ea9332e266e0353f708a83cb5ae348f7 (diff) | |
parent | 2418fd040b8118067ee3c923b9ed604664c9c709 (diff) |
MFH r289384-r293170
Sponsored by: The FreeBSD Foundation
Notes
Notes:
svn path=/projects/release-pkg/; revision=293172
Diffstat (limited to 'share/mk')
43 files changed, 1070 insertions, 502 deletions
diff --git a/share/mk/Makefile b/share/mk/Makefile index a3560b92ff5c..ac3fd94a7f07 100644 --- a/share/mk/Makefile +++ b/share/mk/Makefile @@ -6,6 +6,11 @@ # will read this Makefile since it auto includes it into -I. .if ${.CURDIR} == ${.PARSEDIR} +# Avoid creating a Makefile.depend here as it would get included anywhere +# in the build, similar to the problem above. It would cause dirdeps.mk +# to be included more times than desired. +UPDATE_DEPENDFILE= no + .include <src.opts.mk> FILES= \ @@ -58,7 +63,6 @@ FILES= \ sys.dependfile.mk \ version_gen.awk -NO_OBJ= FILESDIR= ${BINDIR}/mk .if ${MK_TESTS} != "no" diff --git a/share/mk/atf.test.mk b/share/mk/atf.test.mk index 6f99d88fc78a..babecd9f6a84 100644 --- a/share/mk/atf.test.mk +++ b/share/mk/atf.test.mk @@ -22,29 +22,6 @@ ATF_TESTS_C?= ATF_TESTS_CXX?= ATF_TESTS_SH?= -# Path to the prefix of the installed ATF tools, if any. -# -# If atf-run and atf-report are installed from ports, we automatically define a -# realregress target below to run the tests using these tools. The tools are -# searched for in the hierarchy specified by this variable. -ATF_PREFIX?= /usr/local - -# C compiler passed to ATF tests that need to build code. -ATF_BUILD_CC?= ${DESTDIR}/usr/bin/cc -TESTS_ENV+= ATF_BUILD_CC=${ATF_BUILD_CC} - -# C preprocessor passed to ATF tests that need to build code. -ATF_BUILD_CPP?= ${DESTDIR}/usr/bin/cpp -TESTS_ENV+= ATF_BUILD_CPP=${ATF_BUILD_CPP} - -# C++ compiler passed to ATF tests that need to build code. -ATF_BUILD_CXX?= ${DESTDIR}/usr/bin/c++ -TESTS_ENV+= ATF_BUILD_CXX=${ATF_BUILD_CXX} - -# Shell interpreter used to run atf-sh(1) based tests. -ATF_SHELL?= ${DESTDIR}/bin/sh -TESTS_ENV+= ATF_SHELL=${ATF_SHELL} - .if !empty(ATF_TESTS_C) PROGS+= ${ATF_TESTS_C} _TESTS+= ${ATF_TESTS_C} diff --git a/share/mk/bsd.README b/share/mk/bsd.README index cb6e41f3cf07..b1a68e8b538e 100644 --- a/share/mk/bsd.README +++ b/share/mk/bsd.README @@ -20,6 +20,7 @@ bsd.arch.inc.mk - includes arch-specific Makefile.$arch bsd.compiler.mk - defined based on current compiler bsd.confs.mk - install of configuration files bsd.cpu.mk - sets CPU/arch-related variables (included from sys.mk) +bsd.crunchgen.mk - building crunched binaries using crunchgen(1) bsd.dep.mk - handle Makefile dependencies bsd.doc.mk - building troff system documents bsd.endian.mk - TARGET_ENDIAN=1234(little) or 4321 (big) for target @@ -491,6 +492,10 @@ KYUAFILE If 'auto' (the default), generate a Kyuafile out of the subdirectories providing helper programs or data files only). +LOCALBASE The --prefix for the kyua package. + + The value of LOCALBASE defaults to /usr/local . + ATF_TESTS_C The names of the ATF C test programs to build. ATF_TESTS_CXX The names of the ATF C++ test programs to build. diff --git a/share/mk/bsd.compiler.mk b/share/mk/bsd.compiler.mk index dcdf5987b501..dee6a1d8a288 100644 --- a/share/mk/bsd.compiler.mk +++ b/share/mk/bsd.compiler.mk @@ -25,13 +25,102 @@ .if !target(__<bsd.compiler.mk>__) __<bsd.compiler.mk>__: +.include <bsd.opts.mk> + +# Handle ccache after CC is determined, but not if CC/CXX are already +# overridden with a manual setup. +.if ${MK_CCACHE_BUILD:Uno} == "yes" && \ + !make(showconfig) && \ + (${CC:M*ccache/world/*} == "" || ${CXX:M*ccache/world/*} == "") +# CC is always prepended with the ccache wrapper rather than modifying +# PATH since it is more clear that ccache is used and avoids wasting time +# for mkdep/linking/asm builds. +LOCALBASE?= /usr/local +CCACHE_WRAPPER_PATH?= ${LOCALBASE}/libexec/ccache +CCACHE_BIN?= ${LOCALBASE}/bin/ccache +.if exists(${CCACHE_BIN}) +# Export to ensure sub-makes can filter it out for mkdep/linking and +# to chain down into kernel build which won't include this file. +.export CCACHE_BIN +# Expand and export some variables so they may be based on make vars. +# This allows doing something like the following in the environment: +# CCACHE_BASEDIR='${SRCTOP:H}' MAKEOBJDIRPREFIX='${SRCTOP:H}/obj' +.for var in CCACHE_LOGFILE CCACHE_BASEDIR +.if defined(${var}) +${var}:= ${${var}} +.export ${var} +.endif +.endfor +# Handle bootstrapped compiler changes properly by hashing their content +# rather than checking mtime. For external compilers it should be safe +# to use the more optimal mtime check. +# XXX: CCACHE_COMPILERCHECK= string:<compiler_version, compiler_build_rev, compiler_patch_rev, compiler_default_target, compiler_default_sysroot> +.if ${CC:N${CCACHE_BIN}:[1]:M/*} == "" +CCACHE_COMPILERCHECK?= content +.else +CCACHE_COMPILERCHECK?= mtime +.endif +.export CCACHE_COMPILERCHECK +# Remove ccache from the PATH to prevent double calls and wasted CPP/LD time. +PATH:= ${PATH:C,:?${CCACHE_WRAPPER_PATH}(/world)?(:$)?,,g} +# Ensure no bogus CCACHE_PATH leaks in which might avoid the in-tree compiler. +.if !empty(CCACHE_PATH) +CCACHE_PATH= +.export CCACHE_PATH +.endif +# Override various toolchain vars. +.for var in CC CXX HOST_CC HOST_CXX +.if defined(${var}) && ${${var}:M${CCACHE_BIN}} == "" +${var}:= ${CCACHE_BIN} ${${var}} +.endif +.endfor +# GCC does not need the CCACHE_CPP2 hack enabled by default in devel/ccache. +# The port enables it due to ccache passing preprocessed C to clang +# which fails with -Wparentheses-equality, -Wtautological-compare, and +# -Wself-assign on macro-expanded lines. +.if defined(COMPILER_TYPE) && ${COMPILER_TYPE} == "gcc" +CCACHE_NOCPP2= 1 +.export CCACHE_NOCPP2 +.endif +# Canonicalize CCACHE_DIR for meta mode usage. +.if defined(CCACHE_DIR) && empty(.MAKE.META.IGNORE_PATHS:M${CCACHE_DIR}) +CCACHE_DIR:= ${CCACHE_DIR:tA} +.MAKE.META.IGNORE_PATHS+= ${CCACHE_DIR} +.export CCACHE_DIR +.endif +ccache-print-options: .PHONY + @${CCACHE_BIN} -p +.endif # exists(${CCACHE_BIN}) +.endif # ${MK_CCACHE_BUILD} == "yes" + +# Try to import COMPILER_TYPE and COMPILER_VERSION from parent make. +# The value is only used/exported for the same environment that impacts +# CC and COMPILER_* settings here. +_exported_vars= COMPILER_TYPE COMPILER_VERSION +_cc_hash= ${CC}${MACHINE}${PATH} +_cc_hash:= ${_cc_hash:hash} +# Only import if none of the vars are set somehow else. +_can_export= yes +.for var in ${_exported_vars} +.if defined(${var}) +_can_export= no +.endif +.endfor +.if ${_can_export} == yes +.for var in ${_exported_vars} +.if defined(${var}.${_cc_hash}) +${var}= ${${var}.${_cc_hash}} +.endif +.endfor +.endif + .if ${MACHINE} == "common" # common is a pseudo machine for architecture independent # generated files - thus there is no compiler. COMPILER_TYPE= none COMPILER_VERSION= 0 .elif !defined(COMPILER_TYPE) || !defined(COMPILER_VERSION) -_v!= ${CC} --version 2>/dev/null || echo 0.0.0 +_v!= ${CC} --version || echo 0.0.0 .if !defined(COMPILER_TYPE) . if ${CC:T:M*gcc*} @@ -49,11 +138,19 @@ COMPILER_TYPE:= clang . endif .endif .if !defined(COMPILER_VERSION) -COMPILER_VERSION!=echo ${_v:M[1-9].[0-9]*} | awk -F. '{print $$1 * 10000 + $$2 * 100 + $$3;}' +COMPILER_VERSION!=echo "${_v:M[1-9].[0-9]*}" | awk -F. '{print $$1 * 10000 + $$2 * 100 + $$3;}' .endif .undef _v .endif +# Export the values so sub-makes don't have to look them up again, using the +# hash key computed above. +.for var in ${_exported_vars} +${var}.${_cc_hash}:= ${${var}} +.export-env ${var}.${_cc_hash} +.undef ${var}.${_cc_hash} +.endfor + .if ${COMPILER_TYPE} == "clang" || \ (${COMPILER_TYPE} == "gcc" && ${COMPILER_VERSION} >= 40800) COMPILER_FEATURES= c++11 diff --git a/share/mk/bsd.confs.mk b/share/mk/bsd.confs.mk index 0750a4e4fa57..aa5191f995b6 100644 --- a/share/mk/bsd.confs.mk +++ b/share/mk/bsd.confs.mk @@ -4,11 +4,10 @@ .error bsd.conf.mk cannot be included directly. .endif -.if ${MK_INCLUDES} != "no" CONFGROUPS?= CONFS .if !target(buildconfig) -.for group in ${CONFSGROUPS} +.for group in ${CONFGROUPS} buildconfig: ${${group}} .endfor .endif @@ -22,10 +21,9 @@ all: buildconfig ${group}OWN?= ${SHAREOWN} ${group}GRP?= ${SHAREGRP} ${group}MODE?= ${CONFMODE} -${group}DIR?= ${CONFIGDIR}/ +${group}DIR?= ${CONFDIR} STAGE_SETS+= ${group} STAGE_DIR.${group}= ${STAGE_OBJTOP}${${group}DIR} -STAGE_SYMLINKS_DIR.${group}= ${STAGE_OBJTOP} _${group}CONFS= .for cnf in ${${group}} @@ -46,7 +44,6 @@ STAGE_AS_${cnf:T}= ${${group}NAME_${cnf:T}} # XXX {group}OWN,GRP,MODE STAGE_DIR.${cnf:T}= ${STAGE_OBJTOP}${${group}DIR_${cnf:T}} stage_as.${cnf:T}: ${cnf} -stage_config: stage_as.${cnf:T} installconfig: _${group}INS_${cnf:T} _${group}INS_${cnf:T}: ${cnf} @@ -60,7 +57,6 @@ _${group}CONFS+= ${cnf} .endfor .if !empty(_${group}CONFS) stage_files.${group}: ${_${group}CONFS} -stage_config: stage_files.${group} installconfig: _${group}INS _${group}INS: ${_${group}CONFS} @@ -69,7 +65,7 @@ _${group}INS: ${_${group}CONFS} ${.ALLSRC} ${DESTDIR}${${group}DIR}/${${group}NAME} .else ${INSTALL} -C -o ${${group}OWN} -g ${${group}GRP} -m ${${group}MODE} \ - ${.ALLSRC} ${DESTDIR}${${group}DIR} + ${.ALLSRC} ${DESTDIR}${${group}DIR}/ .endif .endif @@ -78,10 +74,12 @@ _${group}INS: ${_${group}CONFS} .endif # !target(installconfig) -.if ${MK_STAGING} != "no" && !defined(_SKIP_BUILD) -.if !defined(NO_STAGE_CONFIG) -STAGE_TARGETS+= stage_config +.if ${MK_STAGING} != "no" +.if !empty(STAGE_SETS) +buildconfig: stage_files +.if !empty(STAGE_AS_SETS) +buildconfig: stage_as +.endif .endif .endif -.endif # ${MK_INCLUDES} != "no" diff --git a/share/mk/bsd.cpu.mk b/share/mk/bsd.cpu.mk index 112c2d5490fe..d54a354ec47a 100644 --- a/share/mk/bsd.cpu.mk +++ b/share/mk/bsd.cpu.mk @@ -18,6 +18,8 @@ MACHINE_CPU = i486 MACHINE_CPU = mips . elif ${MACHINE_CPUARCH} == "powerpc" MACHINE_CPU = aim +. elif ${MACHINE_CPUARCH} == "riscv" +MACHINE_CPU = riscv . elif ${MACHINE_CPUARCH} == "sparc64" MACHINE_CPU = ultrasparc . endif @@ -84,8 +86,7 @@ CPUTYPE = ultrasparc3 # after /etc/make.conf so it can react to the local value of CPUTYPE # defined therein. Consult: # http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html -# http://gcc.gnu.org/onlinedocs/gcc/IA_002d64-Options.html -# http://gcc.gnu.org/onlinedocs/gcc/RS_002f6000-and-PowerPC-Options.html +# http://gcc.gnu.org/onlinedocs/gcc/RS-6000-and-PowerPC-Options.html # http://gcc.gnu.org/onlinedocs/gcc/MIPS-Options.html # http://gcc.gnu.org/onlinedocs/gcc/SPARC-Options.html # http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html @@ -111,9 +112,22 @@ _CPUCFLAGS = -march=armv5te -D__XSCALE__ _CPUCFLAGS = -march=${CPUTYPE} -DARM_ARCH_6=1 . elif ${CPUTYPE} == "cortexa" _CPUCFLAGS = -march=armv7 -DARM_ARCH_6=1 -mfpu=vfp -. else +. elif ${CPUTYPE:Marmv[4567]*} != "" +# Handle all the armvX types that FreeBSD runs: +# armv4, armv4t, armv5, armv5te, armv6, armv6t2, armv7, armv7-a, armv7ve +# they require -march=. All the others require -mcpu=. +_CPUCFLAGS = -march=${CPUTYPE} +. else +# Common values for FreeBSD +# arm: +# arm920t, arm926ej-s, marvell-pj4, fa526, fa626, +# fa606te, fa626te, fa726te +# armv6: +# arm1176jzf-s, generic-armv7-a, cortex-a5, cortex-a7, cortex-a8, +# cortex-a9, cortex-a12, cortex-a15, cortex-a17, cortex-a53, cortex-a57, +# cortex-a72, exynos-m1 _CPUCFLAGS = -mcpu=${CPUTYPE} -. endif +. endif . elif ${MACHINE_ARCH} == "powerpc" . if ${CPUTYPE} == "e500" _CPUCFLAGS = -Wa,-me500 -msoft-float @@ -123,19 +137,21 @@ _CPUCFLAGS = -mcpu=${CPUTYPE} -mno-powerpc64 . elif ${MACHINE_ARCH} == "powerpc64" _CPUCFLAGS = -mcpu=${CPUTYPE} . elif ${MACHINE_CPUARCH} == "mips" -. if ${CPUTYPE} == "mips32" -_CPUCFLAGS = -march=mips32 -. elif ${CPUTYPE} == "mips32r2" -_CPUCFLAGS = -march=mips32r2 -. elif ${CPUTYPE} == "mips64" -_CPUCFLAGS = -march=mips64 -. elif ${CPUTYPE} == "mips64r2" -_CPUCFLAGS = -march=mips64r2 -. elif ${CPUTYPE} == "mips4kc" -_CPUCFLAGS = -march=4kc -. elif ${CPUTYPE} == "mips24kc" -_CPUCFLAGS = -march=24kc -. endif +# mips[1234], mips32, mips64, and all later releases need to have mips +# preserved (releases later than r2 require external toolchain) +. if ${CPUTYPE:Mmips32*} != "" || ${CPUTYPE:Mmips64*} != "" || \ + ${CPUTYPE:Mmips[1234]} != "" +_CPUCFLAGS = -march=${CPUTYPE} +. else +# Default -march to the CPUTYPE passed in, with mips stripped off so we +# accept either mips4kc or 4kc, mostly for historical reasons +# Typical values for cores: +# 4kc, 24kc, 34kc, 74kc, 1004kc, octeon, octeon+, octeon2, octeon3, +# sb1, xlp, xlr +_CPUCFLAGS = -march=${CPUTYPE:S/^mips//} +. endif +. elif ${MACHINE_CPUARCH} == "riscv" +_CPUCFLAGS = -msoft-float # -march="RV64I" # RISCVTODO . elif ${MACHINE_ARCH} == "sparc64" . if ${CPUTYPE} == "v9" _CPUCFLAGS = -mcpu=v9 @@ -144,6 +160,8 @@ _CPUCFLAGS = -mcpu=ultrasparc . elif ${CPUTYPE} == "ultrasparc3" _CPUCFLAGS = -mcpu=ultrasparc3 . endif +. elif ${MACHINE_CPUARCH} == "aarch64" +_CPUCFLAGS = -mcpu=${CPUTYPE} . endif # Set up the list of CPU features based on the CPU type. This is an @@ -255,11 +273,17 @@ MACHINE_CPU = ssse3 sse3 MACHINE_CPU = sse3 . endif MACHINE_CPU += amd64 sse2 sse mmx +########## Mips +. elif ${MACHINE_CPUARCH} == "mips" +MACHINE_CPU = mips ########## powerpc . elif ${MACHINE_ARCH} == "powerpc" . if ${CPUTYPE} == "e500" MACHINE_CPU = booke softfp . endif +########## riscv +. elif ${MACHINE_CPUARCH} == "riscv" +MACHINE_CPU = riscv ########## sparc64 . elif ${MACHINE_ARCH} == "sparc64" . if ${CPUTYPE} == "v9" @@ -296,6 +320,10 @@ CFLAGS += -mfloat-abi=softfp .endif .endif +.if ${MACHINE_CPUARCH} == "riscv" +CFLAGS += -msoft-float +.endif + # NB: COPTFLAGS is handled in /usr/src/sys/conf/kern.pre.mk .if !defined(NO_CPU_CFLAGS) diff --git a/share/mk/bsd.crunchgen.mk b/share/mk/bsd.crunchgen.mk index 0f0edd3c22fb..9374f333593c 100644 --- a/share/mk/bsd.crunchgen.mk +++ b/share/mk/bsd.crunchgen.mk @@ -1,5 +1,7 @@ ################################################################# # +# Generate crunched binaries using crunchgen(1). +# # General notes: # # A number of Make variables are used to generate the crunchgen config file. @@ -13,14 +15,14 @@ # local architecture. # # Special options can be specified for individual programs -# CRUNCH_SRCDIR_$(P): base source directory for program $(P) -# CRUNCH_BUILDOPTS_$(P): additional build options for $(P) -# CRUNCH_ALIAS_$(P): additional names to be used for $(P) +# CRUNCH_SRCDIR_${P}: base source directory for program ${P} +# CRUNCH_BUILDOPTS_${P}: additional build options for ${P} +# CRUNCH_ALIAS_${P}: additional names to be used for ${P} # # By default, any name appearing in CRUNCH_PROGS or CRUNCH_ALIAS_${P} # will be used to generate a hard link to the resulting binary. # Specific links can be suppressed by setting -# CRUNCH_SUPPRESS_LINK_$(NAME) to 1. +# CRUNCH_SUPPRESS_LINK_${NAME} to 1. # # If CRUNCH_GENERATE_LINKS is set to no, no links will be generated. # @@ -31,138 +33,117 @@ # The following is pretty nearly a generic crunchgen-handling makefile # -CONF= $(PROG).conf -OUTMK= $(PROG).mk -OUTC= $(PROG).c -OUTPUTS=$(OUTMK) $(OUTC) $(PROG).cache +CONF= ${PROG}.conf +OUTMK= ${PROG}.mk +OUTC= ${PROG}.c +OUTPUTS=${OUTMK} ${OUTC} ${PROG}.cache CRUNCHOBJS= ${.OBJDIR} -.if defined(MAKEOBJDIRPREFIX) -CANONICALOBJDIR:= ${MAKEOBJDIRPREFIX}${.CURDIR} -.elif defined(MAKEOBJDIR) && ${MAKEOBJDIR:M/*} != "" -CANONICALOBJDIR:=${MAKEOBJDIR} -.else -CANONICALOBJDIR:= /usr/obj${.CURDIR} -.endif -CRUNCH_GENERATE_LINKS?= yes +CRUNCH_GENERATE_LINKS?= yes -CLEANFILES+= $(CONF) *.o *.lo *.c *.mk *.cache *.a *.h +CLEANFILES+= ${CONF} *.o *.lo *.c *.mk *.cache *.a *.h # Don't try to extract debug info from ${PROG}. -MK_DEBUG_FILES=no +MK_DEBUG_FILES= no + +# Set a default SRCDIR for each for simpler handling below. +.for D in ${CRUNCH_SRCDIRS} +.for P in ${CRUNCH_PROGS_${D}} +CRUNCH_SRCDIR_${P}?= ${.CURDIR}/../../${D}/${P} +.endfor +.endfor # Program names and their aliases contribute hardlinks to 'rescue' executable, # except for those that get suppressed. -.for D in $(CRUNCH_SRCDIRS) -.for P in $(CRUNCH_PROGS_$(D)) -.ifdef CRUNCH_SRCDIR_${P} -$(OUTPUTS): $(CRUNCH_SRCDIR_${P})/Makefile -.else -$(OUTPUTS): $(.CURDIR)/../../$(D)/$(P)/Makefile -.endif +.for D in ${CRUNCH_SRCDIRS} +.for P in ${CRUNCH_PROGS_${D}} +${OUTPUTS}: ${CRUNCH_SRCDIR_${P}}/Makefile .if ${CRUNCH_GENERATE_LINKS} == "yes" .ifndef CRUNCH_SUPPRESS_LINK_${P} -LINKS+= $(BINDIR)/$(PROG) $(BINDIR)/$(P) +LINKS+= ${BINDIR}/${PROG} ${BINDIR}/${P} .endif -.for A in $(CRUNCH_ALIAS_$(P)) +.for A in ${CRUNCH_ALIAS_${P}} .ifndef CRUNCH_SUPPRESS_LINK_${A} -LINKS+= $(BINDIR)/$(PROG) $(BINDIR)/$(A) +LINKS+= ${BINDIR}/${PROG} ${BINDIR}/${A} .endif .endfor .endif .endfor .endfor -all: $(PROG) -exe: $(PROG) +all: ${PROG} +exe: ${PROG} -$(CONF): Makefile - echo \# Auto-generated, do not edit >$(.TARGET) +${CONF}: Makefile + echo \# Auto-generated, do not edit >${.TARGET} .ifdef CRUNCH_BUILDOPTS - echo buildopts $(CRUNCH_BUILDOPTS) >>$(.TARGET) + echo buildopts ${CRUNCH_BUILDOPTS} >>${.TARGET} .endif .ifdef CRUNCH_LIBS - echo libs $(CRUNCH_LIBS) >>$(.TARGET) + echo libs ${CRUNCH_LIBS} >>${.TARGET} .endif .ifdef CRUNCH_SHLIBS - echo libs_so $(CRUNCH_SHLIBS) >>$(.TARGET) -.endif -.for D in $(CRUNCH_SRCDIRS) -.for P in $(CRUNCH_PROGS_$(D)) - echo progs $(P) >>$(.TARGET) -.ifdef CRUNCH_SRCDIR_${P} - echo special $(P) srcdir $(CRUNCH_SRCDIR_${P}) >>$(.TARGET) -.else - echo special $(P) srcdir $(.CURDIR)/../../$(D)/$(P) >>$(.TARGET) + echo libs_so ${CRUNCH_SHLIBS} >>${.TARGET} .endif +.for D in ${CRUNCH_SRCDIRS} +.for P in ${CRUNCH_PROGS_${D}} + echo progs ${P} >>${.TARGET} + echo special ${P} srcdir ${CRUNCH_SRCDIR_${P}} >>${.TARGET} .ifdef CRUNCH_BUILDOPTS_${P} - echo special $(P) buildopts DIRPRFX=${DIRPRFX}${P}/ \ - $(CRUNCH_BUILDOPTS_${P}) >>$(.TARGET) + echo special ${P} buildopts DIRPRFX=${DIRPRFX}${P}/ \ + ${CRUNCH_BUILDOPTS_${P}} >>${.TARGET} .else - echo special $(P) buildopts DIRPRFX=${DIRPRFX}${P}/ >>$(.TARGET) + echo special ${P} buildopts DIRPRFX=${DIRPRFX}${P}/ >>${.TARGET} .endif -.for A in $(CRUNCH_ALIAS_$(P)) - echo ln $(P) $(A) >>$(.TARGET) +.for A in ${CRUNCH_ALIAS_${P}} + echo ln ${P} ${A} >>${.TARGET} .endfor .endfor .endfor CRUNCHGEN?= crunchgen -# XXX Make sure we don't pass -P to crunchgen(1). -.MAKEFLAGS:= ${.MAKEFLAGS:N-P} -.ORDER: $(OUTPUTS) objs -$(OUTPUTS): $(CONF) .META - MAKE=${MAKE} MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${CRUNCHGEN} -fq -m $(OUTMK) \ - -c $(OUTC) $(CONF) +CRUNCHENV?= MK_TESTS=no +.ORDER: ${OUTPUTS} objs +${OUTPUTS}: ${CONF} .META + MAKE=${MAKE} MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${CRUNCHGEN} -fq \ + -m ${OUTMK} -c ${OUTC} ${CONF} -$(PROG): $(OUTPUTS) objs - MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} -f $(OUTMK) exe +# These 2 targets cannot use .MAKE since they depend on the generated +# ${OUTMK} above. +${PROG}: ${OUTPUTS} objs + ${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} -f ${OUTMK} exe -objs: $(OUTMK) - MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} -f $(OUTMK) objs +objs: ${OUTMK} + ${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} -f ${OUTMK} objs # <sigh> Someone should replace the bin/csh and bin/sh build-tools with # shell scripts so we can remove this nonsense. -build-tools: -.for _tool in $(CRUNCH_BUILDTOOLS) - cd $(.CURDIR)/../../${_tool}; \ - MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} obj; \ - MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} build-tools +.for _tool in ${CRUNCH_BUILDTOOLS} +build-tools-${_tool}: + ${_+_}cd ${.CURDIR}/../../${_tool}; \ + ${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} obj; \ + ${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} build-tools +build-tools: build-tools-${_tool} .endfor # Use a separate build tree to hold files compiled for this crunchgen binary # Yes, this does seem to partly duplicate bsd.subdir.mk, but I can't # get that to cooperate with bsd.prog.mk. Besides, many of the standard # targets should NOT be propagated into the components. -cleandepend cleandir obj objlink: -.for D in $(CRUNCH_SRCDIRS) -.for P in $(CRUNCH_PROGS_$(D)) -.ifdef CRUNCH_SRCDIR_${P} - cd ${CRUNCH_SRCDIR_$(P)} && \ - MAKEOBJDIRPREFIX=${CANONICALOBJDIR} ${MAKE} \ - DIRPRFX=${DIRPRFX}${P}/ ${CRUNCH_BUILDOPTS} ${.TARGET} -.else - cd $(.CURDIR)/../../${D}/${P} && \ - MAKEOBJDIRPREFIX=${CANONICALOBJDIR} ${MAKE} \ - DIRPRFX=${DIRPRFX}${P}/ ${CRUNCH_BUILDOPTS} ${.TARGET} -.endif +.for __target in clean cleandepend cleandir obj objlink +.for D in ${CRUNCH_SRCDIRS} +.for P in ${CRUNCH_PROGS_${D}} +${__target}_crunchdir_${P}: .PHONY .MAKE + ${_+_}cd ${CRUNCH_SRCDIR_${P}} && \ + ${CRUNCHENV} MAKEOBJDIRPREFIX=${CANONICALOBJDIR} ${MAKE} \ + DIRPRFX=${DIRPRFX}${P}/ ${CRUNCH_BUILDOPTS} ${__target} +${__target}: ${__target}_crunchdir_${P} +.endfor .endfor .endfor clean: rm -f ${CLEANFILES} - if [ -e ${.OBJDIR}/$(OUTMK) ]; then \ - MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} -f $(OUTMK) clean; \ + ${_+_}if [ -e ${.OBJDIR}/${OUTMK} ]; then \ + ${CRUNCHENV} MAKEOBJDIRPREFIX=${CRUNCHOBJS} ${MAKE} \ + -f ${OUTMK} clean; \ fi -.for D in $(CRUNCH_SRCDIRS) -.for P in $(CRUNCH_PROGS_$(D)) -.ifdef CRUNCH_SRCDIR_${P} - cd ${CRUNCH_SRCDIR_$(P)} && \ - MAKEOBJDIRPREFIX=${CANONICALOBJDIR} ${MAKE} \ - DIRPRFX=${DIRPRFX}${P}/ ${CRUNCH_BUILDOPTS} ${.TARGET} -.else - cd $(.CURDIR)/../../${D}/${P} && \ - MAKEOBJDIRPREFIX=${CANONICALOBJDIR} ${MAKE} \ - DIRPRFX=${DIRPRFX}${P}/ ${CRUNCH_BUILDOPTS} ${.TARGET} -.endif -.endfor -.endfor diff --git a/share/mk/bsd.dep.mk b/share/mk/bsd.dep.mk index 965f7034bdb8..87491fe368e1 100644 --- a/share/mk/bsd.dep.mk +++ b/share/mk/bsd.dep.mk @@ -48,12 +48,15 @@ CTAGSFLAGS?= GTAGSFLAGS?= -o HTAGSFLAGS?= -.if ${CC} != "cc" -MKDEPCMD?= CC='${CC} ${DEPFLAGS}' mkdep -.else -MKDEPCMD?= mkdep +_MKDEPCC:= ${CC:N${CCACHE_BIN}} +# XXX: DEPFLAGS can come out once Makefile.inc1 properly passes down +# CXXFLAGS. +.if !empty(DEPFLAGS) +_MKDEPCC+= ${DEPFLAGS} .endif +MKDEPCMD?= CC='${_MKDEPCC}' mkdep DEPENDFILE?= .depend +DEPENDFILES= ${DEPENDFILE} # Keep `tags' here, before SRCS are mangled below for `depend'. .if !target(tags) && defined(SRCS) && !defined(NO_TAGS) @@ -72,7 +75,7 @@ tags: ${SRCS} .if defined(SRCS) CLEANFILES?= -.if !exists(${.OBJDIR}/${DEPENDFILE}) +.if ${MK_FAST_DEPEND} == "yes" || !exists(${.OBJDIR}/${DEPENDFILE}) .for _S in ${SRCS:N*.[dhly]} ${_S:R}.o: ${_S} .endfor @@ -83,7 +86,7 @@ ${_S:R}.o: ${_S} .for _LC in ${_LSRC:R}.c ${_LC}: ${_LSRC} ${LEX} ${LFLAGS} -o${.TARGET} ${.ALLSRC} -.if !exists(${.OBJDIR}/${DEPENDFILE}) +.if ${MK_FAST_DEPEND} == "yes" || !exists(${.OBJDIR}/${DEPENDFILE}) ${_LC:R}.o: ${_LC} .endif SRCS:= ${SRCS:S/${_LSRC}/${_LC}/} @@ -114,7 +117,7 @@ CLEANFILES+= ${_YH} ${_YC}: ${_YSRC} ${YACC} ${YFLAGS} -o ${_YC} ${.ALLSRC} .endif -.if !exists(${.OBJDIR}/${DEPENDFILE}) +.if ${MK_FAST_DEPEND} == "yes" || !exists(${.OBJDIR}/${DEPENDFILE}) ${_YC:R}.o: ${_YC} .endif .endfor @@ -145,9 +148,38 @@ ${_D}.po: ${_DSRC} ${POBJS:S/^${_D}.po$//} .endfor beforedepend: ${DHDRS} beforebuild: ${DHDRS} + + +.if ${MK_FAST_DEPEND} == "yes" && ${.MAKE.MODE:Unormal:Mmeta*} == "" +DEPENDFILES+= ${DEPENDFILE}.* +DEPEND_MP?= -MP +# Handle OBJS=../somefile.o hacks. Just replace '/' rather than use :T to +# avoid collisions. +DEPEND_FILTER= C,/,_,g +DEPEND_CFLAGS+= -MD ${DEPEND_MP} -MF${DEPENDFILE}.${.TARGET:${DEPEND_FILTER}} +DEPEND_CFLAGS+= -MT${.TARGET} +.if defined(.PARSEDIR) +# Only add in DEPEND_CFLAGS for CFLAGS on files we expect from DEPENDOBJS +# as those are the only ones we will include. +DEPEND_CFLAGS_CONDITION= !empty(DEPENDOBJS:M${.TARGET:${DEPEND_FILTER}}) +CFLAGS+= ${${DEPEND_CFLAGS_CONDITION}:?${DEPEND_CFLAGS}:} +.else +CFLAGS+= ${DEPEND_CFLAGS} +.endif +DEPENDSRCS= ${SRCS:M*.[cSC]} ${SRCS:M*.cxx} ${SRCS:M*.cpp} ${SRCS:M*.cc} +.if !empty(DEPENDSRCS) +DEPENDOBJS+= ${DEPENDSRCS:R:S,$,.o,} .endif +.for __obj in ${DEPENDOBJS:O:u} +.if ${.MAKEFLAGS:M-V} == "" +.sinclude "${DEPENDFILE}.${__obj:${DEPEND_FILTER}}" +.endif +DEPENDFILES_OBJS+= ${DEPENDFILE}.${__obj:${DEPEND_FILTER}} +.endfor +.endif # ${MK_FAST_DEPEND} == "yes" +.endif # defined(SRCS) -.if ${MK_META_MODE} == "yes" +.if ${MK_DIRDEPS_BUILD} == "yes" .include <meta.autodep.mk> # this depend: bypasses that below # the dependency helps when bootstrapping @@ -161,7 +193,7 @@ afterdepend: beforedepend depend: beforedepend ${DEPENDFILE} afterdepend # Tell bmake not to look for generated files via .PATH -.NOPATH: ${DEPENDFILE} +.NOPATH: ${DEPENDFILE} ${DEPENDFILES_OBJS} # Different types of sources are compiled with slightly different flags. # Split up the sources, and filter out headers and non-applicable flags. @@ -172,6 +204,7 @@ MKDEP_CXXFLAGS= ${CXXFLAGS:M-nostdinc*} ${CXXFLAGS:M-[BIDU]*} \ DPSRCS+= ${SRCS} ${DEPENDFILE}: ${DPSRCS} +.if ${MK_FAST_DEPEND} == "no" rm -f ${DEPENDFILE} .if !empty(DPSRCS:M*.[cS]) ${MKDEPCMD} -f ${DEPENDFILE} -a ${MKDEP} \ @@ -182,7 +215,11 @@ ${DEPENDFILE}: ${DPSRCS} ${MKDEPCMD} -f ${DEPENDFILE} -a ${MKDEP} \ ${MKDEP_CXXFLAGS} \ ${.ALLSRC:M*.cc} ${.ALLSRC:M*.C} ${.ALLSRC:M*.cpp} ${.ALLSRC:M*.cxx} +.else .endif +.else + : > ${.TARGET} +.endif # ${MK_FAST_DEPEND} == "no" .if target(_EXTRADEPEND) _EXTRADEPEND: .USE ${DEPENDFILE}: _EXTRADEPEND @@ -207,12 +244,12 @@ afterdepend: cleandepend: .if defined(SRCS) .if ${CTAGS:T} == "gtags" - rm -f ${DEPENDFILE} GPATH GRTAGS GSYMS GTAGS + rm -f ${DEPENDFILES} GPATH GRTAGS GSYMS GTAGS .if defined(HTML) rm -rf HTML .endif .else - rm -f ${DEPENDFILE} tags + rm -f ${DEPENDFILES} tags .endif .endif .endif diff --git a/share/mk/bsd.doc.mk b/share/mk/bsd.doc.mk index ae637a482931..a4b9fc1e0554 100644 --- a/share/mk/bsd.doc.mk +++ b/share/mk/bsd.doc.mk @@ -143,11 +143,11 @@ realinstall: .if ${PRINTERDEVICE:Mhtml} cd ${SRCDIR}; \ ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},docs} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ - ${DOC}*.html ${DESTDIR}${BINDIR}/${VOLUME} + ${DOC}*.html ${DESTDIR}${BINDIR}/${VOLUME}/ .endif .for _dev in ${PRINTERDEVICE:Nhtml} ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},docs} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ - ${DFILE.${_dev}} ${DESTDIR}${BINDIR}/${VOLUME} + ${DFILE.${_dev}} ${DESTDIR}${BINDIR}/${VOLUME}/ .endfor spell: ${SRCS} diff --git a/share/mk/bsd.endian.mk b/share/mk/bsd.endian.mk index 2d1a53ed3685..c7ec42cb2876 100644 --- a/share/mk/bsd.endian.mk +++ b/share/mk/bsd.endian.mk @@ -4,6 +4,7 @@ ${MACHINE_ARCH} == "amd64" || \ ${MACHINE_ARCH} == "i386" || \ (${MACHINE} == "arm" && ${MACHINE_ARCH:Marm*eb*} == "") || \ + ${MACHINE_CPUARCH} == "riscv" || \ ${MACHINE_ARCH:Mmips*el} != "" TARGET_ENDIANNESS= 1234 .elif ${MACHINE_ARCH} == "powerpc" || \ diff --git a/share/mk/bsd.files.mk b/share/mk/bsd.files.mk index f4c96e881550..448ac389c098 100644 --- a/share/mk/bsd.files.mk +++ b/share/mk/bsd.files.mk @@ -30,7 +30,6 @@ ${group}DIR?= ${BINDIR} STAGE_SETS+= ${group} .endif STAGE_DIR.${group}= ${STAGE_OBJTOP}${${group}DIR} -STAGE_SYMLINKS_DIR.${group}= ${STAGE_OBJTOP} .if defined(NO_ROOT) .if !defined(${group}TAGS) || ! ${${group}TAGS:Mpackage=*} @@ -44,7 +43,7 @@ _${group}FILES= .for file in ${${group}} .if defined(${group}OWN_${file:T}) || defined(${group}GRP_${file:T}) || \ defined(${group}MODE_${file:T}) || defined(${group}DIR_${file:T}) || \ - defined(${group}NAME_${file:T}) + defined(${group}NAME_${file:T}) || defined(${group}NAME) ${group}OWN_${file:T}?= ${${group}OWN} ${group}GRP_${file:T}?= ${${group}GRP} ${group}MODE_${file:T}?= ${${group}MODE} @@ -83,7 +82,7 @@ _${group}INS: ${_${group}FILES} ${DESTDIR}${${group}DIR}/${${group}NAME} .else ${INSTALL} ${${group}TAG_ARGS} -o ${${group}OWN} -g ${${group}GRP} \ - -m ${${group}MODE} ${.ALLSRC} ${DESTDIR}${${group}DIR} + -m ${${group}MODE} ${.ALLSRC} ${DESTDIR}${${group}DIR}/ .endif .endif diff --git a/share/mk/bsd.incs.mk b/share/mk/bsd.incs.mk index 097eb7f786a9..06d04ed67c15 100644 --- a/share/mk/bsd.incs.mk +++ b/share/mk/bsd.incs.mk @@ -77,7 +77,7 @@ _${group}INS: ${_${group}INCS} ${.ALLSRC} ${DESTDIR}${${group}DIR}/${${group}NAME} .else ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},development} -C -o ${${group}OWN} -g ${${group}GRP} -m ${${group}MODE} \ - ${.ALLSRC} ${DESTDIR}${${group}DIR} + ${.ALLSRC} ${DESTDIR}${${group}DIR}/ .endif .endif diff --git a/share/mk/bsd.info.mk b/share/mk/bsd.info.mk index 8f9131585419..7720d286d3b5 100644 --- a/share/mk/bsd.info.mk +++ b/share/mk/bsd.info.mk @@ -177,11 +177,11 @@ CLEANFILES+= ${INFO:S/$/.info.*.html/} ${INFO:S/$/.info/} install: ${INSTALLINFODIRS} .if !empty(IFILES:N*.html) ${INSTALL} -o ${INFOOWN} -g ${INFOGRP} -m ${INFOMODE} \ - ${IFILES:N*.html} ${DESTDIR}${INFODIR} + ${IFILES:N*.html} ${DESTDIR}${INFODIR}/ .endif .if !empty(FORMATS:Mhtml) ${INSTALL} -o ${INFOOWN} -g ${INFOGRP} -m ${INFOMODE} \ - ${INFO:S/$/.info.*.html/} ${DESTDIR}${INFODIR} + ${INFO:S/$/.info.*.html/} ${DESTDIR}${INFODIR}/ .endif .else # The indirection in the following is to avoid the null install rule diff --git a/share/mk/bsd.lib.mk b/share/mk/bsd.lib.mk index ca73d2dc55db..74b780b296d2 100644 --- a/share/mk/bsd.lib.mk +++ b/share/mk/bsd.lib.mk @@ -120,21 +120,23 @@ PO_FLAG=-pg ${CTFCONVERT_CMD} .asm.po: - ${CC} -x assembler-with-cpp -DPROF ${PO_CFLAGS} ${ACFLAGS} \ - -c ${.IMPSRC} -o ${.TARGET} + ${CC:N${CCACHE_BIN}} -x assembler-with-cpp -DPROF ${PO_CFLAGS} \ + ${ACFLAGS} -c ${.IMPSRC} -o ${.TARGET} ${CTFCONVERT_CMD} .asm.So: - ${CC} -x assembler-with-cpp ${PICFLAG} -DPIC ${CFLAGS} ${ACFLAGS} \ - -c ${.IMPSRC} -o ${.TARGET} + ${CC:N${CCACHE_BIN}} -x assembler-with-cpp ${PICFLAG} -DPIC \ + ${CFLAGS} ${ACFLAGS} -c ${.IMPSRC} -o ${.TARGET} ${CTFCONVERT_CMD} .S.po: - ${CC} -DPROF ${PO_CFLAGS} ${ACFLAGS} -c ${.IMPSRC} -o ${.TARGET} + ${CC:N${CCACHE_BIN}} -DPROF ${PO_CFLAGS} ${ACFLAGS} -c ${.IMPSRC} \ + -o ${.TARGET} ${CTFCONVERT_CMD} .S.So: - ${CC} ${PICFLAG} -DPIC ${CFLAGS} ${ACFLAGS} -c ${.IMPSRC} -o ${.TARGET} + ${CC:N${CCACHE_BIN}} ${PICFLAG} -DPIC ${CFLAGS} ${ACFLAGS} \ + -c ${.IMPSRC} -o ${.TARGET} ${CTFCONVERT_CMD} .if !defined(_SKIP_BUILD) @@ -151,7 +153,7 @@ SHLIB_NAME_FULL=${SHLIB_NAME}.full # Use ${DEBUGDIR} for base system debug files, else .debug subdirectory .if ${_SHLIBDIR} == "/boot" ||\ ${SHLIBDIR:C%/lib(/.*)?$%/lib%} == "/lib" ||\ - ${SHLIBDIR:C%/usr/lib(32)?(/.*)?%/usr/lib%} == "/usr/lib" + ${SHLIBDIR:C%/usr/(tests/)?lib(32|exec)?(/.*)?%/usr/lib%} == "/usr/lib" DEBUGFILEDIR=${DEBUGDIR}${_SHLIBDIR} .else DEBUGFILEDIR=${_SHLIBDIR}/.debug @@ -191,6 +193,7 @@ lib${LIB_PRIVATE}${LIB}.a: ${OBJS} ${STATICOBJS} .if ${MK_PROFILE} != "no" && defined(LIB) && !empty(LIB) _LIBS+= lib${LIB_PRIVATE}${LIB}_p.a POBJS+= ${OBJS:.o=.po} ${STATICOBJS:.o=.po} +DEPENDOBJS+= ${POBJS} CLEANFILES+= ${POBJS} lib${LIB_PRIVATE}${LIB}_p.a: ${POBJS} @@ -203,6 +206,7 @@ lib${LIB_PRIVATE}${LIB}_p.a: ${POBJS} .if defined(SHLIB_NAME) || \ defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) SOBJS+= ${OBJS:.o=.So} +DEPENDOBJS+= ${SOBJS} CLEANFILES+= ${SOBJS} .endif @@ -260,7 +264,7 @@ ${SHLIB_NAME_FULL}: ${SOBJS} .if defined(SHLIB_LINK) && !commands(${SHLIB_LINK:R}.ld) @${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},development} ${SHLIB_NAME} ${SHLIB_LINK} .endif - ${_LD} ${LDFLAGS} ${SSP_CFLAGS} ${SOLINKOPTS} \ + ${_LD:N${CCACHE_BIN}} ${LDFLAGS} ${SSP_CFLAGS} ${SOLINKOPTS} \ -o ${.TARGET} -Wl,-soname,${SONAME} \ `NM='${NM}' NMFLAGS='${NMFLAGS}' lorder ${SOBJS} | tsort -q` ${LDADD} .if ${MK_CTF} != "no" @@ -316,10 +320,12 @@ all: _manpages .endif _EXTRADEPEND: +.if ${MK_FAST_DEPEND} == "no" @TMP=_depend$$$$; \ sed -e 's/^\([^\.]*\).o[ ]*:/\1.o \1.po \1.So:/' < ${DEPENDFILE} \ > $$TMP; \ mv $$TMP ${DEPENDFILE} +.endif .if !defined(NO_EXTRADEPEND) && defined(SHLIB_NAME) .if defined(DPADD) && !empty(DPADD) echo ${SHLIB_NAME_FULL}: ${DPADD} >> ${DEPENDFILE} @@ -350,29 +356,32 @@ realinstall: _libinstall _libinstall: .if defined(LIB) && !empty(LIB) && ${MK_INSTALLLIB} != "no" ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},development} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ - ${_INSTALLFLAGS} lib${LIB_PRIVATE}${LIB}.a ${DESTDIR}${_LIBDIR} + ${_INSTALLFLAGS} lib${LIB_PRIVATE}${LIB}.a ${DESTDIR}${_LIBDIR}/ .endif .if ${MK_PROFILE} != "no" && defined(LIB) && !empty(LIB) ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},profile} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ - ${_INSTALLFLAGS} lib${LIB_PRIVATE}${LIB}_p.a ${DESTDIR}${_LIBDIR} + ${_INSTALLFLAGS} lib${LIB_PRIVATE}${LIB}_p.a ${DESTDIR}${_LIBDIR}/ .endif .if defined(SHLIB_NAME) ${INSTALL} ${TAG_ARGS} ${STRIP} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ ${_INSTALLFLAGS} ${_SHLINSTALLFLAGS} \ - ${SHLIB_NAME} ${DESTDIR}${_SHLIBDIR} + ${SHLIB_NAME} ${DESTDIR}${_SHLIBDIR}/ .if ${MK_DEBUG_FILES} != "no" .if defined(DEBUGMKDIR) - ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},debug} -d ${DESTDIR}${DEBUGFILEDIR} + ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},debug} -d ${DESTDIR}${DEBUGFILEDIR}/ .endif ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},debug} -o ${LIBOWN} -g ${LIBGRP} -m ${DEBUGMODE} \ ${_INSTALLFLAGS} \ - ${SHLIB_NAME}.debug ${DESTDIR}${DEBUGFILEDIR} + ${SHLIB_NAME}.debug ${DESTDIR}${DEBUGFILEDIR}/ .endif .if defined(SHLIB_LINK) .if commands(${SHLIB_LINK:R}.ld) ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},development} -S -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ ${_INSTALLFLAGS} ${SHLIB_LINK:R}.ld \ ${DESTDIR}${_LIBDIR}/${SHLIB_LINK} +.for _SHLIB_LINK_LINK in ${SHLIB_LDSCRIPT_LINKS} + ${INSTALL_SYMLINK} ${SHLIB_LINK} ${DESTDIR}${_LIBDIR}/${_SHLIB_LINK_LINK} +.endfor .else .if ${_SHLIBDIR} == ${_LIBDIR} .if ${SHLIB_LINK:Mlib*} @@ -399,11 +408,11 @@ _libinstall: .endif # SHIB_NAME .if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) && ${MK_TOOLCHAIN} != "no" ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},development} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ - ${_INSTALLFLAGS} lib${LIB}_pic.a ${DESTDIR}${_LIBDIR} + ${_INSTALLFLAGS} lib${LIB}_pic.a ${DESTDIR}${_LIBDIR}/ .endif .if defined(WANT_LINT) && !defined(NO_LINT) && defined(LIB) && !empty(LIB) ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},development} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ - ${_INSTALLFLAGS} ${LINTLIB} ${DESTDIR}${LINTLIBDIR} + ${_INSTALLFLAGS} ${LINTLIB} ${DESTDIR}${LINTLIBDIR}/ .endif .endif # !defined(INTERNALLIB) @@ -434,9 +443,11 @@ lint: ${SRCS:M*.c} .include <bsd.dep.mk> -.if !exists(${.OBJDIR}/${DEPENDFILE}) +.if ${MK_FAST_DEPEND} == "yes" || !exists(${.OBJDIR}/${DEPENDFILE}) .if defined(LIB) && !empty(LIB) +.if !exists(${.OBJDIR}/${DEPENDFILE}) ${OBJS} ${STATICOBJS} ${POBJS}: ${SRCS:M*.h} +.endif .for _S in ${SRCS:N*.[hly]} ${_S:R}.po: ${_S} .endfor diff --git a/share/mk/bsd.libnames.mk b/share/mk/bsd.libnames.mk index 6d3bbe7b8510..d22f99a89c10 100644 --- a/share/mk/bsd.libnames.mk +++ b/share/mk/bsd.libnames.mk @@ -10,8 +10,11 @@ .sinclude <src.libnames.mk> +# Src directory locations are also defined in src.libnames.mk. + LIBCRT0?= ${DESTDIR}${LIBDIR}/crt0.o +LIB80211?= ${DESTDIR}${LIBDIR}/lib80211.a LIBALIAS?= ${DESTDIR}${LIBDIR}/libalias.a LIBARCHIVE?= ${DESTDIR}${LIBDIR}/libarchive.a LIBASN1?= ${DESTDIR}${LIBDIR}/libasn1.a @@ -24,21 +27,23 @@ LIBBSDXML?= ${DESTDIR}${LIBDIR}/libbsdxml.a LIBBSM?= ${DESTDIR}${LIBDIR}/libbsm.a LIBBSNMP?= ${DESTDIR}${LIBDIR}/libbsnmp.a LIBBZ2?= ${DESTDIR}${LIBDIR}/libbz2.a -LIBCXXRT?= ${DESTDIR}${LIBDIR}/libcxxrt.a -LIBCPLUSPLUS?= ${DESTDIR}${LIBDIR}/libc++.a LIBC?= ${DESTDIR}${LIBDIR}/libc.a -LIBC_PIC?= ${DESTDIR}${LIBDIR}/libc_pic.a LIBCALENDAR?= ${DESTDIR}${LIBDIR}/libcalendar.a LIBCAM?= ${DESTDIR}${LIBDIR}/libcam.a LIBCAPSICUM?= ${DESTDIR}${LIBDIR}/libcapsicum.a LIBCASPER?= ${DESTDIR}${LIBDIR}/libcasper.a -LIBCOM_ERR?= ${DESTDIR}${LIBDIR}/libcom_err.a LIBCOMPAT?= ${DESTDIR}${LIBDIR}/libcompat.a LIBCOMPILER_RT?=${DESTDIR}${LIBDIR}/libcompiler_rt.a +LIBCOM_ERR?= ${DESTDIR}${LIBDIR}/libcom_err.a +LIBCPLUSPLUS?= ${DESTDIR}${LIBDIR}/libc++.a LIBCRYPT?= ${DESTDIR}${LIBDIR}/libcrypt.a LIBCRYPTO?= ${DESTDIR}${LIBDIR}/libcrypto.a LIBCTF?= ${DESTDIR}${LIBDIR}/libctf.a LIBCURSES?= ${DESTDIR}${LIBDIR}/libcurses.a +LIBCUSE?= ${DESTDIR}${LIBDIR}/libcuse.a +LIBCXGB4?= ${DESTDIR}${LIBDIR}/libcxgb4.a +LIBCXXRT?= ${DESTDIR}${LIBDIR}/libcxxrt.a +LIBC_PIC?= ${DESTDIR}${LIBDIR}/libc_pic.a LIBDEVCTL?= ${DESTDIR}${LIBDIR}/libdevctl.a LIBDEVINFO?= ${DESTDIR}${LIBDIR}/libdevinfo.a LIBDEVSTAT?= ${DESTDIR}${LIBDIR}/libdevstat.a @@ -55,9 +60,9 @@ LIBFIGPAR?= ${DESTDIR}${LIBDIR}/libfigpar.a LIBFL?= "don't use LIBFL, use LIBL" LIBFORM?= ${DESTDIR}${LIBDIR}/libform.a LIBG2C?= ${DESTDIR}${LIBDIR}/libg2c.a -LIBGPIO?= ${DESTDIR}${LIBDIR}/libgpio.a LIBGEOM?= ${DESTDIR}${LIBDIR}/libgeom.a LIBGNUREGEX?= ${DESTDIR}${LIBDIR}/libgnuregex.a +LIBGPIO?= ${DESTDIR}${LIBDIR}/libgpio.a LIBGSSAPI?= ${DESTDIR}${LIBDIR}/libgssapi.a LIBGSSAPI_KRB5?= ${DESTDIR}${LIBDIR}/libgssapi_krb5.a LIBHDB?= ${DESTDIR}${LIBDIR}/libhdb.a @@ -65,6 +70,12 @@ LIBHEIMBASE?= ${DESTDIR}${LIBDIR}/libheimbase.a LIBHEIMNTLM?= ${DESTDIR}${LIBDIR}/libheimntlm.a LIBHEIMSQLITE?= ${DESTDIR}${LIBDIR}/libheimsqlite.a LIBHX509?= ${DESTDIR}${LIBDIR}/libhx509.a +LIBIBCM?= ${DESTDIR}${LIBDIR}/libibcm.a +LIBIBCOMMON?= ${DESTDIR}${LIBDIR}/libibcommon.a +LIBIBMAD?= ${DESTDIR}${LIBDIR}/libibmad.a +LIBIBSDP?= ${DESTDIR}${LIBDIR}/libibsdp.a +LIBIBUMAD?= ${DESTDIR}${LIBDIR}/libibumad.a +LIBIBVERBS?= ${DESTDIR}${LIBDIR}/libibverbs.a LIBIPSEC?= ${DESTDIR}${LIBDIR}/libipsec.a LIBJAIL?= ${DESTDIR}${LIBDIR}/libjail.a LIBKADM5CLNT?= ${DESTDIR}${LIBDIR}/libkadm5clnt.a @@ -84,17 +95,24 @@ LIBMD?= ${DESTDIR}${LIBDIR}/libmd.a LIBMEMSTAT?= ${DESTDIR}${LIBDIR}/libmemstat.a LIBMENU?= ${DESTDIR}${LIBDIR}/libmenu.a LIBMILTER?= ${DESTDIR}${LIBDIR}/libmilter.a +LIBMLX4?= ${DESTDIR}${LIBDIR}/libmlx4.a LIBMP?= ${DESTDIR}${LIBDIR}/libmp.a LIBMT?= ${DESTDIR}${LIBDIR}/libmt.a +LIBMTHCA?= ${DESTDIR}${LIBDIR}/libmthca.a +LIBNANDFS?= ${DESTDIR}${LIBDIR}/libnandfs.a LIBNCURSES?= ${DESTDIR}${LIBDIR}/libncurses.a LIBNCURSESW?= ${DESTDIR}${LIBDIR}/libncursesw.a LIBNETGRAPH?= ${DESTDIR}${LIBDIR}/libnetgraph.a LIBNGATM?= ${DESTDIR}${LIBDIR}/libngatm.a LIBNV?= ${DESTDIR}${LIBDIR}/libnv.a LIBNVPAIR?= ${DESTDIR}${LIBDIR}/libnvpair.a +LIBOPENSM?= ${DESTDIR}${LIBDIR}/libopensm.a LIBOPIE?= ${DESTDIR}${LIBDIR}/libopie.a +LIBOSMCOMP?= ${DESTDIR}${LIBDIR}/libosmcomp.a +LIBOSMVENDOR?= ${DESTDIR}${LIBDIR}/libosmvendor.a LIBPAM?= ${DESTDIR}${LIBDIR}/libpam.a LIBPANEL?= ${DESTDIR}${LIBDIR}/libpanel.a +LIBPANELW?= ${DESTDIR}${LIBDIR}/libpanelw.a LIBPCAP?= ${DESTDIR}${LIBDIR}/libpcap.a LIBPJDLOG?= ${DESTDIR}${LIBDIR}/libpjdlog.a LIBPMC?= ${DESTDIR}${LIBDIR}/libpmc.a @@ -102,9 +120,10 @@ LIBPROC?= ${DESTDIR}${LIBDIR}/libproc.a LIBPROCSTAT?= ${DESTDIR}${LIBDIR}/libprocstat.a LIBPTHREAD?= ${DESTDIR}${LIBDIR}/libpthread.a LIBRADIUS?= ${DESTDIR}${LIBDIR}/libradius.a +LIBRDMACM?= ${DESTDIR}${LIBDIR}/librdmacm.a LIBROKEN?= ${DESTDIR}${LIBDIR}/libroken.a -LIBRPCSVC?= ${DESTDIR}${LIBDIR}/librpcsvc.a LIBRPCSEC_GSS?= ${DESTDIR}${LIBDIR}/librpcsec_gss.a +LIBRPCSVC?= ${DESTDIR}${LIBDIR}/librpcsvc.a LIBRT?= ${DESTDIR}${LIBDIR}/librt.a LIBRTLD_DB?= ${DESTDIR}${LIBDIR}/librtld_db.a LIBSBUF?= ${DESTDIR}${LIBDIR}/libsbuf.a @@ -114,6 +133,8 @@ LIBSSL?= ${DESTDIR}${LIBDIR}/libssl.a LIBSSP_NONSHARED?= ${DESTDIR}${LIBDIR}/libssp_nonshared.a LIBSTAND?= ${DESTDIR}${LIBDIR}/libstand.a LIBSTDCPLUSPLUS?= ${DESTDIR}${LIBDIR}/libstdc++.a +LIBSTDTHREADS?= ${DESTDIR}${LIBDIR}/libstdthreads.a +LIBSYSDECODE?= ${DESTDIR}${LIBDIR}/libsysdecode.a LIBTACPLUS?= ${DESTDIR}${LIBDIR}/libtacplus.a LIBTERMCAP?= ${DESTDIR}${LIBDIR}/libtermcap.a LIBTERMCAPW?= ${DESTDIR}${LIBDIR}/libtermcapw.a @@ -121,18 +142,18 @@ LIBTERMLIB?= "don't use LIBTERMLIB, use LIBTERMCAP" LIBTINFO?= "don't use LIBTINFO, use LIBNCURSES" LIBUFS?= ${DESTDIR}${LIBDIR}/libufs.a LIBUGIDFW?= ${DESTDIR}${LIBDIR}/libugidfw.a +LIBULOG?= ${DESTDIR}${LIBDIR}/libulog.a LIBUMEM?= ${DESTDIR}${LIBDIR}/libumem.a -LIBUSBHID?= ${DESTDIR}${LIBDIR}/libusbhid.a LIBUSB?= ${DESTDIR}${LIBDIR}/libusb.a -LIBULOG?= ${DESTDIR}${LIBDIR}/libulog.a +LIBUSBHID?= ${DESTDIR}${LIBDIR}/libusbhid.a LIBUTIL?= ${DESTDIR}${LIBDIR}/libutil.a LIBUUTIL?= ${DESTDIR}${LIBDIR}/libuutil.a LIBVGL?= ${DESTDIR}${LIBDIR}/libvgl.a LIBVMMAPI?= ${DESTDIR}${LIBDIR}/libvmmapi.a LIBWIND?= ${DESTDIR}${LIBDIR}/libwind.a LIBWRAP?= ${DESTDIR}${LIBDIR}/libwrap.a -LIBXPG4?= ${DESTDIR}${LIBDIR}/libxpg4.a LIBXO?= ${DESTDIR}${LIBDIR}/libxo.a +LIBXPG4?= ${DESTDIR}${LIBDIR}/libxpg4.a LIBY?= ${DESTDIR}${LIBDIR}/liby.a LIBYPCLNT?= ${DESTDIR}${LIBDIR}/libypclnt.a LIBZ?= ${DESTDIR}${LIBDIR}/libz.a @@ -149,3 +170,18 @@ LDADD:= ${LDADD:N-lpthread} -lpthread LDADD:= ${LDADD:N-lc} -lc .endif .endif + +# Only do this for src builds. +.if defined(SRCTOP) +.if defined(_LIBRARIES) && defined(LIB) && \ + ${_LIBRARIES:M${LIB}} != "" +.if !defined(LIB${LIB:tu}) +.error ${.CURDIR}: Missing value for LIB${LIB:tu} in ${_this:T}. Likely should be: LIB${LIB:tu}?= $${DESTDIR}$${LIBDIR}/lib${LIB}.a +.endif +.endif + +# Derive LIB*SRCDIR from LIB*DIR +.for lib in ${_LIBRARIES} +LIB${lib:tu}SRCDIR?= ${SRCTOP}/${LIB${lib:tu}DIR:S,^${OBJTOP}/,,} +.endfor +.endif diff --git a/share/mk/bsd.man.mk b/share/mk/bsd.man.mk index f84db59a1b0a..0fee37725920 100644 --- a/share/mk/bsd.man.mk +++ b/share/mk/bsd.man.mk @@ -105,8 +105,8 @@ ${__target}: ${__page} .endfor .endif .endfor -.endif -.else +.endif # !empty(MAN) +.else # !defined(MANFILTER) .if defined(MAN) && !empty(MAN) CLEANFILES+= ${MAN:T:S/$/${CATEXT}/g} .if defined(MANBUILDCAT) && !empty(MANBUILDCAT) @@ -121,9 +121,9 @@ ${__target}: ${__page} _manpages: ${MAN} .endif .endif -.endif +.endif # defined(MANFILTER) -.else +.else # ${MK_MANCOMPRESS} == "yes" ZEXT= ${MCOMPRESS_EXT} @@ -170,7 +170,7 @@ ${__target}: ${__page} .endfor .endif -.endif +.endif # ${MK_MANCOMPRESS} == "no" maninstall: _maninstall _maninstall: @@ -186,29 +186,35 @@ _maninstall: ${MAN} ${DESTDIR}${CATDIR}${__page:E}${MANSUBDIR}/${__page} .endif .endfor -.else -.for _page _sect in ${.ALLSRC:C/\.([^.]*)$/.\1 \1/} - @d=${DESTDIR}${MANDIR}${_sect}${MANSUBDIR}; \ - ${ECHO} ${MINSTALL} ${_page} $${d}; \ - ${MINSTALL} $${page} $${d}; -.endfor +.else # !defined(MANFILTER) + @set ${.ALLSRC:C/\.([^.]*)$/.\1 \1/}; \ + while : ; do \ + case $$# in \ + 0) break;; \ + 1) echo "warn: missing extension: $$1"; break;; \ + esac; \ + page=$$1; shift; sect=$$1; shift; \ + d=${DESTDIR}${MANDIR}$${sect}${MANSUBDIR}; \ + ${ECHO} ${MINSTALL} $${page} $${d}; \ + ${MINSTALL} $${page} $${d}; \ + done .if defined(MANBUILDCAT) && !empty(MANBUILDCAT) .for __page in ${MAN} ${MINSTALL} ${__page:T:S/$/${CATEXT}/} \ ${DESTDIR}${CATDIR}${__page:E}${MANSUBDIR}/${__page:T} .endfor .endif -.endif -.else +.endif # defined(MANFILTER) +.else # ${MK_MANCOMPRESS} == "yes" .for __page in ${MAN} ${MINSTALL} ${__page:T:S/$/${MCOMPRESS_EXT}/g} \ - ${DESTDIR}${MANDIR}${__page:E}${MANSUBDIR} + ${DESTDIR}${MANDIR}${__page:E}${MANSUBDIR}/ .if defined(MANBUILDCAT) && !empty(MANBUILDCAT) ${MINSTALL} ${__page:T:S/$/${CATEXT}${MCOMPRESS_EXT}/g} \ ${DESTDIR}${CATDIR}${__page:E}${MANSUBDIR}/${__page:T:S/$/${MCOMPRESS_EXT}/} .endif .endfor -.endif +.endif # ${MK_MANCOMPRESS} == "no" .endif .if !defined(NO_MLINKS) && defined(MLINKS) && !empty(MLINKS) diff --git a/share/mk/bsd.obj.mk b/share/mk/bsd.obj.mk index f94181a74791..4333a828c167 100644 --- a/share/mk/bsd.obj.mk +++ b/share/mk/bsd.obj.mk @@ -55,10 +55,13 @@ CANONICALOBJDIR= ${.OBJDIR} CANONICALOBJDIR:=${MAKEOBJDIRPREFIX}${.CURDIR} .elif defined(MAKEOBJDIR) && ${MAKEOBJDIR:M/*} != "" CANONICALOBJDIR:=${MAKEOBJDIR} +OBJTOP?= ${MAKEOBJDIR} .else CANONICALOBJDIR:=/usr/obj${.CURDIR} .endif +OBJTOP?= ${.OBJDIR:S,${.CURDIR},,}${SRCTOP} + # # Warn of unorthodox object directory. # diff --git a/share/mk/bsd.opts.mk b/share/mk/bsd.opts.mk index 88f5196db89f..e2c56acd8b5a 100644 --- a/share/mk/bsd.opts.mk +++ b/share/mk/bsd.opts.mk @@ -50,6 +50,7 @@ __<bsd.opts.mk>__: __DEFAULT_YES_OPTIONS = \ ASSERT_DEBUG \ + DEBUG_FILES \ DOCCOMPRESS \ INCLUDES \ INSTALLLIB \ @@ -66,8 +67,9 @@ __DEFAULT_YES_OPTIONS = \ WARNS __DEFAULT_NO_OPTIONS = \ + CCACHE_BUILD \ + FAST_DEPEND \ CTF \ - DEBUG_FILES \ INSTALL_AS_USER \ STALE_STAGED @@ -102,6 +104,8 @@ MK_${var}:=no MK_STALE_STAGED= no .endif +.include <bsd.cpu.mk> + .endif # !_WITHOUT_SRCCONF .endif diff --git a/share/mk/bsd.own.mk b/share/mk/bsd.own.mk index 2f20da8620be..9f33424cae20 100644 --- a/share/mk/bsd.own.mk +++ b/share/mk/bsd.own.mk @@ -1,6 +1,6 @@ # $FreeBSD$ # -# The include file <src.opts.mk> set common variables for owner, +# The include file <bsd.own.mk> set common variables for owner, # group, mode, and directories. Defaults are in brackets. # # @@ -133,12 +133,23 @@ CTFCONVERT_CMD= @: .endif .if ${MK_INSTALL_AS_USER} != "no" +.if !defined(_uid) _uid!= id -u +.export _uid +.endif .if ${_uid} != 0 .if !defined(USER) -USER!= id -un +# Avoid exporting USER +.if !defined(_USER) +_USER!= id -un +.export _USER +.endif +USER= ${_USER} .endif +.if !defined(_gid) _gid!= id -g +.export _gid +.endif .for x in BIN CONF DOC DTB INFO KMOD LIB MAN NLS SHARE $xOWN= ${USER} $xGRP= ${_gid} diff --git a/share/mk/bsd.prog.mk b/share/mk/bsd.prog.mk index 2fe85d209ad9..f08985691201 100644 --- a/share/mk/bsd.prog.mk +++ b/share/mk/bsd.prog.mk @@ -89,9 +89,11 @@ ${PROG_FULL}: beforelinking .endif ${PROG_FULL}: ${OBJS} .if defined(PROG_CXX) - ${CXX} ${CXXFLAGS} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD} + ${CXX:N${CCACHE_BIN}} ${CXXFLAGS:N-M*} ${LDFLAGS} -o ${.TARGET} \ + ${OBJS} ${LDADD} .else - ${CC} ${CFLAGS} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD} + ${CC:N${CCACHE_BIN}} ${CFLAGS:N-M*} ${LDFLAGS} -o ${.TARGET} ${OBJS} \ + ${LDADD} .endif .if ${MK_CTF} != "no" ${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${OBJS} @@ -119,9 +121,11 @@ ${PROG_FULL}: beforelinking .endif ${PROG_FULL}: ${OBJS} .if defined(PROG_CXX) - ${CXX} ${CXXFLAGS} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD} + ${CXX:N${CCACHE_BIN}} ${CXXFLAGS:N-M*} ${LDFLAGS} -o ${.TARGET} \ + ${OBJS} ${LDADD} .else - ${CC} ${CFLAGS} ${LDFLAGS} -o ${.TARGET} ${OBJS} ${LDADD} + ${CC:N${CCACHE_BIN}} ${CFLAGS:N-M*} ${LDFLAGS} -o ${.TARGET} ${OBJS} \ + ${LDADD} .endif .if ${MK_CTF} != "no" ${CTFMERGE} ${CTFFLAGS} -o ${.TARGET} ${OBJS} @@ -212,7 +216,7 @@ _proginstall: ${_INSTALLFLAGS} ${PROG} ${DESTDIR}${BINDIR}/${PROGNAME} .if ${MK_DEBUG_FILES} != "no" .if defined(DEBUGMKDIR) - ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},debug} -d ${DESTDIR}${DEBUGFILEDIR} + ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},debug} -d ${DESTDIR}${DEBUGFILEDIR}/ .endif ${INSTALL} ${TAG_ARGS:D${TAG_ARGS},debug} -o ${BINOWN} -g ${BINGRP} -m ${DEBUGMODE} \ ${PROGNAME}.debug ${DESTDIR}${DEBUGFILEDIR}/${PROGNAME}.debug diff --git a/share/mk/bsd.progs.mk b/share/mk/bsd.progs.mk index 2da30c70ebb5..92a5eea56b08 100644 --- a/share/mk/bsd.progs.mk +++ b/share/mk/bsd.progs.mk @@ -31,7 +31,7 @@ UPDATE_DEPENDFILE_PROG = ${PROGS:[1]} # They may have asked us to build just one .for t in ${PROGS} .if make($t) -.if ${PROGS_CXX:M${t}} +.if ${PROGS_CXX:U:M${t}} PROG_CXX ?= $t .endif PROG ?= $t @@ -41,8 +41,8 @@ PROG ?= $t .if defined(PROG) # just one of many -PROG_OVERRIDE_VARS += BINDIR BINGRP BINOWN BINMODE DPSRCS MAN PROGNAME \ - SRCS +PROG_OVERRIDE_VARS += BINDIR BINGRP BINOWN BINMODE DPSRCS MAN NO_WERROR \ + PROGNAME SRCS WARNS PROG_VARS += CFLAGS CPPFLAGS CXXFLAGS DPADD DPLIBS LDADD LIBADD LINKS \ LDFLAGS MLINKS ${PROG_OVERRIDE_VARS} .for v in ${PROG_VARS:O:u} @@ -102,7 +102,10 @@ _PROGS_ALL_SRCS+= ${s} .endfor .endfor .if !empty(_PROGS_COMMON_SRCS) -_PROGS_COMMON_OBJS= ${_PROGS_COMMON_SRCS:N*.h:R:S/$/.o/g} +_PROGS_COMMON_OBJS= ${_PROGS_COMMON_SRCS:M*.[dhly]} +.if !empty(_PROGS_COMMON_SRCS:N*.[dhly]) +_PROGS_COMMON_OBJS+= ${_PROGS_COMMON_SRCS:N*.[dhly]:R:S/$/.o/g} +.endif ${PROGS}: ${_PROGS_COMMON_OBJS} .endif @@ -116,16 +119,16 @@ x.$p= PROG_CXX=$p $p ${p}_p: .PHONY .MAKE (cd ${.CURDIR} && \ DEPENDFILE=.depend.$p \ - ${MAKE} -f ${MAKEFILE} _RECURSING_PROGS= \ - SUBDIR= PROG=$p ${x.$p}) + NO_SUBDIR=1 ${MAKE} -f ${MAKEFILE} _RECURSING_PROGS= \ + PROG=$p ${x.$p}) # Pseudo targets for PROG, such as 'install'. .for t in ${PROGS_TARGETS:O:u} $p.$t: .PHONY .MAKE (cd ${.CURDIR} && \ DEPENDFILE=.depend.$p \ - ${MAKE} -f ${MAKEFILE} _RECURSING_PROGS= \ - SUBDIR= PROG=$p ${x.$p} ${@:E}) + NO_SUBDIR=1 ${MAKE} -f ${MAKEFILE} _RECURSING_PROGS= \ + PROG=$p ${x.$p} ${@:E}) .endfor .endfor diff --git a/share/mk/bsd.snmpmod.mk b/share/mk/bsd.snmpmod.mk index 552f936dc656..ccd57b7c7b24 100644 --- a/share/mk/bsd.snmpmod.mk +++ b/share/mk/bsd.snmpmod.mk @@ -16,12 +16,12 @@ ${MOD}_tree.c ${MOD}_tree.h: ${MOD}_tree.def ${EXTRAMIBDEFS} .if defined(DEFS) FILESGROUPS+= DEFS -DEFSDIR= ${SHAREDIR}/snmp/defs +DEFSDIR?= ${SHAREDIR}/snmp/defs .endif .if defined(BMIBS) FILESGROUPS+= BMIBS -BMIBSDIR= ${SHAREDIR}/snmp/mibs +BMIBSDIR?= ${SHAREDIR}/snmp/mibs .endif .include <bsd.lib.mk> diff --git a/share/mk/bsd.subdir.mk b/share/mk/bsd.subdir.mk index 037a7fec37ab..aacd1b327e7e 100644 --- a/share/mk/bsd.subdir.mk +++ b/share/mk/bsd.subdir.mk @@ -28,31 +28,34 @@ # See ALL_SUBDIR_TARGETS for list of targets that will recurse. # Custom targets can be added to SUBDIR_TARGETS in src.conf. # +# Targets defined in STANDALONE_SUBDIR_TARGETS will always be ran +# with SUBDIR_PARALLEL and will not respect .WAIT or SUBDIR_DEPEND_ +# values. +# .if !target(__<bsd.subdir.mk>__) __<bsd.subdir.mk>__: -ALL_SUBDIR_TARGETS= all all-man buildconfig checkdpadd clean cleandepend \ - cleandir cleanilinks cleanobj depend distribute \ - installconfig lint maninstall manlint obj objlink \ - realinstall regress tags \ +ALL_SUBDIR_TARGETS= all all-man buildconfig buildfiles buildincludes \ + checkdpadd clean cleandepend cleandir cleanilinks \ + cleanobj depend distribute files includes installconfig \ + installfiles installincludes realinstall lint maninstall \ + manlint obj objlink regress tags \ ${SUBDIR_TARGETS} +# Described above. +STANDALONE_SUBDIR_TARGETS?= obj checkdpadd clean cleandepend cleandir \ + cleanilinks cleanobj + .include <bsd.init.mk> .if !defined(NEED_SUBDIR) -.if ${.MAKE.LEVEL} == 0 && ${MK_META_MODE} == "yes" && !empty(SUBDIR) && !(make(clean*) || make(destroy*)) +.if ${.MAKE.LEVEL} == 0 && ${MK_DIRDEPS_BUILD} == "yes" && !empty(SUBDIR) && !(make(clean*) || make(destroy*)) .include <meta.subdir.mk> # ignore this _SUBDIR: .endif .endif -.if !target(_SUBDIR) - -.if defined(SUBDIR) -SUBDIR:=${SUBDIR} ${SUBDIR.yes} -SUBDIR:=${SUBDIR:u} -.endif DISTRIBUTION?= base .if !target(distribute) @@ -63,96 +66,103 @@ distribute: .MAKE .endfor .endif -_SUBDIR: .USE .MAKE -.if defined(SUBDIR) && !empty(SUBDIR) && !defined(NO_SUBDIR) - @${_+_}for entry in ${SUBDIR:N.WAIT}; do \ - if test -d ${.CURDIR}/$${entry}.${MACHINE_ARCH}; then \ - ${ECHODIR} "===> ${DIRPRFX}$${entry}.${MACHINE_ARCH} (${.TARGET:S,realinstall,install,:S,^_sub.,,})"; \ - edir=$${entry}.${MACHINE_ARCH}; \ - cd ${.CURDIR}/$${edir}; \ - else \ - ${ECHODIR} "===> ${DIRPRFX}$$entry (${.TARGET:S,realinstall,install,:S,^_sub.,,})"; \ - edir=$${entry}; \ - cd ${.CURDIR}/$${edir}; \ +# Convenience targets to run 'build${target}' and 'install${target}' when +# calling 'make ${target}'. +.for __target in files includes +.if !target(${__target}) +${__target}: build${__target} install${__target} +.ORDER: build${__target} install${__target} +.endif +.endfor + +# Make 'install' supports a before and after target. Actual install +# hooks are placed in 'realinstall'. +.if !target(install) +.for __stage in before real after +.if !target(${__stage}install) +${__stage}install: +.endif +.endfor +install: beforeinstall realinstall afterinstall +.ORDER: beforeinstall realinstall afterinstall +.endif + +# SUBDIR recursing may be disabled for MK_DIRDEPS_BUILD +.if !target(_SUBDIR) + +.if defined(SUBDIR) +SUBDIR:=${SUBDIR} ${SUBDIR.yes} +SUBDIR:=${SUBDIR:u} +.endif + +# Subdir code shared among 'make <subdir>', 'make <target>' and SUBDIR_PARALLEL. +_SUBDIR_SH= \ + if test -d ${.CURDIR}/$${dir}.${MACHINE_ARCH}; then \ + dir=$${dir}.${MACHINE_ARCH}; \ fi; \ - ${MAKE} ${.TARGET:S,realinstall,install,:S,^_sub.,,} \ - DIRPRFX=${DIRPRFX}$$edir/; \ - done + ${ECHODIR} "===> ${DIRPRFX}$${dir} ($${target})"; \ + cd ${.CURDIR}/$${dir}; \ + ${MAKE} $${target} DIRPRFX=${DIRPRFX}$${dir}/ + +_SUBDIR: .USEBEFORE +.if defined(SUBDIR) && !empty(SUBDIR) && !defined(NO_SUBDIR) + @${_+_}target=${.TARGET:realinstall=install}; \ + for dir in ${SUBDIR:N.WAIT}; do ( ${_SUBDIR_SH} ); done .endif ${SUBDIR:N.WAIT}: .PHONY .MAKE - ${_+_}@if test -d ${.TARGET}.${MACHINE_ARCH}; then \ - cd ${.CURDIR}/${.TARGET}.${MACHINE_ARCH}; \ - else \ - cd ${.CURDIR}/${.TARGET}; \ - fi; \ - ${MAKE} all - -# Work around parsing of .if nested in .for by putting .WAIT string into a var. -__wait= .WAIT + ${_+_}@target=all; \ + dir=${.TARGET}; \ + ${_SUBDIR_SH}; + .for __target in ${ALL_SUBDIR_TARGETS} -.ifdef SUBDIR_PARALLEL +# Only recurse on directly-called targets. I.e., don't recurse on dependencies +# such as 'install' becoming {before,real,after}install, just recurse +# 'install'. Despite that, 'realinstall' is special due to ordering issues +# with 'afterinstall'. +.if make(${__target}) || (${__target} == realinstall && make(install)) +# Can ordering be skipped for this and SUBDIR_PARALLEL forced? +.if ${STANDALONE_SUBDIR_TARGETS:M${__target}} +_is_standalone_target= 1 +SUBDIR:= ${SUBDIR:N.WAIT} +.else +_is_standalone_target= 0 +.endif +.if defined(SUBDIR_PARALLEL) || ${_is_standalone_target} == 1 __subdir_targets= .for __dir in ${SUBDIR} -.if ${__wait} == ${__dir} +.if ${__dir} == .WAIT __subdir_targets+= .WAIT .else __subdir_targets+= ${__target}_subdir_${__dir} __deps= +.if ${_is_standalone_target} == 0 .for __dep in ${SUBDIR_DEPEND_${__dir}} __deps+= ${__target}_subdir_${__dep} .endfor -${__target}_subdir_${__dir}: .MAKE ${__deps} +.endif +${__target}_subdir_${__dir}: .PHONY .MAKE ${__deps} .if !defined(NO_SUBDIR) - @${_+_}if test -d ${.CURDIR}/${__dir}.${MACHINE_ARCH}; then \ - ${ECHODIR} "===> ${DIRPRFX}${__dir}.${MACHINE_ARCH} (${__target:realinstall=install})"; \ - edir=${__dir}.${MACHINE_ARCH}; \ - cd ${.CURDIR}/$${edir}; \ - else \ - ${ECHODIR} "===> ${DIRPRFX}${__dir} (${__target:realinstall=install})"; \ - edir=${__dir}; \ - cd ${.CURDIR}/$${edir}; \ - fi; \ - ${MAKE} ${__target:realinstall=install} \ - DIRPRFX=${DIRPRFX}$$edir/ + @${_+_}target=${__target:realinstall=install}; \ + dir=${__dir}; \ + ${_SUBDIR_SH}; .endif .endif -.endfor +.endfor # __dir in ${SUBDIR} ${__target}: ${__subdir_targets} .else -${__target}: _sub.${__target} -_sub.${__target}: _SUBDIR -.endif -.endfor +${__target}: _SUBDIR +.endif # SUBDIR_PARALLEL || _is_standalone_target +.endif # make(${__target}) +.endfor # __target in ${ALL_SUBDIR_TARGETS} -# This is to support 'make includes' calling 'make buildincludes' and -# 'make installincludes' in the proper order, and to support these -# targets as SUBDIR_TARGETS. -.for __target in files includes -.for __stage in build install -${__stage}${__target}: -.if make(${__stage}${__target}) -${__stage}${__target}: _sub.${__stage}${__target} -_sub.${__stage}${__target}: _SUBDIR -.endif -.endfor +.endif # !target(_SUBDIR) + +# Ensure all targets exist +.for __target in ${ALL_SUBDIR_TARGETS} .if !target(${__target}) -${__target}: .MAKE - ${_+_}cd ${.CURDIR}; ${MAKE} build${__target}; ${MAKE} install${__target} +${__target}: .endif .endfor .endif - -.if !target(install) -.if !target(beforeinstall) -beforeinstall: -.endif -.if !target(afterinstall) -afterinstall: -.endif -install: beforeinstall realinstall afterinstall -.ORDER: beforeinstall realinstall afterinstall -.endif - -.endif diff --git a/share/mk/bsd.sys.mk b/share/mk/bsd.sys.mk index d5a469676d41..de62195b84fd 100644 --- a/share/mk/bsd.sys.mk +++ b/share/mk/bsd.sys.mk @@ -109,6 +109,11 @@ CWARNFLAGS+= -Werror CWARNFLAGS+= -Wno-format .endif # NO_WFORMAT || NO_WFORMAT.${COMPILER_TYPE} +# GCC 5.2.0 +.if ${COMPILER_TYPE} == "gcc" && ${COMPILER_VERSION} >= 50200 +CWARNFLAGS+= -Wno-error=unused-function -Wno-error=enum-compare -Wno-error=logical-not-parentheses -Wno-error=bool-compare -Wno-error=uninitialized -Wno-error=array-bounds -Wno-error=clobbered -Wno-error=cast-align -Wno-error=extra -Wno-error=attributes -Wno-error=inline -Wno-error=unused-but-set-variable -Wno-error=unused-value -Wno-error=strict-aliasing -Wno-error=address +.endif + # How to handle FreeBSD custom printf format specifiers. .if ${COMPILER_TYPE} == "clang" && ${COMPILER_VERSION} >= 30600 FORMAT_EXTENSIONS= -D__printf__=__freebsd_kprintf__ @@ -148,8 +153,14 @@ CXXFLAGS.clang+= -Wno-c++11-extensions .if ${MK_SSP} != "no" && \ ${MACHINE_CPUARCH} != "arm" && ${MACHINE_CPUARCH} != "mips" +.if (${COMPILER_TYPE} == "clang" && ${COMPILER_VERSION} >= 30500) || \ + (${COMPILER_TYPE} == "gcc" && \ + (${COMPILER_VERSION} == 40201 || ${COMPILER_VERSION} >= 40900)) # Don't use -Wstack-protector as it breaks world with -Werror. SSP_CFLAGS?= -fstack-protector-strong +.else +SSP_CFLAGS?= -fstack-protector +.endif CFLAGS+= ${SSP_CFLAGS} .endif # SSP && !ARM && !MIPS @@ -188,13 +199,13 @@ staging stage_libs stage_files stage_as stage_links stage_symlinks: DESTDIR= ${STAGE_OBJTOP} .if commands(beforeinstall) -.if !empty(_LIBS) || ${MK_STAGING_PROG} != "no" +.if !empty(_LIBS) || (${MK_STAGING_PROG} != "no" && !defined(INTERNALPROG)) staging: beforeinstall .endif .endif # normally only libs and includes are staged -.if ${MK_STAGING_PROG} != "no" +.if ${MK_STAGING_PROG} != "no" && !defined(INTERNALPROG) STAGE_DIR.prog= ${STAGE_OBJTOP}${BINDIR} .if !empty(PROG) || !empty(PROGS) @@ -259,7 +270,7 @@ STAGE_TARGETS+= $t STAGE_TARGETS+= stage_as .endif -.if !empty(_LIBS) || ${MK_STAGING_PROG} != "no" +.if !empty(_LIBS) || (${MK_STAGING_PROG} != "no" && !defined(INTERNALPROG)) .if !empty(LINKS) STAGE_TARGETS+= stage_links diff --git a/share/mk/bsd.test.mk b/share/mk/bsd.test.mk index 6b394d853e9a..b0d493945d15 100644 --- a/share/mk/bsd.test.mk +++ b/share/mk/bsd.test.mk @@ -10,6 +10,9 @@ __<bsd.test.mk>__: +# Third-party software (kyua, etc) prefix. +LOCALBASE?= /usr/local + # Tests install directory TESTSDIR?= ${TESTSBASE}/${RELDIR:H} PACKAGE= tests diff --git a/share/mk/dirdeps.mk b/share/mk/dirdeps.mk index c3c19d22d0a0..a989f953b265 100644 --- a/share/mk/dirdeps.mk +++ b/share/mk/dirdeps.mk @@ -1,5 +1,5 @@ # $FreeBSD$ -# $Id: dirdeps.mk,v 1.54 2015/06/08 20:55:11 sjg Exp $ +# $Id: dirdeps.mk,v 1.55 2015/10/20 22:04:53 sjg Exp $ # Copyright (c) 2010-2013, Juniper Networks, Inc. # All rights reserved. @@ -243,6 +243,21 @@ DEP_${TARGET_SPEC_VARS:[$i]} := ${_tspec:[$i]} DEP_MACHINE := ${_DEP_TARGET_SPEC} .endif +.if ${MAKEFILE:T} == ${.PARSEFILE} && empty(DIRDEPS) && ${.TARGETS:Uall:M*/*} != "" +# This little trick let's us do +# +# mk -f dirdeps.mk some/dir.${TARGET_SPEC} +# +all: +${.TARGETS:Nall}: all +DIRDEPS := ${.TARGETS:M*/*} +# so that -DNO_DIRDEPS works +DEP_RELDIR := ${DIRDEPS:R:[1]} +# disable DIRDEPS_CACHE as it does not like this trick +MK_DIRDEPS_CACHE = no +.endif + + # pickup customizations # as below you can use !target(_DIRDEP_USE) to protect things # which should only be done once. diff --git a/share/mk/install-new.mk b/share/mk/install-new.mk index 469e986b2458..5e95c99be242 100644 --- a/share/mk/install-new.mk +++ b/share/mk/install-new.mk @@ -32,9 +32,23 @@ CmpCp= CmpCp() { \ cp $$src $$target; \ fi; } +# Replace the file if they are different and make a backup if desired +CmpReplace= CmpReplace() { \ + src=$$1 target=$$2 _bak=$$3; \ + if ! test -s $$target || ! cmp -s $$target $$src; then \ + trap "" 1 2 3 15; \ + if test -s $$target; then \ + if test "x$$_bak" != x; then \ + rm -f $$target$$_bak; \ + cp -f $$target $$target$$_bak; \ + fi; \ + fi; \ + mv -f $$src $$target; \ + fi; } + # If the .new file is different, we want it. # Note: this function will work as is for *.new$RANDOM" -InstallNew= ${CmpCp}; InstallNew() { \ +InstallNew= ${CmpReplace}; InstallNew() { \ _t=-e; _bak=; \ while :; do \ case "$$1" in \ @@ -46,7 +60,7 @@ InstallNew= ${CmpCp}; InstallNew() { \ for new in "$$@"; do \ if test $$_t $$new; then \ target=`expr $$new : '\(.*\).new'`; \ - CmpCp $$new $$target $$_bak; \ + CmpReplace $$new $$target $$_bak; \ fi; \ rm -f $$new; \ done; :; } diff --git a/share/mk/local.autodep.mk b/share/mk/local.autodep.mk index 8ea5ca63d319..8223fec14bc0 100644 --- a/share/mk/local.autodep.mk +++ b/share/mk/local.autodep.mk @@ -14,12 +14,6 @@ LDFLAGS+= ${LDFLAGS_LAST} CLEANFILES+= .depend -.for h in ${SRCS:M*.h} -.if target($h) -buildfiles: $h -.endif -.endfor - # handy for debugging .SUFFIXES: .S .c .cc .cpp .cpp-out diff --git a/share/mk/local.dirdeps.mk b/share/mk/local.dirdeps.mk index d83e3e8c4d83..ae2c00a6ec52 100644 --- a/share/mk/local.dirdeps.mk +++ b/share/mk/local.dirdeps.mk @@ -28,15 +28,20 @@ DIRDEPS_FILTER+= N*.host .for m in host common M_dep_qual_fixes += C;($m),[^/.,]*$$;\1; .endfor - #.info M_dep_qual_fixes=${M_dep_qual_fixes} -# we want to supress these dependencies for host tools -# but some libs are sadly needed. -_need_host_libs= \ - lib/libc++ \ - lib/libcxxrt \ - lib/libdwarf \ - lib/libmd \ + +# Cheat for including src.libnames.mk +__<bsd.init.mk>__: +# Pull in _INTERNALLIBS +.include <src.libnames.mk> + +# Host libraries should mostly be excluded from the build so the +# host version in /usr/lib is used. Internal libraries need to be +# allowed to be built though since they are never installed. +_need_host_libs= +.for lib in ${_INTERNALLIBS} +_need_host_libs+= ${LIB${lib:tu}DIR:S,^${OBJTOP}/,,} +.endfor N_host_libs:= ${cd ${SRCTOP} && echo lib/lib*:L:sh:${_need_host_libs:${M_ListToSkip}}:${M_ListToSkip}} DIRDEPS_FILTER.host = \ @@ -79,11 +84,93 @@ DIRDEPS += \ cddl/usr.bin/ctfmerge.host .endif +# Bootstrap support. Give hints to DIRDEPS if there is no Makefile.depend* +# generated yet. This can be based on things such as SRC files and LIBADD. +# These hints will not factor into the final Makefile.depend as only what is +# used will be added in and handled via [local.]gendirdeps.mk. This is not +# done for MACHINE=host builds. +# XXX: Include this in local.autodep.mk as well for gendirdeps without filemon. +.if ${RELDIR} == ${DEP_RELDIR} # Only do this for main build target +.for _depfile in ${.MAKE.DEPENDFILE_PREFERENCE:T} +.if !defined(_have_depfile) && exists(${.CURDIR}/${_depfile}) +_have_depfile= .endif - -.if ${MK_CLANG} == "yes" && ${DEP_RELDIR:Nlib/clang/lib*:Nlib/libc*} == "" -DIRDEPS+= lib/clang/include +.endfor +.if !defined(_have_depfile) +# KMOD does not use any stdlibs. +.if !defined(KMOD) +# Has C files. The C_DIRDEPS are shared with C++ files as well. +C_DIRDEPS= \ + gnu/lib/csu \ + gnu/lib/libgcc \ + include \ + include/xlocale \ + lib/${CSU_DIR} \ + lib/libc \ + lib/libcompiler_rt \ + +.if !empty(SRCS:M*.c) +DIRDEPS+= ${C_DIRDEPS} +.endif +# Has C++ files +.if !empty(SRCS:M*.cc) || !empty(SRCS:M*.C) || !empty(SRCS:M*.cpp) || \ + !empty(SRCS:M*.cxx) +DIRDEPS+= ${C_DIRDEPS} +.if ${MK_CLANG} == "yes" +DIRDEPS+= lib/libc++ lib/libcxxrt +.else +DIRDEPS+= gnu/lib/libstdc++ gnu/lib/libsupc++ +.endif +# XXX: Clang and GCC always adds -lm currently, even when not needed. +DIRDEPS+= lib/msun +.endif # CXX +.endif # !defined(KMOD) +# Has yacc files. +.if !empty(SRCS:M*.y) +DIRDEPS+= usr.bin/yacc.host .endif +# Gather PROGS dependencies +.if !empty(PROGS) +_PROGS_LIBADD= +_PROGS_DPADD= +.for _prog in ${PROGS} +.if !empty(LIBADD.${_prog}) +_PROGS_LIBADD+= ${LIBADD.${_prog}} +.endif +.if !empty(DPADD.${_prog}) +_PROGS_DPADD+= ${DPADD.${_prog}} +.endif +.endfor +.endif # !empty(PROGS) +.if !empty(DPADD) +# Taken from meta.autodep.mk (where it only does something with +# BUILD_AT_LEVEL0, which we don't use). +# This only works for DPADD with full OBJ/SRC paths, which is mostly just +# _INTERNALLIBS. +_DPADD= ${DPADD} ${_PROGS_DPADD} +_DP_DIRDEPS= \ + ${_DPADD:O:u:M${OBJTOP}*:H:N.:tA:C,${OBJTOP}[^/]*/,,:N.:O:u} \ + ${_DPADD:O:u:M${OBJROOT}*:N${OBJTOP}*:N${STAGE_ROOT}/*:H:S,${OBJROOT},,:C,^([^/]+)/(.*),\2.\1,:S,${HOST_TARGET}$,host,:N.*:O:u} +# Resolve the paths to RELDIRs +.if !empty(_DP_DIRDEPS) +DIRDEPS+= ${_DP_DIRDEPS:C,^,${SRCTOP}/,:tA:C,^${SRCTOP}/,,} +.endif +.endif # !empty(DPADD) +.if !empty(LIBADD) +# Also handle LIBADD for non-internal libraries. +_ALL_LIBADD= ${LIBADD} ${_PROGS_LIBADD} +.for _lib in ${_ALL_LIBADD:O:u} +_lib${_lib}reldir= ${LIB${_lib:tu}DIR:C,${OBJTOP}/,,} +.if defined(LIB${_lib:tu}DIR) && ${DIRDEPS:M${_lib${_lib}reldir}} == "" && \ + exists(${SRCTOP}/${_lib${_lib}reldir}) +DIRDEPS+= ${_lib${_lib}reldir} +.endif +.endfor +.endif # !empty(LIBADD) +.endif # no Makefile.depend* +.endif # ${RELDIR} == ${DEP_RELDIR} + +.endif # ${DEP_MACHINE} != "host" .if ${MK_STAGING} == "yes" # we need targets/pseudo/stage to prep the stage tree diff --git a/share/mk/local.gendirdeps.mk b/share/mk/local.gendirdeps.mk index 833ac800d643..ac22471611ed 100644 --- a/share/mk/local.gendirdeps.mk +++ b/share/mk/local.gendirdeps.mk @@ -6,13 +6,14 @@ GENDIRDEPS_HEADER= echo '\# ${FreeBSD:L:@v@$$$v$$ @:M*F*}'; # supress optional/auto dependecies # local.dirdeps.mk will put them in if necessary GENDIRDEPS_FILTER+= \ + Nbin/cat.host \ Ngnu/lib/libssp/libssp_nonshared \ Ncddl/usr.bin/ctf* \ - Nlib/clang/include \ Nlib/libc_nonshared \ Ntargets/pseudo/stage* \ Ntools/* +# Exclude toolchain which is handled special. .if ${RELDIR:Mtargets*} == "" .if ${RELDIR:Nusr.bin/clang/*:Ngnu/usr.bin/cc/*:Nlib/clang*} != "" GENDIRDEPS_FILTER.host+= \ @@ -21,7 +22,17 @@ GENDIRDEPS_FILTER.host+= \ .endif GENDIRDEPS_FILTER+= \ + Nlib/clang/include.host \ + Nusr.bin/addr2line.host \ + Nusr.bin/ar.host \ Nusr.bin/clang/clang.host \ + Nusr.bin/elfcopy.host \ + Nusr.bin/elfdump.host \ + Nusr.bin/nm.host \ + Nusr.bin/readelf.host \ + Nusr.bin/size.host \ + Nusr.bin/strings.host \ + Nusr.bin/strip.host \ Ngnu/usr.bin/cc* \ Ngnu/usr.bin/binutils*.host \ diff --git a/share/mk/local.init.mk b/share/mk/local.init.mk index 85303c381bae..f0a7abfc51a7 100644 --- a/share/mk/local.init.mk +++ b/share/mk/local.init.mk @@ -9,32 +9,27 @@ .endif .endif +# XXX: This should be combined with external compiler support in Makefile.inc1 +# and local.meta.sys.mk (CROSS_TARGET_FLAGS) .if ${MK_SYSROOT} == "yes" && !empty(SYSROOT) && ${MACHINE} != "host" CFLAGS_LAST+= --sysroot=${SYSROOT} CXXFLAGS_LAST+= --sysroot=${SYSROOT} LDADD+= --sysroot=${SYSROOT} .elif ${MK_STAGING} == "yes" -CFLAGS+= -nostdinc -CFLAGS+= -I${STAGE_INCLUDEDIR} +CFLAGS+= -isystem ${STAGE_INCLUDEDIR} +# XXX: May be needed for GCC to build with libc++ rather than libstdc++. See Makefile.inc1 +#CXXFLAGS+= -std=gnu++11 +#LDADD+= -L${STAGE_LIBDIR}/libc++ +#CXXFLAGS+= -I${STAGE_INCLUDEDIR}/usr/include/c++/v1 LDADD+= -L${STAGE_LIBDIR} .endif -.if ${MACHINE} == "host" -# we cheat? -LDADD+= -B/usr/lib -CFLAGS_LAST+= -I/usr/include -CXXFLAGS_LAST+= -I/usr/include -.endif .if ${MACHINE} == "host" .if ${.MAKE.DEPENDFILE:E} != "host" UPDATE_DEPENDFILE?= no .endif -HOST_CC?= /usr/bin/cc -CC= ${HOST_CC} -HOST_CXX?= /usr/bin/c++ -CXX= ${HOST_CXX} -HOST_CPP?= /usr/bin/cpp -CPP= ${HOST_CPP} HOST_CFLAGS+= -DHOSTPROG CFLAGS+= ${HOST_CFLAGS} .endif + +.-include "src.init.mk" diff --git a/share/mk/local.meta.sys.mk b/share/mk/local.meta.sys.mk index adc884bc5d16..1aa749abd231 100644 --- a/share/mk/local.meta.sys.mk +++ b/share/mk/local.meta.sys.mk @@ -2,7 +2,7 @@ # local configuration specific to meta mode # XXX some of this should be in meta.sys.mk -# we assume that MK_META_MODE=yes +# we assume that MK_DIRDEPS_BUILD=yes # we need this until there is an alternative MK_INSTALL_AS_USER= yes @@ -48,13 +48,14 @@ TARGET_ARCHES_arm64?= aarch64 TARGET_ARCHES_mips?= mipsel mips mips64el mips64 mipsn32 mipsn32el TARGET_ARCHES_powerpc?= powerpc powerpc64 TARGET_ARCHES_pc98?= i386 +TARGET_ARCHES_riscv?= riscv64 # some corner cases BOOT_MACHINE_DIR.amd64 = boot/i386 MACHINE_ARCH.host = ${_HOST_ARCH} # the list of machines we support -ALL_MACHINE_LIST?= amd64 arm arm64 i386 ia64 mips pc98 powerpc sparc64 +ALL_MACHINE_LIST?= amd64 arm arm64 i386 mips pc98 powerpc riscv sparc64 .for m in ${ALL_MACHINE_LIST:O:u} MACHINE_ARCH_LIST.$m?= ${TARGET_ARCHES_${m}:U$m} MACHINE_ARCH.$m?= ${MACHINE_ARCH_LIST.$m:[1]} @@ -148,7 +149,18 @@ STAGE_MACHINE:= ${TARGET_OBJ_SPEC} .endif STAGE_OBJTOP:= ${STAGE_ROOT}/${STAGE_MACHINE} STAGE_COMMON_OBJTOP:= ${STAGE_ROOT}/common +STAGE_TARGET_OBJTOP:= ${STAGE_ROOT}/${TARGET_OBJ_SPEC} STAGE_HOST_OBJTOP:= ${STAGE_ROOT}/${HOST_TARGET} +# These are exported for hooking in out-of-tree builds. They will always +# be overridden in sub-makes above when building in-tree. +.export STAGE_OBJTOP STAGE_TARGET_OBJTOP STAGE_HOST_OBJTOP + +# Use tools/install.sh which can avoid the need for xinstall for simple cases. +INSTALL?= sh ${SRCTOP}/tools/install.sh +# This is for stage-install to pickup from the environment. +REAL_INSTALL:= ${INSTALL} +.export REAL_INSTALL +STAGE_INSTALL= sh ${.PARSEDIR:tA}/stage-install.sh OBJDIR=${.OBJDIR:tA} STAGE_LIBDIR= ${STAGE_OBJTOP}${_LIBDIR:U${LIBDIR:U/lib}} STAGE_INCLUDEDIR= ${STAGE_OBJTOP}${INCLUDEDIR:U/usr/include} @@ -186,12 +198,6 @@ UPDATE_DEPENDFILE= NO # define the list of places that contain files we are responsible for .MAKE.META.BAILIWICK = ${SB} ${OBJROOT} ${STAGE_ROOT} -.if defined(CCACHE_DIR) -CCACHE_DIR := ${CCACHE_DIR:tA} -.MAKE.META.IGNORE_PATHS += ${CCACHE_DIR} -.export CCACHE_DIR -.endif - CSU_DIR.${MACHINE_ARCH} ?= csu/${MACHINE_ARCH} CSU_DIR := ${CSU_DIR.${MACHINE_ARCH}} @@ -203,25 +209,42 @@ TRACER= ${TIME_STAMP} ${:U} .if ${MACHINE} == "host" MK_SHARED_TOOLCHAIN= no .endif +TOOLCHAIN_VARS= AS AR CC CLANG_TBLGEN CXX CPP LD NM OBJDUMP OBJCOPY RANLIB \ + STRINGS SIZE TBLGEN +_toolchain_bin_CLANG_TBLGEN= /usr/bin/clang-tblgen +_toolchain_bin_CXX= /usr/bin/c++ .ifdef WITH_TOOLSDIR TOOLSDIR?= ${HOST_OBJTOP}/tools -.elif defined(STAGE_HOST_OBJTOP) && exists(${STAGE_HOST_OBJTOP}/usr/bin) +.elif defined(STAGE_HOST_OBJTOP) TOOLSDIR?= ${STAGE_HOST_OBJTOP} .endif -.if !empty(TOOLSDIR) -.if ${.MAKE.LEVEL} == 0 && exists(${TOOLSDIR}/usr/bin) -PATH:= ${PATH:S,:, ,g:@d@${exists(${TOOLSDIR}$d):?${TOOLSDIR}$d:}@:ts:}:${PATH} +# Don't use the bootstrap tools logic on itself. +.if ${.TARGETS:Mbootstrap-tools} == "" && \ + !make(showconfig) && \ + !defined(BOOTSTRAPPING_TOOLS) && !empty(TOOLSDIR) && ${.MAKE.LEVEL} == 0 +.for dir in /sbin /bin /usr/sbin /usr/bin +PATH:= ${TOOLSDIR}${dir}:${PATH} +.endfor .export PATH -.if exists(${TOOLSDIR}/usr/bin/cc) -HOST_CC?= ${TOOLSDIR}/usr/bin/cc -CC?= ${HOST_CC} -HOST_CXX?= ${TOOLSDIR}/usr/bin/c++ -CXX?= ${HOST_CXX} -HOST_CPP?= ${TOOLSDIR}/usr/bin/cpp -CPP?= ${HOST_CPP} -.export HOST_CC CC HOST_CXX CXX HOST_CPP CPP +# Prefer the TOOLSDIR version of the toolchain if present vs the host version. +.for var in ${TOOLCHAIN_VARS} +_toolchain_bin.${var}= ${TOOLSDIR}${_toolchain_bin_${var}:U/usr/bin/${var:tl}} +.if exists(${_toolchain_bin.${var}}) +HOST_${var}?= ${_toolchain_bin.${var}} +${var}?= ${HOST_${var}} +.export HOST_${var} ${var} .endif +.endfor .endif + +.for var in ${TOOLCHAIN_VARS} +HOST_${var}?= ${_toolchain_bin_${var}:U/usr/bin/${var:tl}} +.endfor + +.if ${MACHINE} == "host" +.for var in ${TOOLCHAIN_VARS} +${var}= ${HOST_${var}} +.endfor .endif .if ${MACHINE:Nhost:Ncommon} != "" && ${MACHINE} != ${HOST_MACHINE} diff --git a/share/mk/local.sys.mk b/share/mk/local.sys.mk index d542f8b5de97..37e1a17bb078 100644 --- a/share/mk/local.sys.mk +++ b/share/mk/local.sys.mk @@ -1,6 +1,6 @@ # $FreeBSD$ -.if ${MK_META_MODE} == "yes" +.if ${MK_DIRDEPS_BUILD} == "yes" MAKE_PRINT_VAR_ON_ERROR+= \ .CURDIR \ .MAKE \ @@ -13,6 +13,7 @@ MAKE_PRINT_VAR_ON_ERROR+= \ MAKEOBJDIRPREFIX \ MAKESYSPATH \ MAKE_VERSION\ + PATH \ SRCTOP \ OBJTOP \ ${MAKE_PRINT_VAR_ON_ERROR_XTRAS} @@ -23,3 +24,15 @@ MAKE_PRINT_VAR_ON_ERROR += .MAKE.MAKEFILES .PATH .endif .include "src.sys.mk" + +.if ${.MAKE.MODE:Unormal:Mmeta*} != "" +# we can afford to use cookies to prevent some targets +# re-running needlessly +META_COOKIE_TOUCH= touch ${COOKIE.${.TARGET}:U${.OBJDIR}/${.TARGET}} +# some targets need to be .PHONY - but not in meta mode +META_NOPHONY= +.else +META_COOKIE_TOUCH= +META_NOPHONY= .PHONY +.endif + diff --git a/share/mk/meta.autodep.mk b/share/mk/meta.autodep.mk index 548ba539cf6d..aa41c6e2041c 100644 --- a/share/mk/meta.autodep.mk +++ b/share/mk/meta.autodep.mk @@ -51,6 +51,9 @@ UPDATE_DEPENDFILE = NO .endif _CURDIR ?= ${.CURDIR} +_OBJDIR ?= ${.OBJDIR} +_OBJTOP ?= ${OBJTOP} +_OBJROOT ?= ${OBJROOT:U${_OBJTOP}} _DEPENDFILE := ${_CURDIR}/${.MAKE.DEPENDFILE:T} .if ${.MAKE.LEVEL} == 0 @@ -191,9 +194,9 @@ gendirdeps: ${_DEPENDFILE} # anything which matches ${_OBJROOT}* but not ${_OBJTOP}* # needs to be qualified in DIRDEPS # The pseudo machine "host" is used for HOST_TARGET -DIRDEPS = \ +DIRDEPS += \ ${DPADD:M${_OBJTOP}*:H:C,${_OBJTOP}[^/]*/,,:N.:O:u} \ - ${DPADD:M${_OBJROOT}*:N${_OBJTOP}*:H:S,${_OBJROOT},,:C,^([^/]+)/(.*),\2.\1,:S,${HOST_TARGET}$,host,:N.*:O:u} + ${DPADD:M${_OBJROOT}*:N${_OBJTOP}*:N${STAGE_ROOT:U${_OBJTOP}}/*:H:S,${_OBJROOT},,:C,^([^/]+)/(.*),\2.\1,:S,${HOST_TARGET}$,host,:N.*:O:u} .endif .endif diff --git a/share/mk/meta.stage.mk b/share/mk/meta.stage.mk index cdf3e36e733d..0f5f37dab069 100644 --- a/share/mk/meta.stage.mk +++ b/share/mk/meta.stage.mk @@ -156,7 +156,7 @@ stage_libs: .dirdep @${STAGE_LINKS_SCRIPT}; StageLinks -s ${STAGE_LIBDIR:${STAGE_DIR_FILTER}} \ ${SHLIB_LINKS:@t@${STAGE_LIBS:T:M$t.*} $t@} .elif !empty(SHLIB_LINK) && !empty(SHLIB_NAME) - @${STAGE_LINKS_SCRIPT}; StageLinks -s ${STAGE_LIBDIR:${STAGE_DIR_FILTER}} ${SHLIB_NAME} ${SHLIB_LINK} ${SYMLINKS:T} + @${STAGE_LINKS_SCRIPT}; StageLinks -s ${STAGE_LIBDIR:${STAGE_DIR_FILTER}} ${SHLIB_NAME} ${SHLIB_LINK} .endif .endif @touch $@ diff --git a/share/mk/netbsd-tests.test.mk b/share/mk/netbsd-tests.test.mk index 92a401bf2585..c1c9f91a4a6d 100644 --- a/share/mk/netbsd-tests.test.mk +++ b/share/mk/netbsd-tests.test.mk @@ -3,8 +3,6 @@ .if !target(__netbsd_tests.test.mk__) __netbsd_tests.test.mk__: -OBJTOP?= ${.OBJDIR:S/${RELDIR}//} - TESTSRC?= ${SRCTOP}/contrib/netbsd-tests/${RELDIR:H} .if !exists(${TESTSRC}/) @@ -20,8 +18,7 @@ LIBNETBSD_OBJDIR= ${OBJTOP}/lib/libnetbsd CFLAGS.$t+= -I${LIBNETBSD_SRCDIR} -I${SRCTOP}/contrib/netbsd-tests LDFLAGS.$t+= -L${LIBNETBSD_OBJDIR} -DPADD.$t+= ${LIBNETBSD} -LDADD.$t+= -lnetbsd +LIBADD.${t}+= netbsd SRCS.$t?= ${t:C/^/t_/:C/_test$//g}.c .endfor diff --git a/share/mk/src.init.mk b/share/mk/src.init.mk new file mode 100644 index 000000000000..2067dcdbbabc --- /dev/null +++ b/share/mk/src.init.mk @@ -0,0 +1,11 @@ +# $FreeBSD$ + +.if !target(__<src.init.mk>__) +__<src.init.mk>__: + +.if !target(buildenv) +buildenv: .PHONY + ${_+_}@env BUILDENV_DIR=${.CURDIR} ${MAKE} -C ${SRCTOP} buildenv +.endif + +.endif # !target(__<src.init.mk>__) diff --git a/share/mk/src.libnames.mk b/share/mk/src.libnames.mk index e3d5baecaa29..28c23680d2fb 100644 --- a/share/mk/src.libnames.mk +++ b/share/mk/src.libnames.mk @@ -7,13 +7,10 @@ .error src.libnames.mk cannot be included directly. .endif -.include <src.opts.mk> +.if !target(__<src.libnames.mk>__) +__<src.libnames.mk>__: -.if ${.OBJDIR:S,${.CURDIR},,} != ${.OBJDIR} -ROOTOBJDIR= ${.OBJDIR:S,${.CURDIR},,}${SRCTOP} -.elif defined(OBJTOP) && ${.OBJDIR:M${OBJTOP}*} != "" -ROOTOBJDIR= ${OBJTOP} -.endif +.include <src.opts.mk> _PRIVATELIBS= \ atf_c \ @@ -39,7 +36,7 @@ _INTERNALLIBS= \ netbsd \ ntp \ ntpevent \ - ohash \ + openbsd \ opts \ parse \ readline \ @@ -53,10 +50,13 @@ _INTERNALLIBS= \ _LIBRARIES= \ ${_PRIVATELIBS} \ ${_INTERNALLIBS} \ + ${LOCAL_LIBRARIES} \ + 80211 \ alias \ archive \ asn1 \ auditd \ + avl \ begemot \ bluetooth \ bsdxml \ @@ -121,6 +121,7 @@ _LIBRARIES= \ netgraph \ ngatm \ nv \ + nvpair \ opie \ pam \ panel \ @@ -147,32 +148,61 @@ _LIBRARIES= \ ssp_nonshared \ stdthreads \ supcplusplus \ + sysdecode \ tacplus \ + termcap \ termcapw \ ufs \ ugidfw \ ulog \ + umem \ usb \ usbhid \ util \ + uutil \ vmmapi \ wind \ wrap \ xo \ y \ ypclnt \ - z + z \ + zfs_core \ + zfs \ + zpool \ + +.if ${MK_OFED} != "no" +_LIBRARIES+= \ + cxgb4 \ + ibcm \ + ibcommon \ + ibmad \ + ibsdp \ + ibumad \ + ibverbs \ + mlx4 \ + mthca \ + opensm \ + osmcomp \ + osmvendor \ + rdmacm \ + +.endif +# Each library's LIBADD needs to be duplicated here for static linkage of +# 2nd+ order consumers. Auto-generating this would be better. +_DP_80211= sbuf bsdxml _DP_archive= z bz2 lzma bsdxml .if ${MK_OPENSSL} != "no" _DP_archive+= crypto .else _DP_archive+= md .endif +_DP_sqlite3= pthread _DP_ssl= crypto -_DP_ssh= crypto crypt +_DP_ssh= crypto crypt z .if ${MK_LDNS} != "no" -_DP_ssh+= ldns z +_DP_ssh+= ldns .endif _DP_edit= ncursesw .if ${MK_OPENSSL} != "no" @@ -182,10 +212,11 @@ _DP_geom= bsdxml sbuf _DP_cam= sbuf _DP_casper= capsicum nv pjdlog _DP_capsicum= nv +_DP_kvm= elf _DP_pjdlog= util _DP_opie= md _DP_usb= pthread -_DP_unbound= pthread +_DP_unbound= ssl crypto pthread _DP_rt= pthread .if ${MK_OPENSSL} == "no" _DP_radius= md @@ -203,10 +234,11 @@ _DP_proc= supcplusplus .if ${MK_CDDL} != "no" _DP_proc+= ctf .endif +_DP_proc+= elf rtld_db util _DP_mp= crypto _DP_memstat= kvm _DP_magic= z -_DP_mt= bsdxml +_DP_mt= sbuf bsdxml _DP_ldns= crypto .if ${MK_OPENSSL} != "no" _DP_fetch= ssl crypto @@ -215,7 +247,7 @@ _DP_fetch= md .endif _DP_execinfo= elf _DP_dwarf= elf -_DP_dpv= dialog figpar util +_DP_dpv= dialog figpar util ncursesw _DP_dialog= ncursesw m _DP_cuse= pthread _DP_atf_cxx= atf_c @@ -230,17 +262,49 @@ _DP_pam+= ssh .if ${MK_NIS} != "no" _DP_pam+= ypclnt .endif -_DP_krb5+= asn1 com_err crypt crypto hx509 roken wind heimbase heimipcc \ - pthread +_DP_readline= ncursesw +_DP_roken= crypt +_DP_kadm5clnt= com_err krb5 roken +_DP_kadm5srv= com_err hdb krb5 roken +_DP_heimntlm= crypto com_err krb5 roken +_DP_hx509= asn1 com_err crypto roken wind +_DP_hdb= asn1 com_err krb5 roken sqlite3 +_DP_asn1= com_err roken +_DP_kdc= roken hdb hx509 krb5 heimntlm asn1 crypto +_DP_wind= com_err roken +_DP_heimbase= pthread +_DP_heimipcc= heimbase roken pthread +_DP_heimipcs= heimbase roken pthread +_DP_kafs5= asn1 krb5 roken +_DP_krb5+= asn1 com_err crypt crypto hx509 roken wind heimbase heimipcc _DP_gssapi_krb5+= gssapi krb5 crypto roken asn1 com_err _DP_lzma= pthread _DP_ucl= m _DP_vmmapi= util _DP_ctf= z -_DP_proc= rtld_db util -_DP_dtrace= rtld_db pthread - -# Define spacial cases +_DP_dtrace= ctf elf proc pthread rtld_db +_DP_xo= util +# The libc dependencies are not strictly needed but are defined to make the +# assert happy. +_DP_c= compiler_rt +.if ${MK_SSP} != "no" +_DP_c+= ssp_nonshared +.endif +_DP_stdthreads= pthread +_DP_tacplus= md +_DP_panel= ncurses +_DP_panelw= ncursesw +_DP_rpcsec_gss= gssapi +_DP_smb= kiconv +_DP_ulog= md +_DP_fifolog= z +_DP_ipf= kvm +_DP_zfs= md pthread umem util uutil m nvpair avl bsdxml geom nvpair z \ + zfs_core +_DP_zfs_core= nvpair +_DP_zpool= md pthread z nvpair avl umem + +# Define special cases LDADD_supcplusplus= -lsupc++ LIBATF_C= ${DESTDIR}${LIBDIR}/libprivateatf-c.a LIBATF_CXX= ${DESTDIR}${LIBDIR}/libprivateatf-c++.a @@ -261,7 +325,9 @@ LDADD_${_l}?= -lprivate${_l} .else LDADD_${_l}?= ${LDADD_${_l}_L} -l${_l} .endif -.if defined(_DP_${_l}) && defined(NO_SHARED) && (${NO_SHARED} != "no" && ${NO_SHARED} != "NO") +# Add in all dependencies for static linkage. +.if defined(_DP_${_l}) && (${_INTERNALLIBS:M${_l}} || \ + (defined(NO_SHARED) && (${NO_SHARED} != "no" && ${NO_SHARED} != "NO"))) .for _d in ${_DP_${_l}} DPADD_${_l}+= ${DPADD_${_d}} LDADD_${_l}+= ${LDADD_${_d}} @@ -269,100 +335,198 @@ LDADD_${_l}+= ${LDADD_${_d}} .endif .endfor +# These are special cases where the library is broken and anything that uses +# it needs to add more dependencies. Broken usually means that it has a +# cyclic dependency and cannot link its own dependencies. This is bad, please +# fix the library instead. +# Unless the library itself is broken then the proper place to define +# dependencies is _DP_* above. + +# libatf-c++ exposes libatf-c abi hence we need to explicit link to atf_c for +# atf_cxx DPADD_atf_cxx+= ${DPADD_atf_c} LDADD_atf_cxx+= ${LDADD_atf_c} -DPADD_sqlite3+= ${DPADD_pthread} -LDADD_sqlite3+= ${LDADD_pthread} - -DPADD_fifolog+= ${DPADD_z} -LDADD_fifolog+= ${LDADD_z} - -DPADD_ipf+= ${DPADD_kvm} -LDADD_ipf+= ${LDADD_kvm} - -DPADD_mt+= ${DPADD_sbuf} -LDADD_mt+= ${LDADD_sbuf} - -DPADD_dtrace+= ${DPADD_ctf} ${DPADD_elf} ${DPADD_proc} -LDADD_dtrace+= ${LDADD_ctf} ${LDADD_elf} ${LDADD_proc} - -# The following depends on libraries which are using pthread -DPADD_hdb+= ${DPADD_pthread} -LDADD_hdb+= ${LDADD_pthread} -DPADD_kadm5srv+= ${DPADD_pthread} -LDADD_kadm5srv+= ${LDADD_pthread} -DPADD_krb5+= ${DPADD_pthread} -LDADD_krb5+= ${LDADD_pthread} -DPADD_gssapi_krb5+= ${DPADD_pthread} -LDADD_gssapi_krb5+= ${LDADD_pthread} +# Detect LDADD/DPADD that should be LIBADD, before modifying LDADD here. +_BADLDADD= +.for _l in ${LDADD:M-l*:N-l*/*:C,^-l,,} +.if ${_LIBRARIES:M${_l}} && !${_PRIVATELIBS:M${_l}} +_BADLDADD+= ${_l} +.endif +.endfor +.if !empty(_BADLDADD) +.error ${.CURDIR}: These libraries should be LIBADD+=foo rather than DPADD/LDADD+=-lfoo: ${_BADLDADD} +.endif .for _l in ${LIBADD} -DPADD+= ${DPADD_${_l}:Umissing-dpadd_${_l}} +DPADD+= ${DPADD_${_l}} LDADD+= ${LDADD_${_l}} .endfor -.if defined(DPADD) && ${DPADD:Mmissing-dpadd_*} -.error Missing ${DPADD:Mmissing-dpadd_*:S/missing-dpadd_//:S/^/DPADD_/} variable add "${DPADD:Mmissing-dpadd_*:S/missing-dpadd_//}" to _LIBRARIES, _INTERNALLIBS, or _PRIVATELIBS and define "${DPADD:Mmissing-dpadd_*:S/missing-dpadd_//:S/^/LIB/:tu}". -.endif - -LIBELFTCDIR= ${ROOTOBJDIR}/lib/libelftc +# INTERNALLIB definitions. +LIBELFTCDIR= ${OBJTOP}/lib/libelftc LIBELFTC?= ${LIBELFTCDIR}/libelftc.a -LIBREADLINEDIR= ${ROOTOBJDIR}/gnu/lib/libreadline/readline +LIBREADLINEDIR= ${OBJTOP}/gnu/lib/libreadline/readline LIBREADLINE?= ${LIBREADLINEDIR}/libreadline.a -LIBOHASHDIR= ${ROOTOBJDIR}/lib/libohash -LIBOHASH?= ${LIBOHASHDIR}/libohash.a +LIBOPENBSDDIR= ${OBJTOP}/lib/libopenbsd +LIBOPENBSD?= ${LIBOPENBSDDIR}/libopenbsd.a -LIBSMDIR= ${ROOTOBJDIR}/lib/libsm +LIBSMDIR= ${OBJTOP}/lib/libsm LIBSM?= ${LIBSMDIR}/libsm.a -LIBSMDBDIR= ${ROOTOBJDIR}/lib/libsmdb +LIBSMDBDIR= ${OBJTOP}/lib/libsmdb LIBSMDB?= ${LIBSMDBDIR}/libsmdb.a -LIBSMUTILDIR= ${ROOTOBJDIR}/lib/libsmutil +LIBSMUTILDIR= ${OBJTOP}/lib/libsmutil LIBSMUTIL?= ${LIBSMDBDIR}/libsmutil.a -LIBNETBSDDIR?= ${ROOTOBJDIR}/lib/libnetbsd +LIBNETBSDDIR?= ${OBJTOP}/lib/libnetbsd LIBNETBSD?= ${LIBNETBSDDIR}/libnetbsd.a -LIBVERSDIR?= ${ROOTOBJDIR}/kerberos5/lib/libvers +LIBVERSDIR?= ${OBJTOP}/kerberos5/lib/libvers LIBVERS?= ${LIBVERSDIR}/libvers.a -LIBSLDIR= ${ROOTOBJDIR}/kerberos5/lib/libsl +LIBSLDIR= ${OBJTOP}/kerberos5/lib/libsl LIBSL?= ${LIBSLDIR}/libsl.a -LIBIPFDIR= ${ROOTOBJDIR}/sbin/ipf/libipf +LIBIPFDIR= ${OBJTOP}/sbin/ipf/libipf LIBIPF?= ${LIBIPFDIR}/libipf.a -LIBTELNETDIR= ${ROOTOBJDIR}/lib/libtelnet +LIBTELNETDIR= ${OBJTOP}/lib/libtelnet LIBTELNET?= ${LIBTELNETDIR}/libtelnet.a -LIBCRONDIR= ${ROOTOBJDIR}/usr.sbin/cron/lib +LIBCRONDIR= ${OBJTOP}/usr.sbin/cron/lib LIBCRON?= ${LIBCRONDIR}/libcron.a -LIBNTPDIR= ${ROOTOBJDIR}/usr.sbin/ntp/libntp +LIBNTPDIR= ${OBJTOP}/usr.sbin/ntp/libntp LIBNTP?= ${LIBNTPDIR}/libntp.a -LIBNTPEVENTDIR= ${ROOTOBJDIR}/usr.sbin/ntp/libntpevent +LIBNTPEVENTDIR= ${OBJTOP}/usr.sbin/ntp/libntpevent LIBNTPEVENT?= ${LIBNTPEVENTDIR}/libntpevent.a -LIBOPTSDIR= ${ROOTOBJDIR}/usr.sbin/ntp/libopts -LIBOTPS?= ${LIBOPTSDIR}/libopts.a +LIBOPTSDIR= ${OBJTOP}/usr.sbin/ntp/libopts +LIBOPTS?= ${LIBOPTSDIR}/libopts.a -LIBPARSEDIR= ${ROOTOBJDIR}/usr.sbin/ntp/libparse +LIBPARSEDIR= ${OBJTOP}/usr.sbin/ntp/libparse LIBPARSE?= ${LIBPARSEDIR}/libparse.a -LIBLPRDIR= ${ROOTOBJDIR}/usr.sbin/lpr/common_source +LIBLPRDIR= ${OBJTOP}/usr.sbin/lpr/common_source LIBLPR?= ${LIBOPTSDIR}/liblpr.a -LIBFIFOLOGDIR= ${ROOTOBJDIR}/usr.sbin/fifolog/lib +LIBFIFOLOGDIR= ${OBJTOP}/usr.sbin/fifolog/lib LIBFIFOLOG?= ${LIBOPTSDIR}/libfifolog.a -LIBBSNMPTOOLSDIR= ${ROOTOBJDIR}/usr.sbin/bsnmpd/tools/libbsnmptools +LIBBSNMPTOOLSDIR= ${OBJTOP}/usr.sbin/bsnmpd/tools/libbsnmptools LIBBSNMPTOOLS?= ${LIBBSNMPTOOLSDIR}/libbsnmptools.a -LIBAMUDIR= ${ROOTOBJDIR}/usr.sbin/amd/libamu +LIBAMUDIR= ${OBJTOP}/usr.sbin/amd/libamu LIBAMU?= ${LIBAMUDIR}/libamu/libamu.a +# Define a directory for each library. This is useful for adding -L in when +# not using a --sysroot or for meta mode bootstrapping when there is no +# Makefile.depend. These are sorted by directory. +LIBAVLDIR= ${OBJTOP}/cddl/lib/libavl +LIBCTFDIR= ${OBJTOP}/cddl/lib/libctf +LIBDTRACEDIR= ${OBJTOP}/cddl/lib/libdtrace +LIBNVPAIRDIR= ${OBJTOP}/cddl/lib/libnvpair +LIBUMEMDIR= ${OBJTOP}/cddl/lib/libumem +LIBUUTILDIR= ${OBJTOP}/cddl/lib/libuutil +LIBZFSDIR= ${OBJTOP}/cddl/lib/libzfs +LIBZFS_COREDIR= ${OBJTOP}/cddl/lib/libzfs_core +LIBZPOOLDIR= ${OBJTOP}/cddl/lib/libzpool +LIBCXGB4DIR= ${OBJTOP}/contrib/ofed/usr.lib/libcxgb4 +LIBIBCMDIR= ${OBJTOP}/contrib/ofed/usr.lib/libibcm +LIBIBCOMMONDIR= ${OBJTOP}/contrib/ofed/usr.lib/libibcommon +LIBIBMADDIR= ${OBJTOP}/contrib/ofed/usr.lib/libibmad +LIBIBUMADDIR= ${OBJTOP}/contrib/ofed/usr.lib/libibumad +LIBIBVERBSDIR= ${OBJTOP}/contrib/ofed/usr.lib/libibverbs +LIBMLX4DIR= ${OBJTOP}/contrib/ofed/usr.lib/libmlx4 +LIBMTHCADIR= ${OBJTOP}/contrib/ofed/usr.lib/libmthca +LIBOPENSMDIR= ${OBJTOP}/contrib/ofed/usr.lib/libopensm +LIBOSMCOMPDIR= ${OBJTOP}/contrib/ofed/usr.lib/libosmcomp +LIBOSMVENDORDIR= ${OBJTOP}/contrib/ofed/usr.lib/libosmvendor +LIBRDMACMDIR= ${OBJTOP}/contrib/ofed/usr.lib/librdmacm +LIBIBSDPDIR= ${OBJTOP}/contrib/ofed/usr.lib/libsdp +LIBDIALOGDIR= ${OBJTOP}/gnu/lib/libdialog +LIBGCOVDIR= ${OBJTOP}/gnu/lib/libgcov +LIBGOMPDIR= ${OBJTOP}/gnu/lib/libgomp +LIBGNUREGEXDIR= ${OBJTOP}/gnu/lib/libregex +LIBSSPDIR= ${OBJTOP}/gnu/lib/libssp +LIBSSP_NONSHAREDDIR= ${OBJTOP}/gnu/lib/libssp/libssp_nonshared +LIBSUPCPLUSPLUSDIR= ${OBJTOP}/gnu/lib/libsupc++ +LIBASN1DIR= ${OBJTOP}/kerberos5/lib/libasn1 +LIBGSSAPI_KRB5DIR= ${OBJTOP}/kerberos5/lib/libgssapi_krb5 +LIBGSSAPI_NTLMDIR= ${OBJTOP}/kerberos5/lib/libgssapi_ntlm +LIBGSSAPI_SPNEGODIR= ${OBJTOP}/kerberos5/lib/libgssapi_spnego +LIBHDBDIR= ${OBJTOP}/kerberos5/lib/libhdb +LIBHEIMBASEDIR= ${OBJTOP}/kerberos5/lib/libheimbase +LIBHEIMIPCCDIR= ${OBJTOP}/kerberos5/lib/libheimipcc +LIBHEIMIPCSDIR= ${OBJTOP}/kerberos5/lib/libheimipcs +LIBHEIMNTLMDIR= ${OBJTOP}/kerberos5/lib/libheimntlm +LIBHX509DIR= ${OBJTOP}/kerberos5/lib/libhx509 +LIBKADM5CLNTDIR= ${OBJTOP}/kerberos5/lib/libkadm5clnt +LIBKADM5SRVDIR= ${OBJTOP}/kerberos5/lib/libkadm5srv +LIBKAFS5DIR= ${OBJTOP}/kerberos5/lib/libkafs5 +LIBKDCDIR= ${OBJTOP}/kerberos5/lib/libkdc +LIBKRB5DIR= ${OBJTOP}/kerberos5/lib/libkrb5 +LIBROKENDIR= ${OBJTOP}/kerberos5/lib/libroken +LIBWINDDIR= ${OBJTOP}/kerberos5/lib/libwind +LIBALIASDIR= ${OBJTOP}/lib/libalias/libalias +LIBBLOCKSRUNTIMEDIR= ${OBJTOP}/lib/libblocksruntime +LIBBSNMPDIR= ${OBJTOP}/lib/libbsnmp/libbsnmp +LIBBSDXMLDIR= ${OBJTOP}/lib/libexpat +LIBKVMDIR= ${OBJTOP}/lib/libkvm +LIBPTHREADDIR= ${OBJTOP}/lib/libthr +LIBMDIR= ${OBJTOP}/lib/msun +LIBFORMDIR= ${OBJTOP}/lib/ncurses/form +LIBFORMLIBWDIR= ${OBJTOP}/lib/ncurses/formw +LIBMENUDIR= ${OBJTOP}/lib/ncurses/menu +LIBMENULIBWDIR= ${OBJTOP}/lib/ncurses/menuw +LIBNCURSESDIR= ${OBJTOP}/lib/ncurses/ncurses +LIBNCURSESWDIR= ${OBJTOP}/lib/ncurses/ncursesw +LIBPANELDIR= ${OBJTOP}/lib/ncurses/panel +LIBPANELWDIR= ${OBJTOP}/lib/ncurses/panelw +LIBCRYPTODIR= ${OBJTOP}/secure/lib/libcrypto +LIBSSHDIR= ${OBJTOP}/secure/lib/libssh +LIBSSLDIR= ${OBJTOP}/secure/lib/libssl +LIBTEKENDIR= ${OBJTOP}/sys/teken/libteken +LIBEGACYDIR= ${OBJTOP}/tools/build +LIBLNDIR= ${OBJTOP}/usr.bin/lex/lib + +LIBTERMCAPDIR= ${LIBNCURSESDIR} +LIBTERMCAPWDIR= ${LIBNCURSESWDIR} + +# Default other library directories to lib/libNAME. +.for lib in ${_LIBRARIES} +LIB${lib:tu}DIR?= ${OBJTOP}/lib/lib${lib} +.endfor + +# Validate that listed LIBADD are valid. +.for _l in ${LIBADD} +.if empty(_LIBRARIES:M${_l}) +_BADLIBADD+= ${_l} +.endif +.endfor +.if !empty(_BADLIBADD) +.error ${.CURDIR}: Invalid LIBADD used which may need to be added to ${_this:T}: ${_BADLIBADD} +.endif + +# Sanity check that libraries are defined here properly when building them. +.if defined(LIB) && ${_LIBRARIES:M${LIB}} != "" +.if !empty(LIBADD) && \ + (!defined(_DP_${LIB}) || ${LIBADD:O:u} != ${_DP_${LIB}:O:u}) +.error ${.CURDIR}: Missing or incorrect _DP_${LIB} entry in ${_this:T}. Should match LIBADD for ${LIB} ('${LIBADD}' vs '${_DP_${LIB}}') +.endif +# Note that OBJTOP is not yet defined here but for the purpose of the check +# it is fine as it resolves to the SRC directory. +.if !defined(LIB${LIB:tu}DIR) || !exists(${SRCTOP}/${LIB${LIB:tu}DIR:S,^${OBJTOP}/,,}) +.error ${.CURDIR}: Missing or incorrect value for LIB${LIB:tu}DIR in ${_this:T}: ${LIB${LIB:tu}DIR:S,^${OBJTOP}/,,} +.endif +.if ${_INTERNALLIBS:M${LIB}} != "" && !defined(LIB${LIB:tu}) +.error ${.CURDIR}: Missing value for LIB${LIB:tu} in ${_this:T}. Likely should be: LIB${LIB:tu}?= $${LIB${LIB:tu}DIR}/lib${LIB}.a +.endif +.endif + +.endif # !target(__<src.libnames.mk>__) diff --git a/share/mk/src.opts.mk b/share/mk/src.opts.mk index a5e78a3d9459..47a67e02e52a 100644 --- a/share/mk/src.opts.mk +++ b/share/mk/src.opts.mk @@ -180,11 +180,10 @@ __DEFAULT_NO_OPTIONS = \ DTRACE_TESTS \ EISA \ HESIOD \ - LLDB \ + LIBSOFT \ NAND \ OFED \ OPENLDAP \ - OPENSSH_NONE_CIPHER \ SHARED_TOOLCHAIN \ SORT_THREADS \ SVN @@ -210,34 +209,50 @@ __TT=${MACHINE} .endif .include <bsd.compiler.mk> -.if !${COMPILER_FEATURES:Mc++11} -# If the compiler is not C++11 capable, disable clang and use gcc instead. -__DEFAULT_YES_OPTIONS+=GCC GCC_BOOTSTRAP GNUCXX -__DEFAULT_NO_OPTIONS+=CLANG CLANG_BOOTSTRAP CLANG_FULL CLANG_IS_CC -.elif ${__T} == "aarch64" || ${__T} == "amd64" || ${__TT} == "arm" || \ - ${__T} == "i386" -# On x86 and arm, clang is enabled, and will be installed as the default cc. +# If the compiler is not C++11 capable, disable Clang and use GCC instead. +# This means that architectures that have GCC 4.2 as default can not +# build Clang without using an external compiler. + +.if ${COMPILER_FEATURES:Mc++11} && (${__T} == "aarch64" || \ + ${__T} == "amd64" || ${__TT} == "arm" || ${__T} == "i386") +# Clang is enabled, and will be installed as the default /usr/bin/cc. __DEFAULT_YES_OPTIONS+=CLANG CLANG_BOOTSTRAP CLANG_FULL CLANG_IS_CC __DEFAULT_NO_OPTIONS+=GCC GCC_BOOTSTRAP GNUCXX -.elif ${__T:Mpowerpc*} -# On powerpc, clang is enabled, but gcc is installed as the default cc. +.elif ${COMPILER_FEATURES:Mc++11} && ${__T:Mpowerpc*} +# On powerpc, if an external compiler that supports C++11 is used as ${CC}, +# then Clang is enabled, but GCC is installed as the default /usr/bin/cc. __DEFAULT_YES_OPTIONS+=CLANG CLANG_FULL GCC GCC_BOOTSTRAP GNUCXX __DEFAULT_NO_OPTIONS+=CLANG_BOOTSTRAP CLANG_IS_CC .else -# Everything else disables clang, and uses gcc instead. +# Everything else disables Clang, and uses GCC instead. __DEFAULT_YES_OPTIONS+=GCC GCC_BOOTSTRAP GNUCXX __DEFAULT_NO_OPTIONS+=CLANG CLANG_BOOTSTRAP CLANG_FULL CLANG_IS_CC .endif -.if ${__T} == "aarch64" +# In-tree binutils/gcc are older versions without modern architecture support. +.if ${__T} == "aarch64" || ${__T} == "riscv64" BROKEN_OPTIONS+=BINUTILS BINUTILS_BOOTSTRAP GCC GCC_BOOTSTRAP GDB __DEFAULT_YES_OPTIONS+=ELFCOPY_AS_OBJCOPY .else __DEFAULT_NO_OPTIONS+=ELFCOPY_AS_OBJCOPY .endif +.if ${__T} == "riscv64" +BROKEN_OPTIONS+=PROFILE # "sorry, unimplemented: profiler support for RISC-V" +BROKEN_OPTIONS+=TESTS # "undefined reference to `_Unwind_Resume'" +BROKEN_OPTIONS+=CXX # "libcxxrt.so: undefined reference to `_Unwind_Resume_or_Rethrow'" +.endif +.if ${__T} == "aarch64" || ${__T} == "amd64" +__DEFAULT_YES_OPTIONS+=LLDB +.else +__DEFAULT_NO_OPTIONS+=LLDB +.endif # LLVM lacks support for FreeBSD 64-bit atomic operations for ARMv4/ARMv5 .if ${__T} == "arm" || ${__T} == "armeb" BROKEN_OPTIONS+=LLDB .endif +# Only doing soft float API stuff on armv6 +.if ${__T} != "armv6" +BROKEN_OPTIONS+=LIBSOFT +.endif .include <bsd.mkopt.mk> diff --git a/share/mk/src.sys.mk b/share/mk/src.sys.mk index 7b84d5149316..6c1ebb753f55 100644 --- a/share/mk/src.sys.mk +++ b/share/mk/src.sys.mk @@ -5,6 +5,7 @@ # to preserve historical (and useful) behavior. Changes here need to # be reflected there so SRCCONF isn't included multiple times. +.if !defined(_WITHOUT_SRCCONF) # Allow user to configure things that only effect src tree builds. SRCCONF?= /etc/src.conf .if (exists(${SRCCONF}) || ${SRCCONF} != "/etc/src.conf") && !target(_srcconf_included_) @@ -29,6 +30,7 @@ __postrcconf_${var}:= ${MK_${var}:U-}${WITHOUT_${var}:Uno:Dyes}${WITH_${var}:Uno .endfor .endif # SRCCONF +.endif # tempting, but bsd.compiler.mk causes problems this early # probably need to remove dependence on bsd.own.mk diff --git a/share/mk/suite.test.mk b/share/mk/suite.test.mk index c447a171bf52..2b87d7fba602 100644 --- a/share/mk/suite.test.mk +++ b/share/mk/suite.test.mk @@ -8,10 +8,6 @@ .error suite.test.mk cannot be included directly. .endif -# Directory in which to install tests defined by the current Makefile. -# Makefiles have to override this to point to a subdirectory of TESTSBASE. -TESTSDIR?= . - # Name of the test suite these tests belong to. Should rarely be changed for # Makefiles built into the FreeBSD src tree. TESTSUITE?= FreeBSD @@ -49,31 +45,21 @@ KYUAFILE?= auto # unqualified TEST_METADATA variable. #TEST_METADATA.<test-program>+= key="value" -# Path to the prefix of the installed Kyua CLI, if any. -# -# If kyua is installed from ports, we automatically define a realtest target -# below to run the tests using this tool. The tools are searched for in the -# hierarchy specified by this variable. -KYUA_PREFIX?= /usr/local - -.if ${KYUAFILE:tl} == "yes" +.if ${KYUAFILE:tl} != "no" FILES+= Kyuafile FILESDIR_Kyuafile= ${TESTSDIR} +.endif -CLEANFILES+= Kyuafile.auto Kyuafile.auto.tmp -.elif ${KYUAFILE:tl} == "auto" -FILES+= Kyuafile.auto -FILESDIR_Kyuafile.auto= ${TESTSDIR} -FILESNAME_Kyuafile.auto= Kyuafile - -CLEANFILES+= Kyuafile.auto Kyuafile.auto.tmp +.if ${KYUAFILE:tl} == "auto" +CLEANFILES+= Kyuafile Kyuafile.tmp +.endif .for _T in ${_TESTS} _TEST_METADATA.${_T}= ${TEST_METADATA} ${TEST_METADATA.${_T}} .endfor -.NOPATH: Kyuafile.auto -Kyuafile.auto: Makefile +.if ${KYUAFILE:tl} == "auto" +Kyuafile: Makefile @{ \ echo '-- Automatically generated by bsd.test.mk.'; \ echo; \ @@ -81,18 +67,18 @@ Kyuafile.auto: Makefile echo; \ echo 'test_suite("${TESTSUITE}")'; \ echo; \ - } >Kyuafile.auto.tmp + } > ${.TARGET}.tmp .for _T in ${_TESTS} @echo '${TEST_INTERFACE.${_T}}_test_program{name="${_T}"${_TEST_METADATA.${_T}:C/$/,/:tW:C/^/, /W:C/,$//W}}' \ - >>Kyuafile.auto.tmp + >>${.TARGET}.tmp .endfor .for _T in ${TESTS_SUBDIRS:N.WAIT} - @echo "include(\"${_T}/Kyuafile\")" >>Kyuafile.auto.tmp + @echo "include(\"${_T}/${.TARGET}\")" >>${.TARGET}.tmp .endfor - @mv Kyuafile.auto.tmp Kyuafile.auto + @mv ${.TARGET}.tmp ${.TARGET} .endif -KYUA?= ${KYUA_PREFIX}/bin/kyua +KYUA= ${LOCALBASE}/bin/kyua .if exists(${KYUA}) # Definition of the "make test" target and supporting variables. # diff --git a/share/mk/sys.mk b/share/mk/sys.mk index e8f4892cd99d..51f2818480d7 100644 --- a/share/mk/sys.mk +++ b/share/mk/sys.mk @@ -13,21 +13,20 @@ unix ?= We run FreeBSD, not UNIX. # and/or endian. This is called MACHINE_CPU in NetBSD, but that's used # for something different in FreeBSD. # -MACHINE_CPUARCH=${MACHINE_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb|hf)?/arm/:C/powerpc64/powerpc/} +MACHINE_CPUARCH=${MACHINE_ARCH:C/mips(n32|64)?(el)?/mips/:C/arm(v6)?(eb|hf)?/arm/:C/powerpc64/powerpc/:C/riscv64/riscv/} .endif # Some options we need now __DEFAULT_NO_OPTIONS= \ - DIRDEPS_CACHE \ - META_MODE \ - META_FILES \ - + DIRDEPS_BUILD \ + DIRDEPS_CACHE __DEFAULT_DEPENDENT_OPTIONS= \ - AUTO_OBJ/META_MODE \ - STAGING/META_MODE \ - SYSROOT/META_MODE + AUTO_OBJ/DIRDEPS_BUILD \ + META_MODE/DIRDEPS_BUILD \ + STAGING/DIRDEPS_BUILD \ + SYSROOT/DIRDEPS_BUILD __ENV_ONLY_OPTIONS:= \ ${__DEFAULT_NO_OPTIONS} \ @@ -43,20 +42,18 @@ __ENV_ONLY_OPTIONS:= \ .include <bsd.mkopt.mk> -.if ${MK_META_MODE} == "yes" +.if ${MK_DIRDEPS_BUILD} == "yes" .sinclude <meta.sys.mk> -.elif ${MK_META_FILES} == "yes" && defined(.MAKEFLAGS) +.elif ${MK_META_MODE} == "yes" && defined(.MAKEFLAGS) .if ${.MAKEFLAGS:M-B} == "" .MAKE.MODE= meta verbose .endif .endif .if ${MK_AUTO_OBJ} == "yes" # This needs to be done early - before .PATH is computed -# Don't do this if just running 'make -V' (but do when inspecting .OBJDIR) or -# 'make showconfig' (during makeman which enables all options when meta mode -# is not expected) -.if (${.MAKEFLAGS:M-V} == "" || ${.MAKEFLAGS:M.OBJDIR} != "") && \ - !make(showconfig) +# Don't do this for 'make showconfig' as it enables all options where meta mode +# is not expected. +.if !make(showconfig) .sinclude <auto.obj.mk> .endif .endif @@ -72,6 +69,10 @@ __ENV_ONLY_OPTIONS:= \ # # The rules below use this macro to distinguish between Posix-compliant # and default behaviour. +# +# This functionality is currently broken, since make(1) processes sys.mk +# before reading any other files, and consequently has no opportunity to +# set the %POSIX macro before we read this point. .if defined(%POSIX) .SUFFIXES: .o .c .y .l .a .sh .f @@ -145,13 +146,12 @@ ECHODIR ?= true .endif .endif -.if defined(.PARSEDIR) -# _+_ appears to be a workaround for the special src .MAKE not working. -# setting it to + interferes with -N -_+_ ?= -.elif !empty(.MAKEFLAGS:M-n) && ${.MAKEFLAGS:M-n} == "-n" -# the check above matches only a single -n, so -n -n will result -# in _+_ = + +.if ${.MAKEFLAGS:M-N} +# bmake -N is supposed to skip executing anything but it does not skip +# exeucting '+' commands. The '+' feature is used where .MAKE +# is not safe for the entire target. -N is intended to skip building sub-makes +# so it executing '+' commands is not right. Work around the bug by not +# setting '+' when -N is used. _+_ ?= .else _+_ ?= + @@ -276,7 +276,7 @@ YFLAGS ?= -d # non-Posix rule set -.sh: +.sh: .NOMETA cp -fp ${.IMPSRC} ${.TARGET} chmod a+x ${.TARGET} @@ -318,11 +318,11 @@ YFLAGS ?= -d ${FC} ${RFLAGS} ${EFLAGS} ${FFLAGS} -c ${.IMPSRC} -o ${.TARGET} .S.o: - ${CC} ${CFLAGS} ${ACFLAGS} -c ${.IMPSRC} -o ${.TARGET} + ${CC:N${CCACHE_BIN}} ${CFLAGS} ${ACFLAGS} -c ${.IMPSRC} -o ${.TARGET} ${CTFCONVERT_CMD} .asm.o: - ${CC} -x assembler-with-cpp ${CFLAGS} ${ACFLAGS} -c ${.IMPSRC} \ + ${CC:N${CCACHE_BIN}} -x assembler-with-cpp ${CFLAGS} ${ACFLAGS} -c ${.IMPSRC} \ -o ${.TARGET} ${CTFCONVERT_CMD} @@ -410,6 +410,15 @@ __MAKE_SHELL?=/bin/sh path=${__MAKE_SHELL} .endif +# Hack for ports compatibility. Historically, ports makefiles have +# assumed they can examine MACHINE_CPU without including anything +# because this was automatically included in sys.mk. For /usr/src, +# this file has moved to being included from bsd.opts.mk. Until all +# the ports files are modernized, and a reasonable transition +# period has passed, include it while we're in a ports tree here +# to preserve historic behavior. +.if exists(${.CURDIR}/../../Mk/bsd.port.mk) .include <bsd.cpu.mk> +.endif .endif # ! Posix diff --git a/share/mk/tap.test.mk b/share/mk/tap.test.mk index ec860882f15f..28b52af12bb3 100644 --- a/share/mk/tap.test.mk +++ b/share/mk/tap.test.mk @@ -26,7 +26,7 @@ TAP_TESTS_PERL?= TAP_TESTS_SH?= # Perl interpreter to use for test programs written in this language. -TAP_PERL_INTERPRETER?= /usr/local/bin/perl +TAP_PERL_INTERPRETER?= ${LOCALBASE}/bin/perl .if !empty(TAP_TESTS_C) PROGS+= ${TAP_TESTS_C} |