include: Use printf(1) instead of shell loops for header symlinks

Using a shell for loop means we have to spawn a separate install(1)
process for each header that is symlinked. This patch uses printf(1) to
generate an argument list that has been prefixed with the correct number
of ../ and then uses a single install(1) invocation.

This reduces the number of execve() calls during make includes from 2442
(with D27622) to 1382. Running `make symlinks` in include/ now spawns 214
processes instead of 1276 without this patch.

Reviewed By:	jhb
Differential Revision: https://reviews.freebsd.org/D27723
This commit is contained in:
Alex Richardson 2021-01-06 17:46:36 +00:00 committed by Alex Richardson
parent 0cace0bb0a
commit 7b0d3a3ccf

View File

@ -320,124 +320,79 @@ copies: .PHONY .META
symlinks: .PHONY .META symlinks: .PHONY .META
@${ECHO} "Setting up symlinks to kernel source tree..." @${ECHO} "Setting up symlinks to kernel source tree..."
.for i in ${LDIRS} .for i in ${LDIRS}
cd ${SRCTOP}/sys/$i; \ cd ${SRCTOP}; ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
for h in *.h; do \ $$(printf '../../../%s ' sys/$i/*.h) ${SDESTDIR}${INCLUDEDIR}/$i
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../sys/$i/$$h ${SDESTDIR}${INCLUDEDIR}/$i; \
done
.endfor .endfor
.for i in ${LSUBDIRS:Ndev/agp:Ndev/acpica:Ndev/evdev:Ndev/hyperv:Ndev/pci:Ndev/veriexec} .for i in ${LSUBDIRS:Ndev/agp:Ndev/acpica:Ndev/evdev:Ndev/hyperv:Ndev/pci:Ndev/veriexec}
cd ${SRCTOP}/sys/$i; \ cd ${SRCTOP}; ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
for h in *.h; do \ $$(printf '../../../../%s ' sys/$i/*.h) ${SDESTDIR}${INCLUDEDIR}/$i
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../../sys/$i/$$h ${SDESTDIR}${INCLUDEDIR}/$i; \
done
.endfor .endfor
cd ${SRCTOP}/sys/dev/acpica; \ ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
for h in acpiio.h acpi_hpet.h; do \ $$(printf '../../../../sys/dev/acpica/%s ' acpiio.h acpi_hpet.h) \
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../../sys/dev/acpica/$$h \ ${SDESTDIR}${INCLUDEDIR}/dev/acpica; \
${SDESTDIR}${INCLUDEDIR}/dev/acpica; \ ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../../sys/dev/agp/agpreg.h \
done ${SDESTDIR}${INCLUDEDIR}/dev/agp; \
cd ${SRCTOP}/sys/dev/agp; \ ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
for h in agpreg.h; do \ $$(printf '../../../../sys/dev/evdev/%s ' input.h input-event-codes.h uinput.h) \
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../../sys/dev/agp/$$h \ ${SDESTDIR}${INCLUDEDIR}/dev/evdev;
${SDESTDIR}${INCLUDEDIR}/dev/agp; \ ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../../sys/dev/hyperv/include/hyperv.h \
done ${SDESTDIR}${INCLUDEDIR}/dev/hyperv; \
cd ${SRCTOP}/sys/dev/evdev; \ ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../../sys/dev/hyperv/utilities/hv_snapshot.h \
for h in input.h input-event-codes.h uinput.h; do \ ${SDESTDIR}${INCLUDEDIR}/dev/hyperv; \
ln -fs ../../../../sys/dev/evdev/$$h \ ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../../sys/dev/pci/pcireg.h \
${SDESTDIR}${INCLUDEDIR}/dev/evdev; \ ${SDESTDIR}${INCLUDEDIR}/dev/pci; \
done ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../../sys/dev/veriexec/veriexec_ioctl.h \
cd ${SRCTOP}/sys/dev/hyperv/include; \ ${SDESTDIR}${INCLUDEDIR}/dev/veriexec;
for h in hyperv.h; do \
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../../sys/dev/hyperv/include/$$h \
${SDESTDIR}${INCLUDEDIR}/dev/hyperv; \
done
cd ${SRCTOP}/sys/dev/hyperv/utilities; \
for h in hv_snapshot.h; do \
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../../sys/dev/hyperv/utilities/$$h \
${SDESTDIR}${INCLUDEDIR}/dev/hyperv; \
done
cd ${SRCTOP}/sys/dev/pci; \
for h in pcireg.h; do \
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../../sys/dev/pci/$$h \
${SDESTDIR}${INCLUDEDIR}/dev/pci; \
done
cd ${SRCTOP}/sys/dev/veriexec; \
for h in veriexec_ioctl.h; do \
ln -fs ../../../../sys/dev/veriexec/$$h \
${SDESTDIR}${INCLUDEDIR}/dev/veriexec; \
done
.for i in ${LSUBSUBDIRS} .for i in ${LSUBSUBDIRS}
cd ${SRCTOP}/sys/$i; \ cd ${SRCTOP}; ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
for h in *.h; do \ $$(printf '../../../../../%s ' sys/$i/*.h) ${SDESTDIR}${INCLUDEDIR}/$i
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../../../sys/$i/$$h ${SDESTDIR}${INCLUDEDIR}/$i; \
done
.endfor .endfor
.if ${MK_IPFILTER} != "no" .if ${MK_IPFILTER} != "no"
cd ${SRCTOP}/sys/contrib/ipfilter/netinet; \ cd ${SRCTOP}; ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
for h in *.h; do \ $$(printf '../../../%s ' sys/contrib/ipfilter/netinet/*.h) \
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../sys/contrib/ipfilter/netinet/$$h \ ${SDESTDIR}${INCLUDEDIR}/netinet;
${SDESTDIR}${INCLUDEDIR}/netinet; \
done
.endif .endif
.if ${MK_PF} != "no" .if ${MK_PF} != "no"
cd ${SRCTOP}/sys/netpfil/pf; \ cd ${SRCTOP}; ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
for h in *.h; do \ $$(printf '../../../../%s ' sys/netpfil/pf/*.h) \
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../../sys/netpfil/pf/$$h \ ${SDESTDIR}${INCLUDEDIR}/netpfil/pf;
${SDESTDIR}${INCLUDEDIR}/netpfil/pf; \
done
.endif .endif
cd ${SRCTOP}/sys/crypto; \ ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../sys/crypto/rijndael/rijndael.h \
for h in rijndael/rijndael.h; do \ ${SDESTDIR}${INCLUDEDIR}/crypto; \
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../sys/crypto/$$h \ cd ${SRCTOP}; ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
${SDESTDIR}${INCLUDEDIR}/crypto; \ $$(printf '../../../%s ' sys/opencrypto/*.h) \
done ${SDESTDIR}${INCLUDEDIR}/crypto; \
cd ${SRCTOP}/sys/opencrypto; \ cd ${SRCTOP}; ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
for h in *.h; do \ $$(printf '../../../%s ' sys/${MACHINE}/include/*.h) \
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../sys/opencrypto/$$h \ ${SDESTDIR}${INCLUDEDIR}/machine;
${SDESTDIR}${INCLUDEDIR}/crypto; \
done
cd ${SRCTOP}/sys/${MACHINE}/include; \
for h in *.h; do \
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../sys/${MACHINE}/include/$$h \
${SDESTDIR}${INCLUDEDIR}/machine; \
done
.if exists(${SRCTOP}/sys/${MACHINE}/include/pc) .if exists(${SRCTOP}/sys/${MACHINE}/include/pc)
cd ${SRCTOP}/sys/${MACHINE}/include/pc; \ cd ${SRCTOP}; ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
for h in *.h; do \ $$(printf '../../../../%s ' sys/${MACHINE}/include/pc/*.h) \
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../../sys/${MACHINE}/include/pc/$$h \ ${SDESTDIR}${INCLUDEDIR}/machine/pc;
${SDESTDIR}${INCLUDEDIR}/machine/pc; \
done
.endif .endif
.for _MARCH in ${_MARCHS} .for _MARCH in ${_MARCHS}
.if exists(${SRCTOP}/sys/${_MARCH}/include) .if exists(${SRCTOP}/sys/${_MARCH}/include)
${INSTALL} -d ${TAG_ARGS:D${TAG_ARGS},dev} -o ${BINOWN} -g ${BINGRP} -m 755 \ ${INSTALL} -d ${TAG_ARGS:D${TAG_ARGS},dev} -o ${BINOWN} -g ${BINGRP} -m 755 \
${SDESTDIR}${INCLUDEDIR}/${_MARCH}; \ ${SDESTDIR}${INCLUDEDIR}/${_MARCH}; \
cd ${SRCTOP}/sys/${_MARCH}/include; \ cd ${SRCTOP}; ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
for h in *.h; do \ $$(printf '../../../%s ' sys/${_MARCH}/include/*.h) \
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../sys/${_MARCH}/include/$$h \ ${SDESTDIR}${INCLUDEDIR}/${_MARCH};
${SDESTDIR}${INCLUDEDIR}/${_MARCH}; \
done
.if exists(${SRCTOP}/sys/${_MARCH}/include/pc) .if exists(${SRCTOP}/sys/${_MARCH}/include/pc)
${INSTALL} -d ${TAG_ARGS:D${TAG_ARGS},dev} -o ${BINOWN} -g ${BINGRP} -m 755 \ ${INSTALL} -d ${TAG_ARGS:D${TAG_ARGS},dev} -o ${BINOWN} -g ${BINGRP} -m 755 \
${SDESTDIR}${INCLUDEDIR}/${_MARCH}/pc; \ ${SDESTDIR}${INCLUDEDIR}/${_MARCH}/pc; \
cd ${SRCTOP}/sys/${_MARCH}/include/pc; \ cd ${SRCTOP}; ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
for h in *.h; do \ $$(printf '../../../../%s ' sys/${_MARCH}/include/pc/*.h) \
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../../sys/${_MARCH}/include/pc/$$h \ ${SDESTDIR}${INCLUDEDIR}/${_MARCH}/pc;
${SDESTDIR}${INCLUDEDIR}/${_MARCH}/pc; \
done
.endif .endif
.endif .endif
.endfor .endfor
cd ${SRCTOP}/sys/fs/cd9660; \ cd ${SRCTOP}; ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
for h in *.h; do \ $$(printf '../../../../%s ' sys/fs/cd9660/*.h) \
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../../sys/fs/cd9660/$$h \ ${SDESTDIR}${INCLUDEDIR}/isofs/cd9660; \
${SDESTDIR}${INCLUDEDIR}/isofs/cd9660; \ cd ${SRCTOP}; ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
done $$(printf '../../../sys/rpc/%s ' rpcsec_tls.h types.h) \
cd ${SRCTOP}/sys/rpc; \ ${SDESTDIR}${INCLUDEDIR}/rpc;
for h in rpcsec_tls.h types.h; do \ cd ${SRCTOP}/sys/rpc;
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} ../../../sys/rpc/$$h \
${SDESTDIR}${INCLUDEDIR}/rpc; \
done
.if ${MK_CDDL} != "no" .if ${MK_CDDL} != "no"
${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \ ${INSTALL_SYMLINK} ${TAG_ARGS:D${TAG_ARGS},dev} \
../../../sys/contrib/openenzfs/include/sys/nvpair.h \ ../../../sys/contrib/openenzfs/include/sys/nvpair.h \