ChatGPT解决这个技术问题 Extra ChatGPT

Makefile.am 和 Makefile.in 是什么?

这两个文件大多出现在开源项目中。

它们的用途是什么,它们是如何工作的?


e
emlai

Makefile.am 是程序员定义的文件,automake 使用它来生成 Makefile.in 文件(.am 代表 automake)。通常在源 tarball 中看到的 configure 脚本将使用 Makefile.in 来生成 Makefile

configure script 本身是从名为 configure.acconfigure.in(已弃用)的程序员定义文件生成的。我更喜欢 .ac(对于 autoconf),因为它将它与生成的 Makefile.in 文件区分开来,这样我就可以拥有诸如 make dist-clean 之类的规则运行 rm -f *.in。由于它是一个生成的文件,因此它通常不会存储在 Git、SVN、Mercurial 或 CVS 等修订系统中,而是 .ac 文件。

GNU Autotools 上阅读更多信息。先了解 makeMakefile,然后了解 automakeautoconflibtool 等。


.in 代表什么?
.in 扩展意味着它是 configure 按摩的输入,而不是应该使用的最终文件(例如 make)。如果您对为什么这看起来“荒谬”的复杂感到好奇,请尝试阅读:stackoverflow.com/a/26832773/939557 如今,随着 GitHub 等成为常见的分发渠道,autoconf 的一些假设正在被打破:人们直接从源代码获取源代码代码控制工具,而不是使用维护者创建的源代码分发 tarball。
这似乎与 emacs 源代码不一致;它具有使用“配置”生成 MakefileMakefile.in
@daraul 我认为 Makefile.am 用于生成 Makefile.in,它用作生成 Makefile 的输入。
C
Ciro Santilli Путлер Капут 六四事

简单的例子

无耻地改编自:http://www.gnu.org/software/automake/manual/html_node/Creating-amhello.html,并在 Ubuntu 14.04 Automake 1.14.1 上进行了测试。

生成文件.am

SUBDIRS = src
dist_doc_DATA = README.md

自述文件.md

Some doc.

配置.ac

AC_INIT([automake_hello_world], [1.0], [bug-automake@gnu.org])
AM_INIT_AUTOMAKE([-Wall -Werror foreign])
AC_PROG_CC
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_FILES([
 Makefile
 src/Makefile
])
AC_OUTPUT

src/Makefile.am

bin_PROGRAMS = autotools_hello_world
autotools_hello_world_SOURCES = main.c

src/main.c

#include <config.h>
#include <stdio.h>

int main (void) {
  puts ("Hello world from " PACKAGE_STRING);
  return 0;
}

用法

autoreconf --install
mkdir build
cd build
../configure
make
sudo make install
autotools_hello_world
sudo make uninstall

这输出:

Hello world from automake_hello_world 1.0

笔记

autoreconf --install 生成几个应该被 Git 跟踪的模板文件,包括 Makefile.in。它只需要第一次运行。

make install 安装:二进制文件到 /usr/local/bin README.md 到 /usr/local/share/doc/automake_hello_world

二进制文件到 /usr/local/bin

README.md 到 /usr/local/share/doc/automake_hello_world

On GitHub 供您试用。


为什么要将生成的文件保存在 VCS 下(这不仅可以是 Git BTW)?
@VictorYarema我忘记了为什么得出这个结论!如果你发现了,请告诉我。
不应该用 autotools_hello_world 代替 autoconf_hello_world 吗?在您的使用部分?
E
Elliptical view

DEVELOPER 运行 autoconf 和 automake:

autoconf -- 创建可交付的配置脚本(安装程序稍后将运行该脚本以生成 Makefile)

'autoconf' 是一个宏处理器。

它将 configure.ac(一个使用宏指令的 shell 脚本)转换为 configure(一个成熟的 shell 脚本)。

automake - 创建可交付的 Makefile.in 数据文件(稍后将读取该文件以生成 Makefile)

Automake 有助于创建可移植且符合 GNU 标准的 Makefile。

'automake' 从简单的 Makefile.ams 创建复杂的 Makefile.ins

INSTALLER 运行 configure、make 和 sudo make install:

./configure       # Creates  Makefile        (from     Makefile.in).  
make              # Creates  the application (from the Makefile just created).  

sudo make install # Installs the application 
                  #   Often, by default its files are installed into /usr/local

输入/输出映射

下面的符号大致是:输入 --> 程序 --> 输出

开发人员运行这些:

配置.ac-> 自动配置 -> 配置(脚本)--- (*.ac = autoconf)
configure.in --> 自动配置 -> 配置(脚本)---(configure.in 已弃用。使用 configure.ac)

Makefile.am -> automake -> Makefile.in ----------- (*.am = automake)

安装程序运行这些:

Makefile.in -> 配置 -> Makefile (*.in = 输入文件)

Makefile -> make ---------->(将新软件放在您的下载或临时目录中) Makefile -> make install ->(将新软件放在系统目录中)

“autoconf 是 M4 宏的可扩展包,它生成 shell 脚本以自动配置软件源代码包。这些脚本可以使包适应多种类 UNIX 系统,而无需用户手动干预。Autoconf 从以 M4 宏调用的形式列出软件包可以使用的操作系统功能的模板文件。”

“automake 是一个自动生成符合 GNU 编码标准的 Makefile.in 文件的工具。Automake 需要使用 Autoconf。”

手册:

GNU AutoTools(这方面的权威手册)

m4(由 autoconf 使用)

自动配置

汽车制造

免费在线教程:

使用 GNU 自动工具

例子:

用于构建 LibreOffice 的主要 configure.ac 代码超过 12k 行,(但在子文件夹中还有 57 个其他 configure.ac 文件。)

由此我生成的配置超过 41k 行代码。

而 Makefile.in 和 Makefile 都只有 493 行代码。 (但是,子文件夹中还有 768 个 Makefile.in。)


佚名

reference

Makefile.am - 自动制作的用户输入文件

configure.in -- autoconf 的用户输入文件

autoconf 从 configure.in 生成配置

automake 从 Makefile.am 生成 Makefile.in

configure 从 Makefile.in 生成 Makefile

例如:

$]
configure.in Makefile.in
$] sudo autoconf
configure configure.in Makefile.in ... 
$] sudo ./configure
Makefile Makefile.in

所以 make dist 时 Makefile.in 应该在 tar.gz 文件中,对吧?
@KeminZhou 是的。非开发人员不应运行 automake。他们应该在 tarball 中有 Makefile.in
通常开发人员使用自动工具来生成供普通用户使用的配置。