2011-08-01 2 views
1

question courte et facile, mais il me semble avoir le bloc d'un écrivain ici:Comment puis-je obtenir make pour mettre les binaires dans un endroit différent?

Supposons que j'ai un fichier de code source dans le même répertoire que le makefile que j'utilise pour construire le programme:

[email protected]:~/prog$ ls 
binaries includes main.c Makefile 

Comment puis-je faire pour mettre les binaires pour mon main.c dans le dir binaries? Ensuite, lors d'une seconde exécution, make devrait voir si le fichier binaire est à jour (et ne le recompile pas) comme d'habitude.

Ma pensée était quelque chose comme ceci:

# Makefile 
.PHONY: all 

SOURCES := $(wildcard *.c) 
TARGETS := $(subst %.c,binaries/%.o,$(SOURCES)) 

all:$(TARGETS) 

$(TARGETS):$(SOURCES) 
    ./compile "$(subst .o,.c,$(@F))" -o "[email protected]" 

Répondre

2

Ne dites pas toutes les cibles dépendent de toutes les sources, ont plutôt une règle de modèle

binaries/%.o: %.c 
    ./compile ... -o [email protected] -c $< 

vous pouvez aussi avoir besoin d'utiliser un vpath

Révision: Vous avez également eu un problème avec votre ... ce Subst essai travaillé (juste pour compiler des fichiers .o individuels, vous avez encore besoin de les relier, ce qui serait une règle très simple)

# Makefile 
.PHONY: all 

SOURCES := $(wildcard *.c) 
TARGETS := $(patsubst %.c,binaries/%.o,$(SOURCES)) 

all:$(TARGETS) 

binaries/%.o: %.c 
    $(CC) -o [email protected] -c $< 
+0

Cela met l'erreur: 'Aucune règle pour faire la cible' main.o », nécessaire par "tous". Stop.' –

+0

quelque chose est différent dans nos environnements parce que dans le mien le subst ne fait pas la bonne chose ... y répondre cependant est basé sur un système de travail (ne pas utiliser la sélection de source wildcard, c'est une pratique que je vais éviter) ... mal jeter un oeil cependant dans quelques heures – nhed

+0

Voici ce qui se passe avec votre code: http://paste.ubuntu.com/656480/ –

Questions connexes