2016-08-06 15 views
7

Tôi muốn đặt biến nếu nó trống. Tôi cố gắng theo cách này:Makefile được đặt nếu biến trống rỗng

.... 
TEST := $(something) 
... 
TEST ?= $(something else) 

Các $(something) đầu tiên có thể trả về một chuỗi rỗng, tuy nhiên việc chuyển nhượng có điều kiện = chỉ hoạt động nếu biến trước không được thiết lập, không nếu có sản phẩm nào?.

Bất kỳ giải pháp thanh lịch nào để đặt biến nếu trống?


EDIT tôi tìm thấy giải pháp này:

.... 
TEST := $(something) 
... 
TEST += $(something else) 
TEST := $(word 1, $(TEST)) 

nhưng tôi nghĩ rằng sẽ có nhã một nhiều hơn nữa.

+0

Nhiều chương trình 'make' có điều kiện và cũng có chức năng để kiểm tra các biến. Đối với GNU Hãy [vui lòng đọc tài liệu] (https://www.gnu.org/software/make/manual/make.html). –

+0

Tùy thuộc vào thứ 'cái gì', bạn có thể sử dụng' ifeq (, $ (TEST)) 'hoặc nếu' something' là một lệnh shell có lẽ là 'something || cái gì khác'. – tripleee

+1

Đây có thể là [vấn đề XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem), vui lòng không sử dụng các ví dụ giả tạo. – user657267

Trả lời

26

Bất kỳ giải pháp thanh lịch nào để đặt biến nếu trống?

Làm cho GNU hầu như không được biết đến với các giải pháp thanh lịch. Trừ khi bạn tìm thấy bẫy và mìn để được thanh lịch. Tôi biết chỉ trong hai cách để thực hiện những gì bạn muốn:

  1. Tiêu chuẩn ifeq/endif giải pháp:

    ifeq ($(TEST),) 
    TEST := $(something else) 
    endif 
    
  2. Sử dụng $(if) chức năng:

    TEST := $(if $(TEST),$(TEST),$(something else)) 
    

    Người ta có thể thử để đóng gói cấu trúc đó vào một hàm quá, nhưng điều đó là không thể thực hiện được. Chức năng này sẽ có lỗ hổng ẩn của đôi khi phá vỡ các $(something else) nếu nó có chứa các , (mà chỉ có cách giải quyết wayward). (Các chức năng built-in như $(if) là miễn dịch với các lỗi ,.)

kiểm tra Elegance là tùy thuộc vào bạn.

0

Từ GNU make, chương 7.2, Cú pháp của Conditionals:.

"Thường thì bạn muốn kiểm tra nếu một biến có giá trị không trống Khi kết quả giá trị từ mở rộng phức tạp của các biến và chức năng, mở rộng bạn sẽ xem xét trống thực sự có thể chứa các ký tự khoảng trắng và do đó không được coi là rỗng Tuy nhiên, bạn có thể sử dụng chức năng dải để tránh giải thích khoảng trắng như một giá trị không trống Ví dụ:..

ifeq ($(strip $(foo)),) 
text-if-empty 
endif 

sẽ đánh giá văn bản nếu -empty ngay cả khi mở rộng n của $ (foo) chứa ký tự khoảng trống. "

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