如何从Perl脚本定义Makefile变量?

时间:2010-04-27 02:21:29

标签: xml perl makefile environment-variables

我正在创建一个Makefile,我希望它成为不同体系结构,操作系统,库等的单个文件。为此,我有一个特定于构建的XML文件,它定义了每个体系结构的不同配置选项。配置文件由Perl读取(可以是任何语言),Perl输出返回类似:

var1 := var1_value
var2 := var2_value
var3 := var3_value

我要做的是在我的Makefile中定义这些变量。从makefile我调用我的readconfig脚本,它提供了正确的输出,但我无法将这些变量作为我的Makefile的一部分。我已尝试使用evalvalue,但没有一个有效(虽然这可能是我不知道如何使用它们的问题。总的来说,我想要做的是某些事情像:

read_config:
     $(eval (perl '-require "readConfig.pl"'))
     @echo $(var1)

可以假设我只使用GNU Make行为。我无法改变的事情:

  • 配置文件在XML上
  • 使用Perl作为XML解析器

3 个答案:

答案 0 :(得分:5)

我认为您正在寻找的指令是“包含”:

include config.mk

...rest of makefile...

您的脚本生成config.mk文件; makefile读取它。如果你需要让makefile运行生成器,它会变得更复杂:

MAKEFILE_INCLUDE = dummy.mk
include ${MAKEFILE_INCLUDE}

all: normal dependencies for target

config: config.mk
        perl make-config.pl > config.mk
        ${MAKE} MAKEFILE_INCLUDE=config.mk

您首先运行make config(只有一个空的或几乎为空的dummy.mk文件)。然后它将运行make。如果你不试试这个更简单;除all以外的其他目标变得棘手,等等。有方法,但它们越来越扭曲。

答案 1 :(得分:3)

不需要将config.mk作为显式目标;如果你加入它,Make会做(如有必要):

-include config.mk

all: real_targets

config.mk: xml_file
    perl make-config.pl > $@

答案 2 :(得分:1)

使配置成为默认“全部”目标的一部分的版本。

-include config.mk

all: config.mk and other targets

config.mk:
        perl make-config.pl >config.mk