이번에도 Visual Studio Community 2015이 설치되어있다는 조건하에 진행.
v8의 위키 페이지(https://github.com/v8/v8/wiki)에서 보면 빌드 방법으로는 GN을 사용하는 것. 그리고 deprecated가 된 Gyp가있다. 무엇을 사용하든 depot_tools라는것이 필수.
예전에 한번 심심풀이로 빌드해봤을때는 gyp설치가 잘 안되어 고생을 좀 했지만 큰 문제없이 hello world를 빌드했는데… 지금은 gyp가 deprecated로 표시되어있어 gn을 사용해 보려하니 관련 내용이 부실해서 크게 애먹었다(…).
그래서 gyp를 사용하는걸 더 추천하고싶고, gn은 단점이있어 그다지 추천하고싶지않다.
– Gyp/GN 공통
1. Qt 5.7.0을 빌드하는 방법에서의 ‘(중요) 지역설정’항목에서 영문으로 바꾸는것을 적용한다. 안그러면 ‘현재 코드 페이지(949)에서 표시할 수 없는 문자가 파일에 들어 있습니다.’메시지가 발생한다. v8또한 경고를 에러로 처리하도록 컴파일러 옵션을 주기때문에 해당 경고때문에 빌드가 안된다. 물론 /wd4819 옵션을 지정하여 무시할 수 있지만 이럴경우 라이브러리 내 메시지가 의도치않게 깨져서 출력되는 경우가 생긴다. 그렇다고 유니코드로 일괄 저장하기에도 무언가 프로그램을 쓰지 않으면 힘들다. 개별적인 방법이 있다면 그러한 방법을 써도 무방할듯하다.
2. 윈도 환경이니 Git for Windows를 깔아야한다. Visual Studio의 32 또는 64비트 네이티브 도구모음을 실행하여 git 후 엔터를 처본다. 영문이라면 ‘git is not recognized as an internal or external command, operable program or batch file.’ 에러가 날것이다. 명령줄을 찾을 수 없다는 에러가 난다면 git download 페이지(https://git-scm.com/downloads)에서 Windows 버전으로 다운로드 받고, 기본 옵션으로 설치해도 되지만 아래 두 화면에서와 같이 옵션 두가지를 각각 ‘Use Git from the Windows Command Prompt’, ‘Checkout as-is, commit as-is’로 선택한다.
(이건 아마 기본적으로 Use Git from the Windows Command Prompt 항목이 선택되어있을것이다.)
(커미터라면 이미 잘 알고있을것이고, 아니라면 라인 인코딩을 변환하지 않는 Checkout as-is, commit as-is가 Cygwin, msys등을 사용하게 된다면 정신건강에 더 이로울것이다. 그 중 하나가 ffmpeg 빌드.)
이후에 네이티브 도구를 다시 실행하고 git를 실행하면 도움말이 나오게된다.
3. 이제 depot_tools를 받아야한다. 위 두번째 문단 링크 된 위키페이지에서 ‘Using Git’ 항목을 보면 나와있지만 depot_tools 텍스트의 링크(http://dev.chromium.org/developers/how-tos/install-depot-tools)를 보면 ‘Install on Windows’항목에서 depot_tools.zip를 다운받으라고되어있다. 링크가 바뀔수도 있으니 직접 페이지에서 다운받고 압축을 푼다.
depot_tools는 D:\SDK 아래 depot_tools폴더와 파일들이 위치하는것으로 가정한다.
그리고 v8이 위치할 폴더는 D:\OpenSource 로 가정한다.
이제 32비트 or 64비트 네이티브 도구모음에서 PATH 환경변수를 변경한다.
gclient와 fetch 명령을 사용하기 위해서이다. 이제 D:\OpenSource 폴더로 이동하고 gclient를 입력한다. PATH가 잘 설정되었다면 아래처럼 사용법이 나타나고 아니라면… 경로가 잘못된것이니 다시 PATH를 설정해야한다.
4. GYP를 위한 환경변수를 두개를 설정해야한다. 명령은 아래와같다.
set GYP_MSVS_VERSION=2015 set DEPOT_TOOLS_WIN_TOOLCHAIN=0
GYP_MSVS_VERSION을 지정하지않으면(첨엔 MSYS로 보였었다.) 상황에 따라서는 Visual Studio 2013의 레지스트리 항목 일부가 입력이 되어 있어 2013버전이 존재한다고 인식해버리고 depot_tools로 코드를 다운받고 prepare 작업할 때 에러가 난다. (prepare 작업이 gyp 실행이다. gclient로 다운받을 때 에러난다해서 다시 gclient를 사용 할 필요가 없다.)
DEPOT_TOOLS_WIN_TOOLCHAIN또한 지정하지 않으면 에러가 나는데 정확한 이유는 잘 모르겠다. Chromium 빌드 문서에 지정하라고는 되어있는데 이렇게 하라고 되어있고 부가적인 설명이 없다. (있었어도 영어해석의 한계)
이제 소스코드를 다운로드 받기위해 명령 프롬프트에서 D:\OpenSource로 폴더이동 후 ‘fetch v8’을 실행한다. (시간이 꽤나 걸린다.) 만약 나중에 뭔가 잘못되어서 다시 받아야하는 경우가 생긴다면 해당 폴더에 생성된 .gclient, .gclient_entries파일, v8폴더를 지워주면 된다. (v8말고 다른것도 fetch했다면 그냥 지워서는 안되겠지만.)
(중간 이후로 보이는 메시지와같이 python과 스크립트가 실행되고 git에서 코드가 다운로드 된다.)
아래처럼 뭔가 에러나면 위 환경변수 두개 중 한가지라도 잘못된것이다. 그래도 git만 실행가능하면 소스코드는 잘 받아진것이니 환경변수만 다시잡고 다음으로 진행하면 된다.
– Gyp를 사용하여 빌드
1. v8.dll을 생성하는 dynamic library로 빌드하는 방법과 v8.lib만 생성되는 static library로 빌드하는 방법이 있는데… 빌드하기 위한 명령에 약간의 차이만 있다. 만약 dynamic library로 빌드한다면 빌드하기 전 v8/gypfiles/standalone.gypi를 텍스트 편집기로 열어서 ‘msvs_disabled_warnings’를 찾은다음 아래처럼 4251을 추가해야한다. 안그러면 C4251 경고가 뜨게되고 빌드가 멈추게된다. (혹시 모르니 먼저 4251을 검색 해 보는것이 좋다. 만약 검색했는데 해당 숫자가 있다면 해당 경고를 나타나지 않도록 패치되었을 수 있으니까 수정할 필요가 없을것이다. v8/build/common.gypi파일은 4251 경고를 무시하도록 되어있는데 왜 저건 안되어있는지는 모르겠다.)
2. 이제 명령 프롬프트에서 D:\OpenSource\v8로 이동한 후 아래 처럼 gyp를 실행하여 ninja 프로젝트를 생성한다. (주의 사항으로는 경로중에 공백이 없어야한다는 설명이 있다.)
static library로 빌드 할 경우
D:\SDK\depot_tools\python276_bin\python gypfiles\gyp_v8.py
dynamic library로 빌드 할 경우
D:\SDK\depot_tools\python276_bin\python gypfiles\gyp_v8.py -Dcomponent=shared_library
‘Updating projects from gyp files…’메시지가 표시된 후 명령이 완료되어 다시 입력 커서가 나타나면 ‘ninja -C out/Release_x64’를 실행하여 라이브러리를 빌드한다. (D:\OpenSource\v8\out 폴더를 보면 Debug, Release, 그리고 각각의 64비트 빌드 ninja 프로젝트 파일이 생성되어있다. 64비트용으로 debug 빌드 된 라이브러리가 필요하다면 ‘ninja -C out/Debug_x64’를 실행하면 된다.)
(에러없이 빌드되었다.)
이제 v8폴더의 include 폴더,
v8\out\Release_x64 폴더에서 natives_blob.bin, snapshot_blob.bin, icui18n.dll, icuuc.dll, v8.dll, icui18n.dll.lib, icuuc.dll.lib, v8.dll.lib 파일,
v8\out\Release_x64\obj\src 폴더에서 v8_libplatform.lib 파일등등 필요한 파일들을 따로 복사해서 사용하면 된다.
– GN을 사용하여 빌드.
GN을 사용하여 빌드했을 때 단점은 v8 이외의 v8_libplatform 같은것들은 라이브러리로 링크되어있지않고 obj파일 그대로 남아있게된다. 실제 ninja 프로젝트를 열어서 보면 hello_world.exe등의 파일을 링크할 때 v8만 lib 파일을 링크하고 나머지는 obj 파일을 하나하나 링크하게 되어있다. Visual Studio 프로젝트에서 라이브러리를 사용하려면 그다지 깔끔하게 사용하기 힘들다.
1. 위 공통 항목의 내용을 진행해야한다.
2. D:\OpenSource 폴더에서 ‘gclient sync’를 실행한다. (처음 실행 후 나중에 다시 실행하지 않아도 된다.)
(멋대로 gyp가 실행되는 것 같지만 넘어가야겠다.)
3. D:\OpenSource\v8 폴더로 이동한다음 ‘gn gen out.gn\x64.debug’를 실행한다. 기본적으로 디버그 빌드가 활성화되며 ‘gn gen out.gn\x64.release –args=”is_debug=false”‘와같이 실행하면 릴리즈 모드로 빌드된다. (out.gn\x64.Debug는 그냥 경로지정일 뿐 디버그/릴리즈 x86/x64 타겟에는 영향없다.)
(위와같이 is_component_build=true 항목을 추가하면 dynamic library로 빌드된다. 단 v8.dll만 dynamic library로 생성된다.)
4. 이제 ‘ninja – C out.gn/x64.release’를 실행하면 빌드가 진행된다.
5. 빌드가 완료되면 v8/out.gn/x64.release 폴더에서 파일명이 icu로 시작하는 파일들과, v8.dll, v8.dll.lib 파일을, obj폴더 아래 v8_로 시작하는 폴더들 내 obj 파일을 링크할 때 사용해야한다.
만약 lib 파일을 생성하고싶다면 v8\gni\v8.gni 파일을 열고 ‘v8_source_set’을 검색하여 바로 아래 라인의 ‘source_set’을 ‘static_library’로 수정하면 lib 파일이 생성되도록 할 수 있다. 단, 실행파일들 링크할 땐 ‘_mainCRTStartup’ 함수를 찾을 수 없다는 링크 에러가 나오게되던데… 이 부분까지는 해결해야 할 필요성이 느껴지지않아(Gyp를 사용하면 되기때문) 더는 알아보지않았다.
– 참고
https://chromium.googlesource.com/chromium/src/+/master/docs/windows_build_instructions.md DEPOT_TOOLS_WIN_TOOLCHAIN 환경변수 내용 참고
http://mgun.tistory.com/508 C4251 경고내용 참고
https://chromium.googlesource.com/chromium/src/tools/gn/ What is GN?
– https://chromium.googlesource.com/chromium/src/+/master/tools/gn/docs/cookbook.md GYP->GN Conversion Cookbook
– https://chromium.googlesource.com/chromium/src/+/master/tools/gn/docs/quick_start.md GN Quick Start guide
– https://chromium.googlesource.com/chromium/src/+/master/tools/gn/docs/language.md GN Language and Operation