2010-04-14 92 views
5

我的項目(一種解釋型語言)有一個由多個文件組成的標準庫,它們中的每一個都將被構建到.so動態庫中,解釋器將根據用戶請求加載導入指令)。 每個源文件所在爲代表的「命名空間」的子目錄,例如:Makefile:構建在一個單獨的目錄樹中

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

構建過程必須創建一個「構建」目錄,然後在每個文件進行編譯,創建命名空間編譯

std/io/network/tcp.cc 

當 「打造」 一個,例如,目錄裏面運行,他用mkdir命令

mkdir -p build/std/io/network 

Makefile的片段是:

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) 

我有兩個問題:

1 - 問題是,make命令,我真的不知道爲什麼,不檢查文件是否被修改並啓動構建過程中的所有文件,不管是什麼,所以,如果我需要建立只有一個文件,我要建立他們所有或使用命令:

make path/to/single/file.so 

有什麼辦法解決?

2 - 任何方式以「清潔」的方式做到這一點,而不必分配所有的源代碼的目錄?

感謝

回答

11

爲1)的問題是,你的規則的目標(STDLIB/something.so)是不完全規則進行(建/ something.so),所以要始終認爲它必須做什麼目標。這應該解決它(我使用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) 

對於2)我不知道你的意思。如果你想要你描述的構建目錄結構,這將做到這一點。