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

3

我正在创建一个Makefile,希望它能成为适用于不同架构、操作系统、库等的单一文件。为此,我有一个专门用于构建的XML文件,该文件定义了每个架构的不同配置选项。这个配置文件由Perl(也可以是任何语言)读取,Perl输出返回类似以下内容:

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

我想在我的Makefile中定义这些变量。我从Makefile中调用了readconfig脚本,并且它提供了正确的输出,但我无法将这些变量作为Makefile的一部分。我尝试使用eval和value,但它们都没有起作用(虽然这可能是我不知道如何使用它们的问题)。总体而言,我想做的事情类似于:
read_config:
     $(eval (perl '-require "readConfig.pl"'))
     @echo $(var1)

可以假设我仅使用GNU Make的行为。以下内容无法更改:

  • 配置文件是XML格式
  • 使用Perl作为XML解析器

希望你正在使用一个模块来读取XML文件 http://search.cpan.org/search?query=XML&mode=all - Brad Gilbert
3个回答

5
我认为你要查找的指令是“include”:

我认为你要查找的指令是“include”:

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外变得棘手。虽然有方法可以实现,但越来越麻烦。


config' 放在 all' 的第一个目标,并将 include 更改为 sinclude。sinclude $(MAKEFILE_INCLUDE)all: config 其他目标 - Yi Zhao
答案是正确的,但是Beta指出使用-include更容易解决问题。感谢您的回答。 - Freddy

3

没有必要将config.mk作为一个明确的目标;如果你包含它,Make会自动构建它(如果需要):

-include config.mk

all: real_targets

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

1
一个版本,使配置成为默认的“all”目标的一部分。
-include config.mk

all: config.mk and other targets

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

答案是正确的,但是正如Beta所提到的那样,-include将强制make“重新制作”config.mk而不将其添加到默认目标中。感谢您的回答。 - Freddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接