2012-05-15 28 views
5

Mục tiêu: khi người dùng nhập 'tạo gói', tự động tìm gói libx11-dev (yêu cầu chương trình của tôi biên dịch) và, nếu không tìm thấy, hãy cài đặt nó. Đây là phiên bản rút gọn của makefile của tôi:Tự động cài đặt các gói từ bên trong makefile

PACKAGES = $(shell if [ -z $(dpkg -l | grep libx11-dev) ]; then sudo apt-get install libx11-dev; fi) 

[other definitions and targets] 

packages: $(PACKAGES) 

Khi tôi nhập 'make packages', tôi được nhắc nhập mật khẩu người dùng. Nếu được nhập chính xác, nó sẽ treo vô thời hạn.

Là những gì tôi đang cố gắng làm thậm chí có thể từ bên trong makefile? Nếu vậy, làm thế nào?

Cảm ơn rất nhiều.

Trả lời

6

Vấn đề là chức năng shell hoạt động như backticks trong trình bao: nó lấy đầu ra để xuất chuẩn và trả về giá trị của hàm. Vì vậy, apt-get không treo, nó đang chờ bạn nhập câu trả lời cho một số câu hỏi. Nhưng bạn không thể thấy câu hỏi bởi vì make đã lấy đầu ra.

Cách bạn đang thực hiện việc này sẽ không hoạt động. Tại sao bạn sử dụng shell thay vì chỉ viết nó như một quy tắc?

packages: 
     [ -z `dpkg -l | grep libx11-dev` ] && sudo apt-get install libx11-dev 
.PHONY: packages 
+0

Tôi thấy mẫu ở đây; kéo ra libx11-dev và nó có hoạt động trên một danh sách các gói không? –

+0

@MadScientist Cảm ơn rất nhiều! Điều này làm việc, ngoại trừ nếu gói đã được cài đặt, tôi nhận được lỗi: "/ bin/sh: 1: [: ii: toán tử không mong muốn" có lẽ liên quan đến thực tế là đầu ra của lệnh dpkg -l | grep libx11-dev là "ii libx11-dev 2: 1.4.99.1-0ubuntu2" –

+0

Thêm dấu ngoặc kép: '[-z" \ 'dpkg -l | grep libx11-dev \' "]' – MadScientist

3

tôi đã tìm ra một cách tốt hơn, mà tránh được vấn đề của việc có đối số bất ngờ với câu lệnh if:

if ! dpkg -l | grep libx11-dev -c >>/dev/null; then sudo apt-get install libx11-dev; fi 

Lá cờ -c trên grep làm cho nó trả về số các dòng trong dpkg - l có chứa chuỗi libx11-dev, mà một trong hai sẽ là 0 (nếu gỡ bỏ cài đặt) hoặc 1 (nếu được cài đặt), cho phép

dpkg -l | grep libx11-dev -c 

để bị đối xử như một biến boolean thường.

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