2013-05-19 32 views
7

Tôi biết quá trình cài đặt từ nguồn là.lý do tại sao "thực hiện" trước khi "thực hiện cài đặt"

  1. ./configure
  2. làm
  3. make install

nhưng tại sao "làm" trước khi "make install", tại sao không chỉ làm "make install"

sự hiểu biết của tôi vì vậy xa là "make" chỉ biên dịch nguồn thành tệp thi hành và "make install" thực sự đặt chúng vào thư mục PATH thực thi, tôi có đúng không?

có thể tôi không đặt câu hỏi rõ ràng và xin lỗi về câu hỏi đó.

nói rằng chúng ta muốn cài đặt thực thi trên máy tính này, có thể chúng tôi chỉ làm

  1. ./configure
  2. make install

thay vì 3 bước trình bày ở trên.

Trả lời

10

Khi bạn chạy make, bạn đang hướng dẫn về cơ bản, hãy làm theo một tập hợp các bước xây dựng cho một mục tiêu cụ thể. Khi make được gọi là không có tham số, nó chạy mục tiêu đầu tiên, thường chỉ đơn giản là biên dịch dự án. make install bản đồ đến mục tiêu install, thường không có gì khác ngoài sao chép các tệp nhị phân vào đích của chúng.

Thường xuyên, mục tiêu install phụ thuộc vào mục tiêu biên dịch, vì vậy bạn có thể nhận được kết quả tương tự bằng cách chỉ chạy make install. Tuy nhiên, tôi có thể thấy ít nhất một lý do chính đáng để thực hiện chúng trong các bước riêng biệt: tách đặc quyền.

Thông thường, khi bạn cài đặt phần mềm, nó đi vào các vị trí mà người dùng thông thường không có quyền ghi (như /usr/bin/usr/local/bin). Thông thường, sau đó, bạn thực sự phải chạy make và sau đó sudo make install, vì bước cài đặt yêu cầu leo ​​thang đặc quyền. Đây là "Good Thing ™", vì nó cho phép phần mềm của bạn được biên dịch như một người dùng bình thường (thực sự tạo ra sự khác biệt cho một số dự án), hạn chế phạm vi hư hỏng tiềm tàng cho thủ tục xây dựng kém và chỉ lấy được root đặc quyền cho bước cài đặt.

+0

Chỉ một lưu ý phụ: "thực hiện" mà không có bất kỳ nhận xét nào sẽ bỏ qua bất kỳ mục tiêu ký tự đại diện nào. '%' tương đương với regex '+' cho tên mục tiêu. Ví dụ nếu bạn có 3 mục tiêu: 1) "% _targetsuffix:" 2) ​​"wildTarget:" 3) "defaultTarget:" theo thứ tự này, từ trên xuống dưới. Lệnh "make" sẽ bỏ qua "% _youtargetsuffic:" và build "wildTarget:" ("defaultTarget:" bị bỏ qua vì "wildTarget:" nằm trước nó). Xin lỗi tôi không biết cách định dạng nhận xét để làm cho dễ đọc hơn. – funa68

0

Rất nhiều phần mềm trong những ngày này sẽ làm điều đúng với chỉ make install. Trong trường hợp không, mục tiêu cài đặt không phụ thuộc vào các tệp nhị phân đã biên dịch. Vì vậy, để chơi an toàn, hầu hết mọi người sử dụng make && make install hoặc một biến thể của chúng chỉ để được an toàn.

3

make không có tham số lấy ./Makefile (hoặc ./makefile) và xây dựng các mục tiêu đầu tiên. Theo quy ước, điều này có thể là tất cả mục tiêu, nhưng không nhất thiết. make install tạo mục tiêu đặc biệt, cài đặt. Theo quy ước, điều này có kết quả của make all và cài đặt chúng trên máy tính hiện tại.

Không phải ai cũng cần make install. Ví dụ: nếu bạn xây dựng một số ứng dụng web sẽ được triển khai trên một máy chủ khác hoặc nếu bạn sử dụng trình biên dịch chéo (ví dụ: bạn tạo ứng dụng Android trên máy Linux), không có ý nghĩa gì khi chạy make install.

Trong hầu hết các trường hợp, dòng đơn ./configure && make all install sẽ tương đương với quy trình ba bước mà bạn mô tả, nhưng điều này phụ thuộc vào sản phẩm, theo nhu cầu cụ thể của bạn và một lần nữa, đây chỉ là một quy ước.

1

Có những lúc tôi muốn thử biên dịch thay đổi mã nhưng không triển khai những thay đổi đó. Ví dụ, nếu tôi đang hack cơ sở mã Asterisk C, và tôi muốn chắc chắn rằng những thay đổi mà tôi đang thực hiện vẫn biên dịch, tôi sẽ lưu và chạy make. Tuy nhiên, tôi không muốn triển khai những thay đổi đó bởi vì tôi không thực hiện mã hóa.

Đối với tôi, chạy thực hiện chỉ là một cách để đảm bảo rằng tôi không kết thúc với quá nhiều lỗi biên dịch trong mã của tôi đến nơi tôi gặp khó khăn trong việc định vị chúng. Có lẽ những người lập trình C có kinh nghiệm hơn không có vấn đề đó, nhưng đối với tôi, hạn chế số lượng thay đổi giữa các biên dịch giúp giảm số lượng thay đổi có thể đã hoàn toàn chuyển vào bản dựng của tôi và điều này làm cho việc gỡ lỗi dễ dàng hơn.

Cuối cùng, điều này cũng giúp tôi có điểm dừng. Nếu tôi muốn đi ăn trưa, tôi biết rằng ai đó có thể khởi động lại ứng dụng trong trạng thái hiện đang hoạt động mà không cần phải tìm tôi, vì chỉ cài đặt sẽ sao chép các tệp nhị phân sang thư mục ứng dụng thực tế.

Có thể có nhiều lý do khác, nhưng đây là lý do của tôi để chấp nhận thực tế là hai lệnh được tách ra. Như những người khác đã nói, nếu bạn muốn họ kết hợp, bạn có thể kết hợp chúng bằng cách sử dụng trình bao của bạn.

Các vấn đề liên quan