6

Is there a way to tell automake not to interpret part of the Makefile.am?

Specifically, I am trying to encode a Makefile conditional in a Makefile.am. As other people have noticed, this doesn't work because automake interprets the endif construct.

Is there any way to escape or quote strings in Makefile.am files so that automake copies them verbatim into the destination Makefile? Specifically I don't want it to interpret the endif in something like:

ifeq "$(SOMEVAR)" ""
SOMEVAR="default_value"
endif
Community
  • 1
  • 1
Ed McMan
  • 521
  • 2
  • 15

5 Answers5

7

The reason automake does conditionals is because some dinosaur makes don't. That said, if you really must do this, you could define your snippet as a variable in configure.ac and AC_SUBST it into your Makefile. That way, automake won't get a chance to see it. Remember to use AM_SUBST_NOTMAKE to avoid creating a line like FOO = @FOO@.)

dnl In configure.ac:
snippet='
ifeq ($(somevar),Y)
foo
endif
'
AC_SUBST([snippet])
AM_SUBST_NOTMAKE([snippet])

and:

## In Makefile.am:
@snippet@

I sincerely hope there's a better way than this.

Jack Kelly
  • 18,264
  • 2
  • 56
  • 81
3

The simplest way to do so is to insert a space before the ifdef, ifeq, ifneq, else and endif. That way, these keywords are not recognized by the automake parser. Be sure to insert a space, it won't work with a tab.

source: https://patchwork.kernel.org/patch/6709921/

Jérôme
  • 2,640
  • 3
  • 26
  • 39
3

I managed to find a different solution. You can put your to-be-escaped bits in a separate file and then do:

$(eval include $(srcdir)/Include.Makefile)

Since automake doesn't understand $(eval it just leaves the entire line intact. Thus you can put whatever you want into the other file and GNU make will happily read it. Note you can't just use include directly since Automake does understand that and will go into the other file.

edA-qa mort-ora-y
  • 30,295
  • 39
  • 137
  • 267
0

In automake (GNU automake) 1.16.5 simple conditionals ifeq ... endif do pass through automake into Makefile when I isolate the keywords with newline and spaces, like so:

if %?INSTALL%
# 1 preceding newline
  ifeq (true,$(call direction,uninstall %DIR% PROGRAMS %BASE%))  # 2 preceding spaces
## -------------- ##
## Uninstalling.  ##
## -------------- ##

.PHONY uninstall-am: uninstall-%DIR%PROGRAMS-$(%NDIR%_STATUS)
uninstall-%DIR%PROGRAMS: uninstall-%DIR%PROGRAMS-$(%NDIR%_STATUS)
uninstall-%DIR%PROGRAMS-supported: uninstall-%DIR%PROGRAMS
uninstall-%DIR%PROGRAMS-unsupported:
    @echo "%NDIR% (PROGRAMS) not installed" >&2

uninstall-%DIR%PROGRAMS: $(install_%DIR%_PROGRAMS)
    @test $< \
    && $(NORMAL_UNINSTALL) \
    && $(autotoolsdir)/uninstall -P PROGRAMS -LT ?LIBTOOL? -I $? >&2 

  endif # 2 preceding spaces
# 1 subsequent newline
endif %?INSTALL%
  

That is especially the case if I mix automake conditionals with make conditionals, like shown above.

domson
  • 205
  • 2
  • 8
0

How about:

SOMEVAR=$(if $(SOMEVAR),$(SOMEVAR),"default_value")
ldav1s
  • 15,885
  • 2
  • 53
  • 56
  • This seems to solve my specific problem, but causes automake to give a warning: `if $(SOMEVAR: non-POSIX variable name`. So, it would still be nice to know how to escape/quote in the automakefile. – Ed McMan Sep 21 '11 at 17:28