Bagaimana Anda melakukan logika OR menggunakan ifeq
operator make ?
misalnya, saya telah (disederhanakan):
ifeq ($(GCC_MINOR), 4)
CFLAGS += -fno-strict-overflow
endif
ifeq ($(GCC_MINOR), 5)
CFLAGS += -fno-strict-overflow
endif
tetapi ingin mengkonsolidasikan garis-garis ini.
(ya, ya, autotools, configure, dll dll; terlalu berat untuk situasi saat ini, ingin menyimpan semuanya di dalam Makefile di sini)
[kebalikan logis dari pertanyaan ini: Bagaimana Menggunakan Kondisi Ganda dalam pernyataan 'ifeq' ]
ifdef
operator rantai , pertanyaan ini terkaitifeq
operator rantai , serupa, tetapi jawabannya pasti berbeda.OR
operator logis untukifneq
?Jawaban:
Seperti yang ditemukan di arsip milis,
seseorang dapat menggunakan fungsi filter .
Sebagai contoh
filter X, AB akan mengembalikan A, B yang sama dengan X.
Variasi dari ini adalah
di mana perbandingan negatif terhadap string kosong digunakan sebagai gantinya ( filter akan mengembalikan string kosong jika GCC_MINOR tidak cocok dengan argumen)
Kelemahan dari metode tersebut adalah argumen harus berupa kata-kata tunggal.
sumber
ifneq (,$(filter 4 5,$(GCC_MINOR)))
:)if(flagA == TRUE || flagB == true)
, tetapi jika Anda melakukannya$(filter true, $(flagA) $(flagB)
dan keduanya benar, Anda mendapatkanifeq(true, true true)
Anda bisa memperkenalkan variabel lain. Ini tidak mengkonsolidasikan kedua pemeriksaan, tetapi setidaknya menghindari keharusan menempatkan tubuh dalam dua kali:
sumber
Menurut saya tidak ada cara yang ringkas dan masuk akal untuk melakukan itu, tetapi ada cara yang bertele-tele dan masuk akal (seperti Foo Bah) dan cara patologis yang ringkas, seperti
(yang akan menjalankan perintah asalkan string $ (GCC_MINOR) muncul di dalam string 4-5).
sumber
Di sini varian yang lebih fleksibel: menggunakan shell eksternal, tetapi memungkinkan untuk memeriksa kondisi arbitrer:
sumber
Cara lain yang dapat Anda pertimbangkan untuk digunakan dalam kasus ini adalah:
Saya sebenarnya menggunakan yang sama dalam kode saya karena saya tidak ingin mempertahankan
config
atauConfigure
.Tetapi Anda harus menggunakan portabel, non-anemia
make
, seperti GNU make (gmake
), dan bukan milik Posixmake
.Dan itu tidak membahas masalah logis
AND
danOR
.sumber