根据Makefile中目标内部的条件更改变量的值

时间:2014-02-28 19:45:25

标签: shell makefile gnu-make

在我的makefile中,我想根据条件为变量赋值 我有:

CMAKE=cmake ../

我尝试过:

if test condition;
then $(eval CMAKE := $(cmake -DCMAKE_BUILD_TYPE=Release ../));\
fi;

但这不起作用。还有其他办法吗?

P.S报告的错误是:

Syntax error: ";" unexpected

当我删除“;” ,它显示了另一个错误:

Syntax error: "fi" unexpected

1 个答案:

答案 0 :(得分:0)

shell和make之间的这种“来回”是不可能的。理解它们之间的关系很重要:make没有实现shell解析器:它只是为它运行shell。所有make从shell返回的是一个退出代码,用于确定命令是否成功。

通过首先展开配方中的所有变量和函数,然后将生成的命令传递给要调用的shell,来运行配方。

因此,应该清楚为什么你的例子不起作用。

在我们为您提供良好建议之前,我们需要更高级别的信息,确切了解您要做的事情以及原因。实现所需目标的一种方法是使用$(shell ...)来计算条件,所有这些都在任何规则之外:

ifeq ($(shell test condition && echo true),true)
  CMAKE := cmake -DCMAKE_BUILD_TYPE=Release ../
endif

然而,这看起来很奇怪。如果你描述了你真正想做的事情,我们可能会给你更好的帮助。

ETA:

根据您的描述,最佳选择是特定于目标的变量:

CMAKE_BUILD_FLAG = -DCMAKE_BUILD_TYPE=$(CMAKE_BUILD_TYPE)

debug:   CMAKE_BUILD_TYPE = Debug
release: CMAKE_BUILD_TYPE = Release

setup:   CMAKE_BUILD_FLAG =

debug release setup: all

all:
        cmake $(CMAKE_BUILD_FLAG) ../