Makefile使用if定义变量

时间:2012-03-22 14:21:05

标签: shell makefile

我正在尝试做类似的事情

@if[[ 1==1 ]] then;\
   COMPILER_CMD = -fPic;\
fi;

但是如果我在下一行调用变量它不起作用。 如果我在它之外定义它是否完美。 有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:2)

正如所有人所说,你还没有给我们足够的信息。但我会猜一猜。您希望有条件地设置此变量,然后在makefile中的其他位置以及include这个变量的其他makefile中使用它。

问题是您正在尝试使用shell语法。在命令中,这将起作用(如果语法正确),但该值仅适用于该命令。外部命令,shell语法错误,会导致错误,故障或被忽略,具体取决于您的操作。

在任何规则之外的makefile中尝试此操作(即,不在任何特定目标的配方中):

ifeq (1,1)
COMPILER_CMD = -fPic
endif

$(info $(COMPILER_CMD))

如果有效,那么你可以尝试让它适应你正在做的任何事情。

答案 1 :(得分:1)

Makefile中的每一行都是在一个新的shell进程中单独执行的,这就是为什么你对环境所做的更改不会传播到下一行。

您可以将两条线组合成一条长线,以达到您想要的效果。你可能在Makefile中有这样的东西:

@if[[ 1==1 ]] then;\
   COMPILER_CMD = -fPic;\
fi;
echo $COMPILER_CMD

您希望在echo:

之前的行中添加行继续反斜杠
@if[[ 1==1 ]] then;\
   COMPILER_CMD = -fPic;\
fi; \
echo $COMPILER_CMD

答案 2 :(得分:0)

我假设您展示的示例是某些规则的配方。通过这里的语法,看起来你正试图根据一些shell布尔测试的值在一个配方中设置一个make变量COMPILER_CMD,这当然是不可能的。你必须在脑海中清楚地知道如何使作品:make不以任何方式解释你所写的食谱。 Make只是将这些配方传递给另一个程序(shell),另一个程序正在解释这些命令。因此,您无法在配方中更改make的行为,包括设置make变量:该配方正在完全不同的程序中运行。

正如其他人所说,你没有提供足够的信息来提供你真正想做的事情,在更高的层次上,我们提供一个完整的解决方案。拥有像1==1这样的布尔值并没有提供任何关于你为什么这样做的提示。你的shell语法也包含语法错误,所以我们可以告诉你实际上并没有从一个真实的工作示例中剪切和粘贴它。

正如piokuc所暗示的,您可以使用shell变量COMPILER_CMD(您必须删除=周围的空白以使其成为shell变量赋值)但该值仅在该一个配方行运行时生效。对于下一个配方行,将启动一个新shell,并且前一个shell中设置的任何值都将丢失:

all:
        @ if [[ 1 == 1 ]]; then COMPILER_CMD=-fpic; fi; \
          echo COMPILER_CMD=$$COMPILER_CMD
        @ echo COMPILER_CMD=$$COMPILER_CMD

会给:

COMPILER_CMD=-fpic
COMPILER_CMD=