2010-04-14 4 views
5

Mon projet (un langage interprété) a une bibliothèque standard composée de plusieurs fichiers, chacun d'eux sera construit dans une bibliothèque dynamique .so que l'interpréteur chargera à la demande de l'utilisateur (avec un directive d'importation). Chaque fichier source est situé dans un sous-répertoire représentant son « espace de noms », par exemple:Makefile: Construire dans une arborescence séparée

libraries tree http://img707.imageshack.us/img707/7299/screenshot1tv.png

Le processus de construction doit créer un répertoire « construire », puis quand chaque fichier compile doit créer son espace de noms répertoire à l'intérieur du "build" un, par exemple, lors de la compilation

std/io/network/tcp.cc 

il exécuter une commande mkdir avec

mkdir -p build/std/io/network 

L'extrait Makefile est:

STDSRC=stdlib/std/hashing/md5.cc \ 
     stdlib/std/hashing/crc32.cc \ 
     stdlib/std/hashing/sha1.cc \ 
     stdlib/std/hashing/sha2.cc \ 
     stdlib/std/io/network/http.cc \ 
     stdlib/std/io/network/tcp.cc \ 
     stdlib/std/io/network/smtp.cc \ 
     stdlib/std/io/file.cc \ 
     stdlib/std/io/console.cc \ 
     stdlib/std/io/xml.cc \ 
     stdlib/std/type/reflection.cc \ 
     stdlib/std/type/string.cc \ 
     stdlib/std/type/matrix.cc \ 
     stdlib/std/type/array.cc \ 
     stdlib/std/type/map.cc \ 
     stdlib/std/type/type.cc \ 
     stdlib/std/type/binary.cc \ 
     stdlib/std/encoding.cc \ 
     stdlib/std/os/dll.cc \ 
     stdlib/std/os/time.cc \ 
     stdlib/std/os/threads.cc \ 
     stdlib/std/os/process.cc \ 
     stdlib/std/pcre.cc \ 
     stdlib/std/math.cc 

STDOBJ=$(STDSRC:.cc=.so) 

all: stdlib 

stdlib: $(STDOBJ) 

.cc.so: 
    mkdir -p `dirname $< | sed -e 's/stdlib/stdlib\/build/'` 
    $(CXX) $< -o `dirname $< | sed -e 's/stdlib/stdlib\/build/'`/`basename $< .cc`.so $(CFLAGS) $(LDFLAGS) 

J'ai deux questions:

1 - Le problème est que la commande make, je ne sais vraiment pas pourquoi, ne vérifie pas si un fichier a été modifié et lancer le processus de construction sur tous les fichiers, peu importe quoi, donc si je dois construire un seul fichier, je dois les construire tout ou utiliser la commande:

make path/to/single/file.so 

est-il un moyen de résoudre ce problème?

2 - Une façon de faire cela de façon "propre" sans avoir à distribuer tous les répertoires de construction avec les sources?

Merci

Répondre

11

Pour 1) le problème est que la cible de votre règle (stdlib/something.so) n'est pas exactement ce que fait la règle (construire/something.so), alors assurez-vous toujours pense qu'il doit faire la cible. Cela devrait le réparer (j'utilise GNUMake):

STDOBJ=$(patsubst stdlib%.cc,build%.so, $(STDSRC)) 

all: stdlib 

stdlib: $(STDOBJ) 

build/%.so: stdlib/%.cc 
mkdir -p $(dir [email protected]) 
    $(CXX) $< -o [email protected] $(CFLAGS) $(LDFLAGS) 

Pour 2) Je ne suis pas sûr de ce que vous voulez dire. Si vous voulez que la structure de répertoire de construction que vous décrivez, cela va le faire.