从README.makefiles:
如果您的程序有“构建源”,即从其他文件生成的源文件(例如,由 jay 生成),请定义一个名为 BUILT_SOURCES 的变量,并且不要在$(PROGRAM).sources 中列出源:
========================================
PROGRAM = myprogram.exe
LOCAL_MCS_FLAGS = /r:System.Xml.dll
BUILT_SOURCES = parser.cs
CLEAN_FILES = y.output
include ../build/executable.make
parser.cs: parser.jay
$(topdir)/jay/jay $< > $@
========================================
executable.make 将自动删除“make clean”上的 $(BUILT_SOURCES) 文件。由于这种情况很常见并且 jay 碰巧留下了 y.output 文件,因此您还可以定义一个名为 $(CLEAN_FILES) 的变量,该变量列出了在调用 'make clean' 时要删除的额外文件。(除了您的可执行文件和构建的源代码之外)。
因此,cs-parser.cs 正是以这种方式制作的:
[mono] ~/custom/MONO/mono/mcs/jay @ make
/usr/bin/make all-local
make[1]: Entering directory `/home/sehe/custom/MONO/mono/mcs/jay'
make[1]: Nothing to be done for `all-local'.
make[1]: Leaving directory `/home/sehe/custom/MONO/mono/mcs/jay'
[mono] ~/custom/MONO/mono/mcs/jay @ cd ../mcs
[mono] ~/custom/MONO/mono/mcs/mcs @ make
/usr/bin/make all-local
make[1]: Entering directory `/home/sehe/custom/MONO/mono/mcs/mcs'
./../jay/jay -cv < ./../jay/skeleton.cs cs-parser.jay > jay-tmp.out && mv jay-tmp.out cs-parser.cs
./../jay/jay: 9 shift/reduce conflicts.
(减少输出)
它导致 cs-parser.cs 中有 10470 行非用户可维护的代码
替代方案,开箱即用:
只是一个想法,你能不使用预处理 c# -> c# 转换器吗?这具有额外的好处,您可以使其与任何 C# 工具/编译器一起使用。考虑使用#line
pragma 映射回调试信息的原始源
此外,还有许多用于 C#/.NET 的面向方面的代码编织器。您可能会利用1.和2.的组合来获得您想要的功能?