代码管理:生成各种规则略有变化的源文件

时间:2017-06-21 07:18:05

标签: makefile maintainability variations code-maintainability

我有一个声明性语言(实际上是(j - 1))的源文件,我需要编写许多变体:规范版本和许多非规范版本,每个版本都有一个或多个规范的变体。例如,假设规范文件有三个规则:

twolc

然后,一个变体可能与Rule A: Do something A-ish Rule B: Do something B-ish Rule C: Do something C-ish A的规范具有完全相同的规则,但C的规则不同,我将称之为B:< / p>

B-1

想象一下,你在许多不同的规则上有许多不同的微妙变化,你有我的情况。我担心的问题是代码可维护性。如果,稍后我决定Rule A: Do something A-ish Rule B-1: Do something B-ish, but with a flourish Rule C: Do something C-ish 需要以某种方式重构,那么我将有50多个文件需要手动编辑完全相同的规则。

我的想法是为每个规则设置单独的文件,并使用Rule A将它们连接到变体中:catcat A.twolc B.twolc C.twolc > norm.twolc等。

是否有任何工具可用于管理此类问题?有没有比我想到的更好的方法?我提议的解决方案是否存在我应该注意的弱点?

1 个答案:

答案 0 :(得分:1)

当你添加了makefile标签时,这里是一个基于GNU-make(和Gnu make only)的解决方案:

# Edit this
RULES       := A B B-1 C
VARIATIONS  := norm not-norm
norm-rules  := A B C
not-norm-rules  := A B-1 C
# Do not edit below this line

VARIATIONSTWOLC := $(patsubst %,%.twolc,$(VARIATIONS))

all: $(VARIATIONSTWOLC)

define GEN_rules
$(1).twolc: $$(patsubst %,%.twolc,$$($(1)-rules))
    cat $$^ > $$@
endef
$(foreach v,$(VARIATIONS),$(eval $(call GEN_rules,$(v))))

clean:
    rm -f $(VARIATIONSTWOLC)

patsubst很简单。 foreach-eval-call有点棘手。长话短说:它遍历所有变化(foreach)。对于每个变体v,它会将call替换为GEN_rules(当前变体),将$(1)替换为{{{},展开$(v)} $$ 1}}。然后将每个扩展结果实例化($)作为正常生成规则。示例:对于evalv=norm扩展产生:

GEN_rules

反过来又扩展为(逐步):

步骤1:

norm.twolc: $(patsubst %,%.twolc,$(norm-rules))
    cat $^ > $@

步骤2:

norm.twolc: $(patsubst %,%.twolc,A B C)
    cat $^ > $@

步骤3:

norm.twolc: A.twolc B.twolc C.twolc
    cat $^ > $@

执行您想要的操作:如果norm.twolc: A.twolc B.twolc C.twolc cat A.twolc B.twolc C.twolc > norm.twolc 不存在或者norm.twolcA.twolcB.twolc中的任何一个比C.twolc更新,则食谱被执行。