diff --git a/Makefile b/Makefile --- a/Makefile +++ b/Makefile @@ -119,6 +119,16 @@ # For more information, see the build(7) manual page. # +# Include jobs.mk early if we need it. +# It will turn: +# make buildworld-jobs +# into +# make -j${JOB_MAX} buildworld > ../buildworld.log 2>&1 +# +.if make(*-jobs) +.include +.endif + .if defined(UNIVERSE_TARGET) || defined(MAKE_JUST_WORLDS) || defined(WITHOUT_KERNELS) __DO_KERNELS=no .endif diff --git a/UPDATING b/UPDATING --- a/UPDATING +++ b/UPDATING @@ -27,6 +27,15 @@ world, or to merely disable the most expensive debugging functionality at runtime, run "ln -s 'abort:false,junk:false' /etc/malloc.conf".) +20230420: + Add jobs.mk to save typing. Enables -j${JOB_MAX} and logging + eg. + make buildworld-jobs + runs + make -j${JOB_MAX} buildworld > ../buildworld.log 2>&1 + + where JOB_MAX is derrived from ncpus in local.sys.mk if not set in env. + 20230316: Video related devices for some arm devices have been renamed. If you have a custom kernel config and want to use hdmi output on diff --git a/share/mk/jobs.mk b/share/mk/jobs.mk new file mode 100644 --- /dev/null +++ b/share/mk/jobs.mk @@ -0,0 +1,88 @@ +# $Id: jobs.mk,v 1.7 2023/04/18 23:32:28 sjg Exp $ +# +# @(#) Copyright (c) 2012-2023, Simon J. Gerraty +# +# This file is provided in the hope that it will +# be of use. There is absolutely NO WARRANTY. +# Permission to copy, redistribute or otherwise +# use this file is hereby granted provided that +# the above copyright notice and this notice are +# left intact. +# +# Please send copies of changes and bug-fixes to: +# sjg@crufty.net +# + +# This makefile is used by top-level makefile. +# With the following: +# +# .if make(*-jobs) +# .include +# .endif +# +# +# Then if you do: +# +# mk target-jobs +# +# We will run: +# +# ${MAKE} -j${JOB_MAX} target > ${JOB_LOGDIR}/target.log 2>&1 +# +# JOB_MAX defaults to 8 but should normally be derrived based on the +# number of cpus available. The wrapper script 'mk' makes that easy. +# + +now_utc ?= ${%s:L:gmtime} +.if !defined(start_utc) +start_utc := ${now_utc} +.endif + +.info ${.newline}${TIME_STAMP} Start ${.TARGETS} + +.if make(*-jobs) + +JOB_LOGDIR ?= ${SRCTOP:H} +JOB_LOG = ${JOB_LOGDIR}/${.TARGET:S,-jobs,,:S,/,_,g}.log +JOB_LOG_GENS ?= 4 +# we like to rotate logs +.if empty(NEWLOG_SH) +.ifdef M_whence +NEWLOG_SH := ${newlog.sh:L:${M_whence}} +.else +NEWLOG_SH := ${(type newlog.sh) 2> /dev/null:L:sh:M/*} +.endif +.endif +.if !empty(NEWLOG_SH) && exists(${NEWLOG_SH}) +NEWLOG := sh ${NEWLOG_SH} +JOB_NEWLOG_ARGS ?= -S -n ${JOB_LOG_GENS} +.else +NEWLOG = : +.endif + +.if ${.MAKE.JOBS:U0} > 0 +JOB_MAX= ${.MAKE.JOBS} +.else +# This should be derrived from number of cpu's +JOB_MAX?= 8 +JOB_ARGS+= -j${JOB_MAX} +.endif + +# we need to reset .MAKE.LEVEL to 0 do that +# build orchestration works as expected (DIRDEPS_BUILD) +${.TARGETS:M*-jobs}: + @${NEWLOG} ${JOB_NEWLOG_ARGS} ${JOB_LOG} + @echo Logging to ${JOB_LOG} + @cd ${.CURDIR} && env MAKELEVEL=0 \ + ${.MAKE} ${JOB_ARGS} _TARGETS=${.TARGET:S,-jobs,,} ${.TARGET:S,-jobs,,} >> ${JOB_LOG} 2>&1 + +.endif + +.END: _build_finish +.ERROR: _build_failed + +_build_finish: .NOMETA + @echo "${TIME_STAMP} Finished ${.TARGETS} seconds=`expr ${now_utc} - ${start_utc}`" + +_build_failed: .NOMETA + @echo "${TIME_STAMP} Failed ${.TARGETS} seconds=`expr ${now_utc} - ${start_utc}`" diff --git a/share/mk/local.sys.mk b/share/mk/local.sys.mk --- a/share/mk/local.sys.mk +++ b/share/mk/local.sys.mk @@ -59,6 +59,26 @@ .include "src.sys.mk" .-include +.if make(*-jobs) && empty(JOB_MAX) +# provide a reasonable? default for JOB_MAX based on ncpu +JOB_MAX_FACTOR?= 1.33 +NPROC?= ${(type nproc) 2> /dev/null:L:sh:M/*:[1]} +NPROC:= ${NPROC} +.if !empty(NPROC) +ncpu!= ${NPROC} +.elif ${.MAKE.OS:NDarwin:NFreeBSD} == "" +ncpu!= sysctl -n hw.ncpu +.endif +.if ${ncpu:U0} > 1 +.if ${JOB_MAX_FACTOR} == 1 +JOB_MAX:= ${ncpu} +.else +jm!= echo ${ncpu} \* ${JOB_MAX_FACTOR} | bc +JOB_MAX:= ${jm:R} +.endif +.endif +.endif + .if ${.MAKE.MODE:Mmeta*} != "" # we can afford to use cookies to prevent some targets # re-running needlessly but only when using filemon.