Makefile - 遍历列表并选择特定值

时间:2011-08-16 22:57:25

标签: list if-statement for-loop makefile foreach

我正在尝试做这样的事情(假设$ input是用户提供的东西):

LIST = pre1 pre2 pre3 pre4 pre5 pre6 pre7 pre8 pre9 pre10
START = 0

for prefix in $(LIST); do \
    if $(input) == $(prefix) then
        START = 1
    endif \
    if $(START) == 1 then \
        if [ -f  $(prefix)<file_name> ]; then <do_A>; else <do_B>; fi
    endif \
done

我的问题是上面提到的两个问题。我不知道如何在迭代它时从列表中选择一个特定的字符串值(如果$(输入)== $(前缀)然后),我不知道如何检查值是1还是0(如果$(START)== 1那么。)

我对此代码的意图是对具有相同文件名但具有不同前缀的不同目录使用相同的makefile。有时,目录可能包含具有不同前缀的文件的多个版本,我想要定义这些前缀的层次结构(在我的示例中由LIST定义)。当用户提供版本时,想法是从他提供的版本开始搜索最新版本(例如,如果用户提供pre4,那么我需要首先搜索pre4,如果它不存在 - 我继续搜索pre5,依此类推。但是在这个例子中,即使它存在于当前目录中,我也不会搜索pre1。)

任何人都知道我该怎么做?

提前致谢。

1 个答案:

答案 0 :(得分:3)

如果这应该是Makefile中的命令,则语法必须是这样的:

LIST = pre1 pre2 pre3 pre4 pre5 pre6 pre7 pre8 pre9 pre10
START = 0
input = somename
file_name = whatever

some_target:
    for prefix in $(LIST); do \
        if test "$(input)" = $$prefix; then \
            START=1; \
        fi; \
        if test "$(START)" = 1; then \
            if test -f  $$prefix$(file_name); then \
                <do_A>; \
            else \
                <do_B>; \
            fi; \
        fi; \
    done

但你没告诉我们&lt; input&gt;和&lt; file_name&gt;应该是,所以我认为它们是其他make变量。基本上make规则看起来像一个长shell行,命令用分号分隔,行继续用反斜杠。使用单个$将$$替换为make,这就是为什么对shell变量($$前缀)的引用需要两美元。

您的make手册(man make类型有完整的故事,阅读和理解很有趣。)今天成为make大师!请务必了解make变量和 shell 变量之间的区别。