On 09/03/2010 09:56 AM, Tom Browder wrote:
I am trying to use m4 (version 1.4.13) to generate a C header file and
am approaching it cautiously because my experience with m4 has not
been comforting.

You may want to consider upgrading to 1.4.15, although I don't think that will impact your usage issue.


My initial m4 input file has these lines:

=====>
divert(-1)
define(`hashdef', `#define')dnl
define(`Min', include(`conf/MINOR'))
divert(0)dnl
hashdef __PROGVER_MINOR__ Min
<====

When I execute "m4<m4 input file>" I get:

====>
#define __PROGVER_MINOR__ Min
<====

Notice 'Min is not expanded.

Is the '#' stopping it?

Correct. And that's because, by default, # is the m4 comment character, and once hashdef is expanded, you have turned the rest of the line into an m4 comment.

 If so, how can I get the line I want.

By either disabling m4 comments:

changecom()

or by using proper quoting (so that hashdef no longer expands to a comment character, but a quoted string that happens to contain #):

define(`hashdef', ``#'define')dnl

Also, to be robust to non-GNU m4, you should probably also double-quote define, or use other tricks to ensure that you don't inadvertently end up expanding the define built-in with zero arguments (GNU m4 explicitly documents that the define built-in when invoked with zero arguments expands to it's own name, as if it hadn't been a macro, but POSIX leaves that bit unspecified):

define(`hashdef', ``#define'')dnl

--
Eric Blake   [email protected]    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

Reply via email to