# TODO: Add a section for installation # Makefile for (the project) # Version 3.0 # Jennifer Vesperman # 14 August 2001 # # Version 4.0 # Mitch Davis # 10 January 2002makefile에 헤더를 포함하고 향상시키고자 하는 것을 기록해 놓으면 정말 유용하게 사용할 수 있습니다. 필자의 makefile을 통해 우리가 하고자 하는 일이 무엇인지 알 수 있습니다 .
# Set up the compiler directories xmlc_j:= /usr/local/lib/xmlc2.0.1/xmlc.jar install_d:= /usr/local/apps/jakarta-tomcat-3.2.2/webapps/example servlet_d:= $(tomcathome)/lib class_d:= $(install_d)/WEB-INF/classes class_example_d= $(class_d)/example # (additional directory definitions snipped.)컴파일에 필요한 경로는 변수로 설정할 수 있습니다. 이를 통해 설치가 변경되더라도 쉽게 수정할 수 있습니다. 그리고 다른 종류의 컴퓨터에서 설정을 자동으로 변경하기 위해 조건문과 셸 함수를 사용할 수 있습니다. 조건문과 셸 함수는 뒤에서 자세히 다루겠습니다.
ifeq ($(shell uname -n),install) # For compiling on install machine install_d:= /usr/local/jakarta-tomcat-3.2.2/webapps/example endif재귀적으로 확장되는 변수
# These exports are for xmlc, which is # a java program which calls javac. # javac를 호출하는 xmlc라는 프로그램을 위한 설정 export JAVAC:= $(java_h)/bin/javac export JAVA:= $(java_h)/bin/java때때로 makefile 내에서 환경 변수를 설정해 주어야 합니다. 이것은 보통 특별 버전의 컴파일러를 사용해야만 하는 프로젝트가 있을 경우에만 그렇습니다. 이때에는 변수 값을 신중히 선택하십시오. EDITOR 변수를 바꾸어서 다른 개발 팀원들을 당혹스럽게 만들 수 있기 때문입니다.
# Set up the classpaths for Javac # Javac를 위한 classpaths 설정 classpath:= \ $(cookie_d)/cookiebuster.jar \ $(example_j) \ $(hsqldb_d)/hsqldb.jar \ $(xmlc_j) \ $(xml_j) \ $(jetty_d)/com.mortbay.jetty.jar # Convert the spaces to colons. This trick is from # the make info file. # 빈칸을 콜론으로 바꿉니다. 이 트릭은 make info 파일에 있습니다. empty:= space:= $(empty) $(empty) classpath:= $(subst $(space),:,$(classpath))classpath 변수는 표준이고 간단히 확장되는 변수입니다. 이 변수의 정의는 여러 라인에 걸쳐 있습니다. 여기서 미치(Mitch)는 path를 구분하는 빈칸을 콜론으로 바꾸기 위해 make 함수를 이용했습니다. 그는 이렇게 정의하는 것이 한 라인에서 콜론으로 구분지어 정의하는 것보다 훨씬 더 알아보기에 좋다고 생각합니다. 물론 classpath 내에 빈공간이 있다고 하더라도 이를 사용해서는 안됩니다.
참고 도서 |
# If there"s already a CLASSPATH, put it on the front # 만약 CLASSPATH가 이미 존재한다면 가장 앞쪽에 붙힙니다. ifneq ($(CLASSPATH),) classpath:= $(CLASSPATH):$(classpath) endif # Re-export the CLASSPATH. # CLASSPATH를 다시 export합니다. export CLASSPATH:=$(classpath)Make에는 조건문이 있으며 종종 변수를 설정하는데 쓰입니다. 사용 할 수 있는 조건문으로는 ifeq, ifneq, ifdef, ifndef가 있습니다. else 절은 옵션이고 인자는 괄호([ ])나 작은 따옴표 또는 큰 따옴표 사이에 올 수 있습니다.
ifeq (arg1, arg2) statement/s else statement/s endif셸 함수와 기타 make 함수
# 소스를 담고 있는 디렉토리를 검색하고 # 생성된 .class 파일에 맞는 이름을 생성합니다. # example/util/*에 있는 클래스들이 먼저 컴파일되게 합니다. CLASSFILES_view:= $(patsubst %.java,$(class_d)/%.class, $(shell find example/util -name "*.java")) # 유틸이나 뷰가 아닌 소스를 찾습니다. # grep -v 대신 -apth -prune을 사용하십시요. # find(1) man page의 예제를 참조하시기 바랍니다. CLASSFILES_nonview:= $(patsubst %.java,$(class_d)/%.class, $(shell find example -path example/util -prune -o -path example/views -prune -o -name "*.java" -a -print)) # xmlc에 의해 .html 파일로부터 생성된 class를 찾습니다. # 단, mockup 디렉토리에 있는 것은 제외합니다. CLASSFILES:= $(CLASSFILES_view) $(CLASSFILES_nonview) VIEWFILES:= $(patsubst %.html,$(class_d)/%.class,$(shell find example -path example/views/mockups -prune -o -name "*.html" -a -print))이 makefile은 표준 make 함수뿐만 아니라 셸 함수도 포함하고 있습니다. 셸 함수 문법은 $(쉘 명령어)입니다. 이는 셸 함수 결과를 리턴합니다. 이때 엔터는 제거됩니다.
# .html과 .java 파일을 어떻게 컴파일 할 것인가 htmlcompile=$(XMLC) -d $(class_d) -class $(subst /,., $(basename $<)) $< javacompile=javac -sourcepath . -d $(class_d) $(filter %.java,$?)이는 재귀적으로 확장되는 변수들로 변수가 실질적으로 필요할 때 계산됩니다 . 여기서 변수들은 재귀적으로 확장되어야 하는데 이는 변수들이 전제조건 리스트에 의존적인 자동 변수들을 포함하고 있고 룰에서 명령어 문자열로 사용될 것이기 때문입니다.(자동 변수에 대해서는 「make 소개」에 잘 설명되어 있다.)
$(VIEWFILES): $(class_example_view_d)/%.class: example/views/%.html $(class_d) $(htmlcompile) $(CLASSFILES): $(class_example_d)/%.class: example/%.java $(class_d) $(javacompile)이 룰의 첫번째 라인은 세 부분으로 구성되어 있습니다. 이는 정적 패턴 룰(static pattern rules)이라 불리는 GNU make의 특별한 룰입니다. 「make 소개」를 보시면 패턴 룰에 대한 소개가 간단하게 되어 있습니다. 정적 패턴 룰의 문법은 다음과 같습니다.
targets: target-pattern: dependency-patterns commands$(class_example_view_d) 디렉토리에 있는 .class 파일은 example/views/%.html 디렉토리에 있는 .class와 상응하는 .html 파일로부터 생성할 수 있습니다. 하지만 이는 .class 파일이 $(VIEWFILES) 리스트의 일부분일 때만 가능합니다. 파일 타입이 .A인 파일을 .B로 변경하는 방법에는 여러 가지가 있는데 그 선택은 변경하는 파일에 따라 의존적이라면 정적 패턴 룰을 사용하기 바랍니다.
# Make가 알아야 할 것들 .SUFFIXES : .html .java .class .PHONY : clean all show_classpath # 중요 타겟 : make all all: $(VIEWFILES) $(CLASSFILES) $(class_d): mkdir $@ show_classpath: @echo Here is the CLASSPATH passed to javac: @echo $$CLASSPATH # $$ 표기법에 주목 clean: -rm -rf $(class_d)all 타겟은 패턴 룰에 의존적입니다. 다른 룰은 아래와 같은 형식으로 되어 있는 간단한 룰입니다.
target: prerequisites command간단한 룰과 phony 룰은 이미 「make 소개」에서 설명했습니다.
이전 글 : AIM Filter의 백도어와 gzip의 버퍼 오버플로우
다음 글 : SAN과 NAS의 선택에 결정적인 10가지 요인
최신 콘텐츠