Как поручить Makefile использовать разные компиляторы - PullRequest
13 голосов
/ 22 июня 2010

Я должен построить свой код для двух разных платформ одновременно, используя два разных компилятора и библиотеки.Как я могу сделать это с одним файлом make.

В настоящее время содержимое моего make-файла приведено нижеКак я могу дать ему команду изменить компилятор на gcc в том же файле 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):
    -@$(MKDIR) "$(OUTPUT_DIRECTORY)"
endif

ifneq ($(OBJ),)
all: $(OBJ)
$(OBJ_DIR):
    -@$(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 $@ $<


EXECUTABLE=MyExecutable

all: $(SOURCES) $(EXECUTABLE)

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

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


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

Ответы [ 3 ]

8 голосов
/ 22 июня 2010

Я бы начал с того, что поместил все специфичные для платформы определения в отдельный make-файл.Таким способом вы можете сделать:

include $(TARGET).make

Где $ (TARGET) .make определяет CC и другие переменные для каждой конкретной платформы.Затем вы можете вызвать make рекурсивно, установив TARGET на то, что вы хотите.Что-то вроде:

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

Но на самом деле существует множество способов достижения одной и той же вещи.

2 голосов
/ 22 июня 2010

Использовать автоконф.Когда вы конфигурируете проект с ./configure, он автоматически выберет тот, который доступен.

0 голосов
/ 22 июня 2010

Было бы намного легче читать, если бы в вашем сообщении были правильно сохранены разрывы строк.

В любом случае, я ожидаю, что вам понадобится две копии нескольких вещей в Makefile, например, в форме

all : all-platform1 all-platform2

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

Вполне возможно, что вы сможете автоматически сгенерировать такой make-файл, чтобы сэкономить некоторые усилия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...