【问题标题】:Setting env variable from Perl and using in Makefile从 Perl 设置环境变量并在 Makefile 中使用
【发布时间】:2017-05-23 11:32:40
【问题描述】:

我正在尝试从 Perl 脚本设置 env 变量并在 Makefile 中使用它不起作用。转储 ENV 哈希树显示变量已成功设置。

生成文件代码

list_gen: $(TESTBENCH_PATH)/blocks/soc_tb/global/default 
    perl list_gen.pl; \
    $(MAKE) $(RECITAL_PATH)/catalog/catalog.xml 

    @ touch $@


# Generates catalog.xml from .xmls of VIPs
$(RECITAL_PATH)/catalog/catalog.xml: $(VIP_XMLs) 
    @echo "#  generating catalog.xml " ;                                \
    echo "vip list is $(VIP_LIST)" ;                                \
    rpfCatalog --add $(VIP_XMLs);                       \
    for vip in $(VIP_LIST);                                         \
    do                                  \
       rpfCatalog --add $$TESTBENCH_PATH/common_blocks/$$vip/global/default.xml; \
    done

Perl 脚本代码

$ENV{"VIP_LIST"} = $vip_exists;

【问题讨论】:

  • perl脚本是如何调用make的?
  • 您是否尝试使用 perl 脚本设置环境变量并稍后使用? perl 脚本在子 shell 中运行;它不会将其价值带入父外壳。
  • perl 脚本没有调用 make。在执行 perl 脚本后.. make 被递归调用,以便 env.变量更新可见
  • Perl 中 %ENV 的更改不会传播到父进程。不过,您可以 print 将该值捕获到 make 变量中。
  • @choroba : 好的 .. 那么如何变量值可用于 makefile 呢?

标签: bash perl unix makefile


【解决方案1】:

我认为没有任何优雅的方法可以通过运行任何外部命令(如 perl 脚本)来更新 ma​​ke 的环境。因为即使是直接的方式也行不通。

/home/user> cat makefile
NUM=100

first:
        NUM=200
        echo $(NUM)    
second:
        NUM=200; echo $(NUM)    
third:
        NUM=200; \
        echo $(NUM);

/home/user> make first
NUM=200
echo 100
100

/home/user> make second
NUM=200; echo 100
100

/home/user> make third
NUM=200; \
echo 100;
100

如果您只是在寻找一个 perl 脚本来修改它的父级环境,那么类似这样的方法(以非常有限的方式):

/home/user> cat change_env.pl
#!/usr/bin/perl -w
print "NUM=100\n";

/home/user> NUM=1
/home/user> echo $NUM
1
/home/user> eval $(./change_env.pl)
/home/user> echo $NUM
100

回到原来的问题,.. 对 shell 环境进行更改后,您不能调用 make 吗?

【讨论】:

  • 谢谢,但这不是我要找的。我需要环境。要从 perl 脚本(从 makefile 调用)在 makefile 中更新的变量
  • 我认为在 some(x) 文件中进行有意义的修改,然后它将运行 perl 脚本来更新 env。变量然后 make 使用更新的变量,但现在看来我必须在 make 和更新变量中读取(X 文件)。你有什么更好的建议吗?谢谢
【解决方案2】:
VIP_LIST=$(perl my.pl)

会将脚本的输出保存在父 shell 的变量中。

HTH 乔治

【讨论】:

    【解决方案3】:

    当你执行你的 Perl 脚本时,在提示符下像 $(./myperlscript.pl) 那样做。你需要做的是

    $ENV{VIP_LIST} = $vip_exists;
    

    去掉引号

    【讨论】:

    • 您是否尝试在当前 shell 中运行 perl 解释器(通过在 shell 脚本前加上一个点)?
    • 是的,我是。这将在相同的过程中将其导出。
    • @KaranShah,我不是反对者,但我想它可能被反对了,因为你的意图不明确。
    猜你喜欢
    • 2015-02-01
    • 2013-10-28
    • 2016-04-28
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多