2011-09-02 6 views
3

에서 찾을 :나는 이런 식으로 뭔가가있는 경우 메이크 배열

PROJECTS += path/to/first 
PROJECTS += path/to/second 
PROJECTS += path/to/third 

LIBS += lib_output/first.lib 
LIBS += lib_output/second.lib 
LIBS += lib_output/third.lib 

가 어떻게 LIBS += lib_output/first.libPROJECTS += path/to/first에서 프로젝트를 연결할 수 있을까? makefile에서 사용할 수있는 hashmap과 같은 것이 있습니까? 또는 배열로 검색 할 수 있습니까?

+2

복잡한 변수를 실제로 만들지는 않습니다. 우리가하는 일에 대해 더 잘 알 수 있습니까? – Beta

답변

12

당신은 조회 computed variable names를 사용하여 테이블과 변수 이름은 점 및 슬래시와 같은 some special characters 포함 할 수 있도록 사실을 시뮬레이션 할 수 있습니다 : 출력

PROJECTS += path/to/first 
PROJECTS += path/to/second 
PROJECTS += path/to/third 

LIBS += lib_output/first.lib 
LIBS += lib_output/second.lib 
LIBS += lib_output/third.lib 

lookup.path/to/first := lib_output/first.lib 
lookup.path/to/second := lib_output/second.lib 
lookup.path/to/third := lib_output/third.lib 

path := path/to/first 
$(info ${path} -> ${lookup.${path}}) 
path := path/to/second 
$(info ${path} -> ${lookup.${path}}) 
path := path/to/third 
$(info ${path} -> ${lookup.${path}}) 

을 :

$ make 
path/to/first -> lib_output/first.lib 
path/to/second -> lib_output/second.lib 
path/to/third -> lib_output/third.lib 
+0

규칙에서 사용할 수 있습니까? 나는 foo.o와 같은 규칙을 가지고있다 : randompath/foo.c, 나는 다양한 경로 아래에서 그런 파일들을 많이 가지고있다. 나는 쉽게 객체 이름을 생성 할 수있다. (notdir $ (SOURCES : .c = .o)), 그러나 나는 파생 할 수 없다. 패턴 규칙의 소스 이름 솔루션을 사용하여 모두 하나의 규칙을 만들 수 있습니까? – user377178

+2

['VPATH'] (http://www.gnu.org/software/make/manual/make.html#General-Search)를 사용해 다른 디렉토리의 소스를 찾을 수 있습니다. 더 나은 해결책은 객체 디렉토리의 소스 디렉토리 계층 구조를 복제하는 것입니다. 그러면 파일 이름 충돌을 피할 수 있습니다. –

+0

좋은 포인터. 나는 vpath (소문자)가 내가 필요한 것이라고 생각한다. 내 개체 파일 이름은 실제로 '병합 된'경로입니다 (예 : some_5_steps_deep_path_foo.c.o. 체리 만 프로젝트의 각 파일에서 몇 파일을 선택하면 폴더 구조를 복제하는 것보다 훨씬 효율적입니다. – user377178

0

내가 잘 모르겠어요 I 귀하의 질문을 완전히 이해하지만, word 함수가 필요한 것일 수 있습니다 (GNU make 확장 기능 일 수 있음) :

$(word 2, $(PROJECTS))path/to/second,
$(word 2, $(LIBS))을 반환합니다. lib_output/second.lib을 반환합니다.

관련 문제