[컴][웹] V8 컴파일 하기

v8 engine compilation / v8 chrome engine / 브라우저 엔진 컴파일 / javascript engine / js engine v8


v8 compilation

컴퓨터환경

  • CPU : i3-2100 CPU@3.10GHz
  • RAM : 8GB
  • DISK : SATA3(6Gb/s), 7200RPM, 16MB

windows 에서 빌드

절차

  1. python 설치
  2. python 경로를 PATH 환경변수에 추가
  3. Visual Studio 설치(약 40분)
  4. Windows 10 SDK 설치
  5. depot_tools 설치
  6. path 설정
  7. gclient
  8. fetch v8(약 10분)
    1. 만약 update 한다면, gclient sync
  9. gn gen --ide=vs out/MyV8

python 2.7.15

python 을 설치하고 환경변수 PATH 에 path 를 추가하자.

pip install pypiwin32

win32 module 을 third-party toolchain 에서 사용한다. 그래서 필요하다.

Visual Studio 설치

windows 에서 v8 를 build 하려면 compiler 가 설치되어 있어야 한다. 여기서는 Visual Studio 2017 Community version 을 사용할 것이다.
  • 버전: Visual Studio 2017 (>=15.7.2) 또는 2019 (>=16.0.0) 가 필요[ref. 1]
"C++를 사용한 데스크톱 개발" 을 선택하고, 설치 세부정보 에서 "x86 및 x64용 Visual C++ MFC" 를 추가한다. 아래 command line 으로 바로 설치할 수 있다.
vs_community.exe --add Microsoft.VisualStudio.Workload.NativeDesktop --add Microsoft.VisualStudio.Component.VC.ATLMFC --includeRecommended

Windows 10 SDK 설치 - Debugging Tools

version 10.0.17134 이상의 Windows 10 SDK 가 설치되어 있어야 한다.
아래에서 setup 을 download 하고, "Debugging Tools for Windows" 를 선택하자.
그러면 아래 경로에서 .msi 를 찾을 수 있다. 이녀석을 실행해서 Debugging Tools 를 설치하자.
  • 64bit용 : <Windows Kits>\10\WindowsSDK\Installers\X86 Debuggers And Tools-x64_en-us.msi

depot_tools

depot_tools 를 설치하자. 참고로 python 은 이미 설치되어 있었다.
  1. depot_tools.zip 를 다운받아서 압축을 풀자. 여기서는 c:\v8\depot_tools\ 에 풀었다.
  2. 이 경로를 PATH 환경변수에 추가하자.
  3. DEPOT_TOOLS_WIN_TOOLCHAIN 변수를 설정하고, 0으로 set 하자. 0 으로 set 하면 이미설치된 Visual Studio 를 사용한다는 뜻이다.
  4. gclient 를 실행하자. metrics.cfg 를 만들어준다.
    c:\v8\depot_tools\>gclient

windows defender 에 '제외'(exclusion) 추가

빌드 속도의 향상을 위해 v8 src directory 를 '제외' 항목에 추가하자. (참고)

fetch v8

이 명령어로 checkout 을 하게 된다. 처음에 git source 를 받을 때 사용한다.
> cd c:\v8\v8_chromium
> fetch v8

참고로, fetch chromium 은 desktop chromium 의 소스를 가져온다.  잘 못 알아서, fetch chromium 을 했는데, master 소스를 가져오는데에만 2시간 55분 정도 소요됐다. 그 후에 다른 관련 소스를 또 받아오는데 25분정도가 더 소요됐다.

HDD는 최소 25GB 는 사용된 듯 하다. ref. 1 을 보면 build 에 최소 100GB 가 필요하다고 한다.

v8 은 그래서 아래 경로에 fetch 가 됐다. v8 source code 의 크기만 1.8GB 정도가 된다.
  • c:\v8_chromium\src\v8
그 다음 nacl(Google Native Client) tools 를 download 한다.

마지막으로 아래처럼 username 을 물어본다. 그냥 enter 를 치면, build 를 시도하다 실패한다.

Username for 'https://chrome-internal.googlesource.com':

________ running 'C:\Python27\python.exe v8/build/vs_toolchain.py update' in 'c:\v8\v8_engine'



No downloadable toolchain found. In order to use your locally installed version of Visual Studio to build Chrome please set DEPOT_TOOLS_WIN_TOOLCHAIN=0.
For details search for DEPOT_TOOLS_WIN_TOOLCHAIN in the instructions at https://chromium.googlesource.com/chromium/src/+/master/docs/windows_build_instructions.md


Traceback (most recent call last):
  File "v8/build/vs_toolchain.py", line 502, in <module>
    sys.exit(main())
  File "v8/build/vs_toolchain.py", line 498, in main
    return commands[sys.argv[1]](*sys.argv[2:])
  File "v8/build/vs_toolchain.py", line 444, in Update
    subprocess.check_call(get_toolchain_args)
  File "C:\Python27\lib\subprocess.py", line 190, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '['C:\\Python27\\python.exe', 'c:\\v8\\v8_engine\\v8\\third_party\\depot_tools\\win_toolchain\\get_toolchain_if_necessary.py', '--output-json', 'c:\\v8\\v8_engine\\v8\\build\\win_toolchain.json', '3bc0ec615cf20ee342f3bc29bc991b5ad66d8d2c']' returned non-zero exit status 1
Error: Command 'C:\\Python27\\python.exe v8/build/vs_toolchain.py update' returned non-zero exit status 1 in c:\v8\v8_engine
Hook ''C:\Python27\python.exe' v8/build/vs_toolchain.py update' took 601.97 secs
Traceback (most recent call last):
  File "c:\v8\depot_tools\\fetch.py", line 306, in <module>
    sys.exit(main())
  File "c:\v8\depot_tools\\fetch.py", line 301, in main
    return run(options, spec, root)
  File "c:\v8\depot_tools\\fetch.py", line 295, in run
    return checkout.init()
  File "c:\v8\depot_tools\\fetch.py", line 137, in init
    self.run_gclient(*sync_cmd)
  File "c:\v8\depot_tools\\fetch.py", line 82, in run_gclient
    return self.run(cmd_prefix + cmd, **kwargs)
  File "c:\v8\depot_tools\\fetch.py", line 71, in run
    subprocess.check_call(cmd, **kwargs)
  File "C:\Python27\lib\subprocess.py", line 190, in check_call
    raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command '('C:\\Python27\\python.exe', 'c:\\v8\\depot_tools\\gclient.py', 'sync', '--with_branch_heads')' returned non-zero exit status 2

c:\v8\v8_engine>

gclient sync

추후에 source 를 최신으로 update 할 때 사용하면 된다.
c:\v8\v8_engine\v8>gclient sync
Syncing projects: 100% (24/24), done.
Running hooks:  75% (21/28) clang
________ running 'C:\Python27\python.exe v8/tools/clang/scripts/update.py' in 'c:\v8\v8_engine'
Downloading https://commondatastorage.googleapis.com/chromium-browser-clang/Win/clang-349417-2.tgz .......... Done.
Copying C:\Program Files (x86)/Microsoft Visual Studio/2017/Community\DIA SDK\bin\amd64\msdia140.dll to c:\v8\v8_engine\v8\third_party\llvm-build\Release+Asserts\bin
Hook ''C:\Python27\python.exe' v8/tools/clang/scripts/update.py' took 19.46 secs
Running hooks: 100% (28/28), done.

c:\v8\v8_engine\v8>

gn gen --ide=vs out/MyV8

chromium 은 ninja 를 사용한다. depot_tools 를 설치하면 같이 설치된다. gn 을 실행하면 .ninja 를 만들어준다. (자세한 내용은 여기 를 참고하자.)

여기서는 Visual Studio 에서 build 를 할 것이라서 --ide=vs 를 추가해 줬다.
c:\v8\v8_engine\v8>gn gen --ide=vs out\MyV8
Generating Visual Studio projects took 277ms
Done. Made 132 targets from 76 files in 9360ms

c:\v8\v8_engine\v8>

이제 아래 경로에 .sln file 이 생성됐다.
  • c:\v8\v8_engine\v8\out\MyV8\all.sln
몇몇 관련 project 를 filetering 하려면 아래 처럼 하면 된다. 하지만 이 option 은 chromium 같이 큰 프로젝트를 열때나 필요할 듯 하다. v8 project 만 열때는 필요치 않았다.
gn gen --ide=vs --filters=//third_party/v8/* --no-deps out\Default

open .sln(약 60분)

이제 위에서 생성된 all.sln 파일을 더블클릭해서 Visual Studio 를 열자. 그리고 build 를 하면 된다. build 를 하면 내부적으로 ninja 를 호출해서 build 를 하게 된다.

여기서는 v8_hello_world 를 build 했다. 대략 60분 정도가 소요됐다.

error case : visual studio 2015 --> visual studio 2017

v8 build 를 위해서 visual studio 의 version 을 upgrade 한 경우는 stdio.h 등의 header files 가 include 가 안되는 경우가 있다. 이때는 Windows SDK 버전을 재설정 해주자.

v8_hello_world.exe 실행

이제 아래 path 에 v8_hello_world.exe 가 생성됐다. 이 녀석을 실행하면 아래처럼 결과가 나온다.
c:\a\programming\v8\v8_engine\v8\out\MyV8>v8_hello_world.exe
Hello, World!
3 + 4 = 7

debug mode

당영한 이야기지만, 만약 이 v8_hello_world 를 디버그 모드로 실행하고 싶다면, solution explorer 에서 v8_hello_world project 에서 context menu(마우스 오른쪽 버튼) 을 눌러서 debug 를 해야 한다.

See Also

  1.  V8 에서 JavaScript 의 pipeline
  2. V8 관련 글들

References

  1. Checking out and Building Chromium for Windows
  2. v8/v8.git - Git at Google

댓글 없음:

댓글 쓰기