몇주 전 패키지 업데이트 후 icu가 업데이트 되어서인지 spidermonkey를 리빌드 하기위해 emerge @preserved-rebuild 명령을 실행하라하여 실행하니 오류가 발생하였다.
컴파일러의 변수형 검사가 더 강화된건지 jschar(unsigned short int)를 UChar(int16_t)로 형변환 오류가 발생했다. 그냥 두면 언젠가 패치되겠지했더니 한달동안 바뀌지않아 직접 패치한 내용을 나중에 또 필요할 경우를위해 과정은 생략하고 중요한것만 기록.
1. 패치파일 (/usr/portage/dev-lang/spidermonkey/files)
--- a/js/src/jspubtd.h 2018-03-24 14:46:05.245670691 +0900 +++ b/js/src/jspubtd.h 2018-03-24 15:05:45.705519813 +0900 @@ -64,7 +64,7 @@ #ifdef WIN32 typedef wchar_t jschar; #else -typedef uint16_t jschar; +typedef char16_t jschar; #endif /* --- a/mfbt/HashFunctions.h 2018-03-24 14:58:28.848967651 +0900 +++ b/mfbt/HashFunctions.h 2018-03-24 15:07:14.685819168 +0900 @@ -312,14 +312,14 @@ MOZ_WARN_UNUSED_RESULT inline uint32_t -HashString(const uint16_t* str) +HashString(const char16_t* str) { return detail::HashUntilZero(str); } MOZ_WARN_UNUSED_RESULT inline uint32_t -HashString(const uint16_t* str, size_t length) +HashString(const char16_t* str, size_t length) { return detail::HashKnownLength(str, length); } --- a/mfbt/TypeTraits.h 2018-03-24 15:20:41.328643028 +0900 +++ b/mfbt/TypeTraits.h 2018-03-24 15:21:28.616793417 +0900 @@ -195,6 +195,7 @@ template<> struct IsPod : TrueType {}; template<> struct IsPod : TrueType {}; template<> struct IsPod : TrueType {}; +template<> struct IsPod : TrueType {}; template struct IsPod<t*> : TrueType {}; namespace detail {</t*>
패치파일 생성은
diff -u orignalfile1 newfile1 > custom.patch
diff -u orignalfile2 newfile2 >> custom.patch
과같이 patch파일에 덛붙이면 여러파일의 패치를 담을 수 있다. a/mfbt, b/mfbt등 폴더를 만든다음 a에는 오리지널, b에는 수정될 파일을 위치하여 작업을 했다.
2. Manifest 파일 수정 (/usr/portage/dev-lang/spidermonkey)
portage 폴더 내 files에 위치한 패치파일은 AUX로 시작한다.
ex) AUX custom.patch 1208 BLAKE2B ac90b1748e526eb21b0477bb60c08d79a0bbd49c633327132572258987ec0ad6f0d2a2ab802a642fa2ede11151980383fa36fbe530b516333f0f3084b346c8ea SHA512 47327d1f9da97fe89e45745a1947fa62ffb612d9568791555db5009b4b9e9880b982518339f5503fa173eae780e1dc3d7266496538c13b7d740da30df3cd95a2
blake2b 해시파일은 b2sum custom.patch, sha512 해시파일은 sha512sum custom.patch 명령을 실행하면 출력된다. 해당 해쉬문자를 위 라인에 잘 넣으면 된다.
3. rebuild
이제 emerge 명령을 실행하면 끝.
오래 전 젠투리눅스 사용한지 얼마 안되었을 땐 한국 젠투 커뮤니티에서 직접 빌드오류 패치하는 방법을 공유하는 글이 많았는데 요즘은 오히려 잘 검색이 안되는거같다. 그냥 직접 부딛혀보니 어떻게든 해결되었다(…).
뭐 패치를 잘 한건지 모르겠지만 문제없겠지(…) 다음에도 이런 빌드 오류가 발생하면 또 이런 방법을 써먹어야겠다. 끝.
– 2020-09-02 내용보충 –
Manifest 파일에 직접 추가하지않고 ebuild [ebuild 파일 경로] digest 명령을 실행하면 파일이 다시 생성되는것으로 보이지만 나중에 변경된건지 직접 ebuild 파일 수정은 emerge 때 적용되지 않았다. 대신 /etc/portage에 patches 폴더를 생성, 그 아래 패치파일을 만들면 사용자 패치가 적용되었다. 아무래도 sync하면 초기화 되는 등 사용자가 직접 관리되는 파일을 수정하는것을 피하기 위함이 아닌가 생각이든다.
예를들면 sys-devel/bison-3.7.1 이라면 /etc/portage/patches/sys-devel/bison-3.7.1 폴더를 만들고 patch 파일들을 넣으면 되었다. 폴더 이름의 규칙은 간략하게 아래와같고 자세한 내용은 참고링크 참조.
sys-devel/bison
sys-devel/bison:3
sys-devel/bison-3.7.1
sys-devel/bison-3.7.1-r1