微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

配置编译选项和编译器自动配置

如何解决配置编译选项和编译器自动配置

我正在使用Rust和tcl进行个人项目,但是我仍然想使用经典的makefile结构。

我知道要编译多文件,我只需要在main.rs上声明mod second,然后rustc自动连接模块。所以我用

$ rustc main.rs -o output -C debuginfo=2

现在我试图集成 autoconf automake ,因为我想创建一个配置脚本来检查tcl,rustup等...但是我不知道如何进行编辑以使用rustc及其cc和c选项的选项进行编译(例如尝试使用由于没有主要功能而无法编译的.o)。

对于我使用的 configure.ac

AC_CONfig_SRCDIR([source/main.rs])
AC_CONfig_AUX_DIR(config)

# I manually checked for rustup and tclsh

AM_INIT_AUTomake
AC_CONfig_FILES([Makefile])
AC_OUTPUT

Makefile.am

AUTomake_OPTIONS = foreign
bin_PROGRAMS = output

SUBDirs = sources
output_SOURCES = sources/main.rs

我的主目录包含configure.ac和Makefile.am,sources目录包含所有内容(以及autoconf的配置目录)

解决方法

现在我试图集成 autoconf automake ,因为我想创建一个配置脚本来检查tcl,rustup等...

配置脚本由Autoconf负责。没有必要将Automake与Autoconf一起使用,并且应考虑单独使用Autoconf是否明智。这样可以完全控制生成的Makefile,因为您可以直接编写Makefile.in而不是依靠Automake来完成。大概,您写的Makefile.in比Automake生成的要简单得多,没关系。


Automake不一定没有问题,但是its manual has this to say关于语言支持:

Automake当前仅包含对C,C ++的完全支持(请参阅C ++ 支持),目标C(请参见目标C支持),目标C ++(请参见 目标C ++支持),Fortran 77(请参见Fortran 77支持),Fortran 9x(请参阅Fortran 9x支持)和Java(请参阅带有gcj的Java支持)。 对其他语言的基本支持 将根据用户需求进行改进。

可以通过以下方式获得对添加自己的语言的某些有限支持: 后缀规则处理(请参见后缀)。

referenced section about suffix rules显示了如何使用这样的规则教Automake如何构建Rust程序。它可能看起来像这样:

.rs:
    $(RUSTC) $< -o $@ $(AM_RUSTFLAGS) $(RUSTFLAGS)

SUFFIXES = .rs

假设configure将标识Rust编译器并将其名称导出为RUSTCAM_RUSTFLAGS用于在项目内部(通常在Makefile.am中定义编译标志,RUSTFLAGS用于使构建器在构建时添加或覆盖编译标志。

但是,由于编译器不会产生中间目标文件(或因此我收集),所以我希望在output_SOURCES中定义源不会产生有效的Makefile,并且您可能需要顶部的名称级别的Rust源,以匹配所需二进制文件的名称(即output.rs而不是main.rs)。然后,单后缀规则应在不明确指定任何源的情况下构建二进制文件。您还希望在EXTRA_SOURCES变量中命名 all 个贡献Rust的源,否则将通过make dist构建的发行包中将它们省略。

还请注意,如果您要构建多文件程序,则以上内容并未定义实际存在的所有构建依赖项。我建议通过添加适当的仅前提条件规则来做到这一点,例如

output: $(output_extra_sources)
在多文件情况下为

(无配方)。这将确保make将识别出由于output以外的其他来源之一的修改而需要重建output.rs的时间。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。