1

这是我的制作文件。而且,我正在尝试使用 unifdef 运行部分预处理。但是在执行 unifdef 后它失败了。

#HELLO = world
HELLO_WORLD = $(HELLO) world!
COMMA := ,
VAR_ARG_LIST_A := $(subst $(COMMA), ,$(VAR_ARG_LIST))
VAR_ARG_LIST_1 := $(word 1,$(VAR_ARG_LIST_A))
VAR_ARG_LIST_2 := $(word 2,$(VAR_ARG_LIST_A))
VAR_ARG_LIST_3 := $(word 3,$(VAR_ARG_LIST_A))
VAR_ARG_LIST_4 := $(word 4,$(VAR_ARG_LIST_A))
VAR_ARG_LIST_5 := $(word 5,$(VAR_ARG_LIST_A))
VAR_ARG_LIST_6 := $(word 6,$(VAR_ARG_LIST_A))
all:
#       echo $(HELLO_WORLD)
        echo $(VAR_ARG_LIST_1)
#       echo $(VAR_ARG_LIST)
        echo $(VAR_ARG_LIST_2)
        echo $(VAR_ARG_LIST_3)
        echo $(VAR_ARG_LIST_4)
        echo $(VAR_ARG_LIST_5)
        echo $(VAR_ARG_LIST_6)
        unifdef -USW1 -USW2 -USW3 -USW4 -USW5 -USW6 -t file1.txt > file2.txt

错误是

make VAR_ARG_LIST=AW1,AW2
echo AW1
AW1
echo AW2
AW2
echo 

echo 

echo 

echo 

unifdef -USW1 -USW2 -USW3 -USW4 -USW5 -USW6 -t file1.txt > file2.txt
make: *** [all] Error 1

file1.txt 的内容是:

#ifdef SW1
This is a file1
#endif
This is file file 1
This is file file 2
This is file file3

file2.txt 的内容是:

This is file file 1
This is file file 2
This is file file3

make 在执行 unifdef 命令后立即失败。

4

3 回答 3

1

问题是,如果输出与输入不同(也就是说,如果它做任何事情), unifdef 将以状态 1 退出,但 Make 将非零状态解释为失败并中止。你可以用连字符来解决这个问题:

-unifdef -USW1 -USW2 -USW3 -USW4 -USW5 -USW6 -t file1.txt > file2.txt

现在 Make 将报告

make: [all] Error 1 (ignored)

并继续前进。(如果它让您烦恼,可能有一种方法可以抑制错误消息。)

于 2012-04-11T03:08:32.067 回答
1

如果您不关心 unifdef 的退出代码,那么只需确保配方行以真值退出。例如:

unifdef -USW1 -USW2 -USW3 -USW4 -USW5 -USW6 -t file1.txt > file2.txt || true

将确保该行始终成功。

于 2012-04-11T05:55:31.803 回答
1

unifdef 2.7 版(2013 年 3 月发布)有一个 -x 选项来控制退出状态逻辑,因此它与 make 配合得更好。您可能想要使用 -x1 以便 make 确保 unifdef 确实进行了更改。见http://dotat.at/prog/unifdef/

于 2013-04-11T10:51:53.717 回答