ARM 타겟 PHP 빌드 오류 해결

라즈베리파이에 올릴 용도로 buildroot의 LTS판 최신버전(2020.02.8)을 php 포함하여 빌드하는 중 아레와같은 빌드 에러가 발생하였다.

ext/standard/crc32.c:48:10: error: ‘armv8-a’ does not support feature ‘nothing’
 # pragma GCC target ("+nothing+crc")
          ^~~
ext/standard/crc32.c:48:10: note: valid feature names are: crc simd crypto nocrypto nofp
ext/standard/crc32.c:48:10: error: ‘armv8-a’ does not support feature ‘nothing’
ext/standard/crc32.c:48:10: note: valid feature names are: crc simd crypto nocrypto nofp
ext/standard/crc32.c:49:1: error: ‘armv8-a’ does not support feature ‘nothing’
 static uint32_t crc32_aarch64(uint32_t crc, char *p, size_t nr) {
 ^~~~~~
ext/standard/crc32.c:49:1: note: valid feature names are: crc simd crypto nocrypto nofp
ext/standard/crc32.c:49:1: error: ‘armv8-a’ does not support feature ‘nothing’
ext/standard/crc32.c:49:1: note: valid feature names are: crc simd crypto nocrypto nofp
ext/standard/crc32.c: In function ‘crc32_aarch64’:
ext/standard/crc32.c:49:1: error: ‘armv8-a’ does not support feature ‘nothing’
ext/standard/crc32.c:49:1: note: valid feature names are: crc simd crypto nocrypto nofp
ext/standard/crc32.c:49:17: error: ‘armv8-a’ does not support feature ‘nothing’
 static uint32_t crc32_aarch64(uint32_t crc, char *p, size_t nr) {
                 ^~~~~~~~~~~~~
ext/standard/crc32.c:49:17: note: valid feature names are: crc simd crypto nocrypto nofp
make[1]: *** [Makefile:967: ext/standard/crc32.lo] Error 1

구글링해보니 해당 파일의 위 에러가 발생하는 “+nothing+crc” 부분을 “arch=armv8-a+crc”로 바꾸니 해결되었다. 일부러 +nothing을 넣은건지 알수없고… 에러 내용도 보면 armv8-a에선 nothing을 지원하지 않는다. 이정도로 해석된다.

저런식으로 일단 빌드 안되게 해둔것이 빌드 대상 아키텍쳐가 crc 명령을 지원하는지 유무를 빌드 된 바이너리 레벨에서 확인이 안되어서 인가? 명령이 지원 안하면 실행 시 에러가 발생할것이니 빌드 레벨에서 대상 타겟이 무엇인지 명시적으로 정의를 하는것 같기도하고 음… 나중에 생각이 나고 기회가 되면 파고들어봐야겠다.

CEF(Chromium Embedded Framework) 빌드

풀네임으로는 Chromium Embedded Framework

우연찮게도 DJMAX에서 MSVC 재배포 패키지 설치가 필요하다는 오류가 뜬다는 질문을 보고 몇버전 런타임이 필요할까 하여 리소스를 살펴보다 이건 왜이렇게 용량이 큰거지? 라는 의문으로 구글링하다 알게된 것. 그런데 또 우연스럽게도 며칠 지나지도않아서 이거 관련되어 요청이 하나 들어온게 발생하여 빌드해보았다.

쉬운방법은 cef-project 코드를 받아서 readme 파일대로 cmake만 실행하면된다. 하지만 이건 자동빌드에 의해 먼저 빌드된 엔진을 다운로드하여 부수적인 dll파일만 빌드하는것으로 보였다. 기왕이면 동일한 런타임, 컴파일러로 빌드된 라이브러리를 발드하고싶어 좀 더 보니 cef가 있다. 이쪽은 빌드과정이 흩어져있어서 아래와같이 정리.

Continue reading CEF(Chromium Embedded Framework) 빌드

ICU 라이브러리 MSVC로 빌드

매우 오랜만에 ICU를 빌드하려하다보니 Windows SDK Version이 변경되지않는 이상한 문제가 발생하였다. 이거로 두시간동안 구글링도해보고 솔루션, 프로젝트, 프로퍼티 파일을 열어보아도 답이 안나와서 결국 MSYS2에서 빌드하였다(…).

빌드방법은 간단. VC 콘솔에서 MSYS2가 설치된 폴더로 이동 후 msys2_shell.cmd -use-full-path 명령으로 실행하면 프롬포트의 환경번수가 유지되어 bash 쉘이 뜨게된다. 이제 압축을 푼 icu 폴더의 source 폴더로 이동하여 ./runConfigureICU MSYS/MSVC --prefix=/d/OpenSource/icu-67.1.x64 --enable-tests=no --enable-samples=no 이런식으로 Makefile을 생성. 그리고 원인은 모르지만 config 파일을 정확하게 지정하지 못하는데… 이건 source 폴더의 하위 폴더인 config에서 cp mh-msys-msvc mh-unknown와같이 복사 후 make하면 끝. (nmake가 아닌 make 명령. 만약 D 옵션을 알 수 없다는 오류가 뜬다면 /usr/bin/link.exe 파일의 이름을 잠깐 다른 이름으로 바꾸면 오류를 회피할 수 있다. tests를 비활성화하면 링크에서 오류가 난다.)

이것으로 삽질 끝.

만약 위와같이 rc 명령에서 오류가 난다면 data 폴더에 out폴더 생성, 그 안애 tmp 폴더를 생성하면 된다. 추가로 extra의 scptrun에서 링크오류가 발생하면 해당 폴더의 makefile을 열어서 LINK.cc를 검색하여 -o $@ 부분을 -out:$@로 변경하면 된다.

추가)
icu 70.1버전에서 data폴더에서 dirs.timestamp관련 오류가 발생한다. 패치는 이곳에서 확인가능하며 아래가 패치파일 내용.

diff --urN a/source/data/Makefile.in b/source/data/Makefile.in
--- a/source/data/Makefile.in
+++ b/source/data/Makefile.in
@@ -236,11 +236,12 @@
 ## Include the main build rules for data files
 include $(top_builddir)/$(subdir)/rules.mk
 
+PKGDATA_LIST = $(TMP_DIR)/icudata.lst
 
 ifeq ($(ENABLE_SO_VERSION_DATA),1)
 ifeq ($(PKGDATA_MODE),dll)
 SO_VERSION_DATA = $(OUTTMPDIR)/icudata.res
-$(SO_VERSION_DATA) : $(MISCSRCDIR)/icudata.rc | $(TMP_DIR)/dirs.timestamp
+$(SO_VERSION_DATA) : $(MISCSRCDIR)/icudata.rc $(PKGDATA_LIST)
 ifeq ($(MSYS_RC_MODE),1)
 	rc.exe -i$(srcdir)/../common -i$(top_builddir)/common -fo$@ $(CPPFLAGS) $<
 else
@@ -249,7 +250,6 @@
 endif
 endif
 
-PKGDATA_LIST = $(TMP_DIR)/icudata.lst
 
 
 #####################################################

CMake-gui를 Qt5환경으로 빌드하기

빌드하게 매우 귀찮아 CMake를 MSI 패키지로 설치를 하다가 매우 오랜만에 직접 빌드해보았다. (대신 MSYS2를 깔아야한다.) 전에는 Qt4를 사용했기때문에 쉽게 빌드된거같은데 Qt5를 사용한 GUI 환경을 빌드하려하니 구글링도 안되어 꽤나 삽질했다. CMakeLists.txt를 열어보면 Qt5를 지원하는 모양이였지만 find_package(Qt5Widgets QUIET)구문이 어떻게 동작하는지 알 수 없어 리눅스 환경에서 bootstrap을 실행하여 생성된 CMakeCache.txt 파일을 직접 분석하여 찾아본 결과 -DBUILD_QtDialog=ON -DQT_QMAKE_EXECUTABLE=D:\OpenSource\Qt5.15.0.x64\bin\qmake.exe -DQt5Widgets_DIR=D:\OpenSource\Qt5.15.0.x64\lib\cmake\Qt5Widgets 이렇게 변수를 설정하면 된다는것을 알게되었다.

자세한 내용은 CMake 소스코드에서 README.rst 파일을 열어보면 되고 이미 빌드된 CMake가 없는 상태에서 간략한 빌드과정은

MSYS2를 설치한다. 설치완료 후 MSYS2를 실행하고 pacman -S --needed git base-devel mingw-w64-x86_64-gcc 명령으로 필요한 패키지를 설치한다. (git는 필요없어보이지만 README.rst에서 설치하라고하니..) 그 후 exit 명령으로 쉘을 종료하고 시작메뉴에서 MSYS2 MinGW 64bit를 실행한다. 이렇게 기본 빌드환경은 끝.

3.18.1버전의 cmake를 압축 풀었다면 폴더 이름이 cmake-3.18.1일것이다. 압축 푼 경로가 D:\OpenSource\cmake-3.18.1 이라면 cd /d/OpenSource 명령으로 폴더 이동 후 임의 폴더 생성한다. (cmake-build1로 만들었다.) cmake-build1 폴더에서 ../cmake-3.18.1/configure –prefix=/d/OpenSource/cmake-bootstrap 명령을 실행 후 make && make install 명령을 실행하여 빌드 및 바이너리를 설치한다. 이렇게 bootstrap 환경은 완료.

Visual Studio의 64비트 툴 콘솔을 실행하여 set PATH=%PATH%;C:\msys64\mingw64\bin 명령을 수행 후(msys2를 기본 경로에 설치했을경우) D:\OpenSource\cmake-build2 폴더를 생성 & 이동하여 ../cmake-bootstrap/bin/cmake ..\cmake-3.18.1 -DCMAKE_INSTALL_PREFIX=D:\OpenSource\cmake -DBUILD_QtDialog=ON -DQT_QMAKE_EXECUTABLE=D:\OpenSource\Qt5.15.0.x64\bin\qmake.exe -DQt5Widgets_DIR=D:\OpenSource\Qt5.15.0.x64\lib\cmake\Qt5Widgets 이렇게 실행하면 Visual Studio Solution 파일(CMake.sln)이 생성된다. (nmake 타겟으로 생성가능하지만 VS 솔루션 파일에서 빌드하면 병렬빌드가 되기에 그냥 기본 타겟으로 생성하였다.) 이제 솔루션 파일을 열고 빌드 형식을 Release / x64로 설정하여 CMakePredefinedTargets/ALL_BUILD 프로젝트를 우클릭하여 빌드 메뉴를 선택한다. 모두 빌드되면 CMakePredefinedTargets/INSTALL 프로젝트를 우클릭하여 빌드 메뉴를 선택하면 CMAKE_INSTALL_PREFIX로 설정된 D:\OpenSource\cmake에 CMake가 설치된다.

D:\OpenSource\cmake\bin\cmake-gui.exe 파일을 실행하면 DLL 종속성 오류가 뜰것이다. 명령 프롬포트에서 D:\OpenSource\cmake\bin 폴더로 이동 후 D:\OpenSource\Qt5.15.0.x64\bin\windeployqt.exe cmake-gui.exe 명령을 실행하면 종속된 파일이 전부 복사되고 이제 cmake-gui.exe를 실행하면 아래와같이 GUI 환경의 cmake 프로그램이 실행된다.

이제 필요한것들을 빌드해야겠다. 실행도 깔끔하게 잘 되니 이것으로 끝!

PS4 Remote 로그인 문제 해결

포맷 후 오랜만에 PS4 Remote로 플스에 접속하려고하니 아래와같이 ‘서버에 연결할 수 없습니다.’라는 메시지가 출력되었다.

몇번 시도하면 되겠지 하고 오기로 로그인 해보려하니 마찬가지. 다른 사람들도 겪을 문제일거같아 구글링해보니 아래와같은 영상이 나왔다.

영상의 업로드 날짜는 4월 23일. 최소한 이것보다 더 전부터 발생하던것인거같다. 지금보다 약 두달 전 부터 있던 문제인것. 많은 유저가 버그리포트 했을것이고 왜 아직도 해결안되고 있는지 이해가 되지않는다.

혹시모르니 간략하게 요약

1. 로그인 화면에서 우클릭
2. ‘속성’ 선택
3. 주소(URL) 우측의 주소를 복사(더블클릭 속도로 빠르게 세번 클릭하면 전체선택됨)
4. ‘속성’ 창 닫고, 브라우저의 주소에 붙여넣기 후 엔터(브라우저는 무엇을 사용해도 상관없음)
5. 로그인 후 주소 표시줄의 주소를 복사
6. PS4 Remote의 로그인 창을 클릭한 후 컨트롤 + L
7. 브라우저에서 복사한 주소를 붙여넣고 [확인] 클릭

브라우저의 주소가 변경되면 code와 cid를 읽고 사용자 정보를 읽는것으로 보인다. 윈도에서 유난히 자주 볼 수 있지만 브라우저를 프로그램 내 넣어서 무언가를 하면 브라우저가 업데이트 된 이후 없던 문제가 발생할 수 있는데… PS4 Remote에서도 시스템 브라우저의 어딘가 바뀐 정책으로 로그인 진행이 안되는거같다. 이런 문제를 되도록 피하려면 브라우저를 직접 프로그램에 포함하면되지만 라이선스 문제나 용량이 필요이상으로 늘어날 수 있기때문에 시스템 브라우저를 넣는것이겠지만 요즘같은 때 10~20메가 용량때문에 그럴 필요가 있을까? 싶다.

암튼 해결되었으니 다행. 그런데 두달 넘도록 이런 문제하나 수정하지못하고 뭘하는걸까?