caTea 블로그

V8 engine xcode build and embed 본문

macos | ios

V8 engine xcode build and embed

ZaRas 2023. 3. 17. 14:29
반응형

구글 자바스크립트 엔진을 사용하여 이것저것 개발하기위해 개발환경을 만들어보자

한국어로 된 자료가 많이 없어서 내가 만든다.. (V8엔진 사이트가 불친절한것도 있는거같기두..)

 

필자가 개발한 환경

M1 Pro 노트북

Macos 13.0.1 벤츄라

Xcode 14.2

 

 

1. 개발 관련 구글 툴 받기

먼저 v8엔진 소스를 받기 전에 v8엔진 빌드 툴부터 받는다

터미널에서 아래 명령어를 실행한다

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git

2. 환경변수 등록

 

이거 받고 환경변수로 등록해준다

.zprofile 파일 수정 후 터미널 재실행

PATH="/Users/abcdefg123456/workspace/v8engine/depot_tools:${PATH}"
export PATH

3. 구글 V8 Engine 소스코드 및 개발환경 받기

 

그 다음 적당한 디렉토리에 V8프로젝트를 받을 폴더 생성 해주고 아래 명령어 실행하면 

공식사이트에서 하라는 명령어들을 모두 해준다 빌드 환경까지 내려받아주는듯 fetch 실행바이너리는 depot_tools에 있다

그래서 환경변수를 설정해주어야한다 내부적으로 gclient 실행까지 해주는듯하다

fetch v8

4. gm, v8gen 환경변수 등록

 

그다음 gm , v8gen 명령어를 수행해야 컴파일 빌드 스크립트를 만들어주는데 경로 찾아가기 귀찬으니까 환경변수로 등록하자

alias gm=/Users/abcdefg123456/workspace/v8engine/v8/tools/dev/gm.py
alias v8gen=/Users/abcdefg123456/workspace/v8engine/v8/tools/dev/v8gen.py

5. 임베디드용 컴파일 빌드 스크립트 생성

난 xcode에 맥용으로 엔진을 임베디드하여 사용할꺼기 때문에 아래 명령어로 생성한다 (메뉴얼에 이렇게 있더라..)

v8gen arm64.release.sample

6. 컴파일 실행

ninja -C out.gn/arm64.release.sample v8_monolith 

7. 라이브러리 생성 완료

아래 경로 가보면 .a파일이 3개 생겼을꺼다

/Users/abcdefg123456/workspace/v8engine/v8/out.gn/arm64.release.sample/obj

 

근데 문제가 발생했다 

 

가져가 사용해보니 에러가 나데?

 

첫번째 문제 

빌드가 정상적으로 되어서 라이브러리 파일을 프로젝트에 넣고 실행해보니 에러로그가 콘솔에 올라온다.

v8_enable_pointer_compression 이 플래그를 false로 해주어야 포인터 충돌이 안난다 공식문서에는 ios만 하라고 되어있는데

Macos에는 모두 넣어줘야한다

다시빌드했다..

 

/Users/abcdefg123456/workspace/v8engine/v8/out.gn/arm64.release.sample/args.gn 파일을 열어서 수정해준다

dcheck_always_on = false
is_component_build = false
is_debug = false
target_cpu = "arm64"
use_custom_libcxx = false
v8_enable_i18n_support = false
v8_monolithic = true
v8_use_external_startup_data = false
v8_enable_pointer_compression = false
is_clang = true
target_os = "mac"

 

두번째 문제

아래 붉은색 소스에서 자꾸 앱 크래시가 난다

Fatal process OOM in Failed to reserve virtual memory for CodeRange

    std::unique_ptr<v8::Platform> platform = v8::platform::NewDefaultPlatform();
    v8::Platform *p = platform.get();
    v8::V8::InitializePlatform(platform.get());
    v8::V8::Initialize();
    


    v8::Isolate::CreateParams create_params;
    create_params.array_buffer_allocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator();
    v8::Isolate* isolate = v8::Isolate::New(create_params);

 

문제는 v8엔진이 시스템 로우 레벨단 메모리 핸들링을하는데 애플이 막아놓은것이였다.. 찾는데 오래걸렸다

 

Disable Executeable Memory Protection 을 체크 하면 정상 동작된다

 

이제 정말 끝이다 v8엔진을 맘껏 핸들링할수있다!!

 

갖고 놀아봐야겠다

 

728x90