2010-04-14 7 views
5

Mój projekt (język interpretowany) ma standardową bibliotekę złożoną z wielu plików, każdy z nich będzie wbudowany w bibliotekę dynamiczną .so, którą interpreter załaduje na żądanie użytkownika (z dyrektywa importowa). Każdy plik źródłowy znajduje się w podkatalogu reprezentującego jego „nazw”, na przykład:Makefile: Utwórz w osobnym drzewie katalogów

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

Build musi utworzyć katalog „budować”, a następnie, gdy każdy plik jest kompilacji musi stworzyć swoją nazw katalog wewnątrz "build" jednego, na przykład, podczas kompilowania

std/io/network/tcp.cc 

on uruchomić komendę mkdir z

mkdir -p build/std/io/network 

Makefile fragment brzmi:

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) 

Mam dwa pytania:

1 - Problem polega na tym, że polecenie make, ja naprawdę nie wiem dlaczego, nie sprawdza, czy plik został zmodyfikowany i uruchomić proces budowania na wszystkich plików bez względu na to, więc jeśli trzeba zbudować tylko jeden plik, mam je wszystkie zbudować lub użyć polecenia:

make path/to/single/file.so 

Czy istnieje jakiś sposób, aby rozwiązać ten problem?

2 - Czy można to zrobić w "czystszy" sposób, bez konieczności rozprowadzania wszystkich katalogów kompilacji za pomocą źródeł?

Dzięki

Odpowiedz

11

Dla 1) Problem polega na tym, że cel reguły (stdlib/something.so) nie jest dokładnie to, co sprawia, że ​​reguła (build/something.so), dlatego zawsze myśli to musi zrobić cel. To powinno naprawić (używam 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) 

Dla 2) Nie jestem pewien co masz na myśli. Jeśli chcesz opisać strukturę katalogu kompilacji, zrobi to.

Powiązane problemy