makefile中的部分预处理出错

时间:2012-04-11 02:32:33

标签: bash makefile

这是我的make文件。而且,我正在尝试使用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

执行unifdef命令后立即失败。

3 个答案:

答案 0 :(得分:1)

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

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

现在Make将报告

make: [all] Error 1 (ignored)

继续前进。 (如果它让你烦恼,可能有办法压制错误信息。)

答案 1 :(得分:1)

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

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

将确保该行始终成功。

答案 2 :(得分:1)

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