ทุบตีขยายวงกลมภายใน Makefile


15

ฉันต้องการทำการดำเนินการกับไฟล์ทั้งหมดในโฟลเดอร์เฉพาะที่ไม่ได้ขึ้นต้นด้วยคำนำหน้าเฉพาะ (พูดexclude_) ฉันมี bash forloop พร้อมกับ glob แบบขยายที่มีลักษณะดังนี้:

for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done

บนบรรทัดคำสั่งสิ่งนี้ใช้ได้ผล:

 $ for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
 foo/bar/apple
 foo/bar/pear
 foo/bar/banana

แต่เมื่อฉันใช้ใน makefile:

target:
    for FILE in foo/bar/!(exclude_*) ; do echo $$FILE ; done

ฉันได้รับข้อผิดพลาดต่อไปนี้:

$ make
for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done'

มีบางอย่างที่จำเป็นในการหลบหนีที่ฉันไม่ได้รับ?

คำตอบ:


7
  1. extglobคุณจะต้องตั้ง
  2. คุณต้องบอกให้ใช้ bash ไม่ใช่ sh

Makefile:

SHELL=/bin/bash
.SHELLFLAGS="-O extglob -c"
 ...

2
อืมมม ด้วยเหตุผลบางอย่าง.SHELLFLAGSไม่ได้ทำงานสำหรับฉัน แต่วางธงโดยตรงในการSHELL=/bin/bash -O extglob -cทำ ความคิดใด ๆ
ทิโมธีโจนส์

1
บางทีคุณอาจไม่ได้ใช้ GNU หรืออาจไม่จำเป็นต้องมีเครื่องหมายคำพูด
Ignacio Vazquez-Abrams

GNU Make 3.81 และทุบตี GNU รุ่น 4.1.2 พยายามโดยไม่พูดด้วย แปลก.
ทิโมธีโจนส์

อย่างไรก็ตามคำตอบของคุณแก้ไขให้ฉันเมื่อฉันทำให้พวกเขาทั้งหมดในบรรทัดเดียว ขอบคุณ!
ทิโมธีโจนส์

1
.SHELLFLAGSตัวแปรที่ถูกเพิ่มเข้ามาใน GNU แต่งหน้า 3.82 คุณสามารถตรวจสอบคุณสมบัติที่ถูกเพิ่มเข้ามาในที่ที่เผยแพร่ผ่านทางไฟล์ข่าว: git.savannah.gnu.org/cgit/make.git/tree/NEWS
MadScientist

11

มันจะมีสำนวนและพกพาได้มากกว่าในการแก้ปัญหาด้วย Make และไม่ใช่กับ Bash hacks เกิดอะไรขึ้นถ้ามีคนไม่ได้ติดตั้ง Bash?

อย่างไรก็ตามนี่คือวิธีที่เหมาะสมในการทำ:

FOOFILES = $(filter-out foo/bar/exclude_%,$(wildcard foo/bar/*))

target:
    for FILE in ${FOOFILES}; do echo $$FILE ; done

2

นี่เป็นวิธีที่ง่ายกว่า:

SHELL:=/bin/bash -O globstar

ซึ่งจะเปิดใช้งานตัวเลือก globstar shell (ซึ่งทำงานบน BSD / OS X เช่นกัน)


0

เพิ่มไปที่ด้านบนของ Makefile:

SHELL := bash -O extglob

1
ใช้งานไม่ได้ เวอร์ชั่นด้านบนถูกต้อง
Desik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.