Makefile: Force creation of directories using an order-only pattern rule.
authorMark Wooding <mdw@distorted.org.uk>
Mon, 10 Jun 2024 02:04:49 +0000 (03:04 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Mon, 10 Jun 2024 02:25:49 +0000 (03:25 +0100)
This means that there's at most one `mkdir' attempt for each directory,
and usually none if it already exists.

Makefile

index 9b52893..1c0c594 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -406,6 +406,11 @@ check-mountpoint    = $(call check,$1,"\`$2' is not a mount point", \
 check-symlink           = $(call check,$1,"\`$2' is not a link to \`$3'", \
        [ -L "$2" ] && [ "$$(readlink "$2")" = "$3" ])
 
+##     DIR/
+##
+## Make a directory.  Use as an order-only dependency.
+%/:; $(V_AT)mkdir -p $@
+
 ###--------------------------------------------------------------------------
 ### Python extensions.
 
@@ -429,14 +434,13 @@ PYEXT_ALLSRC               = $(foreach x,$(PYEXTS),\
                                $(call c-source,$($x_SOURCES)))
 PYEXT_ALLOBJ            = $(foreach x,$(PYEXTS),\
                                $(call c-object,$($x_SOURCES)))
-$(PYEXT_ALLOBJ): $(STATE)/obj/%.o: src/%.c
-       $(V_AT)mkdir -p $(dir $@)
+$(PYEXT_ALLOBJ): $(STATE)/obj/%.o: src/%.c | $$(dir $$@)
        $(call v_tag,CC)$(CC) -c $(CFLAGS) $(PYEXT_CFLAGS) -o$@ $<
 
 PYMODULES               = $(foreach x,$(PYEXTS),$(STATE)/lib/python/$x.so)
 all: $(PYMODULES)
-$(PYMODULES): $(STATE)/lib/python/%.so: $$(call c-object,$$($$*_SOURCES))
-       $(V_AT)mkdir -p $(dir $@)
+$(PYMODULES): $(STATE)/lib/python/%.so: \
+               $$(call c-object,$$($$*_SOURCES)) | $$(dir $$@)
        $(call v_tag,LD)$(LD) $(LDFLAGS) $(PYEXT_LDFLAGS) -o$@ $^
 
 ###--------------------------------------------------------------------------
@@ -447,8 +451,7 @@ SCRIPTS                     += mkchrootconf
 
 SUBST_SCRIPTS           = $(addprefix $(STATE)/bin/,$(SCRIPTS))
 all: $(SUBST_SCRIPTS)
-$(SUBST_SCRIPTS): $(STATE)/bin/%: bin/% $(STATE)/config.sh
-       $(V_AT)mkdir -p $(dir $@)
+$(SUBST_SCRIPTS): $(STATE)/bin/%: bin/% $(STATE)/config.sh | $$(dir $$@)
        $(call v_tag,SUBST){ \
                sed \
                -e '2i### GENERATED by distorted-chroot: do not edit' \
@@ -466,8 +469,8 @@ $(SUBST_SCRIPTS): $(STATE)/bin/%: bin/% $(STATE)/config.sh
 APT_SOURCES             = $(foreach d,$(DISTS),$(LOCAL)/etc/apt/sources.$d)
 all: $(APT_SOURCES)
 
-$(foreach d,$(DISTS),$(STATE)/etc/apt/aptsrc.$d): $(STATE)/etc/apt/aptsrc.%:
-       $(V_AT)mkdir -p $(dir $@)
+$(foreach d,$(DISTS),$(STATE)/etc/apt/aptsrc.$d): \
+               $(STATE)/etc/apt/aptsrc.%: | $$(dir $$@)
        $(call v_tag,GEN){ \
          echo "### -*-conf-*- GENERATED by distorted-chroot: do not edit"; \
          echo "subscribe"; \
@@ -475,8 +478,8 @@ $(foreach d,$(DISTS),$(STATE)/etc/apt/aptsrc.$d): $(STATE)/etc/apt/aptsrc.%:
        } >$@.new && mv $@.new $@
 
 $(APT_SOURCES): $(LOCAL)/etc/apt/sources.%: \
-               $$(APTSRC) $$($$*_APTSRC) $$(STATE)/etc/apt/aptsrc.$$*
-       $(V_AT)mkdir -p $(dir $@)
+               $$(APTSRC) $$($$*_APTSRC) $$(STATE)/etc/apt/aptsrc.$$* \
+               | $$(dir $$@)
        $(call v_tag,GEN)bin/mkaptsrc \
                $(APTSRC) $($*_APTSRC) $(STATE)/etc/apt/aptsrc.$* \
                >$@.new && mv $@.new $@
@@ -487,8 +490,7 @@ CLEANFILES          += $(APT_SOURCES)
 APT_CONFIGS           = $(addprefix $(LOCAL)/etc/apt/apt.conf.d/,$(APTCONF))
 all: $(APT_CONFIGS)
 $(APT_CONFIGS): $(LOCAL)/etc/apt/apt.conf.d/%: \
-               $$(or $$(_$$*_APTCONFSRC) etc/apt-conf.d/$$*)
-       $(V_AT)mkdir -p $(dir $@)
+               $$(or $$(_$$*_APTCONFSRC) etc/apt-conf.d/$$*) | $$(dir $$@)
        $(call v_tag,COPY)cp $< $@.new && mv $@.new $@
 clean::; rm -f $(APT_CONFIGS)
 
@@ -501,16 +503,15 @@ EATMYDATA_HACKS           += apt-get aptitude dpkg
 SYMLINK_EATMYDATA_HACKS         = $(addprefix $(LOCAL)/hacks/,$(EATMYDATA_HACKS))
 all: $(SYMLINK_EATMYDATA_HACKS)
 $(SYMLINK_EATMYDATA_HACKS): $(LOCAL)/hacks/%: \
-               $$(if $$(call symlink-ok-p,$$@,/usr/bin/eatmydata),,_force)
-       $(V_AT)mkdir -p $(dir $@)
+               $$(if $$(call symlink-ok-p,$$@,/usr/bin/eatmydata),,_force) \
+               | $$(dir $$@)
        $(call v_tag,SYMLINK)ln -sf /usr/bin/eatmydata $@.new && mv $@.new $@
 clean::; rm -f $(SYMLINK_EATMYDATA_HACKS)
 
 SCRIPT_HACKS           += buildwrap
 COPY_SCRIPT_HACKS       = $(addprefix $(LOCAL)/hacks/,$(SCRIPT_HACKS))
 all: $(COPY_SCRIPT_HACKS)
-$(COPY_SCRIPT_HACKS): $(LOCAL)/hacks/%: bin/%
-       $(V_AT)mkdir -p $(dir $@)
+$(COPY_SCRIPT_HACKS): $(LOCAL)/hacks/%: bin/% | $$(dir $$@)
        $(call v_tag,COPY)cp $< $@.new && mv $@.new $@
 clean::; rm -f $(COPY_SCRIPT_HACKS)
 
@@ -534,27 +535,25 @@ schroot-config_HASH       := \
        $(shell $(call %print-varlist,$(CONFIG_VARS)) | \
                sha256sum | cut -c1-32)
 schroot-config_FILE     = $(STATE)/config.sh-$(schroot-config_HASH)
-$(schroot-config_FILE):
-       $(V_AT)mkdir -p $(STATE)
+$(schroot-config_FILE): | $(STATE)/
        $(V_AT)rm -f $(STATE)/config.sh-*
        $(call v_tag,GEN)$(call %print-varlist,$(CONFIG_VARS)) \
                >$@.new && mv $@.new $@
 
 schroot-config: $(STATE)/config.sh
 $(STATE)/config.sh: $(schroot-config_FILE)
-       $(call v_tag,SYMLINK)ln -sf $(notdir $<) $@
+       $(call v_tag,SYMLINK)ln -sf $(call base-name,$<) $@
 
 schroot-config: $(LOCAL)/etc/schroot/sbuild.schroot
-$(LOCAL)/etc/schroot/sbuild.schroot: $(STATE)/bin/mkchrootconf
-       $(V_AT)mkdir -p $(dir $@)
+$(LOCAL)/etc/schroot/sbuild.schroot: $(STATE)/bin/mkchrootconf | $$(dir $$@)
        $(call v_tag,GEN)$(STATE)/bin/mkchrootconf >$@.new && \
                $(ROOTLY) chown root:root $@.new && mv $@.new $@
 CLEANFILES             += $(LOCAL)/etc/schroot/sbuild.schroot
 check::; $(call check-symlink,WARN,/etc/schroot/chroot.d/sbuild,$(ABSLOCAL)/etc/schroot/sbuild.schroot)
 
 schroot-config: $(LOCAL)/etc/schroot/sbuild.profile/copyfiles
-$(LOCAL)/etc/schroot/sbuild.profile/copyfiles: $(schroot-config_STAMP)
-       $(V_AT)mkdir -p $(dir $@)
+$(LOCAL)/etc/schroot/sbuild.profile/copyfiles: \
+               $(schroot-config_STAMP) | $$(dir $$@)
        $(call v_tag,GEN){ \
          echo "### -*-conf-*- GENERATED by distorted-chroot: do not edit"; \
          for i in $(SCHROOT_COPYFILES); do echo "$$i"; done; \
@@ -562,8 +561,8 @@ $(LOCAL)/etc/schroot/sbuild.profile/copyfiles: $(schroot-config_STAMP)
 CLEANFILES             += $(LOCAL)/etc/schroot/sbuild.profile/copyfiles
 
 schroot-config: $(LOCAL)/etc/schroot/sbuild.profile/nssdatabases
-$(LOCAL)/etc/schroot/sbuild.profile/nssdatabases: $(schroot-config_STAMP)
-       $(V_AT)mkdir -p $(dir $@)
+$(LOCAL)/etc/schroot/sbuild.profile/nssdatabases: \
+               $(schroot-config_STAMP) | $$(dir $$@)
        $(call v_tag,GEN){ \
          echo "### -*-conf-*- GENERATED by distorted-chroot: do not edit"; \
          for i in $(SCHROOT_NSSDATABASES); do echo "$$i"; done; \
@@ -572,8 +571,7 @@ CLEANFILES          += $(LOCAL)/etc/schroot/sbuild.profile/nssdatabases
 
 schroot-config: $(LOCAL)/etc/schroot/sbuild.profile/fstab
 $(LOCAL)/etc/schroot/sbuild.profile/fstab: \
-               etc/sbuild.fstab.in $(schroot-config_STAMP)
-       $(V_AT)mkdir -p $(dir $@)
+               etc/sbuild.fstab.in $(schroot-config_STAMP) | $$(dir $$@)
        $(call v_tag,SUBST)$(call subst-file,### -*-conf-*-) \
                <$< >$@.new && mv $@.new $@
 CLEANFILES             += $(LOCAL)/etc/schroot/sbuild.profile/fstab
@@ -581,8 +579,8 @@ CLEANFILES          += $(LOCAL)/etc/schroot/sbuild.profile/fstab
 check::; $(call check-symlink,WARN,/etc/schroot/sbuild,$(ABSLOCAL)/etc/schroot/sbuild.profile)
 
 schroot-config: $(LOCAL)/etc/sbuild.conf
-$(LOCAL)/etc/sbuild.conf: etc/sbuild.conf.in $(schroot-config_STAMP)
-       $(V_AT)mkdir -p $(dir $@)
+$(LOCAL)/etc/sbuild.conf: etc/sbuild.conf.in \
+               $(schroot-config_STAMP) | $$(dir $$@)
        $(call v_tag,SUBST)$(call subst-file,### -*-perl-*-) \
                <$< >$@.new && mv $@.new $@
 CLEANFILES             += $(LOCAL)/etc/sbuild.conf
@@ -595,8 +593,8 @@ SCHROOT_SCRIPTS             += 51chrootenv
 COPY_SCHROOT_SCRIPTS    = $(addprefix $(LOCAL)/etc/schroot/setup.d/,$(SCHROOT_SCRIPTS))
 schroot-config: $(COPY_SCHROOT_SCRIPTS)
 $(COPY_SCHROOT_SCRIPTS): \
-               $(LOCAL)/etc/schroot/setup.d/%: etc/schroot-scripts/%
-       $(V_AT)mkdir -p $(dir $@)
+               $(LOCAL)/etc/schroot/setup.d/%: etc/schroot-scripts/% \
+               | $$(dir $$@)
        $(call v_tag,COPY)cp $< $@.new && mv $@.new $@
 CLEANFILES             += $(COPY_SCHROOT_SCRIPTS)
 
@@ -613,8 +611,7 @@ CCACHE_CONFIGS               = $(foreach r,$(ALL_CHROOTS), \
        /var/lib/sbuild/build/.ccache/$(LVPREFIX)$r/ccache.conf)
 all: $(CCACHE_CONFIGS)
 $(CCACHE_CONFIGS): /var/lib/sbuild/build/.ccache/$(LVPREFIX)%/ccache.conf: \
-               etc/ccache.conf
-       $(V_AT)mkdir -p $(dir $@)
+               etc/ccache.conf | $$(dir $$@)
        $(call v_tag,COPY)cp $< $@.new && mv $@.new $@
 
 ###--------------------------------------------------------------------------
@@ -623,9 +620,6 @@ $(CCACHE_CONFIGS): /var/lib/sbuild/build/.ccache/$(LVPREFIX)%/ccache.conf: \
 LOCAL_COMMON_DIRS       = share/ src/
 LOCAL_EXTRA_DIRS        = share/man/
 all: $(foreach d,$(LOCAL_COMMON_DIRS) $(LOCAL_EXTRA_DIRS),$(LOCAL)/$d)
-$(foreach d,$(LOCAL_COMMON_DIRS) $(LOCAL_EXTRA_DIRS),$(LOCAL)/$d):
-       $(V_AT)mkdir -p $(call parent-dir $@)
-       $(call v_tag,MKDIR)mkdir $@
 
 LOCAL_ARCH_DIRS                 = bin/ etc/ games/ include/ include.aside/
 LOCAL_ARCH_DIRS                += lib/ libexec/ sbin/
@@ -637,21 +631,15 @@ all: $(foreach a,$(ALL_ARCHS),\
        $(foreach d,$(LOCAL_ARCH_LINKS),$(LOCAL)/$a/$d) \
        $(foreach d,$(LOCAL_COMMON_DIRS),$(LOCAL)/$a/$d))
 
-$(foreach a,$(ALL_ARCHS),$(LOCAL)/$a/):
-       $(call v_tag,MKDIR)mkdir $@
-$(foreach a,$(ALL_ARCHS),\
-  $(foreach d,$(LOCAL_ARCH_DIRS),$(LOCAL)/$a/$d)):
-       $(V_AT)mkdir -p $(call parent-dir,$@)
-       $(call v_tag,MKDIR)mkdir $@
 $(foreach a,$(ALL_ARCHS),\
   $(foreach d,$(LOCAL_ARCH_LINKS),$(LOCAL)/$a/$d)): \
                $$(if $$(call symlink-ok-p,$$@,$$($$(call base-name,$$@)_LINKDEST)),,_force) \
-       $(V_AT)mkdir -p $(call parent-dir,$@)
+               | $$(dir $$@)
        $(call v_tag,SYMLINK)ln -sf $($(call base-name,$@)_LINKDEST) $@
 $(foreach a,$(ALL_ARCHS),\
   $(foreach d,$(LOCAL_COMMON_DIRS),$(LOCAL)/$a/$d)): \
                $$(if $$(call symlink-ok-p,$$@,../$$(call base-name,$$@)),,_force) \
-       $(V_AT)mkdir -p $(call parent-dir,$@)
+               | $$(call parent-dir,$$@)
        $(call v_tag,SYMLINK)ln -sf ../$(call base-name,$@) $(call file-name,$@)
 
 ###--------------------------------------------------------------------------