기본 콘텐츠로 건너뛰기

Java: OpenJDK 빌드 환경 셋업

JavaOne 2010에서 Oracle은 OpenJDK 프로젝트를 계속적으로 지원할 것을 천명하였다. OpenJDK는 Java SE SDK의 오픈소스 프로젝트로 앞으로 출시될 JDK 7도 OpenJDK 프로젝트를 통해 개발이 이루어지고 있다.

OpenJDK 프로젝트를 이용하여 새로이 나올 JDK 버전의 기능을 미리 확인해 볼수도 있고 내부 코드의 구현 방법을 살펴보면서 Java 프로그래밍 능력을 향상시키는 기회로 삼을 수도 있을 것이다. 더 나아가 Java 발전에 직접 기여하는 뜻깊은 일을 해볼 수 있을지도 모른다.

이 글에서는 OpenJDK를 Windows XP 환경에서 빌드하는 방법에 대해 설명해보고자 한다.

1. Tools
Windows에서 OpenJDK를 빌드하기 위해서 Cygwin이 필요하다. Cygwin 설치 시 다음과 같은 package들을 설치하도록 한다.
  • binutils - GNU assembler, linker, binary utilities
  • make - GNU make
  • m4 - UNIX macro processor (GNU version)
  • cpio - Manage archive of files
  • awk - Text processing language
  • file - File type check
  • zip - zip utility
  • unzip - unzip utility
  • procps - Get free and used memory space of system
  • mercurial
만일 cygwin의 make 버전이 3.81이라면 3.78 ~ 3.80 사이의 버전을 사용하여야 한다. make -v로 3.81 버전으로 판명되면 여기서 make.exe를 다운로드 받아 cygwin/bin 폴더의 make.exe를 대치하여 사용한다.

OpenJDK workspace를 clone하기 위해서는 Mercurial에 Forest라는 extension이 필요하다.
hg clone http://bitbucket.org/pmezard/hgforest-crew
위와 같은 명령을 cygwin shell에서 실행하여 forest.py 파일을 받는다. 이 파일을 어딘가 원하는 위치에 복사한 후 shell의 home directory에 아래와 같은 내용의 .hgrc 파일을 생성한다. (cygwin shell에서 cd ~ 명령어를 수행하면 자신의 home directory로 이동한다.)
[extensions]

forest=~/forest.py    # home 디렉토리에 forest.py 파일을 복사해두었다.
fetch=
이제 shell에서 hg 명령어를 실행하면 basic commands 목록에 fclone, fpush, fpull 등과 같은 명령어들이 보일 것이다.

2. Mercurial source repository
.hgrc 파일에 아래와 같은 내용을 추가한다.
[ui]
username=testname
username 항목에 자신의 실명을 나타내는 영문이름을 기입한다. 혹시, OpenJDK에 patch를 제공하게 되는 경우 이 이름이 Mercurial repository의 log에 기록되어진다.
hg showconfig 명령어를 실행하면 최소한 아래와 같은 항목들이 보여져야 한다.
extensions.forest=~/forest.py
extensions.fetch=
ui.username=testname
모든것이 준비되었다면 JDK7의 소스를 clone해보도록 하자.
mkdir jdk7
cd jdk7
hg fclone http://hg.openjdk.java.net/jdk7/tl mytl
위 명령여는 tl 프로젝트의 전체 forest를 얻어오는 것이다. tl 프로젝트는 JDK7의 Tools, Libraries API를 구현하는 프로젝트로 대부분의 core libraries 개발이 이루어지는 프로젝트이다. 정상적으로 clone이 되었다면 아래와 같은 폴더 목록이 만들어진다.

corba
hotspot
jaxp
jaxws
jdk
langtools
make
test

OpenJDK에서 소스로 공개되지 않은 부분도 있기 때문에 빌드를 위해 binary plugs를 다운로드 받아 설치해야 한다.

http://download.java.net/openjdk/jdk7/

위 페이지에서 자신의 개발환경에 맞는 binary plugs를 다운로드 받아 아래와 같이 실행한다.
java -jar jdk-7-ea-plug-bnn-os-arch-dd_month_year.jar
설치할 위치를 묻는 대화상자에서 적당한 폴더를 고른다. 이 위치는 아래 4번 항목에서 설명하듯이 ALT_BINARY_PLUGS 환경변수에 지정해주어야 한다.


3. Build Tools
C/C++ 컴파일러는 Microsoft의 Visual C++ 10 Professional 혹은 Visual C++ 10 Express 버전을 사용하면 된다. 단, Visual C++ 10 Express 버전의 경우 Rc.exe와 mt.exe가 제공이 안되는 문제가 있다. 이를 해결하기 위해서는 Microsoft Windows 7 SDK를 설치한 후 Microsoft SDKs\Windows\v7.0\Bin 폴더에 있는 Rc.exe, RcDll.dll, mt.exe 파일을 Microsoft Visual Studio 10.0\VC\bin 폴더로 복사하여 준다. Java 컴파일러의 경우는 JDK 1.6 버전을 설치하여 사용하면 된다.

Java 빌드를 위해 ANT 최신 버전을 다운로드 받아 설치한다. ANT_HOME은 아래 4번 항목에서 설명하듯이 .bash_profile에 환경변수로 설정해주면 된다.

Microsoft DirectX 9.0 SDK Update 버전을 설치한다. 되도록이면 d:/dxsdk9과 같이 경로에 공백 문자가 들어가지 않는 곳에 설치하도록 하자. DXSDK의 경우도 아래 4번 항목의 ALT_DXSDK_PATH와 같이 환경변수로 위치를 설정해주어야 한다.

FreeType 2.3.5 binary 파일을 다운로드 받아 압축을 푼다. FreeType의 DLL은 Zlib1.dll에 dependency가 있기 때문에 Zlib 홈페이지에서 DLL 파일을 다운로드 받아야 한다. FreeType의 bin 폴더에 있는 freetype6.dll 파일과 Zlib의 zlib1.dll 파일을 Windows의 system32와 같이 DLL 검색 경로에 복사한다. freetype6.dll 파일을 FreeType 압축을 해지한 폴더의 lib 폴더에 복사하고 이름을 freetype.dll로 변경해준다. (OpenJDK 빌드 과정에 해당 위치에서 이 파일을 찾는 과정이 있어서 그렇다.) 역시나 아래 4번 항목의 설명과 같이 FreeType의 헤더와 라이브러리 위치를 환경변수에 설정해주어야 한다.

4. Environment Variables
Cygwin 폴더에 있는 cygwin.bat 파일에 
call "C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"
위와 같은 라인을 추가하여 Visual C++ 10의 환경설정이 이루어지도록 한다.

Cygwin bash shell의 home 디렉토리에 .bash_profile 파일을 열어 아래와 같은 내용을 추가하도록 한다.
export ALT_BOOTDIR=c:/jdk1.6.0_13
export ALT_BINARY_PLUGS_PATH=/open_source/jdk7/binplugs
export ALT_DXSDK_PATH=/cygdrive/c/dxsdk9
export ANT_HOME=/cygdrive/c/apache-ant-1.7.1
export ALT_FREETYPE_HEADERS_PATH=d:/open_source/jdk7/freetype/include
export ALT_FREETYPE_LIB_PATH=d:/open_source/jdk7/freetype/lib
물론, 각 경로는 자신의 시스템의 사항에 맞추어 변경하여 지정한다. 파일을 저장 후 Cygwin의 bash shell을 다시 시작한다.

5. OpenJDK Build
 한글 Windows에서 빌드하는 경우 javac의 encoding 문제로 인해 corba project를 빌드하다가 오류가 발생한다. - "unmappable character for encoding ascii"
이 문제를 해결하기 위해서는 corba\make\common\shared에 있는 Defs-java.gmk 파일을 아래와 같이 수정한다.
JAVACFLAGS  += -encoding ascii

==>

JAVACFLAGS  += -encoding ms949
이제 모든 설정이 완료되었으므로 빌드 환경에 문제가 없는지 확인해보자. jdk7 소스의 루트 폴더에서 아래와 같이 실행한다.
make sanity
문제가 없다면 Error 메시지 없이 완료되고 build\windows-i586 폴더에 sanityCheckMessages.txt라는 파일이 생성될 것이다. 만일, 에러 메시지가 출력되었다면 메시지를 살펴보면 에러의 원인을 파악할 수 있다.

이제 실제 빌드를 위해 아래와 같이 명령을 실행한다.
make ALLOW_DOWNLOADS=true USERNAME=wonkim
위 명령어에서 USERNAME 인자는 echo $USERNAME을 실행해본 후 사용자 이름이 공백문자열이 없는 영어로 출력이 된다면 굳이 지정할 필요는 없다. (빌드 과정에 네트워크에 접속하여 소스 파일을 다운로드 받는 과정이 있으므로 반드시 네트워크 연결이 이루어진 상태에서 빌드한다.)

한번 빌드가 이루어진 후에는 ALLOW_DOWNLOADS=true 인자는 다시 지정할 필요가 없다. 이 인자를 지정하면 서버에서 jaxp와 jaxws에 대한 소스 코드를 다운로드 받는다.

6. Testing
빌드가 완료되면 build\windows-i586\bin 폴더에 java.exe, javac.exe등의 파일들이 생성되어진다. javac -version으로 실행해보면 javac 1.7.0-internal와 같이 출력된다.

7. What's Next
JDK 7 개발을 바로 바로 빌드해서 테스트 할 수 있는 환경이 마련되었다. 이제 부터 해보고 싶은 것들은 다음과 같다.
  • NetBeans, Eclipse와 같은 IDE와 연동해서 JDK 7 프로그램 개발 환경 만들기
  • JDK 7의 새로운 기능들에 대해 sample code 작성 및 테스트
  • OpenJDK 프로젝트 중 흥미로운 것을 골라 직접 참여해보기

참고자료:

댓글

이 블로그의 인기 게시물

Wireless: HotSpot 2.0 이란?

스마트폰 사용자가 HotSpot 2.0을 지원하는 Wi-Fi 망을 사용하는 경우라면 기존 Wi-Fi 망과 달리 이동통신 망에서 Wi-Fi 망으로의 네트워크 연결 전환이 자연스럽게 이루어진다. 예를 들면, 3G 네트워크를 이용하여 영화를 보고 있다가 HotSpot 2.0 네트워크에 연결이 가능하게 되면 영화 시청 중단 없이 Wi-Fi 망으로 자연스럽게 네트워크 연결이 이동하여 3G 망의 부하도 줄이고 사용자의 네트워크 비용도 절약할 수 있다. 시스코에서 제공한 White Paper 를 참고.

Apple M1 Mac Mini에서 이더리움 (Ethereum) 채굴하기

 돈을 벌 목적은 아니고 이더리움 기술에 대한 호기심에 직접 채굴(마이닝)에 나서 보기로 했다. 머신은 Apple M1 Mac Mini. 스팩을 살펴보니 8 Core GPU에 16GB 메모리를 공유하고 있어 가능은 해보인다. 큰 흐름은 다음과 같다. 채굴한 이더리움을 저장할 지갑을 만든다 만든 지갑의 정보를 잘 보관해둔다 (Secret Recovery Phrase, 지갑의 주소 값) Apple M1용 채굴 프로그램 설치 내 지갑 정보를 이용해서 채굴 프로그램 실행 일단, 채굴한 이더리움을 저장할 지갑(wallet)을 만들어야 한다.  크롬 브라우저 익스텐션 설치로 비교적 간단하게 지갑을 만들 수 있는  https://metamask.io/ 를 이용하기로 했다. 크롬 익스텐션을 설치 후 기존에 만든 지갑이 없으므로 "Create a Wallet"을 선택한다. 패스워드 입력하고 등등의 절차를 거치면 아래와 같은 Secret Recovery Phrase가 나온다. 이 값을 잘 보관해두기 바란다. 나중에 지갑을 복구할 때 필요한 값이다. 이 값이 유출되면 지갑에 모아둔 이더리움을 다 털릴 수 있으므로 안전한 곳에 보관한다. Confirm Your Secret Phrase에서 확인 과정을 거친다. 직접 입력하는 것이 아니라 단어 별 버튼을 일일이 클릭해서 확인해주어야 한다. (좀 번거롭지만 그만큼 Secret Recovery Phrase가 중요함을 인지시키기 위한 과정이다.) 이제 지갑은 준비 완료. 생성된 Account 화면에서 지갑의 주소갑을 얻을 수 있다.  Apple M1용 채굴 프로그램을 설치해보자. Ethminer M1 Github 프로젝트 에서 미리 컴파일된 바이너리를 다운로드 받는다. (Assets를 펼치고 ethminer-m1을 클릭해서 다운 받으면 된다) 원하는 폴더에 파일을 옮겨 놓고 Terminal에서 chmod +x로 실행가능하게 만든다. % mv ~/Downloads/ethminer-m1 .             %   % c

Java: Java for Game? Java가 Game 개발에 어울릴까?

Java가 기업용 서버 소프트웨어 개발에 활발하게 쓰이는 것과 달리 일반 응용프로그램 분야에서는 별로 대접을 받지 못하는 현실을 개선하려면 어떤 분야부터 손보면 좋을까? 로딩타임, 성능, 사용자 인터페이스 등 Java를 이용한 클라이언트 프로그램을 개발하지 않는 이유들은 개발자 별로 서로 다를 것이다. 하지만, 이런 단점에도 불구하고 점점 복잡해지는 소프트웨어를 더 쉽게 다양한 환경에서 동작하도록 만들기 위해서는 Java만큼 이미 성숙한 해결책도 없지 않은가? 클라이언트 개발을 활성화하기 위해 Java를 게임 개발에 활용할 수 있도록 지원하면 어떨까? 역시, 사용자가 직접 쓰는 응용프로그램 중에는 게임이 가장 시장이 큰 분야이니 말이다. 그렇다면, 현재 게임 개발에 Java가 어느 정도 사용되고 있고 미래에 더 활성화 될 가능성은 있을 것인가? 이런 의문점을 가지고 "Java + Game"에 대해 조사해보기로 했다. 1. Java로 개발한 게임들 우선, Java로 개발한 게임들에 대해 살펴보자. Oracle의  Java in Action 웹페이지 를 보면 Java를 이용한 3D MMORPG RuneScape 에 대한 설명이 있다. 가입자가 1억 3000만명이 넘는다고 하다. 실제 게임을 설치해서 실행해보니 WOW같은 화려한 그래픽에는 못미치치만 잘만든 Role Playing 게임이다 Puppy Games 에서 개발한  Revenge of the Titans 게임도 눈여겨 볼 만하다. 이 회사는 작고 손쉽게 즐길 수 있는 게임을 개발하는데 모든 게임을 Java로 만든다. Revenge of the Titans는 Starcraft와 같은 전략 게임으로 너무 머리쓰지 않고 즐길 수 있는 게임이며 그래픽도 신선하다. 개발이 진행 중인 것으로 보이는 Urban Galaxy 라는 게임도 재미있을 것 같다. SF 영화를 보면 자주 등장하는 미래의 빌딩 숲을 날아다니는 자동차로 전투도 치르고 무역도 하며 캐릭터를 키우는 게임으로