2011-11-10 60 views
20

Trong quá trình xây dựng gói RPM, tôi phải chỉ định BuildRoot và sau này sẽ được sử dụng trong% cài đặt có giá $ RPM_BUILD_ROOT. Tôi luôn nghĩ rằng RPM_BUILD_ROOT là cài đặt giả cho RPM để thực hiện đóng gói. Sau đó, tại thời điểm cài đặt bằng gói RPM, nó sẽ cài đặt vào vị trí thực tế. Ví dụ:

$RPM_BUILD_ROOT/usr/bin 

Tôi nghĩ rằng $ RPM_BUILD_ROOT là cho quá trình đóng gói duy nhất, và trong một số cách RPM có thể phân biệt $ RPM_BUILD_ROOT và thực tế vị trí cài đặt khi người dùng thực hiện "rpm -ivh package.rpm" sẽ là/usr/bin.

Nhưng gần đây khi đọc một số tài liệu, RPM_BUILD_ROOT là vị trí thực tế sẽ được cài đặt và $ RPM_BUILD_ROOT được chỉ định bởi người dùng có cài đặt biến môi trường $ RPM_BUILD_ROOT để cho phép người dùng cài đặt gói trong vị trí mong muốn của họ. Nếu không, $ RPM_BUILD_ROOT sẽ rỗng và sẽ cài đặt vào vị trí mặc định. Trong trường hợp trên, nó là/usr/bin. Do đó, $ RPM_BUILD_ROOT không chỉ dành cho quy trình đóng gói hoặc "cài đặt giả" mà là một cách để người dùng xác định vị trí cài đặt, tương tự như chọn vị trí thư mục trong Windows.

Tôi không biết suy nghĩ của mình là chính xác hay không. Ai đó có thể vui lòng xác minh? Cảm ơn trước.

Trả lời

27

$RPM_BUILD_ROOT (hoặc tương đương %{buildroot} macro tệp SPEC) luôn giữ lưu giữ thư mục theo đó RPM sẽ tìm bất kỳ tệp nào để đóng gói. Các tập lệnh RPM (ví dụ: tập lệnh nén các trang thủ công) cũng sẽ sử dụng giá trị đó để biết nơi cần tìm các tệp vừa được cài đặt. Thông thường, giá trị này sẽ không trống và chứa vị trí cách xa các thư mục hệ thống - thường ở đâu đó dưới /tmp hoặc /var/tmp.

Tác giả của tập tin SPEC dự kiến ​​để đảm bảo rằng make install (hoặc bất kỳ cài đặt phần mềm trong câu hỏi được sử dụng) sẽ đặt bất kỳ tập tin dưới $RPM_BUILD_ROOT, với hệ thống phân cấp tương tự mà nên được sử dụng khi phần mềm cuối cùng được cài đặt. Ví dụ. để cài đặt RPM ls trong /bin/ls, phần %install SPEC phải đảm bảo rằng ls được đặt trong $RPM_BUILD_ROOT/bin/ls.

Tác giả của tệp SPEC cũng được mong đợi sử dụng thẻ BuildRoot: để chỉ định vị trí thích hợp. Ngoài ra, hệ thống xây dựng có thể có tệp cấu hình RPM rpmrc với mục nhập phù hợp. Trong any case gốc xây dựng phải được đặt, sao cho:

  • Người dùng thông thường sẽ có thể tạo gói nguồn.

  • Nếu siêu người dùng đã từng xây dựng gói nguồn, quá trình xây dựng sẽ không ghi đè bất kỳ tệp hệ thống nào, trừ khi siêu người dùng cài đặt gói nhị phân kết quả. Và có, có thể có lý do chính đáng để xây dựng một số góiroot - ví dụ: chạy thử nghiệm đầy đủ glibc yêu cầu root đặc quyền đối với một số thử nghiệm.

Điều đó nói rằng, RPM có thể và sẽ xây dựng một gói có biến gốc xây dựng trống. Trong trường hợp đó cả cài đặt bản dựng và vị trí đích cuối cùng sẽ trùng khớp nhau. Một cuộc gọi tiềm năng cho ví dụ make install sẽ sử dụng vị trí mặc định, do đó, nén các tệp hệ thống theo ví dụ: /usr/lib nếu chạy với đủ đặc quyền.Ngoài ra, có /usr/bin/* trong phần %files của bạn sẽ vui vẻ kéo toàn bộ nội dung của thư mục lưu trữ xây dựng /usr/bin/ vào gói nhị phân của bạn.

Bottom line:

  • Không bao giờ sử dụng một build gốc trống.

  • Không xây dựng các gói như root trừ khi hoàn toàn không có cách nào khác.

+0

Vì vậy, trong kết thúc, $ RPM_BUILD_RooT chỉ là giá trị được sử dụng cho quá trình xây dựng và cho RPM giả mạo cài đặt các tệp vào thư mục gốc của trình xây dựng, vì vậy nó có thể lấy cấu trúc thư mục cho các vị trí cài đặt cuối cùng. Tôi nghĩ rằng sự hiểu biết ban đầu của tôi về gốc xây dựng là chính xác. – Amumu

+0

Làm cách nào để chuyển một thư mục gốc tùy chỉnh sang 'make install'? – Jeroen

+0

Đề xuất $ RPM_BUILD_ROOT duy nhất để hỗ trợ các bản dựng song song trên cùng một máy chủ bằng cách sử dụng một cái gì đó như thế này: 'BuildRoot:% {_ tmppath} /% {name} -buildroot -% {version} -% {release}' – MarkHu

7

file ~/.rpmmacros xác định đường dẫn cho mỗi người dùng:

%_topdir %(echo $HOME)/rpmbuild 
%_tmppath %{_topdir}/tmp 

và người ta cũng có thể định nghĩa chúng với các thông số dòng lệnh rpmbuild:

rpmbuild --define '_topdir /home/username/rpmbuild' 
Các vấn đề liên quan