Что такое Makefile.am и Makefile.in?

335

Эти два файла чаще всего встречаются в проектах с открытым исходным кодом.

Для чего они и как они работают?

маскировать
источник

Ответы:

381

Makefile.amэто файл, определенный программистом, который используется automakeдля генерации Makefile.inфайла ( .amрасшифровывается как uto m ake). configureСценарий , обычно видел в исходных тарболлах будет использовать Makefile.inдля генерации Makefile.

Сам configureсценарий генерируется из определенного программистом файла с именем configure.acor или configure.in(не рекомендуется). Я предпочитаю .ac(для токоррекция с ОНФ) , поскольку он отличает его от сгенерированных файлов и таким образом я могу иметь такие правила , как , которая работает . Поскольку это сгенерированный файл, он, как правило, не хранится в системе редакций, такой как Git, SVN, Mercurial или CVS, скорее файл будет.Makefile.inmake dist-cleanrm -f *.in.ac

Узнайте больше о GNU Autotools . Читайте о makeи Makefileпервых, познакомимся automake, autoconf, libtoolи т.д.

Шон А.О. Харни
источник
3
Что означает .in?
Утку
10
В .inсредство расширения , что это вход для configureмассировать, а не конечный файл , который должен использоваться (например , с make). Если вам интересно, почему это кажется «нелепо» сложным, попробуйте прочитать: stackoverflow.com/a/26832773/939557 В наши дни GitHub и т. Д. Становятся общим каналом распространения, некоторые из предположений autoconf рушатся: люди получают исходный код непосредственно из инструмента управления исходным кодом, а не с помощью архива исходного кода, созданного сопровождающими.
MadScientist
53

Простой пример

Бесстыдно адаптировано из: http://www.gnu.org/software/automake/manual/html_node/Creating-amhello.html и протестировано на Ubuntu 14.04 Automake 1.14.1.

Makefile.am

SUBDIRS = src
dist_doc_DATA = README.md

README.md

Some doc.

configure.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
autoconf_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

На GitHub для вас, чтобы попробовать это.

Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
источник
1
Почему следует хранить сгенерированные файлы в VCS (это может быть не только Git BTW)?
Виктор Ярема
@VictorYarema Я забыл, почему я пришел к такому выводу! Дайте мне знать, если узнаете.
Сиро Сантилли 郝海东 冠状 病 六四 事件 法轮功
19

DEVELOPER работает autoconfи automake:

1) autoconf - создает настраиваемый сценарий
(который позже запустит установщик для создания Makefile )

2) Automake - создает транспортируемый Makefile.in файл данных
(который настроить позже будет читать , чтобы сделать Makefile )


УСТАНОВКА работает 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


КАРТА ВХОДА / ВЫХОДА

Обозначение ниже примерно: входы -> программы -> выходы

DEVELOPER запускает эти:

configure.ac -> Autoconf -> Configure (сценарий) --- (*. ас = токоррекция с ОНФ) configure.in -> Autoconf
-> Configure (сценарий) --- ( configure.inамортизируется Использование configure.ac.)

Makefile.am -> automake -> Makefile.in ----------- (*. Am = a uto m ake)

INSTALLER запускает эти:

Makefile.in -> Настройка -> Makefile . (* В = в пут - файла)

Makefile -> make ----------> (помещает новое программное обеспечение в ваши файлы для загрузки или во временный каталог)
Makefile -> make install -> (помещает новое программное обеспечение в системные каталоги)


« autoconf - это расширяемый пакет макросов M4, которые создают сценарии оболочки для автоматической настройки пакетов исходного кода программного обеспечения. Эти сценарии могут адаптировать пакеты для многих типов UNIX-подобных систем без ручного вмешательства пользователя. Autoconf создает сценарий конфигурации для пакета из файл шаблона, в котором перечислены функции операционной системы, которые может использовать пакет, в виде вызовов макросов M4. "

" automake - это инструмент для автоматической генерации файлов Makefile.in, соответствующих стандартам кодирования GNU. Automake требует использования Autoconf».

Руководства:

Бесплатные онлайн-уроки:


Пример:

Основной файл configure.ac, используемый для сборки LibreOffice, содержит более 12 тыс. Строк кода (но в подпапках также есть 57 других файлов configure.ac).

Исходя из этого, моя сгенерированная конфигурация содержит более 41 тыс. Строк кода.

И хотя Makefile.in и Makefile имеют всего 493 строки кода. (Но есть также еще 768 Makefile.in в подпапках.)

Эллиптический вид
источник
16

ссылка :

Makefile.am - пользовательский файл ввода для автоматизации

configure.in - файл пользовательского ввода для autoconf


autoconf создает конфигурацию из файла configure.in

automake создает Makefile.in от Makefile.am

configure генерирует Makefile из Makefile.in

Например:

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

источник
Так что Makefile.in должен быть в файле tar.gz, когда вы делаете dist, верно?
Кемин Чжоу