【问题标题】:Makefile - loop through a list and select a specific valueMakefile - 遍历列表并选择特定值
【发布时间】:2011-10-28 12:04:57
【问题描述】:

我正在尝试做这样的事情(假设 $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

我的问题在于上面提到的两个 if。我不知道如何在迭代列表时从列表中选择特定的字符串值(如果 $(input) == $(prefix) then)并且我不知道如何检查值是 1 还是 0(如果 $(START) == 1 那么)。

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

有人知道我该怎么做吗?

提前致谢。

【问题讨论】:

  • 这个有点不清楚。如果pre4确实存在,该过程是否应该继续pre5,pre6...?
  • 嗯,这个想法是不继续。但这不是我的问题。我想我知道如何处理(在 中再次将 START 设置为 0)

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


【解决方案1】:

如果这应该是 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

但是你没有告诉我们 应该是什么,所以我假设它们是其他 make 变量。基本上make 规则看起来像一个很长的shell 行,命令用分号分隔,行以反斜杠继续。 $$ 被 make 替换为一个 $,这就是为什么引用 shell 变量($$prefix)需要两美元。

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

【讨论】:

    猜你喜欢
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多