When an input yacc file ends in .yy and the yacc -d flag is used, expect a generated...
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Wed, 2 Jul 2003 04:39:48 +0000 (04:39 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Wed, 2 Jul 2003 04:39:48 +0000 (04:39 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@731 fdb21ef1-2011-0410-befe-b5e4ea1792b1

src/CHANGES.txt
src/engine/SCons/Defaults.py
test/YACC.py

index 5ef9a7f200782e9b3d785f1d8ca097acd35888c0..03bd9dea07da0c59d0241fde2223ea4bb4eac60b 100644 (file)
@@ -12,6 +12,11 @@ RELEASE 0.XX - XXX
 
   From Steven Knight:
 
+  - Tighten up the scons -H help output.
+
+  - When the input yacc file ends in .yy and the -d flag is specified,
+    recognize that a .hpp file (not a .h file) will be created.
+
 
 
 RELEASE 0.90 - Wed, 25 Jun 2003 14:24:52 -0500
index 6fa053d2a49a5387c62e653e63f6c0d27a94d958..e2bb3b436ca7d802745048e554f64bd78b0305c0 100644 (file)
@@ -69,14 +69,19 @@ CScan = SCons.Scanner.C.CScan()
 FortranScan = SCons.Scanner.Fortran.FortranScan()
 
 def yaccEmitter(target, source, env, **kw):
-    # Yacc can be configured to emit a .h file as well
-    # as a .c file, if -d is specified on the command line.
-    if len(source) and \
-       os.path.splitext(SCons.Util.to_String(source[0]))[1] in \
-       [ '.y', '.yy'] and \
-       '-d' in string.split(env.subst("$YACCFLAGS")):
-        target.append(os.path.splitext(SCons.Util.to_String(target[0]))[0] + \
-                      '.h')
+    # If -d is specified on the command line, yacc will emit a .h
+    # or .hpp file as well as a .c or .cpp file, depending on whether
+    # the input file is a .y or .yy, respectively.
+    if len(source) and '-d' in string.split(env.subst("$YACCFLAGS")):
+        suff = os.path.splitext(SCons.Util.to_String(source[0]))[1]
+        h = None
+        if suff == '.y':
+            h = '.h'
+        elif suff == '.yy':
+            h = '.hpp'
+        if h:
+            base = os.path.splitext(SCons.Util.to_String(target[0]))[0]
+            target.append(base + h)
     return (target, source)
 
 def CFile():
index 68a0ba52e132887376961699a99f66bdfef42ef1..a93b9688affad69caddd8fb013deca4ec666b681 100644 (file)
@@ -103,6 +103,8 @@ yacc = foo.Dictionary('YACC')
 bar = Environment(YACC = r'%s wrapper.py ' + yacc)
 foo.Program(target = 'foo', source = 'foo.y')
 bar.Program(target = 'bar', source = 'bar.y')
+foo.Program(target = 'hello', source = ['hello.cpp']) 
+foo.CXXFile(target = 'file.cpp', source = ['file.yy'], YACCFLAGS='-d')
 """ % python)
 
     yacc = r"""
@@ -135,6 +137,26 @@ letter:  'a' | 'b';
 newline: '\n';
 """
 
+    test.write("file.yy", """\
+%token   GRAPH_T NODE_T EDGE_T DIGRAPH_T EDGEOP_T SUBGRAPH_T
+
+%pure_parser
+
+%%
+graph:        GRAPH_T
+              ;
+
+%%
+""")
+
+    test.write("hello.cpp", """\
+#include "file.hpp"
+
+int main()
+{
+}
+""")
+
     test.write('foo.y', yacc % 'foo.y')
 
     test.write('bar.y', yacc % 'bar.y')
@@ -161,4 +183,8 @@ newline: '\n';
 
     test.fail_test(os.path.exists(test.workpath('foo.h')))
 
+    test.run(arguments = '.')
+
+    test.up_to_date(arguments = '.')
+
 test.pass_test()