2012-02-07 10 views
14

मैं अपनी बिन और मेरी कोड फ़ाइलों को अलग निर्देशिका में विभाजित करने में सक्षम होना चाहता हूं क्योंकि यह वर्तमान स्थिति में प्रबंधन करना मुश्किल हो रहा है।मेकफ़ाइल स्रोत कोड और बाइनरी के लिए अलग निर्देशिका का उपयोग कैसे कर सकता है?

मैं आदर्श करना चाहते हैं

project_dir 
|-Makefile 
|-run_tests.sh 
| 
|__source 
| |-program1.cpp 
| |-program2.cpp 
| 
|__bin 
    |-program1 
    |-program2 

हालांकि मैं मैन्युअल रूप से हर कार्यक्रम (मन में भालू है कि हर कार्यक्रम के एक है के लिए नियमों को लिखने के लिए बिना इस प्राप्त करने के लिए अपने मौजूदा प्रणाली के साथ काम करने में असमर्थ हूँ अलग कार्यक्रम, वस्तुओं की नहीं एक श्रृंखला एक साथ जुड़े हुए)

#Current make system 
BIN=./bin/ 
SOURCE=./source/ 

LIST=program1 program2... 

all: $(LIST) 

%: $(SOURCE)%.cpp 
    $(CC) $(INC) $< $(CFLAGS) -o $(BIN)[email protected] $(LIBS) 

यह छोड़कर काम करता है मैं इसे वर्तमान पथ में लक्ष्य नहीं देख सकते हैं तो यह लगता है कि यह हमेशा बाइनरी पुनर्निर्माण भले ही स्रोत फ़ाइलें नहीं है बदला हुआ।

इस समय मेरा एकमात्र विचार मेकफ़ाइल बनाने के लिए एक प्रोग्राम लिखना है, लेकिन मैं ऐसा नहीं करना चाहता हूं। उपयोग automake:

+0

पारंपरिक दृष्टिकोण स्रोत निर्देशिका 'src' को कॉल करना, वहां बाइनरी बनाना है, और एक अलग चरण' इंस्टॉल 'है जिसमें बाइनरी को' bin' निर्देशिका में कॉपी किया गया है - यहां तक ​​कि एक विशेष उपयोगिता भी है ' ऐसा करने के लिए 'इंस्टॉल करें। – reinierpost

उत्तर

17

आपने लगभग थे ...

#Current make system 
BIN=./bin/ 
SOURCE=./source/ 

LIST=$(BIN)/program1 $(BIN)/program2... 

all: $(LIST) 

$(BIN)/%: $(SOURCE)%.cpp 
    $(CC) $(INC) $< $(CFLAGS) -o [email protected] $(LIBS) 

आप निम्न

PROG=program1 program2 
LIST=$(addprefix $(BIN)/, $(PROG)) 
+0

बेवकूफ सवाल हो सकता है लेकिन कमांड लाइन पर '%' चर (यानी नाम कम निर्देशिका) का उपयोग करने का कोई तरीका है। तो "जीसीसी ब्ला ब्लाह-डी%" (इसलिए प्रोग्राम को इसका नाम पता है) – 111111

+2

हां, आप स्टेम प्राप्त करने के लिए '$ *' का उपयोग कर सकते हैं। –

+0

उत्कृष्ट मुझे लगता है कि मेरी मेक फ़ाइल पूरी हो चुकी है, आपकी सभी मदद के लिए धन्यवाद। – 111111

1

आसान समाधान का उपयोग करके LIST आसान बना सकते हैं।

यदि आप इसे हाथ से करना चाहते हैं, तो आपको vpath निर्देश या VPATH पर्यावरण चर लागू करने की आवश्यकता होगी। जीएनयू मैनुअल में उनके बारे में a section है। अपनी मेकफ़ाइल सीधे bin निर्देशिका में रखें, स्रोत निर्देशिका में VPATH सेट करें, और निहित नियम दोबारा काम करेंगे।

+1

अगर इसे अच्छी तरह से बनाई गई फ़ाइल के साथ किया जा सकता है तो ऑटोमेक का प्रशंसक नहीं है। – 111111

1

मेकफ़ाइल का एक पूर्ण तैयार संस्करण है। /

CC   = g++ 
LD   = g++ 
CFLAG  = -Wall 
PROG_NAME = prog 

SRC_DIR  = ./src 
BUILD_DIR = ./build 
BIN_DIR  = ./bin 
SRC_LIST = $(wildcard $(SRC_DIR)/*.cpp) 
OBJ_LIST = $(BUILD_DIR)/$(notdir $(SRC_LIST:.cpp=.o)) 

.PHONY: all clean $(PROG_NAME) compile 

all: $(PROG_NAME) 

compile: 
    $(CC) -c $(CFLAG) $(SRC_LIST) -o $(OBJ_LIST) 

$(PROG_NAME): compile 
    $(LD) $(OBJ_LIST) -o $(BIN_DIR)/[email protected] 

clean: 
    rm -f $(BIN_DIR)/$(PROG_NAME) $(BUILD_DIR)/*.o 
पर /bin/

तब का उपयोग निम्नलिखित Makefile: सीपीपी फ़ाइलों के लिए /build/ :

निम्न निर्देशिका

ओ फ़ाइलों के लिए

के साथ अपने फ़ोल्डर तैयार /src/ बाइनरी फ़ाइलों के लिए

आपके अंतिम कार्यक्रम को /bin/ में प्रोजे के रूप में नामित किया जाएगा, हर बार जब आप संकलित करेंगे कोड, द्विआधारी /build/ पर अलग हो जाएंगे ताकि स्रोत कोड निर्देशिका बहुत साफ और साफ हो।

संबंधित मुद्दे

 संबंधित मुद्दे