0

我想将cpputest作为 git 子模块包含在我的项目的源代码树中,但我对 autotools 并不十分熟悉。

我一直在看这个页面作为指南

我创建了以下 Makefile,cpputest 位于它下面的子目录中:

CPPUTEST_BUILD_DIR := cpputest/cpputest_build

CPPUTEST_LIBS :=                           \
    $(CPPUTEST_BUILD_DIR)/libCppUTest.a    \
    $(CPPUTEST_BUILD_DIR)/libCppUTestExt.a

CPPUTEST_TESTS :=                          \
    $(CPPUTEST_BUILD_DIR)/CppUTestTests    \
    $(CPPUTEST_BUILD_DIR)/CppUTestExtTests

cpputest:                           \
    cpputest/configure              \
    $(CPPUTEST_BUILD_DIR)/Makefile  \
    $(CPPUTEST_LIBS)                \
    $(CPPUTEST_TESTS)

cpputest/configure: cpputest/configure.ac cpputest/autogen.sh
    cd cpputest && ./autogen.sh

cpputest/cpputest_build/Makefile: cpputest/configure
    cd $(CPPUTEST_BUILD_DIR) && ../configure

$(CPPUTEST_LIBS): $(CPPUTEST_BUILD_DIR)/Makefile
    cd $(CPPUTEST_BUILD_DIR) && make

$(CPPUTEST_TESTS): $(CPPUTEST_LIBS)
    cd $(CPPUTEST_BUILD_DIR) && make tdd

运行这个 makefile 可以满足我的要求,但我不确定依赖项有多强大。除了干净的规则之外,还有什么我应该考虑添加的吗?


这是John Bollinger 回答后我的最终 Makefile 。

它位于 CppUTest 目录的根目录中。

# This makefile will generate a platform specific makefile, build CppUTest
# library outputs, and build and run tests on CppUTest.
BUILD_DIR := cpputest_build

LIBS := $(BUILD_DIR)/lib/libCppUTest.a $(BUILD_DIR)/lib/libCppUTestExt.a

TESTS := $(BUILD_DIR)/CppUTestTests $(BUILD_DIR)/CppUTestExtTests

# All builds both libraries, to build and run all of the tests for CppUTest use
# the phony target run_tests.
all: $(LIBS)

.PHONY: all run_tests clean FORCE

# The Makefile rule depends on the "configure" shell script existing. If
# CppUTest is updated from upstream or configure doesn't exist then run
# autogen.sh or uncomment the rule below. All of the outputs autogen.sh should
# be tracked in the develop branch.
#
#configure: configure.ac autogen.sh
#   ./autogen.sh

$(BUILD_DIR)/Makefile: configure
    mkdir -p $(BUILD_DIR) && cd $(BUILD_DIR) && ../configure

$(LIBS) : $(BUILD_DIR)/Makefile FORCE
    cd $(BUILD_DIR) && make $(subst $(BUILD_DIR)/,,$@)

$(TESTS) : $(BUILD_DIR)/Makefile FORCE
    cd $(BUILD_DIR) && make $(@F)

run_tests: $(TESTS)
    for test in $(TESTS); do $$test -c || exit 1; done


clean:
    rm -rf $(BUILD_DIR)
4

1 回答 1

1

除了干净的规则之外,还有什么我应该考虑添加的吗?

TL;DR:您应该预先运行 ccptest 的autogen.sh脚本,并在您的发行版中包含所有生成的文件以及所有其他文件。然后,您也可以考虑省略构建规则cpputest/configure(我自己确实会省略它)。


Cpputest 显然遵循最近的趋势,即从源代码管理中省略 Autotools 生成的文件。这从表面上看是有道理的,因为这些文件确实可以从源代码控制中可用的其他文件生成。从源代码控制系统作为项目维护和开发工具的角度来看,这很好。但是,对于用作分发工具的源代码控制来说,这并不好。

Autotools 的设计目标之一是只有项目维护人员需要它们本身。运行它们并不打算成为常规构建过程的一部分,例如只想构建和运行软件的人会雇用。因此,由 Autotools 构建系统本身准备的分发包包括使之成为可能的所有必要位:configure脚本、支持实用程序脚本、Makefile.in文件,有时还有一些其他杂项文件。这是预期的分发形式。

在这种情况下,Autotools 的兼容性压力比许多项目要小,这实际上体现在不同 AT 版本之间的兼容性较弱。如果您使用与项目维护者自己不同的 AT 版本构建构建系统,那么您可能会遇到错误。你肯定会得到一个与维护者使用的系统有一些不同的构建系统。通常结果仍然会毫无问题地构建项目,但有时不会。所以帮自己一个忙,回避这个问题。

运行这个 makefile 可以满足我的要求,但我不确定依赖项有多强大。

makefile 本身对我来说看起来很不错。我认为批评的主要内容是

  • 规则cpputest/cpputest_build/Makefile拼写出目录部分,而不是使用$(CPPUTEST_BUILD_DIR)变量。

  • 目标的cpputest先决条件列表不应包含 cpputest/configure$(CPPUTEST_BUILD_DIR)/Makefile。构建过程需要这些是偶然的,并且已经通过那些被列为直接依赖于它们的目标的先决条件的工件来解决。作为风格、可维护性和一般良好实践的问题,make规则应该只列出目标的直接先决条件。

由于我建议您分发构建系统组件而不是让每个人都重新构建它们,但是,我也会删除构建规则cpputest/configure。如果您遵循我的建议,那么您将分发一个预构建的,这样用户就不需要构建它。省略该规则并cpputest/configure从出现的那些先决条件列表中提取将消除在时间戳被打乱的情况下所有内容都崩溃的小风险,这有时会在复制源树时发生。

作为一项clean规则,由于您是在顶层控制下进行 cpputest 配置make,因此相应的清理方法是 to cd $(CPPUTEST_BUILD_DIR); make distclean。但是,由于您正在执行源外构建,因此您还可以选择递归地删除构建目录。但是请注意,如果您坚持autogen.sh作为构建过程的一部分运行,则生成的文件将不限于构建目录。在那种情况下,相应的清理可能会涉及make maintainer-clean.

于 2020-03-09T19:44:12.327 回答