Makefile 使用gnumake编译需要gnatprep和gnatchop的ada项目

Makefile 使用gnumake编译需要gnatprep和gnatchop的ada项目,makefile,compilation,gnu-make,ada,gnat,Makefile,Compilation,Gnu Make,Ada,Gnat,我一直在尝试将多个大型ada编译从基于脚本的方法转换为使用gnu make 3.82 makefile,可能需要一些经验丰富的知识 一些背景: Red Hat Enterprise Linux 7.9版上的GNAT 4.8.5 每次编译都从~1000.ada文件的源列表开始 不同版本使用一些相同的文件,每个源列表中约14k个文件中只有约7000个唯一的文件 每个文件都需要预先准备、切碎,然后编译——绑定和链接在别处完成 我的做法: 配方1:对于每个文件,将文件准备到src/foo/prep

我一直在尝试将多个大型ada编译从基于脚本的方法转换为使用gnu make 3.82 makefile,可能需要一些经验丰富的知识

一些背景:

  • Red Hat Enterprise Linux 7.9版上的GNAT 4.8.5
  • 每次编译都从~1000.ada文件的源列表开始
  • 不同版本使用一些相同的文件,每个源列表中约14k个文件中只有约7000个唯一的文件
  • 每个文件都需要预先准备、切碎,然后编译——绑定和链接在别处完成
我的做法:

  • 配方1:对于每个文件,将文件准备到src/foo/prepped,然后切碎到src/foo/chopped
  • 配方2:将配方1中创建的每个切碎文件复制到modules SRC/文件夹中
  • 配方3:编译SRC/文件夹中配方2的每个切碎文件,并将其放入OBJ/文件夹中
问题:

  • 斩波阶段会导致问题,因为文件名已更改,并且在某些情况下会创建更多文件。为了解决这个问题,我尝试对每个src/foo/prepped文件夹的内容进行通配符,并将它们复制到src/文件夹中进行编译。由于此列表在准备/切碎阶段之前是未知的,因此需要再次调用make来提取这些文件名
  • 在编译阶段,我盲目地运行SRC/文件夹中的每个文件,以使用双冒号规则进行编译,因为我不确定编译阶段(.ali或.o)中输出的文件
  • 如果一个文件已经从以前的编译中预编译/切碎,它将不会执行双重预编译/切碎工作,但不会将该文件复制到SRC中/
问题:

  • 我如何解释使用gnatchop输出的文件,而不事先知道这一点
  • 在编译阶段,如何编写可以从.adb或.ads文件创建.o或.ali文件的规则

您可以使用项目文件和GPRBuild告诉GNAT在一个步骤中预处理和编译多单元源代码。但是有这么多的文件,, 以及必须指定多单元源的方式,您可能必须生成项目文件

更多信息请参见以下答案:

  • 多单元源文件:

  • 预处理:

还有


编辑:正如@SimonWright所建议的那样,
gnatname
可能能够生成必要的命名规则

在准备的文件和剪切的文件之间存在一对一的对应关系

如果可以的话,最好让GNAT知道何时需要编译规范,并知道依赖关系,尤其是内联和泛型体等不明显的依赖关系

一个非常简单的makefile(适用于Make3.81)可能是:

SOURCES = foo.ada bar.ada
DEFS = defs.def

CHOPPED_STAMPS = $(addsuffix .chopped, $(SOURCES))

compile: $(CHOPPED_STAMPS)
    cd obj; gnatmake -c ../chopped/*

%.prepped: %
    gnatprep $< prepped/ $(DEFS)
    touch $@

%.chopped: %.prepped
    gnatchop -w prepped/$(basename $<) chopped/
    touch $@
SOURCES=foo.ada bar.ada
DEFS=DEFS.def
切碎的邮票=$(addsuffix.CHOPPED,$(来源))
编译:$(切碎的邮票)
cd obj;gnatmake-c../c.切碎/*
%.已准备好:%
gnatprep$gnatchop-w已准备好/$(basename$哪个操作系统?您使用的GNAT版本是什么?感谢您的询问Simon-我们正在红帽企业Linux 7 7.9版上使用GNAT 4.8.5是否
gnatname
help?@SimonWright是的,由于组织限制,使用另一个软件可能不实用。@snwkidz但您已经在使用GNAT,bgnatprep和gnatchop都在您的Makefile中,那么另一个GNAT工具有什么问题呢?隐式规则似乎是解决这个问题的方法
SOURCES = foo.ada bar.ada
DEFS = defs.def

CHOPPED_STAMPS = $(addsuffix .chopped, $(SOURCES))

compile: $(CHOPPED_STAMPS)
    cd obj; gnatmake -c ../chopped/*

%.prepped: %
    gnatprep $< prepped/ $(DEFS)
    touch $@

%.chopped: %.prepped
    gnatchop -w prepped/$(basename $<) chopped/
    touch $@