Makefile experts, unite!

Guillaume Boucher via Digitalmars-d digitalmars-d at puremagic.com
Sun Jun 11 13:55:39 PDT 2017


On Sunday, 11 June 2017 at 19:17:36 UTC, Andrei Alexandrescu 
wrote:
> Instead of an error, I get a no-op result that looks like 
> success. How can that situation be converted to an error?

That makefile target is poorly written.

It was probably intended to have a dependency on the directory 
itself, so by adding "%/" to the pattern it correctly produces an 
error (since std.algorithm.d doesn't exist):

%.test : $(LIB) %/
         ...

To allow for your case, just add this line:

std.%.test : std/%.test


While that should work (at least for the first level), it still 
is very poorly written.  It doesn't use the white-listed 
modules/packages despite the rest of the makefile seems to use 
that fairly consistently.

I would replace all the ".test" targets with the following code:

# Target for quickly running a single unittest (using static 
phobos library).
# For example: "make std/algorithm/mutation.test"
# The mktemp business is needed so .o files don't clash in 
concurrent unittesting.
$(addsuffix .test,$(D_MODULES)): %.test : %.d $(LIB)
         T=`mktemp -d /tmp/.dmd-run-test.XXXXXX` &&                
                                               \
           (                                                       
                                               \
             $(DMD) -od$$T $(DFLAGS) -main -unittest $(LIB) 
-defaultlib= -debuglib= $(LINKDL) -cov -run $< ;     \
             RET=$$? ; rm -rf $$T ; exit $$RET                     
                                               \
           )

# Target for quickly unittesting all modules and packages within 
a package,
# transitively. For example: "make std/algorithm.test"
define PACKAGETEST_template
$(1).test: $$(patsubst %,$(1)/%.test,$$(PACKAGE_$(subst 
/,_,$(1))))
endef
$(foreach package,$(STD_PACKAGES),$(eval $(call 
PACKAGETEST_template,$(package))))

# Target for quickly unittesting all modules and packages by 
using dot as a separator.
# For example: "make std.algorithm.sorting.test"
define MODULESYNTAXTEST_template
$(subst /,.,$(1)).test : $(1).test
endef
$(foreach module,$(STD_PACKAGES) $(D_MODULES),$(eval $(call 
MODULESYNTAXTEST_template,$(module))))


(I'm not going to make a pull request though.)



More information about the Digitalmars-d mailing list