2012-03-22 88 views
0

我试图做类似的东西Makefile中使用,如果

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

定义变量,但如果我在下一行调用变量它不工作。 如果我在外界定义它,如果它工作完美。 有人可以帮助我吗?

+0

@Oli:他在配方中定义了一个shell变量,如果'.ONESHELL:'不存在,每行都是独立的,我99%确定有更好的解决方案,但 – Christoph 2012-03-22 14:26:06

+0

@demonofnight:你想完成什么? – Christoph 2012-03-22 14:26:33

+0

如果我只是试图在变量为空后打印变量 – Lefsler 2012-03-22 14:27:15

回答

2

由于大家是说,你没有给我们足够的信息。但我会猜测。你希望有条件地设置这个变量,然后在makefile中的其他地方以及其他的makefile文件中使用这个变量。

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

试试这个在makefile,任何规则的外(即不在配方针对任何特定的目标):

ifeq (1,1) 
COMPILER_CMD = -fPic 
endif 

$(info $(COMPILER_CMD)) 

如果这样的作品,那么你可以尝试去适应它做任何事你真的想要做什么。

+0

我将这些行添加到我的生成文件我收到缺少的分隔符错误。 – Lefsler 2012-03-22 16:28:22

+0

@demonofnight,*向我们展示makefile *。并告诉我们你正在使用哪个版本('make -v')。 – Beta 2012-03-22 16:29:50

+0

解决了,我忘了空的空间 – Lefsler 2012-03-22 16:34:11

1

Makefile中的每一行在新的shell进程中分别执行,所以这就是为什么您对环境所做的更改不会传播到下一行。

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

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

你想之前回声续行反斜线添加到该行:

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

好的,但是如果我在包含此脚本的另一个脚本中需要它。这个脚本是定义变量的脚本,编译过程是使用这些变量的另一个脚本,如果我需要在同一行中执行该操作,该怎么做? – Lefsler 2012-03-22 14:42:57

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= 
+0

“不以任何方式解释”过于宽泛:当然,在将其发送到shell之前,会在配方中扩展任何宏引用。但是一旦这个字符串被扩展并传递给shell,make就不知道更多。它只是等待shell完成,检查退出代码以查看它是成功还是失败,然后继续。 – MadScientist 2012-03-22 15:01:25