2010-06-22 7 views
13

Je dois créer mon code pour deux plates-formes différentes à la fois en utilisant deux compilateurs et bibliothèques différents. Comment puis-je faire cela avec un fichier make unique.Comment configurer Makefile pour utiliser différents compilateurs

Actuellement, mon contenu makefile est donné ci-dessous. Comment puis-je lui demander de changer le compilateur en gcc dans le même fichier 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) 

Répondre

8

Je commencerais par mettre toutes les définitions spécifiques à la plate-forme dans un makefile séparé. De cette façon, vous pouvez faire:

include $(TARGET).make 

Où $ (TARGET) .make définit CC et d'autres variables pour chaque plate-forme particulière. Ensuite, vous pouvez appeler make récursivement en réglant TARGET sur ce que vous voulez. Quelque chose comme:

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

Mais en réalité, il existe de nombreuses façons de réaliser la même chose.

0

Cela serait beaucoup plus facile à lire si les sauts de ligne étaient correctement conservés dans votre publication.

Quoi qu'il en soit, je pense que vous allez avoir deux copies d'un certain nombre de choses dans le Makefile, de sorte que c'est de la forme

all : all-platform1 all-platform2 

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

Il est possible que vous pourriez être en mesure d'auto -generate un makefile comme ça, pour économiser un peu d'effort.

2

Utiliser autoconf. Lorsque vous configurez le projet avec ./configure, il choisit automatiquement celui qui est disponible.

+1

Mais j'ai les deux compilateurs disponibles, je veux définir makefile afin que je puisse dire quel compilateur utiliser – Poorna

+0

Vous pouvez faire './configure CC =" votre compilateur "' et il sera configuré avec celui que vous spécifier – Phong

Questions connexes