Apa itu Makefile.am dan Makefile.in?

335

Kedua file ini sebagian besar terlihat dalam proyek open source.

Untuk apa itu, dan bagaimana cara kerjanya?

Topeng
sumber

Jawaban:

381

Makefile.amadalah file programmer-didefinisikan dan digunakan oleh automakeuntuk menghasilkan Makefile.inberkas (yang .amberdiri untuk sebuah uto m ake). The configureScript biasanya terlihat di tarball source akan menggunakan Makefile.inuntuk menghasilkan Makefile.

The configureScript itu sendiri dihasilkan dari file programmer-didefinisikan bernama baik configure.acatau configure.in(usang). Saya lebih suka .ac(untuk sebuah uto c onf) karena membedakan dari yang dihasilkan Makefile.infile dan cara yang saya dapat memiliki aturan seperti make dist-cleanyang berjalan rm -f *.in. Karena ini adalah file yang dihasilkan, biasanya tidak disimpan dalam sistem revisi seperti Git, SVN, Mercurial atau CVS, melainkan .acfile tersebut.

Baca lebih lanjut tentang GNU Autotools . Baca tentang makedan Makefilepertama, kemudian belajar tentang automake, autoconf, libtool, dll

Sean AO Harney
sumber
3
Apa artinya .in?
Utku
10
The .inekstensi berarti bahwa masukan itu untuk configurememijat, bukan file akhir yang harus digunakan (misalnya dengan make). Jika Anda penasaran mengapa ini tampaknya "konyol" rumit, coba baca: stackoverflow.com/a/26832773/939557 Hari-hari ini dengan GitHub, dll. Menjadi saluran distribusi umum yang beberapa asumsi autoconf mogok: orang memperoleh sumber langsung dari alat kontrol kode sumber, daripada menggunakan tarball distribusi sumber yang dibuat oleh pengelola.
MadScientist
53

Contoh sederhana

Tanpa malu-malu diadaptasi dari: http://www.gnu.org/software/automake/manual/html_node/Creating-amhello.html dan diuji di 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], [[email protected]])
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;
}

Pemakaian

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

Output ini:

Hello world from automake_hello_world 1.0

Catatan

  • autoreconf --installmenghasilkan beberapa file templat yang harus dilacak oleh Git, termasuk Makefile.in. Itu hanya perlu dijalankan pertama kali.

  • make install menginstal:

    • biner ke /usr/local/bin
    • README.md untuk /usr/local/share/doc/automake_hello_world

Di GitHub, Anda bisa mencobanya.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
1
Mengapa kita harus menyimpan file yang dihasilkan di bawah VCS (ini tidak hanya Git BTW)?
Victor Yarema
@VictorYarema Saya lupa mengapa saya mencapai kesimpulan itu! Beri tahu saya jika Anda mengetahuinya.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
19

DEVELOPER berjalan autoconfdan automake:

1) autoconf - membuat konfigurasi shippable skrip
(yang nantinya akan dijalankan oleh pemasang untuk membuat Makefile )

2) automake - membuat file data Makefile.in shippable
(yang mengkonfigurasi nantinya akan dibaca untuk membuat Makefile )


INSTALLER berjalan configure, makedan 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


PETA INPUT / OUTPUT

Notasi di bawah ini kira-kira: input -> program -> output

DEVELOPER menjalankan ini:

configure.ac -> autoconf -> configure (script) --- (*. ac = a uto c onf)
configure.in -> autoconf -> configure (script) --- ( configure.indisusutkan Gunakan configure.ac.)

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

INSTALLER menjalankan ini:

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

Makefile -> make ----------> (menempatkan perangkat lunak baru di unduhan Anda atau direktori sementara)
Makefile -> make install -> (menempatkan perangkat lunak baru di direktori sistem)


" autoconf adalah paket extensible dari makro M4 yang menghasilkan skrip shell untuk secara otomatis mengkonfigurasi paket kode sumber perangkat lunak. Skrip ini dapat mengadaptasi paket ke berbagai jenis sistem mirip-UNIX tanpa intervensi pengguna manual. Autoconf membuat skrip konfigurasi untuk paket dari sebuah file templat yang mencantumkan fitur sistem operasi yang dapat digunakan paket, dalam bentuk panggilan makro M4. "

" automake adalah alat untuk secara otomatis menghasilkan file Makefile.in yang sesuai dengan Standar Pengkodean GNU. Automake membutuhkan penggunaan Autoconf."

Manual:

Tutorial online gratis:


Contoh:

Configure.ac utama yang digunakan untuk membangun LibreOffice adalah lebih dari 12k baris kode, (tetapi ada juga 57 file configure.ac lainnya dalam subfolder.)

Dari ini konfigurasi yang saya hasilkan adalah lebih dari 41k baris kode.

Dan sementara Makefile.in dan Makefile sama-sama hanya 493 baris kode. (Tapi, ada juga 768 Makefile.in di subfolder lagi.)

Pandangan elips
sumber
16

referensi :

Makefile.am - file input pengguna untuk diotomatisasi

configure.in - file input pengguna ke autoconf


autoconf menghasilkan configure dari configure.in

automate gererates Makefile.in dari Makefile.am

configure menghasilkan Makefile dari Makefile.in

Misalnya:

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

sumber
Jadi Makefile.in harus di file tar.gz saat Anda membuat dist, kan?
Kemin Zhou