如何避免使用自动工具重新编译不同路径中的不同目标?

Posted

技术标签:

【中文标题】如何避免使用自动工具重新编译不同路径中的不同目标?【英文标题】:How avoid recompile different targets in different paths using autotools? 【发布时间】:2012-03-20 21:22:26 【问题描述】:

我已经可以编译不同的目标或风格(调试版本),但问题是当我制作:make debugmake release 这会在相应的文件夹文件夹中生成对象和库。

这是 Makefile.am:

AM_CXXFLAGS = @AM_CXXFLAGS@

ACLOCAL_AMFLAGS = $ACLOCAL_FLAGS

lib_LIBRARIES = libInitDB.a

libInitDB_a_SOURCES = \
InitDB.cpp

.PHONY: debug release

debug:
    make CXXFLAGS='$(CXX_DEBUG_FLAGS) $(CXXFLAGS)'
    mkdir -p $(DEBUG_DIR)
    mv $(lib_LIBRARIES) $(DEBUG_DIR)/$(lib_LIBRARIES)
    mv *.o $(DEBUG_DIR)

release:
    make CXXFLAGS='$(CXX_RELEASE_FLAGS) $(CXXFLAGS)'
    mkdir -p $(RELEASE_DIR)
    mv $(lib_LIBRARIES) $(RELEASE_DIR)/$(lib_LIBRARIES)
    mv *.o $(RELEASE_DIR)    

但问题是当我再次生成:make debugmake release 时,当我移动对象和库时,会再次生成已存储在调试或发布文件夹中的对象和库。

有人可以帮助我找到如何避免这种情况以及何时在正确的文件夹中编译该搜索?

【问题讨论】:

【参考方案1】:

您可以使用两个单独的构建目录配置不同的选项,而不是让一个 Makefile 生成两种类型的目标。

例如:

mkdir debug
(cd debug && ../configure --enable-debug)

mkdir release
(cd release && ../configure --enable-release)

这样,您可以转到任一目录并仅重新编译所需的内容,只需键入make

【讨论】:

您好,感谢您的回答,但是有可能在 Makefile.am 中制作一些东西而不是调用 2 次来 configure.ac?,这对我真的很有帮助。 @arimaujinn 不,我不知道有什么方法可以做到这一点,实际上我也不想知道。想想你想要什么:相同源的两个不同构建,使用不同的配置选项,每个都有自己的中间文件(*.o)和最终目标(库和可执行文件)。这正是构建目录的用途。现在没有什么能阻止您使用上面目录中的Makefile 自动创建/配置构建目录。

以上是关于如何避免使用自动工具重新编译不同路径中的不同目标?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自动工具设置包含路径

如何将域中的多个路径重定向到不同的 AWS 负载均衡器?

C 结构中的自动字段重新排序以避免填充

如何在目标板上实现blktrace

如何避免在 Windows 和 Linux 中使用不同名称的目标进行重建?

Makefile工具使用