Makefile.am và Makefile.in là gì?


335

Hai tệp này hầu hết được nhìn thấy trong các dự án nguồn mở.

Họ làm gì và làm việc như thế nào?

Câu trả lời:


381

Makefile.amlà một tập tin lập trình viên xác định và được sử dụng bởi automakeđể tạo ra các Makefile.intập tin ( .amviết tắt cho một Uto m ake). Các configurekịch bản thường thấy trong tarball nguồn sẽ sử dụng Makefile.inđể tạo ra một Makefile.

Bản thân configuretập lệnh được tạo từ một tệp do lập trình viên xác định có tên configure.achoặc configure.in(không dùng nữa). Tôi thích .ac(đối với một uto c onf) vì nó phân biệt nó với các Makefile.intệp được tạo và theo cách đó tôi có thể có các quy tắc như make dist-cleanchạy rm -f *.in. Vì nó là một tệp được tạo, nên nó thường không được lưu trữ trong một hệ thống sửa đổi, chẳng hạn như Git, SVN, Mercurial hoặc CVS, thay vào đó là .actệp.

Đọc thêm về GNU Autotools . Tìm hiểu về makeMakefilelần đầu tiên, sau đó tìm hiểu về automake, autoconf, libtoolvv


3
Không đại diện .incho cái gì?
Utku

10
Các .inphương tiện mở rộng mà nó đầu vào cho configuređến xoa bóp, không phải là một tập tin cuối cùng mà nên được sử dụng (ví dụ với make). Nếu bạn tò mò về lý do tại sao điều này có vẻ "nực cười" phức tạp, hãy thử đọc: stackoverflow.com/a/26832773/939557 Những ngày này với GitHub, v.v. nguồn trực tiếp từ công cụ kiểm soát mã nguồn, thay vì sử dụng tarball phân phối nguồn được tạo bởi các nhà bảo trì.
MadSellectist

53

Ví dụ đơn giản

Thích nghi một cách đáng xấu hổ từ: http://www.gnu.org/software/automake/manual/html_node/Creating-amhello.html và thử nghiệm trên 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;
}

Sử dụng

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

Kết quả này:

Hello world from automake_hello_world 1.0

Ghi chú

  • autoreconf --installtạo một số tệp mẫu cần được theo dõi bởi Git, bao gồm Makefile.in. Nó chỉ cần được chạy lần đầu tiên.

  • make install cài đặt:

    • nhị phân để /usr/local/bin
    • README.md đến /usr/local/share/doc/automake_hello_world

Trên GitHub để bạn dùng thử.


1
Tại sao người ta phải giữ các tệp được tạo trong VCS (đây không chỉ là Git BTW)?
Victor Yarema

@VictorYarema Tôi quên mất tại sao tôi lại đạt được kết luận đó! Hãy cho tôi biết nếu bạn tìm hiểu.
Ciro Santilli 郝海东 冠状 病 事件

19

DEVELOPER chạy autoconfautomake:

1) autoconf - tạo tập lệnh cấu hình có thể chuyển đổi
(mà trình cài đặt sau này sẽ chạy để tạo Makefile )

2) automake - tạo tệp dữ liệu Makefile.in có thể thay đổi
( cấu hình này sẽ đọc sau này để tạo Makefile )


INSTALLER chạy configure, makesudo 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


Input / Output MAP

Ký hiệu bên dưới đại khái là: đầu vào -> chương trình -> đầu ra

DEVELOPER chạy sau đây:

configure.ac -> autoconf -> configure (script) --- (*. ac = a uto c onf)
configure.in -> autoconf -> configure (script) --- ( configure.indepreciated. Sử dụng configure.ac)

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

INSTALLER chạy các:

Makefile.in -> configure -> Makefile (. * Trong = trong tập tin đặt)

Makefile -> make ----------> (đặt phần mềm mới vào phần tải xuống hoặc thư mục tạm thời của bạn)
Makefile -> make install -> (đặt phần mềm mới vào thư mục hệ thống)


" Autoconf là một gói phần mềm mở rộng của macro M4 sản xuất kịch bản shell với các gói mã nguồn phần mềm tự động cấu hình. Những kịch bản có thể thích ứng với các gói với nhiều loại UNIX-như hệ thống mà không cần hướng dẫn sử dụng can thiệp. Autoconf tạo ra một kịch bản cấu hình cho một gói từ một tệp mẫu liệt kê các tính năng của hệ điều hành mà gói có thể sử dụng, dưới dạng các cuộc gọi macro M4. "

" automake là một công cụ để tự động tạo các tệp Makefile.in tuân thủ Tiêu chuẩn mã hóa GNU. Automake yêu cầu sử dụng Autoconf."

Hướng dẫn sử dụng:

Hướng dẫn trực tuyến miễn phí:


Thí dụ:

Các chính configure.ac dùng để xây dựng LibreOffice là hơn 12k dòng mã, (nhưng cũng có 57 file configure.ac khác trong thư mục con).

Từ đây, cấu hình được tạo của tôi là hơn 41k dòng mã.

Và trong khi Makefile.inMakefile đều chỉ có 493 dòng mã. (Nhưng, cũng có thêm 768 Makefile.in trong các thư mục con.)


16

tham khảo :

Makefile.am - một tệp đầu vào của người dùng để tự động

configure.in - một tệp đầu vào của người dùng vào autoconf


autoconf tạo configure từ configure.in

tự động điều chỉnh Makefile.in từ Makefile.am

cấu hình tạo Makefile từ Makefile.in

Ví dụ:

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

Vì vậy, Makefile.in nên có trong tệp tar.gz khi bạn thực hiện dist, phải không?
Kemin Zhou
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.