带替换的变量赋值

时间:2013-07-09 17:04:26

标签: makefile

这对我不起作用。我想做一些替换并将其分配给Makefile中的变量。一个例子如下,但我更喜欢使用Perl,因为其他替换可能比这更复杂。

eval.%:
    # make eval.exp-1.ans
    # $* --> exp-1.ans
    folder=`echo $* | sed -e 's/\..*//g'`
    # OR
    folder=`echo $* | perl -ne 'm/(.*)\.ans/; print $$1'
    # I want that folder will be exp-1
    echo $$folder ${folder}

为什么这不起作用?我怎样才能在Makefile中做这类事情?

2 个答案:

答案 0 :(得分:0)

你的问题不明确。您是否尝试在makefile中设置变量,以便其他配方等可以看到它?或者您只是想在配方的一部分中设置一个可以在同一配方的其他部分使用的变量?

在它调用的shell中运行配方。 UNIX的一个基本特性是没有子进程可以修改内存/环境/工作目录/等。其父进程。因此,您在makefile的配方(子shell)中分配的变量都不能设置make环境变量。有办法做到这一点,但不是从食谱中。但是,(从您的示例中)不会出现您想要做的事情。

接下来要注意的是make在不同的shell中运行配方的每个逻辑行。因此,当shell退出时,在一个逻辑行中设置的shell变量将丢失,并且下一个逻辑行无法看到该值。解决方案是确保需要访问变量的配方的所有行都在同一逻辑行上,因此它们将被发送到相同的shell脚本,如下所示:

eval.%:
        folder=`echo $* | perl -ne 'm/(.*)\.ans/; print $$1' || exit 1 ; \
        echo $$folder

答案 1 :(得分:0)

您是否尝试过$(VARIABLE:suffix=replacement)语法?在您的情况下,$(*:.ans=)。这适用于任何后缀,即使它不是以点开头。