Що таке Makefile.am та Makefile.in?


335

Ці два файли в основному бачать у проектах з відкритим кодом.

Для чого вони потрібні і як вони працюють?

Відповіді:


381

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

Сам configureсценарій генерується з файлу, визначеного програмістом, з ім'ям configure.acабо 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 Я забув, чому я дійшов такого висновку! Повідомте мене, якщо ви дізнаєтесь.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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.ac.)
configure.in

Makefile.am -> Automake -> Makefile.in ----------- (. * Я = токоррекція м ака)

INSTALLER виконує такі:

Makefile.in -> configure -> Makefile (*. In = in put file)

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


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

" automkeke - це інструмент для автоматичного генерування файлів 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

автоматизувати герерати Makefile.in з Makefile.am

конфігурує генерує Makefile з Makefile.in

Наприклад:

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

Тож Makefile.in повинен бути у файлі tar.gz, коли ви робите dist, правда?
Kemin Zhou
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.