首页 > 解决方案 > 使用带有文件扩展名 .r 的自动工具作为标题,而不是 ratfor 而是 C 编程

问题描述

我正在使用 Axel T Schreiner 所著的http://www.cs.rit.edu/~ats/books/ooc.pdf “ANSI-C 中的面向对象编程”一书。他使用的 makefile 和编译一样工作正常。所以 C 编译器和 make 实用程序使用 .r 文件作为包含文件没有问题。(.r代表为了练习信息隐藏。)

现在我已经进步到我想手动编写代码的地步了。我通常使用自动工具没有问题。对于.r文件,我遇到了问题。该命令autreconf -iv返回以下错误:

autoreconf: Entering directory `.'
autoreconf: configure.ac: not using Gettext
autoreconf: ...............................
..... (snip)
autoreconf: running: /usr/bin/autoheader
autoreconf: running: automake --add-missing --copy --no-force
Makefile.am: error: Ratfor source seen but 'F77' is undefined
Makefile.am:   The usual way to define 'F77' is to add 'AC_PROG_F77'
Makefile.am:   to 'configure.ac' and run 'autoconf' again.
autoreconf: automake failed with exit status: 1

我希望 autoheader/autoreconf 不将.r文件标记为源文件,而只是将它们用作 C 包含文件,只是另一个头文件。

我搜索了谷歌,但主要发现了 autoheader 的手册,据我所知,这没有帮助。

有没有办法让 autotools 将 .r 文件(或任何其他后缀)视为 C 代码而不是 ratfor 源?

标签: cheader-filesautotools

解决方案


确实,.h头文件的后缀只是一个约定,而不是规则。事实上,头文件作为源文件的一个区分类别的整个想法基本上是传统的,即使它是标准本身遵守的约定。尽管如此,这些都是非常强大的约定。

Automake 通过依赖文件命名和组织来遵守此类约定来实现其许多自动化行为。特别是,它通过文件名后缀识别源文件类型。据我所知,这样做的规则是不可配置的。使用标准文件命名约定是使用 Autotools 的成本之一。

但是可以稍微改变一下这个规则。请特别注意,在*_SOURCES变量中列出头文件的唯一目的是确保它们被打包到(源)发行版中。Automake 不依赖于任何其他目的,特别是它不依赖于依赖跟踪。但是还有另一种方法可以告诉 Automake 应该进入分发的文件:将它们列在EXTRA_DIST变量的值中。因此,.r从变量中删除文件*_SOURCES并将它们放入EXTRA_DIST将解决问题。

示例

测试.c

#include "test.r"

int x = 1;

int main(void) {
    return x;
}

测试.r

#ifndef TEST_R
#define TEST_R

extern int x;

#endif

生成文件.am

bin_PROGRAMS = test

test_SOURCES = test.c
EXTRA_DIST = test.r

(config.ac 省略——非说明性的)


推荐阅读