말이 많다. 왜냐. 이거 찾느라 이틀 썼거든. ㅠ 이게 묘미지 ✪‿✪
CMake Error at cmake/do_abi_check.cmake:73 (MESSAGE):
sed returned error No such file or directory
이런 에러 메세지가 뜬다면 현재 abi_check.out 파일을 만들 권한이 없는 것입니다. 그러므로 root 계정으로 바꿔서 재실행하거나 설치한 mysql 디렉토리의 권한을 변경하십쇼ㅎ
빌드 100% 돼서 우와 끝났다!! 했는데 1초 뒤 에러떴을 때의 심정을 아십니까
에러를 아무리 찾아도 없길래 뭐야뭐야 나 아무도 뜨지 않은 에러를 만났나봐 설레설레 했는데 진짜 일줄은 몰랐지 아무도 이 에러에 대한 말이 없는거야 왜..?
심지어 cmake 들어가서 shell script 뜯어보기까지 했다..
[ec2-user@ip-10-0-180-126 cmake]$ cat -n do_abi_check.cmake
1 # Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
2 #
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; version 2 of the License.
6 #
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
11 #
12 # You should have received a copy of the GNU General Public License
13 # along with this program; if not, write to the Free Software
14 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
15
16 #
17 # Rules for checking that the abi/api has not changed.
18 #
19 # The following steps are followed in the do_abi_check rule below
20 #
21 # 1) Generate preprocessor output for the files that need to
22 # be tested for abi/api changes. use -nostdinc to prevent
23 # generation of preprocessor output for system headers. This
24 # results in messages in stderr saying that these headers
25 # were not found. Redirect the stderr output to /dev/null
26 # to prevent seeing these messages.
27 # 2) sed the output to
28 # 2.1) remove blank lines and lines that begin with "# "
29 # 2.2) When gcc -E is run on the Mac OS and solaris sparc platforms it
30 # introduces a line of output that shows up as a difference between
31 # the .pp and .out files. Remove these OS specific preprocessor text
32 # inserted by the preprocessor.
33 # 3) diff the generated file and the canons (.pp files already in
34 # the repository).
35 # 4) delete the .out file that is generated.
36 #
37 # If the diff fails, the generated file is not removed. This will
38 # be useful for analysis of ABI differences (e.g. using a visual
39 # diff tool).
40 #
41 # A ABI change that causes a build to fail will always be accompanied
42 # by new canons (.out files). The .out files that are not removed will
43 # be replaced as the new .pp files.
44 #
45 # e.g. If include/mysql/plugin.h has an ABI change then this rule would
46 # leave a <build directory>/abi_check.out file.
47 #
48 # A developer with a justified API change will then do a
49 # mv <build directory>/abi_check.out include/mysql/plugin.pp
50 # to replace the old canons with the new ones.
51 #
52
53 SET(abi_check_out ${BINARY_DIR}/abi_check.out)
54
55 FOREACH(file ${ABI_HEADERS})
56 GET_FILENAME_COMPONENT(header_basename ${file} NAME)
57 SET(tmpfile ${BINARY_DIR}/${header_basename}.pp.tmp)
58
59 EXECUTE_PROCESS(
60 COMMAND ${COMPILER}
61 -E -nostdinc -dI -DMYSQL_ABI_CHECK -I${SOURCE_DIR}/include
62 -I${BINARY_DIR}/include -I${SOURCE_DIR}/include/mysql -I${SOURCE_DIR}/sql
63 -I${SOURCE_DIR}/libbinlogevents/export
64 ${file}
65 ERROR_QUIET OUTPUT_FILE ${tmpfile})
66 EXECUTE_PROCESS(
67 COMMAND sed -e "/^# /d"
68 -e "/^[ ]*$/d"
69 -e "/^#pragma GCC set_debug_pwd/d"
70 -e "/^#ident/d"
71 RESULT_VARIABLE result OUTPUT_FILE ${abi_check_out} INPUT_FILE ${tmpfile})
72 IF(NOT ${result} EQUAL 0)
73 MESSAGE(FATAL_ERROR "sed returned error ${result}")
74 ENDIF()
75 FILE(REMOVE ${tmpfile})
76 EXECUTE_PROCESS(
77 COMMAND diff -w ${file}.pp ${abi_check_out} RESULT_VARIABLE result)
78 IF(NOT ${result} EQUAL 0)
79 MESSAGE(FATAL_ERROR
80 "ABI check found difference between ${file}.pp and ${abi_check_out}")
81 ENDIF()
82 FILE(REMOVE ${abi_check_out})
83 ENDFOREACH()
84
/usr/local/mysql-5.7.23/cmake/do_abi_check.cmake
파일은 api check를 하는데 파일 명 두개를 비교해서 같으면 통과고 다르면 error를 리턴한다.
do_abi_check.cmake를 통해 생기는 파일은 abi_check.out 파일인데, check 프로세스가 끝나면 파일이 삭제된다.
그래서 내가 뭘 보고 싶어도 볼 수가 없다. 그러면 이건 보라고 있는 파일이 아니겠지 그러니까 이거는 문제가 아닐 거다. 해서 다시 에러를 뜯어봤다.
이것저것 찾아보다가 gcc 버전이 문제인가 싶어서 버전도 확인해보고..
https://mariadb.com/kb/en/Build_Environment_Setup_for_Linux/
공식문서에서 권장하는 버전은 gcc 4.8.5이상 인데 내가 쓰는 버전은 11.3.1이다. 안 될리가 없다. gcc 문제는 아닐 것이다.
이제 CMake 공식 문서로 넘어갔다.
https://cmake.org/cmake/help/latest/
CMake 공식 문서도 여기저기 돌아다녔는데 그런 에러는 안 나온다ㅠㅠ
그러다 문득 든 생각,
실수로 sudo 없이 make && make install
명령을 실행시켰는데 같은 에러가 발생했다.
그리고 위에 do_abi_check.cmake 코드에 있었던 abi_check.out 파일이 생성된다는 게 생각났다. 아,, 혹시 파일을 생성할 수 없는 건가???
sudo make && make install로 명령을 실행하면 일시적으로 이 명령에 대해서만 root 권한이 생긴다. 그러니까 make를 하면서 abi_check.out 파일을 생성하는 것은 ec2-user지, root가 아니다. 그래서 파일을 생성할 수 없는 것이었다..!!
간단한 방법으로는 sudo su
명령으로 사용자를 root
로 전환한 다음에 make && make install을 실행시키면 된다.
귀찮은 방법으로는 생성한 디렉토리의 사용자를 내가 사용할 user
로 변경시키면 된다. 혹은 chmod로 다른 유저에게도 권한을 주던지.
make 완료 ٩( ᐛ )و