2010-06-22 27 views
13

Tôi phải xây dựng mã của mình cho hai nền tảng khác nhau cùng một lúc bằng cách sử dụng hai trình biên dịch và thư viện khác nhau. Làm thế nào tôi có thể làm điều này với duy nhất làm cho tập tin.Cách hướng dẫn Makefile sử dụng các trình biên dịch khác nhau

Hiện tại nội dung của tệp makefile của tôi được đưa ra dưới đây. Làm thế nào tôi có thể hướng dẫn nó để thay đổi trình biên dịch để gcc trong cùng một makefile?

VPATH = /root/Documents/project/src 

CROSS_COMPILE = /opt/compilers/bin/compiler1 
CXX = $(CROSS_COMPILE)-g++ 
CC = $(CROSS_COMPILE)-gcc 
AS = $(CROSS_COMPILE)-as 
AR = $(CROSS_COMPILE)-ar 
NM = $(CROSS_COMPILE)-nm 
LD = $(CROSS_COMPILE)-ld 
OBJDUMP = $(CROSS_COMPILE)-objdump 
OBJCOPY = $(CROSS_COMPILE)-objcopy 
RANLIB = $(CROSS_COMPILE)-ranlib 
STRIP = $(CROSS_COMPILE)-strip 


CFLAGS  = -c -Wall -D_REENTRANT -DACE_HAS_AIO_CALLS -D_GNU_SOURCE -DACE_HAS_EXCEPTIONS -D__ACE_INLINE__ 
LDFLAGS  = -L. -L/etc/ACE_wrappers/lib 
CPPFLAGS  += -I/etc/ACE_wrappers -I/etc/ACE_wrappers/ace 
LDLIBS  = -lACE 

OUTPUT_DIRECTORY=/root/Documents/bin 
OBJ=/root/Documents/obj 

ifneq ($(OUTPUT_DIRECTORY),) 
all: $(OUTPUT_DIRECTORY) 
$(OUTPUT_DIRECTORY): 
    [email protected]$(MKDIR) "$(OUTPUT_DIRECTORY)" 
endif 

ifneq ($(OBJ),) 
all: $(OBJ) 
$(OBJ_DIR): 
    [email protected]$(MKDIR) "$(OBJ)" 
endif 

SOURCES=File_1.cpp File_2.cpp 

OBJECTS=$(SOURCES:%.cpp=$(OBJ)/%.o) 

$(OBJ)/%.o: %.cpp 
    @echo Building Objects 
    $(CC) $(CFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c -o [email protected] $< 


EXECUTABLE=MyExecutable 

all: $(SOURCES) $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    @echo $(SOURCES) 
    $(CC) $(LDFLAGS) $(OBJECTS) $(LDLIBS) -o $(OUTPUT_DIRECTORY)/[email protected] 

File_1.o:File_1.cpp 
File_1.o:File_1.cpp 


.PHONY: clean 
clean: 
    rm $(OBJECTS) $(OUTPUT_DIRECTORY)/$(EXECUTABLE) 

Trả lời

8

Tôi bắt đầu bằng cách đặt tất cả các định nghĩa nền tảng cụ thể vào một tệp makefile riêng biệt. Bằng cách đó bạn có thể làm:

include $(TARGET).make 

Trường hợp $ (TARGET) .định nghĩa CC và các biến khác cho từng nền tảng cụ thể. Sau đó, bạn có thể gọi thực hiện đệ quy thiết lập mục tiêu đến những gì bạn muốn. Một cái gì đó như:

build: 
    $(MAKE) TARGET=platform1 all 
    $(MAKE) TARGET=platform2 all 

Nhưng thực sự có rất nhiều cách để bạn có thể đạt được điều tương tự.

0

Điều đó sẽ dễ đọc hơn nhiều nếu các dòng sản phẩm được lưu giữ đúng cách trong bài đăng của bạn.

Dù sao, tôi hy vọng rằng bạn sẽ cần phải có hai bản sao của một số điều trong Makefile, như vậy mà nó là dạng

all : all-platform1 all-platform2 

stuff-platform1 : requirements 
    $(CC1) whatever 
stuff-platform2 : requirements 
    $(CC2) whatever 

Có thể là bạn có thể có thể tự động -generate một makefile như thế này, để tiết kiệm một số nỗ lực mặc dù.

2

Sử dụng tự động xác thực. Khi bạn định cấu hình dự án với ./configure, nó sẽ tự động chọn dự án có sẵn.

+1

Nhưng tôi có cả hai trình biên dịch sẵn có, tôi muốn định nghĩa makefile để tôi có thể nói trình biên dịch nào sử dụng – Poorna

+0

Bạn có thể làm '.confconf CC =" trình biên dịch của bạn "và nó sẽ được cấu hình với trình biên dịch bạn chỉ định – Phong

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