<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
<HTML>
<HEAD>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
  <META NAME="GENERATOR" CONTENT="GtkHTML/3.26.0">
</HEAD>
<BODY>
On Fri, 2010-12-03 at 15:52 -0500, Matt Turner wrote:
<BLOCKQUOTE TYPE=CITE>
<PRE>
From: Matthieu Herrb &lt;<A HREF="mailto:matthieu.herrb@laas.fr">matthieu.herrb@laas.fr</A>&gt;

GNU cpp is predefining a number of symbols, depending on the host and target
architecture. This can produce some unexpected results: for example, the
expansion of CLIENTHOST if the host name is i386.my.domain.

The attached patch creates a new -undef option to xrdb that is passed to
cpp.
---
Should it be on by default?

Matthieu, please give your Signed-off-by.

 xrdb.c   |   12 +++++++++++-
 xrdb.man |    4 ++++
 2 files changed, 15 insertions(+), 1 deletions(-)

diff --git a/xrdb.c b/xrdb.c
index 21005c0..68accf8 100644
--- a/xrdb.c
+++ b/xrdb.c
@@ -479,8 +479,11 @@ DoCmdDefines(String *buff)
                 *val = '=';
             } else
                 AddSimpleDef(buff, arg + 2);
-        } else
+        } else if (arg[1] == 'U') {
             AddUndef(buff, arg + 2);
+        } else if (!strcmp(arg, &quot;-undef&quot;) &amp;&amp; oper != OPSYMBOLS) {
+            addstring(buff, &quot; -undef&quot;);
+        }
     }
 }
 
@@ -867,6 +870,13 @@ main(int argc, char *argv[])
                     fatal(&quot;%s: Too many -U/-D arguments\n&quot;, ProgramName);
                 }
                 continue;
+            } else if (!strcmp (&quot;-undef&quot;, arg)) {
+                if (num_cmd_defines &lt; MAX_CMD_DEFINES) {
+                    cmd_defines[num_cmd_defines++] = &quot;-undef&quot;;
+                } else {
+                    fatal(&quot;%s: Too many cpp arguments\n&quot;, ProgramName);
+                }
+                continue;
             }
             Syntax ();
         } else if (arg[0] == '=') 
diff --git a/xrdb.man b/xrdb.man
index d0d45ad..ddf1a73 100644
--- a/xrdb.man
+++ b/xrdb.man
@@ -223,6 +223,10 @@ This option indicates that
 should not run the input file through a preprocessor before loading it
 into properties.
 .TP 8
+.B -undef
+This option is passed to the C preprocessor if used. It prevents it from
+predefining any system specific macros.
+.TP 8
 .B \-symbols
 This option indicates that the symbols that are defined for the preprocessor
 should be printed onto the standard output.
</PRE>
</BLOCKQUOTE>
<BR>
If I understand, strings like CLIENTHOST were not meant to be substituted.<BR>
<BR>
What if the pre-processor is not a GNU cpp? Solaris&nbsp; or something else.<BR>
<BR>
You might want to look at this link, it looks like -undef does not work properly on CYGWIN gcc 2.95.<BR>
<A HREF="http://www.cygwin.com/ml/cygwin/2002-05/msg01613.html">http://www.cygwin.com/ml/cygwin/2002-05/msg01613.html</A><BR>
<BR>
The gcc doc is pretty vague as to what will not be substituted. It would be nice to have a list of such symbols in the commit to help investigation if something is not expected.<BR>
<BR>
Acked-by: <TT><FONT COLOR="#1a1a1a">Gaetan Nadon &lt;<A HREF="mailto:memsize@videotron.ca">memsize@videotron.ca</A>&gt;</FONT></TT><BR>
<BR>
<BR>
<BR>
<BR>
<BR>
<BR>
<BR>
</BODY>
</HTML>