2010-06-09 3 views
0

Considérons le Makefile suivantConstruire plusieurs executables de petits changements dans les objets

COMP = compiler 

OBJECTS = file1 \ 
     file2 \ 
     file3 \ 
     file4 \ 
     file5_suffix \ 
     file6 \ 
     file7 \ 
     file8 \ 
     file9_suffix \ 
     file10 

all: $(OBJECTS) 
     $(COMP) $(OBJECTS) -o bin/executable_suffix 

est-il un moyen facile de compiler plusieurs exécutables pour différentes valeurs de suffix? Par exemple, l'équivalent de

COMP = compiler 

OBJECTS1 = file1 \ 
     file2 \ 
     file3 \ 
     file4 \ 
     file5_s1 \ 
     file6 \ 
     file7 \ 
     file8 \ 
     file9_s1 \ 
     file10 

OBJECTS2 = file1 \ 
     file2 \ 
     file3 \ 
     file4 \ 
     file5_s2 \ 
     file6 \ 
     file7 \ 
     file8 \ 
     file9_s2 \ 
     file10 

all: $(OBJECTS1) $(OBJECTS2) 
     $(COMP) $(OBJECTS1) -o bin/executable_s1 
     $(COMP) $(OBJECTS2) -o bin/executable_s2 

mais sans redéfinir la liste entière des objets? Dans le cas réel que je traite, il pourrait y avoir plus de 50 objets et une douzaine de binaires à construire, avec seulement de petits changements entre la liste d'objets à chaque fois, donc ce serait bien de ne pas lister tous les objets à chaque fois.

Répondre

0

Cela va le faire. Il peut être rendu plus élégant s'il y a plus de restrictions que vous pouvez mettre sur les variations.

COMP = compiler 

OBJECTS = file1 \ 
    file2 \ 
    file3 \ 
    file4 \ 
    file5 \ 
    file6 \ 
    file7 \ 
    file8 \ 
    file9 \ 
    file10 

# This isn't terribly elegant, but it is quite general. 
# If the variations you have in mind are more regular, such as 
# changing only file5 and file9 for all executables, then there 
# are tidier ways to do it. 
OBJECTS1 := $(OBJECTS) 
OBJECTS1 := $(patsubst file5,file5_s1,$(OBJECTS1)) 
OBJECTS1 := $(patsubst file9,file9_s1,$(OBJECTS1)) 

OBJECTS2 := $(OBJECTS) 
OBJECTS2 := $(patsubst file5,file5_s2,$(OBJECTS2)) 
OBJECTS2 := $(patsubst file9,file9_s2,$(OBJECTS2)) 

all: bin/executable_s1 bin/executable_s2 

# It looks a little clumsy to include the path in the target, 
# but the idea is that the target should be what it's actually making, 
# which is bin/executable_s1, not executable_s1. 

bin/executable_s1: $(OBJECTS1) 
bin/executable_s2: $(OBJECTS2) 

bin/executable_%: 
    $(COMP) $^ -o [email protected] 
Questions connexes