11 괜찮은 기술 문서 모음

Posted by 빵빵빵
2009/04/10 21:41 분류없음



11 괜찮은 기술 문서 모음

원문 : http://www.jiniya.net/tt/271


재미있는 기술 문서들을 모아놓는 코너입니다.
심심하신 분들은 한번씩 읽어보세요.
읽는 만큼 쭉쭉 늘어나는 내공을 느끼실 수 있을 겁니다.


What's new in Visual C++ 2008
Visual Studio 2008이 정식 출시되었습니다.
아래는 Visual C++ 2008의 새로운 기능들을 소개하는 페이지 입니다.
http://msdn2.microsoft.com/en-us/library/bb384632(VS.90).aspx

Visual C++ 2008 Express Edition은 아래 페이지에서 무료로 다운로드 받으실 수 있습니다.
http://www.microsoft.com/express/download/default.aspx

C++ explicit 키워드
http://yesarang.tistory.com/58

Linux Kernel Source
리눅스 커널 소스 사이트 입니다. 크로스 레퍼런스로 만들어놔서 보기 좋네요. *^^*
http://lxr.linux.no/source/
절제의 미학

http://blogs.msdn.com/oldnewthing/archive/2007/10/03/5249866.aspx


코드 생성해서 실행시키기

원 래 이 분야가 개척된 이유는 조금 다른데, 요즘은 보안쪽에서 더 관심을 가지고 있는것처럼 보입니다. 동적으로 코드를 생성하고 실행시키거나 실행 중에 코드 자체가 변형되는 것들이죠. 이런 식으로 런타임에 생성되거나 변형되는 코드는 고전적인 방법으로 리버싱하기가 무척 힘들기 때문에 보안쪽에서 많은 관심을 가지는 듯 합니다.
http://www.codeproject.com/useritems/Self-generating-code.asp

예외 처리

C+ +에서 새로 생겼고 가장 이해하기 힘들고, 가장 의견이 분분한 내용 중 하나가 예외 입니다. 특히나 어떤 상황을 예외로 규정할지에 대해서는 정말 다양한 의견이 있습니다. 이것 또한 종교적인 논쟁의 한 부분이기도 합니다. 하지만 그 논쟁 사이에서 많은 새로운 관점들을 배울 수 있을 것 같아서 모아봤습니다. c++ 그룹에서 진행된 예외와 관련된 글타래들 입니다.

예외처리 매커니즘은 좋다. 하지만 무엇을 예외로 처리할 것인가?
무엇이 예외적인 상황인가?
왜 예외를 사용하는가?
생성자에서 예외를 던질까? 말까?
어떤 예외들이 있을까?

스레드 스위칭
http://www.codeproject.com/useritems/threadswitch.asp

Vim Tip
저 는 소스 코드 편집을 주로 vim으로 합니다. 웹에 올리거나 기사를 쓸 때 주로 편집하는 편인데 이 때 새로 줄이 길어서 종종 문제가 되곤 합니다. 아래 명령어를 사용하면 80 글자 이상되는 부분은 색깔을 표시해 줍니다. 편집할 때 도움이되죠. 80을 다른 숫자로 변경해 주면 길이를 바꿀 수 있습니다.
:match Error /\%>80v./

C++ 멤버 함수 포인터 크기

http://blog.naver.com/drvoss/20041594354

C/C++에서 전역 변수가 초기화 되는 과정
http://blogs.msdn.com/vcblog/archive/2006/10/20/crt-initialization.aspx

__purecall에 관해서
http://blogs.msdn.com/oldnewthing/archive/2004/04/28/122037.aspx

투명 PNG 디스플레이 하기
http://www.codeproject.com/useritems/transparent__png.asp

메모리 릭 탐지하기
http://minjang.egloos.com/1414494

DllMain에서 스레드 생성하면 데드락 걸릴까??
http://blogs.msdn.com/oldnewthing/archive/2007/09/04/4731478.aspx

다른 프로세스 TEB, PEB 구하기
http://readdie.woweb.net/entry/...

윈도우 사용 시간 제한 방법
http://www.codeproject.com/useritems/ProjectFromHell.asp

네이티브 애플리케이션
http://www.microsoft.com/technet/sysinternals/information/NativeApplications.mspx

Windows 2000/XP에서 동작하는 리얼 타임 모듈
http://www.codeproject.com/system/RealTimeModule.asp

Standard Annotation Language(SAL)을 이용한 버퍼오버런 방지 기술
http://blog.naver.com/drvoss/20041282591
http://blog.naver.com/drvoss/20042737417

MFC MDI 프레임워크에서 핸재 생성된 MDI 자식들 순회하는 방법
http://support.microsoft.com/default.aspx?scid=kb;en-us;131994

PE 포맷 체크섬 알고리즘
http://www.codeproject.com/useritems/PEChecksum.asp

유사 랜덤 제너레이터
http://www.codeproject.com/useritems/PRNG.asp

모질라 브라우저 임베딩 시키기
http://www.codeproject.com/useritems/iemozilla.asp

Vectored Exception Handling (VEH)
http://msdn.microsoft.com/msdnmag/issues/01/09/hood/
http://www.codeproject.com/useritems/VEH.asp

C++ CLI Micro Chess

http://www.codeproject.com/cpp/cpp_microchess.asp


2009/04/10 21:41 2009/04/10 21:41

07 이클립스(Eclipse) 단축키 및 환경설정

Posted by 빵빵빵
2009/04/10 21:36 분류없음



07 이클립스(Eclipse) 단축키 및 환경설정

원문 : http://kkamagui.springnote.com/pages/432649

 

들어가기 전에...


0.시작하면서...

 이클립스 단축키 및 환경설정은 Window -> Preferences 메뉴를 통해 설정가능하다. 여기에 설정된 내용은 프로젝트와 관계없이 Global 하게 설정되는 내용이며 해당 프로젝트에만 특수하게 적용되는 설정은 Project -> Properties 메뉴를 통해서 설정가능하다.

 그럼 이제부터 이클립스 환경을 Visual Studio 환경과 비슷하게 설정하는 방법을 알아보자.



1.윈도우 폰트 설정

 설정1.PNG

<폰트 설정 화면>

  우측의 Basic 항목에서 Text Font와 C/C++에서 Editor Font를 수정하면 된다.



2.단축키 설정

2.1 설정 윈도우

 단축키 설정은 아래의 화면에서 설정가능하다.

 설정2.PNG

<단축키 설정화면>

우측 상단에 에디트 박스에는 단축키 설정 항목에 대한 검색을 수행할 수 있는 에디트 박스가 있다. 위 항목에 설정하고 싶은 검색어를 넣으면 해당 항목이 포함된 부분만 필터링하여 표시해 준다. 주의할 점은 아래의 Include unbound commands 체크 박스를 설정하여서 모든 기능에 대해서 검색이 수행되게 해야 한다는 것이다. 위 체크박스를 클릭하지 않으면 이미 단축키가 할당된 항목에서만 검색을 하므로 단축키가 설정되지 않은 기능에 대해서는 검색할 수 없다.

 검색의 결과로 나온 항목 중에 필요한 항목을 클릭한 후 제일 아래의 Binding: 에디트 박스를 클릭하여 포커스를 이동한 후 입력하고 싶은 키를 누르면 단축키로 설정된다.


2.2 단축키 참고

 Visual Studio와 비슷하게 동작하기 위해서는 아래의 각 항목을 검색하여 단축키를 수정하면 된다(개인적인 취향이 포함된 설정이라 참고만 하도록하자.)

 간혹 설정한 단축키가 먹지 않는 경우가 있는데, 중복 설정된 경우에 흔히 발생하므로 해당 키로 다시 검색하여 다른 기능에 맵핑된 키를 삭제하면 된다.

  • Build Project : F5
  • Clean Project : F6
  • Toggle Source/Header : ALT + O
    • 소스파일과 헤더를 번갈아 가면서 보여주는 옵션
  • Next Editor : Control + Tab
    • 에디터 탭간의 이동
  • Content Assist : Control + Enter
    • Visual Studio의 자동완성과 같은 기능, 아래의 Content Assist 설정 참조 
  • Bookmark Plugin 관련 : Bookmark 플러그인 설치에 대해서는 아래의 북마크 플러그인 참조
    • Go to next bookmark : F2
    • Go to previous bookmark : Shift + F2
    • Toggle bookmark : Control + F2
  • Show Outline : Control + O
    • 해당 파일에 있는 모든 함수 및 변수 표시
  • Open Declaration : F3 
    • 정의로 이동


3.Content Assist 설정

3.1 Indexer 설정

 Content Assist 기능을 사용하려면 Indexer를 이용하여 인덱스를 생성해야 한다. 아래는 Indexer를 설정하는 예제이다.

설정6.PNG

<Indexer 설정>

 메모리 여유가 좀 있다면 위와 같이 Full로 설정하는 것이 좋다. 파일이 변경되는 즉시 업데이트되어 아주 편리하게 사용할 수 있다.


3.2 Content Assist 설정

 ., ->, ::와 같은 확장 가능한 문자열 다음에 얼마의 Delay 뒤에 Content Assist를 표시할 것인지를 설정한다.

설정7.PNG

<Content Assist 설정>


3.3 단축키 설정

Zelon 님의 제보로 키보드 타입을 USB 3으로 할 시에 Control + Space 가 한자 키로 맵핑되어 안되었다는 사실을 알았다.

Zelon 님께 감사드린다.

 Control + Enter로 수정하면 잘 동작한다.

Eclipse.PNG

<Content Assist 단축키 설정>




4.플러그인(Plugin) 설치

4.1 북마크 플러그인(Bookmark Plugin) 설치

 이클립스의 북마크는 Visual Studio의 북마크보다 약간 불편하다. 북마크를 생성할 때마다 이름을 입력해야 하며 Quick하게 이동하기도 불편하게 되어있다. 이러한 기능을 보강하고자 나온 것이 북마크 플러그인이다. http://wimy.com/tt/106에서 내용을 찾아볼 수 있다.

 http://etc.to/eclipse_bookmarks_plugin에 보면 아래와 같은 기능 설명과 업데이트 경로가 나온다.

I just created my second Eclipse plugin which adds several bookmark methods to the editor. The "default" bookmark methods of Eclipse ask for a name and this is often not very useful. The code here adds bookmarks a la "Borland" and bookmarks a la "JCreator". The code has the following options which can all be bound/rebound with the keys dialog under the "Edit" category:

  • Add a numbered bookmark at the cursor: Alt+[digit]. This creates a quick bookmark with the specified number using a "single" keypress. Only one bookmark of the given number can be present in the workspace. Setting the same number bookmark again will clear the earlier instance.
  • Goto a numbered bookmark: Alt+Shift+[digit]. Moves to the bookmark as it was set using Alt+[digit].
  • Toggle Bookmark: Ctrl+B. This drops an unnamed bookmark at the current location. Pressing Ctrl+B again releases the bookmark at that location again. This is often used with "Goto next bookmark" and "Goto previous bookmark".
  • Goto next bookmark in file: Ctrl+N. This locates the next bookmark in the current file and moves there.
  • Goto previous bookmark in file: Ctrl+P. This locates the previous bookmark in the current file and moves there. warning: the Ctrl+P binding is a suggestion only; since Ctrl+P is currently assigned you must add your own key binding using Window -> Preferences -> General -> Keys.

I'll be posting the source of the plugin later on; the plugin can be installed using the update site

http://eclipse.etc.to/updates/

 설치 방법은 아래와 같이 메뉴에서 Install/Update를 이용하면 된다.

설정3.PNG

<Plugin 설치메뉴>


 위 메뉴를 클릭하면 Install/Update 다얼로그가 표시되는데 Search for new features to install 항목을 선택하여 Next 버튼을 누르면 아래와 같은 화면이 표시된다.

설정4.PNG

<새로운 사이트 추가>

 우측 상단의 New Remote Site를 클릭하고 다이얼로그를 위와 같이 체운 후 OK 버튼을 누르면 etc.to 사이트가 추가된다. 북마크 플러그인을 설치하기위해서는 Java Development Tools(JDT)을 설치해야 하므로 Europa Discovery Site 항목을 체크한 뒤에 Finish 버튼을 클릭한다.

 잠시 시간이 지나면 아래와 같은 검색 결과가 표시되는데 Java Development Tools를 체크하여 Next 버튼을 누르면 JDT가 설치된다.

설정5.PNG

<JDT 설치화면>

 JDT의 설치가 끝나면 동일한 방법으로 etc.to 항목을 클릭하고 검색결과로 나온 Eclipse Editor Extentions를 설치하면 정상적으로 완료된다. 북마크 키에 대한 설정은 위의 단축키 설정을 참고하자.


5.기타 기능

5.1 빌드 시에 수정된 파일 자동으로 저장하기

 Eclipse1.PNG


5.2 필요없는 자동완성 막기

설정8.PNG


5.3 소스 폴딩(Folding) 기능 설정

설정9.PNG




5.4 탭(Tab)을 공백(Space)로 변경 및 80 컬럼(Column) 가이드 라인 설정


설정10.PNG



6.마치면서...

 이상으로 이클립스의 단축키 설명 및 환경 설정방법에 대해 알아보았다. 윈도우 프로그래밍에는 Visual Studio를 사용하고 기타(임베디드 or 자바 or 기타 등등) 프로그래밍에는 이클립스를 사용하여 프로그래밍을 편리하게 하자. @0@)/~

2009/04/10 21:36 2009/04/10 21:36

02 간단한 Make 사용법

Posted by 빵빵빵
2009/04/10 21:35 전산(컴퓨터)/리눅스



02 간단한 Make 사용법

원문 : http://kkamagui.springnote.com/pages/359124

 

들어가기 전에...



0.시작하면서...

 통합 개발툴(IDE)를 이용해서 개발하는 경우에 굳이 Makefile을 생성할 필요는 없지만 IDE를 사용하지 않고 개발할 경우, 많은 소스파일을 관리하기위해서 makefile이 필수이다. make는 실제로 굉장히 많은 기능을 가지고 있지만, 그중 몇가지 유용한 기능만 알아도 훨씬 코드 관리가 편리해 진다.

 이제 그 몇가지에 대해서 알아보자. @0@)/~


1.makefile의 기본 형식

 makefile은 기본적으로 아래와 같은 형식으로 이루어진다.

  1. Target File : Source File(Dependency) 
    1. <tab> command

 좌측의 Target File은 make command의 실행 결과로 생성할 파일이고 Source File은 make command에 사용될 파일이다. 아래의 command는 탭으로 한칸 띄우는데 이 탭이 command의 구분자의 역할을 한다. 만약 Abc.c 파일을 gcc -c로 컴파일 해서 Abc.o 파일을 생성한다면 아래와 같이 된다(주의-대소문자 구분함).

  1. Abc.o : Abc.c 
    1. <tab> gcc -c Abc.o Abc.c

 실제로 여러 파일을 생성한다고 가정하면 위와 같은 코드들이 아래와 같이 나열된다.

  1. # 이건 주석입니다.
  2. Abc.o : Abc.c 
    1. <tab> gcc -c Abc.o \   <- 멀티라인 사용법
      1. Abc.c
  3. Abb.o : Abb.c

    1. <tab> gcc -c Abb.o Abb.c

  4. A.exe : Abc.o Abb.o

    1. <tab> gcc -o A.exe Abb.o Abc.o
  5. ...... 반복.....

  주석은 #로 시작하고 멀티라인은 \를 마지막 라인에 추가하면 된다. 아주 간단하지 않는가? 위와 같이 파일을 생성하여 makefile을 만든 후, make.exe를 실행하면 자동으로 makefile을 읽어서 위의 조건에 따라 파일을 생성해 준다.

 만약 어떤 Target File이 생성되기 위해 다른 파일이 Target File이 필요한 경우 makefile이 알아서 필요한 파일 순서대로 결과 파일을 만든 후 최종 결과물을 만들어 준다. 위의 makefile을 수행하면 A.exe와 각종 .o 파일들이 생긴다.


2.매크로(Macro)의 사용

 만약 소스파일이 손으로 칠 수 없을 만큼 많다면? 또는 어떤 Target File을 생성하는데 규칙이 일정하다면?(.c 파일을 .o 파일로 바꾸는 것과 같은 경우) 과연 이런 경우에도 일일이 다 손으로 써줘야 할까?

 매크로를 이용하면 이것을 편리하게 할 수 있다. GNU-Make에서 매크로는 아래와 같이 정의하고 사용한다.

  1. OBJECT = A.o B.o C.o
  2. CC = gcc
  3. A.exe : $(OBJECT) 
    1. <tab> $(CC) -o A.exe $(OBJECT)

 OBJECT 매크로가 없다면 일일이 손으로 저 파일들을 다 쳐줘야 할 것을 OBJECT 매크로를 정의함으로써 편리하게 해결했다.


 그럼 이제 좀더 이것을 확장해 보자. 일반적으로 .c 파일을 .o 파일로 만드는 규칙은 거의 동일하다. 컴파일 옵션에 -c 옵션을 줄 것이며 A.o A.c와 같은 같은 파일명을 사용하고 확장자만 다르다. 이것을 어떻게 간단하게 할 수 있을까? 답은 패턴 규칙을 이용하는 것이다. %를 사용하는 아래를 보자.

  1. %.o : %.c

    1. <tab> gcc -c $@ $<

 위와 같이 하면, .c가 들어간 파일은 .o로 바꾸어 주는데 gcc -c 옵션을 적용하여 .o 파일을 생성한다. 즉 %는 확장자를 제외한 파일명을 의미한다. $@와 같은 생소한 문자를 볼 수 있는데, 이것은 make에서 미리 정의해둔 매크로로 아래와 같은 것들이 있다.

  • $@ : Target File. 파일명 및 확장자 포함. 왼쪽 전체 패턴을 치환
  • $< : Source File. 파일명 및 확장자 포함. 오른쪽 첫번째 패턴을 치환
  • $* : 파일명만 포함
  • $^ : Source File. 오른쪽 전체 리스트를 치환

 그럼 패턴 규칙을 이용할때 파일명 그대로만 사용 가능할까? 답은 "그렇지 않다" 이다. 아래와 같은 사용도 가능하다.

  1.  %_debug.o : %.c

    1. <tab> gcc -c $@ $<

 위처럼하면 파일이름에 _debug가 붙은 파일을 생성할 수 있다. 저 규칙을 잘 이용하면 여러가지 종류의 파일을 생성할 수 있다.


  자 그러면 매크로로 정의한 내용 중에 필요한 내용만 따로 치환할 수 는 없을까? 물론 가능하다. 아래는 .o를 .c로 치환하는 문장이다.

  1. OBJECT = a.o b.o c.o d.o
  2. SOURCE = $(OBJECT:.o=.c)

 아주 간단하지 않은가? @0@)/~ 정말 놀랍다. @0@)/~~!!!!


 그럼 만약 target에서 사용될 이름과 동일한 파일명이 존재한다면? 즉 make clean과 같이 clean을 사용해야 하는데 마침 clean의 이름을 가지는 항목이 있다면 어떻게 할까? make clean을 하면 해당 항목이 컴파일 될 것인데... 우리가 원하는 것은 그것이 아니다...

 이런 경우 아래와 같이 사용하면 된다.

  1. .PHONY : clean

 .PHONY가 의미하는 것은 clean이 build의 대상이 아님을 말한다.


 이번에는 make 실행 시 입력값에 의해 Active하게 플래그를 변경해서 실행해 보자. makefile안에 여러 모드로 컴파일하는 기능도 넣어보자. 아무옵션이 없이 그냥 make만 실행되었을 때, 디폴트로 가는 레이블은 all 이다. 이 기능을 이용해서 디폴트 Target 파일을 지정해보고 clean 기능을 넣어서 .o 파일을 모두 지우게 하자.

  1. all : A.exe
  2. .... 어쩌구 저쩌구 ...
  3. A.exe : $(OBJ) 
    1. <tab> $(CC) $(FLAG) $(OBJ)
  4. .... 어쩌구 저쩌구 ...
  5. clean :
    1. <tab> del *.o

 위 처럼 Source File 즉 Dependency에 아무것도 넣지 않거나 만들 Target File 명을 넣으면 된다. A.exe를 만들고 싶으면 "make"라고 입력하던지 "make all"이라고 입력하면 되고 clean 기능을 동작 시키려면 "make clean"이라고 입력하면 된다.


 조금 더 응용해서 make 시에 컴파일 플래그를 조절하도록 해보자

  1. ifdef FULL
  2. FLAG = -f -c
  3. endif

  위와 같이 한 뒤에 "make FULL=yes" 라고 실행하면 FULL 플래그를 설정하여 FLAG를 활성화 시킬 수 있다.



3.디렉토리의 변경

 makefile을 생성하여 사용할때 여러개의 프로젝트를 동시에 빌드하여 하나의 output이 나와야 할 경우가 있다. 이런 경우 하위 폴더에 프로젝트들을 넣어두고 상위 폴더에 하위 폴더를 다 make 하는 형식을 사용하는데, 이때 각 프로젝트 폴더로 이동해서 해당 폴더의 makefile을 실행해야한다.

 이때 사용하는 옵션이 -C 이고 make를 실행하기 전에 폴더를 변경하라는 옵션이다.

  1. make -C "Boot" -f makefile

위의 명령은 Boot 폴더로 폴더를 이용해서 make를 수행하라는 명령이다.



4.출력 메시지

 make 도중에 메시지를 화면에 출력하고 싶으면 @echo "메시지" 의 형태로 사용하면 된다.

  1. @echo "빌드중입니다..."


5.마무리-makefile 적용

5.1 Build 파일을 직접 선택

 자 이제 이것을 실제로 적용해 보자. 아래의 makefile은 make에 대해서 잘 몰랐을 때, 노가다로 작성한 파일이다. 상당히 불현하고 특히 자주 파일이 추가되거나 변경되는 Custom 폴더의 경우 파일이 추가될때 마다 일일이 명령을 추가해줘야하는 단점이 있었다.

  1. #   Kernel Make File
    #
    #   Written KKAMAGUI, http://kkamagui.egloos.com
  2. all: Kkernel
  3. # Compile 옵션
    GCC = gcc -ffreestanding -c
    NASM = nasm -f coff
    FWDIR = FW/
    CUSTOMDIR = Custom/
  4. # Frame Work 파일
    # Compile할 파일 이름 다 적기
    A.o: $(FWDIR)Asm.asm
     $(NASM) -o A.o $(FWDIR)Asm.asm
    Is.o: $(FWDIR)Isr.asm
     $(NASM) -o Is.o $(FWDIR)Isr.asm
    K.o: $(FWDIR)Kernel.c
     $(GCC) -o K.o $(FWDIR)Kernel.c
    D.o: $(FWDIR)Descriptor.c
     $(GCC) -o D.o $(FWDIR)Descriptor.c
    Int.o: $(FWDIR)Interrupt.c
     $(GCC) -o Int.o $(FWDIR)Interrupt.c
    Key.o: $(FWDIR)Keyboard.c
     $(GCC) -o Key.o $(FWDIR)Keyboard.c
    Stdlib.o : $(FWDIR)stdlib.c
     $(GCC) -o Stdlib.o $(FWDIR)Stdlib.c
    Task.o : $(FWDIR)Task.c
     $(GCC) -o Task.o $(FWDIR)Task.c
  5. # 응용 프로그램 파일
    FW.o : $(CUSTOMDIR)Framework.c
     $(GCC) -o FW.o $(CUSTOMDIR)FrameWork.c
    KShell.o : $(CUSTOMDIR)KShell.c
     $(GCC) -o KShell.o $(CUSTOMDIR)KShell.c
    Sched.o : $(CUSTOMDIR)Scheduler.c
     $(GCC) -o Sched.o $(CUSTOMDIR)Scheduler.c
  6. #Object 파일 이름 다 적기
    #아래의 순서대로 링크된다.
    OBJ = A.o K.o Is.o D.o Int.o Key.o Stdlib.o Task.o FW.o KShell.o Sched.o
  7. Kkernel: $(OBJ)
     ld $(OBJ) -o kkernel.bin --oformat binary -Ttext 0x100000
  8. clean:
     del *.o

 위의 makefile을 배운 것을 이용하여 간단하게 정리하면 아래와 같이 쓸 수 있다.

  1. #   Kernel Make File
    #
    #   Written KKAMAGUI, http://kkamagui.egloos.com
  2. all: kernel
  3. # Compile 옵션 및 폴더 설정
    GCC = gcc -ffreestanding -c
    NASM = nasm -f coff
    FWDIR = FW/
    CUSTOMDIR = Custom/
  4. #Object 파일 이름 다 적기
    #아래의 순서대로 링크된다. 새로운 파일이 생기면 뒤에다 추가하자
    OBJ = Asm.o Kernel.o Isr.o Descriptor.o Interrupt.o Keyboard.o StdLib.o Task.o \
          FrameWork.o KShell.o Scheduler.o
  5. #컴파일할 파일의 확장자에 따른 규칙
  6. # FW 폴더 밑의 파일들 컴파일
  7. %.o: $(FWDIR)%.asm
     $(NASM) -o $@ $<
    %.o: $(FWDIR)%.c
     $(GCC) -o $@ $<
  8. # Custom 폴더 밑의 파일들 컴파일
    %.o : $(CUSTOMDIR)%.c
     $(GCC) -o $@ $<
  9. # 최종 링크
    kernel: $(OBJ)
     ld $(OBJ) -o kkernel.bin --oformat binary -Ttext 0x100000
  10. clean:
     del *.o

  우와~ 정말 깔끔해졌다. 확장 또한 한부분만 추가하면 되니까 훨씬 간단해 졌다. makefile 사용해서 효율적인 프로젝트 관리를 해보자.


5.2 특정 폴더의 특정 확장자의 파일을 모두 빌드

 이클립스 버전으로 옮겨가면서 makefile 또한 정리하였다. 자세한 내용은 21 OS 프레임워크 소스 릴리즈의 릴리즈 파일을 참고하도록하고 아래는 00Kernel 폴더의 makefile이다.

  1. #   Kernel Make File
    #
    #   Written KKAMAGUI, http://kkamagui.egloos.com
  2. all: kernel
  3. # Compile 옵션 및 폴더 설정
    GCC = djgcc -ffreestanding -c
    LD = djld
    NASM = nasm -f coff
    FWDIR = FW
    CUSTOMDIR = Custom
    SOURCEDIR = $(FWDIR) $(CUSTOMDIR)
  4. #Object 파일 이름 다 적기
    #아래의 순서대로 링크된다. 새로운 파일이 생기면 뒤에 다 추가하자
    #커널에 꼭 필요한 Object 파일들. ASM.o 파일은 항상 제일 앞에 와야한다. 그 이유는
    #커널의 엔트리포인트가 있는 함수이기 때문이다.
    ESSENTIALOBJ = Asm.o Isr.o
  5. # 디렉토리에 있는 C 파일들을 다 찾아서 넣도록 한다.
    CFILE = $(foreach dir,$(SOURCEDIR),$(notdir $(wildcard $(dir)/*.c )))
    CFILEOBJ = $(CFILE:.c=.o)
  6. #확장자 규칙을 이용해서 컴파일 한다.
    %.o: $(FWDIR)\%.asm
     $(NASM) -o $@ $<
    %.o: $(FWDIR)\%.c
     $(GCC) -o $@ $<
    %.o: $(CUSTOMDIR)\%.asm
     $(NASM) -o $@ $<
    %.o: $(CUSTOMDIR)\%.c
     $(GCC) -o $@ $<
     
    # 최종 링크
    kernel: $(ESSENTIALOBJ) $(CFILEOBJ)
     @echo "==> Making Kernel..."
     $(LD) $(ESSENTIALOBJ) $(CFILEOBJ) -o kkernel.bin --oformat binary -Ttext 0x100000
     @echo "==> Complete"
  7. clean:
     del *.o
     del kkernel.bin

6.make 문법 quick reference

 GNU make의 quick refernce는 http://www.viper.pe.kr/docs/make-ko/make-ko_15.html 에서 찾을 수 있다.

이 부록은 GNU make 가 이해하는 지시어, 텍스트 조작 함수, 그리고 특수 변수들에 대해서 요약한 것이다. 다른 요약들을 보고자 한다면 See section 특수 내장 타겟 이름(Special Built-in Target Names), section 묵시적 규칙들의 카달로그(Catalogue of Implicit Rules), and section 옵션들의 요약(Summary of Options).



다음은 GNU make 가 인식하는 지시어들을 요약한 것이다:

define variable

endef

멀티-라인, 재귀적으로 확장되는 변수 하나를 정의한다.
See section 명령들을 묶어서 정의하기(Defining Canned Command Sequences).

ifdef variable

ifndef variable

ifeq (a,b)

ifeq "a" "b"

ifeq 'a' 'b'

ifneq (a,b)

ifneq "a" "b"

ifneq 'a' 'b'

else

endif

makefile 의 조건 평가 부분.
See section Makefile 조건 부분(Conditional Parts of Makefiles).

include file

다른 makefile 을 포함한다.
See section 다른 makefile 삽입(Including Other Makefiles).

override variable = value

override variable := value

override variable += value

override define variable

endef

변수 하나를 정의하고 이전의 정의를 오버라이드하다. 심지어 명령행에서의 정의까지 오버라이드한다.
See section override 지시어.

export

make 에게 차일드 프로세스들에게 디폴트로 모든 변수들을 익스포트하도록 지시.
See section 서브-make 대한 통신 변수(Communicating Variables to a Sub-make).

export variable

export variable = value

export variable := value

export variable += value

unexport variable

make 에게 특정한 변수를 차일드 프로세스들에게 익스포트할 것인가 아닌가를 지시한다.
See section 서브-make 대한 통신 변수(Communicating Variables to a Sub-make).

vpath pattern path

`%' 패턴과 일치하는 파일들에 대해서 검색 경로를 지정.
See section vpath 지시어.

vpath pattern

pattern 로 사전에 지정된 모든 검색 경로들을 제거.

vpath

vpath 지시어에 의해서 사전에 지정된 모든 검색 경로들을 제거.


다음은 텍스트 조작 함수들의 요약이다 (see section 텍스트 변환을 위한 함수(Functions for Transforming Text)): Here is a summary of the text manipulation functions (see section 텍스트 변환을 위한 함수(Functions for Transforming Text)):

$(subst from,to,text)

text 에서 from 를 to 로 교체.
See section 문자 대입과 분석을 위한 함수들(Functions for String Substitution and Analysis).

$(patsubst pattern,replacement,text)

text 에서 pattern 과 일치하는 것을 replacement 로 교체.
See section 문자 대입과 분석을 위한 함수들(Functions for String Substitution and Analysis).

$(strip string)

string 로부터 여분의 공백 문자들을 제거.
See section 문자 대입과 분석을 위한 함수들(Functions for String Substitution and Analysis).

$(findstring find,text)

text 에서 find 를 찾음(locate).
See section 문자 대입과 분석을 위한 함수들(Functions for String Substitution and Analysis).

$(filter pattern...,text)

pattern 단어들중의 하나와 일치하는 text 내의 단어들을 선택.
See section 문자 대입과 분석을 위한 함수들(Functions for String Substitution and Analysis).

$(filter-out pattern...,text)

pattern 단어들중의 하나와 일치하지 않는 단어들을 text에서 선택.
See section 문자 대입과 분석을 위한 함수들(Functions for String Substitution and Analysis).

$(sort list)

list 에 있는 단어들을 사전식으로 소팅하고 중복된 것들을 제거.
See section 문자 대입과 분석을 위한 함수들(Functions for String Substitution and Analysis).

$(dir names...)

각 파일 이름에서 디렉토리 부분을 추출.
See section 파일 이름들을 위한 함수(Functions for File Names).

$(notdir names...)

각 파일 이름에서 비-디렉토리 부분을 추출.
See section 이름들을 위한 함수(Functions for File Names).

$(suffix names...)

각 파일 이름의 확장자(마지막 `.'과 다음 문자들)를 추출.
See section 파일 이름들을 위한 함수(Functions for File Names).

$(basename names...)

각 파일 이름의 몸체 이름(확장자를 뺀 이름)을 추출.
See section 파일 이름들을 위한 함수(Functions for File Names).

$(addsuffix suffix,names...)

names 에 있는 각 단어의 뒤에다 suffix 를 붙인다.
See section 파일 이름들을 위한 함수(Functions for File Names).

$(addprefix prefix,names...)

prefix names 에 있는 각 단어 앞에다 붙인다.
See section 파일 이름들을 위한 함수(Functions for File Names).

$(join list1,list2)

두 단어들의 병렬 리스트를 묶는다.
See section 파일 이름들을 위한 함수(Functions for File Names).

$(word n,text)

text 에서 n번째 단어(시작은 1)를 추출한다.
See section 파일 이름들을 위한 함수(Functions for File Names).

$(words text)

text 에서 단어들의 개수를 계산한다.
See section 파일 이름들을 위한 함수(Functions for File Names).

$(firstword names...)

names 의 첫번째 단어를 추출한다.
See section 파일 이름들을 위한 함수(Functions for File Names).

$(wildcard pattern...)

쉘 파일 이름 패턴 (`%' 패턴이 아님) 과 일치하는 파일 이름들을 찾는다.
See section wildcard 함수(The Function wildcard).

$(shell command)

쉘 명령을 실행하고 그것의 결과를 리턴.
See section shell 함수(The shell Function).

$(origin variable)

make 변수 variable 가 정의된 방법을 설명하는 문자열을 리턴.
See section origin 함수(The origin Function).

$(foreach var,words,text)

words 에 있는 각 단어를 가리키는 var 로 text 를 평가하고 그 결과를 서로 붙인다.
See section foreach 함수(The foreach Function).




다음은 완전한 정보를 대신할 자동 변수들See section 자동 변수들(Automatic Variables)의 요약이다.

$@

타겟의 파일 이름.

$%

타겟이 아카이브 멤버일 때, 타겟의 멤버 이름.

$<

첫번째 종속물의 이름.

$?

타겟보다 더 새로운 모든 종속물들의 이름. 이들 사이는 스페이스들로 구분된다. 아카이브 멤버들인 종속물들의 경우 이름있는 멤버들만이 사용된다 (see section 아카이브 파일을 갱신하기 위해서 make 사용하기(Using make to Update Archive Files)).

$^

$+

모든 종속물들의 이름. 이들 사이는 공백으로 구분된다. 아카이브 멤버들인 종속물들의 경우 이름있는 멤버만이 사용된다 (see section 아카이브 파일을 갱신하기 위해서 make 사용하기(Using make to Update Archive Files)). $^의 값은 중복된 종속물들을 생략한다. 반면에 $+는 그들을 그대로 가지고 그들의 순서를 유지한다.

$*

묵시적인 규칙이 매치된 줄기 (see section 패턴 비교 방법(How Patterns Match)).

$(@D)

$(@F)

$@의 디렉토리-안에 있는-파일 부분과 디렉토리 부분.

$(*D)

$(*F)

$*의 디렉토리-안에 있는-파일 부분과 디렉토리 부분.

$(%D)

$(%F)

$%의 디렉토리-안에 있는-파일 부분과 디렉토리 부분.

$(<D)

$(<F)

$<의 디렉토리-안에 있는-파일 부분과 디렉토리 부분.

$(^D)

$(^F)

$^의 디렉토리-안에 있는-파일 부분과 디렉토리 부분.

$(+D)

$(+F)

$+의 디렉토리-안에 있는-파일 부분과 디렉토리 부분.

$(?D)

$(?F)

$?의 디렉토리-안에 있는-파일 부분과 디렉토리 부분.



다음 변수들은 GNU make에 의해서 특별하게 사용된다:

MAKEFILES

make 의 모든 실행때마다 읽히는 makefile들.
See section MAKEFILES 변수(The Variable MAKEFILES).

VPATH

현재 디렉토리에서 찾을 수 없는 파일들에 대한 디렉토리 검색 경로.
See section VPATH: 모든 종속물에 대한 검색 패스(Search Path for All Dependencies).

SHELL

시스템의 디폴트 명령 해석기의 이름. 일반적으로 `/bin/sh'. 명령들을 실행하는 데 사용되는 쉘을 변경하기 위해서 makefile 에서 SHELL 을 설정할 수 있다. See section 명령 실행(Command Execution).

MAKESHELL

MS-DOS 에서만 사용되며 make 에 의해서 사용되는 명령 해석기의 이름. 이 값은 SHELL 의 값보다 우선한다. See section 명령 실행(Command Execution).

MAKE

make 가 호출된 이름. 이 변수를 명령에서 사용하는 것은 특수한 의미가 있다. See section MAKE 변수가 작동하는 방법(How the MAKE Variable Works).

MAKELEVEL

재귀적 진입의 단계 번호 (서브-make들의).
See section 서브-make 대한 통신 변수(Communicating Variables to a Sub-make).

MAKEFLAGS

make 에 주어진 플래그들. 플래그들을 설정하기 위해서 환경에서나 makefile 안에서 이것을 설정할 수 있다.
See section 서브-make 대한 통신 옵션(Communicating Options to a Sub-make).

MAKECMDGOALS

make 에 대해서 명령행에서 주어진 타겟. 이 변수를 설정하는 것은 make 의 작업에 어떤 영향도 미치지 않는다.
See section goal 지정하는 매개변수(Arguments to Specify the Goals).

CURDIR

현재 작업 디렉토리(모든 -C 옵션들이, 있다면 처리된 후)의 경로명으로 설정된다. 이 변수를 설정하는 것은 make 의 작업에 어떤 영향도 미치지 않는다.
See section make 재귀적 사용(Recursive Use of make).

SUFFIXES

make makefile 들을 읽기 전의 접미사들의 디폴트 리스트.

2009/04/10 21:35 2009/04/10 21:35