Makefile 带替换的变量赋值

Makefile 带替换的变量赋值,makefile,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 wa

这对我不起作用。我想进行一些替换,并将其分配给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中执行此类操作?

您的问题不清楚。您是否试图在makefile中设置一个变量,以便其他菜谱等可以看到它?或者,您只是想在配方的某个部分设置一个变量,该变量可用于同一配方的其他部分

在调用的shell中生成运行配方。UNIX的一个基本特性是,任何子进程都不能修改其父进程的内存/环境/工作目录等。因此,在makefile的配方(子shell)中指定的任何变量都不能设置make环境变量。有很多方法可以做到这一点,但不是从食谱中。然而,从你的例子来看,这并不是你想要做的

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

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

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

是,
$*
exp-1.ans
$(basename$*)
exp-1
。那么您能提供一些示例吗?@bobbogo-hi。首先,如何
basename exp-1.ans
给我
exp-1
?basename删除目录路径并提供基本文件名。例如:
basename/etc/parr.txt
为您提供了
parr.txt
。当然,正如@bobbogo所指出的,如果您只是试图删除后缀,那么内置函数将完成此操作。更复杂的替换可以由其他shell函数执行,所以这可能就是您所需要的(请注意,这些是GNU make的特性:它们不可移植到其他版本的make)。但你说“其他替代可能更复杂”,所以这会有所帮助。