在 autotools 中生成 headers 的构建过程
build process that generates headers in autotools
我正在将 home-baked makefile
设置移植到 autotools 套件中。我 运行 遇到了一个问题,但我还没有找到合适的答案。可能是我在搜索中没有使用正确的术语。作为 autotools 的完全新手,我可能只是对行话了解不够。
问题:我们的构建过程依赖于从 csv 文件生成的 header 文件。 (我不知道为什么,就是这样。)在我们的旧系统中,我们做了这样的事情:
.PHONY: all
all : header.csv.h $(objects)
header.csv.h:
python prebuild.py
# remainder for building objects and the file lib.a
找到 link 到 extend default rules,我已将其添加到我的 Makefile.am
noninst_LIBRARIES = libstuff.a
# .. Additional CXXFLAGS and CPPFLAGS, and listing the sources
all-local: header.csv.h
header.csv.h:
python prebuild.py
重制的 Makefile
仍然无效。检查为库的这一部分生成的 Makefile
显示:
# lots of stuff preceeding
all: all-am
all-am: Makefile $(LIBRARIES) all-local
all-local: header.csv.h
# the rest as above
all-am:
就是问题所在。 $(LIBRARIES)
依赖项首先列出,因此首先构建。对上面扩展 link 的一些进一步阅读表明这是可以预料的:无法保证顺序。 "fix" 很简单:将 all-local
移动到 $(LIBRARIES)
之前。但是,这只会修复一次。我必须保证它总是首先构建。
我可以在 configure
脚本中添加东西以在配置过程中执行吗?处理此类事情的正确方法是什么?
您不应该根据 Makefile 中列出的顺序编写规则。根本没有理由采用此规则(我知道这是对您的旧 Makefile 的直接翻译——这也是错误的):
all-local: header.csv.h
因为header.csv.h
不是需要在制作过程结束时出现的构建产品。相反,你需要
somesourcefile.o : header.csv.h
反映了真实的事实,构建 somesourcefile.o 需要头文件存在,因为 somesourcefile.cpp 包含它。如果它包含在多个地方,您可能需要多个这样的规则。
当您正确指定依赖关系时,make
将计算依赖关系图,并以正确的顺序构建事物。
还有这条规则
header.csv.h:
python prebuild.py
几乎可以肯定
header.csv.h : header.csv prebuild.py
python prebuild.py
确保它在源数据或翻译规则发生变化时重建,而不是在它们不发生变化时重建。
我正在将 home-baked makefile
设置移植到 autotools 套件中。我 运行 遇到了一个问题,但我还没有找到合适的答案。可能是我在搜索中没有使用正确的术语。作为 autotools 的完全新手,我可能只是对行话了解不够。
问题:我们的构建过程依赖于从 csv 文件生成的 header 文件。 (我不知道为什么,就是这样。)在我们的旧系统中,我们做了这样的事情:
.PHONY: all
all : header.csv.h $(objects)
header.csv.h:
python prebuild.py
# remainder for building objects and the file lib.a
找到 link 到 extend default rules,我已将其添加到我的 Makefile.am
noninst_LIBRARIES = libstuff.a
# .. Additional CXXFLAGS and CPPFLAGS, and listing the sources
all-local: header.csv.h
header.csv.h:
python prebuild.py
重制的 Makefile
仍然无效。检查为库的这一部分生成的 Makefile
显示:
# lots of stuff preceeding
all: all-am
all-am: Makefile $(LIBRARIES) all-local
all-local: header.csv.h
# the rest as above
all-am:
就是问题所在。 $(LIBRARIES)
依赖项首先列出,因此首先构建。对上面扩展 link 的一些进一步阅读表明这是可以预料的:无法保证顺序。 "fix" 很简单:将 all-local
移动到 $(LIBRARIES)
之前。但是,这只会修复一次。我必须保证它总是首先构建。
我可以在 configure
脚本中添加东西以在配置过程中执行吗?处理此类事情的正确方法是什么?
您不应该根据 Makefile 中列出的顺序编写规则。根本没有理由采用此规则(我知道这是对您的旧 Makefile 的直接翻译——这也是错误的):
all-local: header.csv.h
因为header.csv.h
不是需要在制作过程结束时出现的构建产品。相反,你需要
somesourcefile.o : header.csv.h
反映了真实的事实,构建 somesourcefile.o 需要头文件存在,因为 somesourcefile.cpp 包含它。如果它包含在多个地方,您可能需要多个这样的规则。
当您正确指定依赖关系时,make
将计算依赖关系图,并以正确的顺序构建事物。
还有这条规则
header.csv.h:
python prebuild.py
几乎可以肯定
header.csv.h : header.csv prebuild.py
python prebuild.py
确保它在源数据或翻译规则发生变化时重建,而不是在它们不发生变化时重建。