0

这对我不起作用。我想进行一些替换并将其分配给 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 中做这种事情?

4

2 回答 2

0

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

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

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

eval.%:
        folder=`echo $* | perl -ne 'm/(.*)\.ans/; print $$1' || exit 1 ; \
        echo $$folder
于 2013-07-09T17:14:40.760 回答
0

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

于 2013-07-13T06:36:21.737 回答