go download error in etcd build

# etcd 소스 빌드
wget https://github.com/etcd-io/etcd/archive/refs/tags/v3.5.18.tar.gz
tar zxvf v3.5.18.tar.gz
cd etcd-3.5.18
make

# make > build.sh > script/test_lib.sh > determine_go_version 에서
# .go-version 파일에서 사용할 go version 을 찾고 다운로드 한다.
# 여기서 exit code 1 발생으로 빌드가 중지된다.
GO_BUILD_FLAGS="-v" ./build.sh
go: downloading go1.22.11 (darwin/arm64)
go: download go1.22.11: golang.org/toolchain@v0.0.1-go1.22.11.darwin-arm64: verifying module: checksum database disabled by GOSUMDB=off

# 수동으로 해당 go 버전을 설치하면 된다.
# /Users/ysoftman/workspace/gopath/bin/go1.22.11 가 생긴다.
go install golang.org/dl/go1.22.11@latest

# ~/sdk/go1.22.11/ 에 go 소스 빌드 파일이 생긴다.
go1.22.11 download

# 또는 다음 환경변수 설정으로 시스템 go 버전을 사용해 빌드할 수 있다.
FORCE_HOST_GO=ON make

build gRPC on mac

# mac m1(arm64) 에서 grpc 소스 빌드를 해보는데 다음 에러가 발생했다.
/Users/ysoftman/workspace/grpc-1.70.1/src/core/lib/promise/pipe.h:118:5: error: use of undeclared identifier 'VLOG'
  118 |     GRPC_TRACE_VLOG(promise_primitives, 2)
      |     ^
/Users/ysoftman/workspace/grpc-1.70.1/src/core/lib/debug/trace_impl.h:95:40: note: expanded from macro 'GRPC_TRACE_VLOG'
   95 |   if (GRPC_TRACE_FLAG_ENABLED(tracer)) VLOG(level)

# grpc 빌드에 protobuf, absl, c-ares, re2, ssl, zlib 등이 라이브러리가 필요하고
# cmake 실행시 다음과 같이 package(시스템 패키지)가 사용되도록 했다.
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_INSTALL_PREFIX=/Users/ysoftman/workspace/ysoftman-build-grpc \
-DBUILD_SHARED_LIBS=1 \
-DgRPC_CARES_PROVIDER=package \
-DgRPC_ABSL_PROVIDER=package \
-DgRPC_PROTOBUF_PROVIDER=package \
-DgRPC_RE2_PROVIDER=package \
-DgRPC_SSL_PROVIDER=package \
-DgRPC_ZLIB_PROVIDER=package \
-DgRPC_DOWNLOAD_ARCHIVES=0 \
-DgRPC_BUILD_GRPC_CSHARP_PLUGIN=0 \
-DgRPC_BUILD_GRPC_NODE_PLUGIN=0 \
-DgRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN=0 \
-DgRPC_BUILD_GRPC_PHP_PLUGIN=0 \
-DgRPC_BUILD_GRPC_RUBY_PLUGIN=0 .

# cmake 수행후 설정들이 어떻게 생성됐는지 확인해 보면
# re2 만 (x86_64)/usr/local/lib/cmake/re2 경로를 사용하고 있었다.
cmake -L ./grpc-1.70.1
... 생략 ...
Protobuf_DIR:PATH=/opt/homebrew/lib/cmake/protobuf
absl_DIR:PATH=/opt/homebrew/lib/cmake/absl
c-ares_DIR:PATH=/opt/homebrew/lib/cmake/c-ares
gRPC_ABSL_PROVIDER:STRING=package
gRPC_BUILD_CODEGEN:BOOL=ON
gRPC_BUILD_GRPCPP_OTEL_PLUGIN:BOOL=OFF
gRPC_BUILD_GRPC_CPP_PLUGIN:BOOL=ON
gRPC_BUILD_GRPC_CSHARP_PLUGIN:BOOL=0
gRPC_BUILD_GRPC_NODE_PLUGIN:BOOL=0
gRPC_BUILD_GRPC_OBJECTIVE_C_PLUGIN:BOOL=0
gRPC_BUILD_GRPC_PHP_PLUGIN:BOOL=0
gRPC_BUILD_GRPC_PYTHON_PLUGIN:BOOL=ON
gRPC_BUILD_GRPC_RUBY_PLUGIN:BOOL=0
gRPC_BUILD_MSVC_MP_COUNT:STRING=0
gRPC_BUILD_TESTS:BOOL=OFF
gRPC_CARES_PROVIDER:STRING=package
gRPC_DOWNLOAD_ARCHIVES:BOOL=0
gRPC_INSTALL:BOOL=ON
gRPC_INSTALL_BINDIR:STRING=bin
gRPC_INSTALL_CMAKEDIR:STRING=lib/cmake/grpc
gRPC_INSTALL_INCLUDEDIR:STRING=include
gRPC_INSTALL_LIBDIR:STRING=lib
gRPC_INSTALL_SHAREDIR:STRING=share/grpc
gRPC_PROTOBUF_PROVIDER:STRING=package
gRPC_RE2_PROVIDER:STRING=package
gRPC_SSL_PROVIDER:STRING=package
gRPC_USE_PROTO_LITE:BOOL=OFF
gRPC_ZLIB_PROVIDER:STRING=package
re2_DIR:PATH=/usr/local/lib/cmake/re2

# re2(regular expression library) 를 설치하면 /opt/homebrew/lib/cmake/re2 가 생된다.
brew install re2

# 이제 cmake 를 실행하고 설정 내용을 보면 re2 경로가 다음으로 변경된다.
re2_DIR:PATH=/opt/homebrew/lib/cmake/re2

# 다시 빌드 수행 중 다음 에러가 발생했다.
ld: warning: ignoring file '/usr/local/Cellar/openssl@3/3.2.0_1/lib/libssl.3.dylib': found architecture 'x86_64', required architecture 'arm64'
ld: warning: ignoring file '/usr/local/Cellar/openssl@3/3.2.0_1/lib/libcrypto.3.dylib': found architecture 'x86_64', required architecture 'arm64'
Undefined symbols for architecture arm64:

# export OPENSSL_ROOT_DIR=/usr/local/opt/openssl 환경변수 설정이 문제였다.
# openssl 을 설치하고
brew install openssl
# 다음과 같이 환경변수를 설정 또는 OPENSSL_ROOT_DIR 설정을 안하면 기본 /opt/homebrew/opt/openssl 을 사용한다.
export OPENSSL_ROOT_DIR=/opt/homebrew/opt/openssl

# 다시 cmake > make 하면 빌드 성공~

clang complie_commands.json

# mac m1(arm64)에서 linux/x86(amd64) 환경 cpp 개발을 위해,
# 다음과 같이 docker 를 띄우고 host cpp 소스 경로 <-> docker볼륨을 연결했다. 
docker run -dit --name myproject \
    --hostname myproject-docker \
    --platform linux/amd64 \
    --workdir /myproject \
    -p 8080:8080 \
    -p 8081:8081 \
    -v /Users/ysoftman/myproject:/myproject \
    -v /Users/ysoftman/myproject_lib:/myproject_lib \
    ysoftman-myproject

# 빌드는 docker 에서 수행하도록 했다.
docker exec -u root -it myproject /bin/bash -c "
cd /myproject && 
    cmake \
    -DEXTERNS_DIR:PATH=/myproject_lib \
    -DCMAKE_INSTALL_PREFIX:PATH=/myproject/out
make -j8 && make install
"

# host 에서 cpp 를 nvim 으로 열면 다음과 같이 선어되지 않은 식별자 에러가 발생한다.
clang "use of undeclared identifier" 

# 참고로 vscode 는 자체 cpp intelligence 를 이용해서 에러가 없다.
# 원인은 nvim cpp LSP(LanguageServerProtocol) 로 clangd(clang 데몬)를 사용하고
# clangd 는 식별자 선언 내용을 compile_commands.json 파일을 참고하는데 이 파일이 없었다.
# 다음의 cmake 명령으로 compile_commands.json 을 생성할 수 있다.
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON {프로젝트 경로} 

# 문제
# 다음과 같이 host 기준으로 하면 이미 makefile, cmakecahe.txt 등의 파일들이 docker container 기준의 경로로 되어 있기 때문에 에러가 발생한다.
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON /Users/ysoftman/myproject

# 그리고 mac 루트 경로에서는 읽기만 허용해 다음과 같은 소프트 링크를 생성할 수 없었다.
ln -sf /myproject -> /Users/ysoftman/myproject

# 해결방법
# docker container 환경에서 compile_commands.json 생성하고
docker exec -u root -it myproject /bin/bash -c "
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON /myproject
"

# mac root 경로를 수정할 수 없어 compile_commands.json 의 경로를 수정한다.
pushd /Users/ysoftman/myproject
sed -i '' \
    -e "s#/myproject#$/Users/ysoftman/myproject#g" \
    -e "s#/myproject_lib#$/Users/ysoftman/myproject_lib#g" \
    compile_commands.json
popd

# 이제 nvim 으로 열어보면 에러도 없고 goto declaration도 잘 동작한다.

# 추가로 .clangd 파일에 include 경로 설정
CompileFlags:
  Add:
    - "-I/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include"
    # - "-I/opt/homebrew/opt/llvm/include/c++/v1"
    - "-L/opt/homebrew/opt/llvm/lib"
    - "-Wall"
    - "-xc++"
    - "-std=c++17"
Index:
  StandardLibrary: Yes