मैं एक मेकफ़ाइल लिख रहा हूं जिसमें आर्किटेक्चर और बिल्ड प्रकारों के लिए कई लक्ष्य हैं। जब मैं मेक को कॉल करता हूं तो मैं इसे दो लक्ष्यों को पारित करने में सक्षम होना चाहता हूं जैसे कि:

make x86 debug

जहां आर्किटेक्चर लक्ष्य निर्माण लक्ष्य द्वारा उपयोग किए जाने वाले चर सेट करता है। एक आर्किटेक्चर लक्ष्य इस तरह दिख सकता है:

.PHONY: x86
x86: NAME_PREFIX = x86_64_Linux
x86: TARGET_TRIPLE = x86_64-pc-linux-elf
x86: CC = gcc
x86: CFLAGS += -fomit-frame-pointer

पहला मुद्दा: यदि मैं दो लक्ष्यों को चलाता हूं, तो पहला लक्ष्य छोड़ दें क्योंकि यह कुछ भी नहीं बल्कि चर सेट करता है।

$ make x86 debug
make: Nothing to be done for `x86'.

दूसरा मुद्दा: भले ही यह पहला लक्ष्य चलाएगा, मेरी समझ यह है कि जब भी दूसरा लक्ष्य चलाना शुरू होता है तो मूल्यों को बरकरार नहीं रखा जाएगा।

अभी के लिए, मैं उन लक्ष्यों का उपयोग कर रहा हूं जो चर सेट करते हैं और लक्ष्य निकाय के अंत में बिल्ड प्रकार लक्ष्य को एक शर्त के रूप में जोड़ते हैं, लेकिन मुझे आर्किटेक्चर और बिल्ड प्रकार के प्रत्येक संयोजन के लिए लक्ष्य की आवश्यकता होगी।

.PHONY: x86_debug
x86_debug: NAME_PREFIX = x86_64_Linux
x86_debug: TARGET_TRIPLE = x86_64-pc-linux-elf
x86_debug: CC = gcc
x86_debug: CFLAGS += -fomit-frame-pointer
x86_debug: debug
0
superb owl 15 नवम्बर 2018, 20:24

1 उत्तर

सबसे बढ़िया उत्तर

आपका दूसरा दृष्टिकोण बेहतर है। लेकिन आपको प्रत्येक संयोजन के लिए एक लक्ष्य की आवश्यकता नहीं है, यदि आप एक सुसंगत नामकरण योजना का उपयोग करते हैं, और वाइल्डकार्ड लक्ष्य का उपयोग करते हैं:

.PHONY: x86_% arm_% # etc
.PHONY: %_debug %_optimised # etc

x86_%: NAME_PREFIX = x86_64_Linux
x86_%: TARGET_TRIPLE = x86_64-pc-linux-elf
x86_%: CC = gcc
x86_%: CFLAGS += -fomit-frame-pointer

arm_%: NAME_PREFIX = ARM_LINUX
arm_%: TARGET_TRIPLE = arm-linux-eabi
arm_%: CC = arm-linux-gcc


%_debug: CFLAGS += -g

%_optimised: CFLAGS += -O3
1
Toby Speight 15 नवम्बर 2018, 17:28