<aside> 📝 필자가 macOS에서 cmake --build 로 빌드를 하던 중이었다. The following build commands failed: CodeSign 이라는 에러 메세지를 토해내면서 빌드가 되지 않았는데, 어떠한 방법으로도 해결되지 않다가 결국 해결 방법을 찾아냈다.

</aside>

현상

macOS 13.4에서 ‘Cycling74/min-devkit’이라는 패키지를 빌드하고 있을 때였다. 해당 Readme에서 시키는 대로 빌드 폴더를 만들어 cmake -G Xcode .. 을 하고, cmake --build . 로 빌드를 하고 있었다.

그런데 중간에 계속해서 The following build commands failed: CodeSign 이라는 에러를 뱉어내며 빌드가 성공하지 않았다.

해결 방법

문제는 바로 iCloud였다. 현재 작업 중인 디렉토리가 ~/Documents 폴더였는데, 필자는 iCloud 싱크를 켜 두어서 ~/Documents 폴더도 같이 동기화되고 있었다. 계속해서 해결 방법을 찾던 도중 혹시나 해서 꺼 보았는데, 역시나 바로 해결되었다.

그러나 의문점이 든다. iCloud 동기화가 켜져있으면 왜 CodeSign이 되지 않는걸까? CodeSign이 애초에 무엇일까?

해결 과정

codesign

Code signing은 위키피디아에 따르면 executable과 스크립트의 무결성을 검사하는 과정이라고 한다. macOS에서는 Xcode가 이 작업을 자동으로 해 준다. 혹은 codesign 커맨드로도 할 수 있다.

마침 해당 리포의 Readme에서 codesign --force --deep -s - [myobject].mxo 커맨드로 수동 code sign해야할 수 도 있다는 부분을 보고 해당 파일에 적용해 보았지만, 이것 또한 실패하였다.

'resource fork, Finder information, or similar detritus not allowed'

이러한 에러가 등장하였는데, 애플 문서에 해결 방법이 나와 있었다.

xattr

xattr -cr <path_to_app_bundle> 커맨드를 사용해도 같은 현상이 반복되고 해결되지 않았다. 이 또한 해결 방법이 아닌 걸까? 여기에서 또 xattr은 무엇이고 왜 작동하지 않을까.

xattr은 위키피디아에 따르면 extended file attribute로 파일의 메타데이터들이다. 파일의 저자, 체크섬같은 기타 정보들이 들어있다. -c 플래그는 모든 xattr을 삭제하고, -r 플래그는 재귀적으로 작동하게 한다. Code sign할 대상이 이러한 xattr을 가고 있으면 보안상의 이유로 sign할 수 없게끔 macOS Sierra부터 막아 두었다고 한다.

xattr -lr <bundle> 명령을 사용해서 현재 폴더와 내용물들의 xattr을 확인해 보았는데, com.apple.FinderInfo는 어떤 명령을 사용해도 제거되지 않았다. xattr -d com.apple.FinderInfo <bundle> 를 명시적으로 사용해도 해당 FinderInfo는 지워지지 않았다. xattr -px com.apple.FinderInfo <bundle> 으로 안의 내용물을 확인해 보니, 그저 몇개의 비트들 뿐이었다.

00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

실험 결과 iCloud 안에 있는 파일과 폴더들은 해당 xattr를 지울 수 없었고, 밖에 있는 폴더들은 지울 수 있었다. 바로 이것이 문제였다. 위의 에러에 등장하듯이 Finder information을 지울 수 없기 때문이었다.

이 비트들은 해당 비트가 패키지에 해당한다는 것은 다른 글에서 따로 증명하였다.