Makefile.am ve Makefile.in nedir?


335

Bu iki dosya çoğunlukla açık kaynaklı projelerde görülür.

Ne işe yarıyorlar ve nasıl çalışıyorlar?

Yanıtlar:


381

Makefile.amBir programcı tarafından tanımlanan bir dosya tarafından kullanılan, automakeoluşturmak için Makefile.indosya ( .amyerini tutan bir uto m AKE). configureTipik kaynak paketler görülen komut dosyası kullanacak Makefile.inbir oluşturmak için Makefile.

configureKomut kendisi ya da adlandırılan bir programcı tanımlanmış dosyasından oluşturulur configure.acya da configure.in(kaldırıldı). Ben .ac(oluşturulan bir uto c onf için) onu oluşturulan Makefile.indosyalardan farklılaştırır ve bu şekilde make dist-cleanhangi çalışır gibi kuralları olabilir tercih ederim rm -f *.in. Oluşturulan bir dosya olduğundan, genellikle Git, SVN, Mercurial veya CVS gibi bir revizyon sisteminde depolanmaz, .acdosya olur.

GNU Autotools hakkında daha fazla bilgi edinin . Hakkında okuyun makeve Makefileönce, sonra hakkında bilgi automake, autoconf, libtoolvb


3
Ne anlama geliyor .in?
Utku

10
.inİçin 's giriş uzatma aracı configure, kullanılması gereken bir nihai dosyayı masaj (örn ile make). Bunun neden "gülünç" karmaşık göründüğünü merak ediyorsanız, okumaya çalışın: stackoverflow.com/a/26832773/939557 GitHub, vb. İle ortak bir dağıtım kanalı haline gelen bu günlerde bazı autoconf varsayımları bozuluyor: insanlar kaynağı koruyucular tarafından oluşturulan bir kaynak dağıtım tarball kullanmak yerine doğrudan kaynak kodu kontrol aracından.
MadScientist

53

Basit örnek

Utanmadan uyarlanmış: http://www.gnu.org/software/automake/manual/html_node/Creating-amhello.html ve Ubuntu 14.04 Automake 1.14.1'de test edilmiştir.

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;
}

kullanım

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

Bu çıktılar:

Hello world from automake_hello_world 1.0

notlar

  • autoreconf --installGit tarafından izlenmesi gereken birkaç şablon dosyası oluşturur Makefile.in. Sadece ilk kez çalıştırılması gerekiyor.

  • make install yükler:

    • ikili /usr/local/bin
    • README.md için /usr/local/share/doc/automake_hello_world

Denemek için GitHub'da .


1
Neden oluşturulan dosyalar VCS altında tutulmalıdır (bu sadece Git BTW olamaz)?
Victor Yarema

@VictorYarema Bu sonuca neden ulaştığımı unuttum! Öğrenirsen bana haber ver.
Ciro Santilli 法轮功 18 病 六四 事件 法轮功

19

DEVELOPER çalışır autoconfve automake:

1) autoconf - gönderilebilir yapılandırma komut dosyası oluşturur
(yükleyici daha sonra Makefile yapmak için çalışacaktır )

2) automake - shippable Makefile.in veri dosyasını oluşturur
( yapılandırmak daha sonra Makefile yapmak için okunacaktır )


MONTÖR çalıştırır configure, makeve 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


GİRİŞ / ÇIKIŞ HARİTASI

Aşağıdaki gösterim kabaca: girişler -> programlar -> çıkışlar

DEVELOPER bunları çalıştırır:

configure.ac -> autoconf -> configure (script) --- (*. ac = a uto c onf)
configure.in -> autoconf -> configure (script) --- ( configure.inamortismana tabi kullan)

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

INSTALLER şu şekilde çalışır:

Makefile.in -> configure -> Makefile (*. İnç ) = içinde koymak dosyası)

Makefile -> yapmak ----------> (sizin indirme veya geçici dizinde koyar yeni yazılım)
Makefile -> make install -> (sistem dizinlerine yeni yazılımlar koyar)


" autoconf , yazılım kaynak kodu paketlerini otomatik olarak yapılandırmak için kabuk komut dosyaları üreten, genişletilebilir bir M4 makro paketidir. Bu komut dosyaları, manuel kullanıcı müdahalesi olmadan paketleri birçok UNIX benzeri sisteme uyarlayabilir. Autoconf, paketin kullanabileceği işletim sistemi özelliklerini M4 makro çağrıları şeklinde listeleyen şablon dosyası. "

" automake otomatik olarak GNU Kodlama Standartları ile uyumlu Makefile.in dosyaları oluşturmak için bir araçtır. Automake Autoconf kullanımını gerektirir."

Kılavuzlar:

Ücretsiz çevrimiçi eğitimler:


Misal:

LibreOffice'i oluşturmak için kullanılan ana configure.ac , 12k kod satırının üzerindedir (ancak alt klasörlerde 57 tane daha configure.ac dosyası vardır.)

Bu benim oluşturulan yapılandırma 41k kod satırı üzerinde.

Ve iken Makefile.in ve Makefile kodunun hem sadece 493 çizgilerdir. (Ama alt klasörlerde 768 tane daha Makefile var.)


16

referans :

Makefile.am - otomatik yapmak için bir kullanıcı giriş dosyası

configure.in - autoconf'a bir kullanıcı giriş dosyası


autoconf configure.in dosyasından config oluşturur.

automake Makefile.in gelen Makefile.in gererates

configure Makefile.in dan Makefile üretir

Örneğin:

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

Dist yaparken Makefile.in tar.gz dosyasında olmalı, değil mi?
Kemin Zhou
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.