2010-04-14 7 views
5

내 프로젝트 (해석 된 언어)는 여러 파일로 구성된 표준 라이브러리를 가지며, 각각은 인터프리터가 사용자 요청에 따라로드하는 .so 동적 라이브러리로 빌드됩니다 (import 지시문). 각 소스 파일은 예를 들어, 자사의 "네임 스페이스"를 나타내는 서브 디렉토리에 위치합니다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 - 소스를 가진 모든 빌드 디렉토리를 배포하지 않고도 "깔끔한"방법으로이 작업을 수행 할 수있는 방법은 무엇입니까?/something.so 규칙의 대상 (다음 stdlib)이 규칙은() something.so/구축, 그래서 항상해야합니다 생각 확인하게 정확히 아니라고

감사

경우 1

답변

11

) 문제가 목표. 이것은 (내가 GNUMake을 사용하고 있습니다)을 수정해야합니다 :

2의
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) 

) 나는 당신이 무슨 뜻인지 모르겠어요. 설명하는 빌드 디렉토리 구조가 필요하면이 작업을 수행합니다.

관련 문제