help-make
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Need ways to make Makefiles more foolproof


From: Bo Johansson
Subject: Re: Need ways to make Makefiles more foolproof
Date: Sun, 11 Mar 2012 22:18:54 +0100

Hej Michael!

Thanks for the answer!

Michael Ludwig skriver Sat, 10 Mar 2012 21:45:47 +0100

>* GNU Make looks for GNUmakefile first, so you could provide
>  one specifically for GNU Make.

Good hint! It can be used to distinguise between GNU Make and other make 
programs.
If the Makefile is not intended for GNU Make, a GNUmakefile could be provided.
If GNU Make was used by mistake an error message can be generated by the 
GNUmakefile.

>* You often see build.bat/build.sh/build.pl/Makefile.PL to
>  provide portability.

Yes I know:
    perl Makefile.PL
    make
    make test
    ...

But I should have used DMAKE instead of make and spoiled some day trying to 
find the "non existing" errors.
An error message (in the makefile generated by "perl Makefile.PL") telling me 
that I was using the wrong make program had saved me some work.

>
>Maybe people come up with ideas if you provide the concrete
>circumstances of the situation. Why would you want to do that
>instead of going for one of the established solutions?
>

Here is my current try. I run this makefile by GNU Make and dmake.
---------------------------------
# 1] Find which make program is used

ifeq "{xxx}" "xxx"
MAKE_USED = dmake
endif

ifneq "$(.VARIABLES)" ""
MAKE_USED = gnumake
endif

# "allign" GNU make and dmake

ifeq "$(MAKE_USED)" "dmake"
MAKE_VERSION = $(MAKEVERSION)
endif

LEFT_CBRACKETS = {
RIGHT_CBRACKETS = }
ifeq "$(MAKE_USED)" "dmake"
LEFT_CBRACKETS = {{
RIGHT_CBRACKETS = }}
endif

AT_ARGV_IN_CBRACKETS = $(LEFT_CBRACKETS)@ARGV$(RIGHT_CBRACKETS)

NORL address@hidden No Output of Recipe Line

.PHONY: all test warning error
all: test warning error
    $(NORL)echo ----------------- End of $@

test:
    $(NORL)echo MAKE_USED is $(MAKE_USED)
    $(NORL)echo MAKE_VERSION is $(MAKE_VERSION)
    $(NORL)echo { is $(LEFT_CBRACKETS)
    $(NORL)echo } is $(RIGHT_CBRACKETS)
    $(NORL)echo AT_ARGV_IN_CBRACKETS is $(AT_ARGV_IN_CBRACKETS)
    $(NORL)echo ----------------- End of $@

warning: # 2] Give a warning message
ifeq "$(MAKE_USED)" "gnumake"
    $(warning WARNING: This is a warning message)
else
    $(NORL)echo WARNING: This is NOT sent to STDERR
endif
    $(NORL)echo ----------------- End of $@

error: # 3] Give an error message and stop the make program
ifeq "$(MAKE_USED)" "gnumake"
    $(error ERROR: Using $(MAKE_USED) for a Makefile intended for dmake)
else
    $(NORL)echo ERROR: This is NOT sent to STDERR
#Generates an error message
    $(assign ERR OR = ERROR)
    $(NORL)IS_NOT_REACHED
endif
    $(NORL)echo ----------------- End of $@
---------------------------------

For GNU Make I have found solutions.
However I have not found any good way of generating warning and error messages 
in dmake and to stop dmake.

So I am looking for "portable" makefile idioms to:

*Find which make program is used
*Give an error message and stop the make program

I also want the idioms to be portable to more make programs than GNU Make and 
dmake.
I expected that there was "libraries" with "portable" makefile idioms!

See also the original post 
http://lists.gnu.org/archive/html/help-make/2012-02/msg00022.html.

Best regards

Bosse


reply via email to

[Prev in Thread] Current Thread [Next in Thread]