레이블이 CMake인 게시물을 표시합니다. 모든 게시물 표시
레이블이 CMake인 게시물을 표시합니다. 모든 게시물 표시

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

replace intel app to apple app

mac intel -> M1(apple silicon)으로 마이그레이션 후
intel kind의 프로세서들은 rosetta2 에뮬레이터가 변환해서 apple silicon 에서도 동작한다.
하지만 변환과정으로 비효율적이다.
activity Monitor.app > kind 로 intel 프로세스를 확인할 수 있다.

아직 apple silicon(arm64) 바이너리가 많이 없지만 있다면 대체해보자.

# file 명령으로 바이너리가 어떤 환경에서 실행 되는지 알 수 있다.
file /bin/sh

# bin/zsh 는 arm64, x86_64 둘다 지원하는 universal binary 다.
file /bin/zsh

# intel 용으로 zsh 를 실행하기
arch -x86_64 /bin/zsh

# arm64 용으로 zsh 를 실행하기
arch -arm64 /bin/zsh

# 그런데 /usr/local/bin/zsh 는 x86_64 바이너리다.
file /usr/local/bin/zsh

# 아래 사이트에서 brew 설치 스크립트를 실행하면
# apple silicon 용(/opt/Homebrew/bin 에 설치) homebrew 로 설치 된다.
# 설후 설정을 보면 HOMEBREW_PREFIX: /opt/Homebrew 로 되어 있다.
brew config

# apple silicon 용 brew 등의 바이너리를 우선 실행할 수 있도록 한다.
export PATH=/opt/Homebrew/bin:$PATH

# 이제 쉘을 재시작하고 zsh 설치해 보자.
# bash 도 arm64 으로 설치하자.
brew install zsh bash

# 새로 설치된 zsh 는 arm64 버전이다.
which zsh
/opt/Homebrew/bin/zsh
file /opt/Homebrew/bin/zsh
/opt/Homebrew/bin/zsh: Mach-O 64-bit executable arm64

# 이제 brew 로 arm64 버전의 프로그램을 설치 할 수 있다.
brew install vim fzf git lsd wegt dog 등등

# 참고로 x86_64 용(/usr/local/bin 에 설치) brew 를 사용하려면
# x86_64 용(/usr/local/bin 에 설치) homebrew 설치하고
arch --x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/
install/HEAD/install.sh)"

# 다음과 같이 사용한다.
arch --x86_64 /usr/local/Homebrew/bin/brew install {패키지이름}

#####

arm64 zellij (/opt/Homebrew/bin/zellij) 0.39.1 을 사용하면 status-bar 등의 코드에서 에러가 발생한다.
SSE2 명령셋등 intel cpu 종속적인 코드가 있어 보인다.

# 당분간은 x86_64 zellij 사용하기 위해 arm64 로 설치된 zellij 는 제거한다.
brew uninstall zellij

# 몇주 후 0.39.2 버전이 나왔고 설치하니 해결되었다.
arch -arm64 brew install zellij

# 버전확인
/opt/homebrew/bin/zellij --version
zellij 0.39.2

# arm64 바이너리 확인
file /opt/homebrew/bin/zellij
/opt/homebrew/bin/zellij: Mach-O 64-bit executable arm64

#####

# 마이그레이션 후 파이썬 설치시
brew install python

# 또는 uname -m 이 x86_64 라면
arch -arm64 brew install python

# 다음과 같은 에러가 발생했다.
Error: An exception occurred within a child process:
  FormulaUnavailableError: No available formula with the name "/opt/Homebrew/Library/Taps/homebrew/homebrew-core/Aliases/python".

# 확인해보니 다음 경로 자체가 없었다.
/opt/Homebrew/Library/Taps/homebrew/homebrew-core

# homebrew/core 를 다시 구성후 설치하면 된다.
# 구성에 시간이 좀 걸린다.
brew tap homebrew/core

# 만약 /opt/Homebrew/Library/Taps/homebrew/homebrew-core 경로가 있는 상태에서도 안되면 삭제후 시도해보자.
rm -rf /opt/Homebrew/Library/Taps/homebrew/homebrew-core

#####

# 마이그레이션 후 
# pyenv 로 python 설치하면 다음과 같은 이유로 실패 한다.
pyenv install -v 3.12
ld: warning: duplicate -rpath '/Users/ysoftman/.pyenv/versions/3.12.0/lib' ignored
ld: warning: duplicate -rpath '/opt/homebrew/lib' ignored
ld: warning: search path '/Users/ysoftman/.pyenv/versions/3.12.0/lib' not found
ld: warning: search path '/Users/ysoftman/.pyenv/versions/3.12.0/lib' not found
ld: Undefined symbols:
ld: Undefined symbols:
  _libintl_bindtextdomain, referenced from:
      __locale_bindtextdomain in _localemodule.o
      __locale_bindtextdomain in _localemodule.o
  _libintl_dcgettext, referenced from:
      __locale_dcgettext in _localemodule.o
  _libintl_dgettext, referenced from:
      __locale_dgettext in _localemodule.o
  _libintl_gettext, referenced from:
      __locale_gettext in _localemodule.o
  _libintl_setlocale, referenced from:
      __locale_setlocale in _localemodule.o
      __locale_setlocale in _localemodule.o
      __locale_localeconv in _localemodule.o
      __locale_localeconv in _localemodule.o
      __locale_localeconv in _localemodule.o
      __locale_localeconv in _localemodule.o
  _libintl_textdomain, referenced from:
      __locale_textdomain in _localemodule.o
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [Programs/_freeze_module] Error 1
make: *** Waiting for unfinished jobs....

# libintl.a 라이브러리에 있는 심볼들이 보인다.
# /opt/homebrew/lib/libintl.a 를 참조하지 않는게 문제 같다.
nm /opt/homebrew/lib/libintl.a | rg  "_libintl_(bindtextdomain|dcgettext|dgettext|gettext|setlocale)$"

# 구글링으로 여러 방법들을 시도...
# gettext library 를 찾지 못한다고 해서 다시 설치했지만 안된다.
brew reinstall gettext

# arm64 library 을 찾도록 LDFLAG 를 설정해도 안된다.
export LDFLAGS="-L/opt/homebrew/lib"
export CPPFLAGS="-I/opt/homebrew/include"

# 기존 x86_64 라이브러를 우선 참조하게 되는것 같아 해당 path 를 강제 삭제해도 안된다.
rm -rf /usr/local/Cellar/{gettext,readline}

# arm64 용으로 make gcc 등 컴파일러 최신으로 설치해도 안된다.
arch -arm64 brew install cmake make gcc

# 이번에는 실제 파이썬 소스를 다운받아 다음과 같이 빌드하면 잘된다.
# 아래처럼 configure 로 Makefile 이 생성하면 CC=gcc CXX=g++ 로 설정되어 있다.
git clone https://github.com/python/cpython
cd cpython; ./configure && make -j10

# pyenv 빌드시 clang (Apple clang version 15.0.0) 대신 
# 컴파일러를 gcc(없다면 설치 brew install gcc)로 변경하니 된다.
CC=/opt/homebrew/bin/gcc-13 pyenv install -v 3.12

# 몇달 후 zellij, /opt/homebrew 패키지들을 arm64 로 다시 설치등의 변화가 있었는데,
# 별도 CC 설정없이 clang (Apple clang version 15.0.0) 로도 됐다.
pyenv install -v 3.12

vim-go 환경 만들기


# vim-go 설치 자동 설정 스크립트~^^;

https://github.com/ysoftman/myenv/blob/master/installvim.sh



build OpenCV

# 윈도우 빌드
# CMake download
http://www.cmake.org/

# OpenCV download
http://opencv.org/

# CMake 실행
# Where is the source code: 항목에 소스 경로 명시
# Where to build the binaries: 결과파일이 생성될 경로 명시
# Configure 실행하여 컴파일러 선택 후 finish
# Configure Done 후 Generate 실행하면 .sln .vcproj 등의 파일이 생성된다.
# VS2008 의 경우 OpenCV.sln 를 열고 일괄빌드에서
# ALL_BUILD 프로젝트 빌드하면
# bin => *.dll *.pdb 생성됨
# lib => *.lib *.exp 생성됨

#####

# 리눅스 빌드
# CMake 설치
sudo yum install cmake

# OpenCV download
wget http://downloads.sourceforge.net/project/opencvlibrary/opencv-unix/2.4.2/OpenCV-2.4.2.tar.bz2?r=http%3A%2F%2Fopencv.org%2Fdownloads.html&ts=1344324014&use_mirror=cdnetworks-kr-2

# OpenCV 압축 풀기
tar -jxvf OpenCV-2.4.2.tar.bz2

# OpenCV-2.4.2 위치(CMakeLists.txt 위치)에서
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local .

# Make파일이 생성되면
make -j10
sudo make install
/usr/local/lib 에 *.so 파일이 생성됨

Linux MySQL 5.5.xx 버전대 설치 및 실행

수동으로 mysqld 중지
#######################################################
# MySQL 소스 컴파일 설치
# MySQL 5.5 부터 configure 가 지원되지 않고 cmake 유틸리티를 사용해야한다.
# CMake 우선 설치
wget http://www.cmake.org/files/v2.8/cmake-2.8.4.tar.gz
tar zxvf cmake-2.8.4.tar.gz
cd cmake-2.8.4
./bootstrap
make && make install (root 권한)
# 무료 버전 MySQL Community Server (MySQL5.5) 설치
wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.12.tar.gz/from/http://mirror.khlug.org/mysql/
tar zxvf mysql-5.5.12.tar.gz
cd mysql-5.5.12.tar.gz

cmake -DCMAKE_INSTALL_PREFIX=/home/ysoftman/mysql -DMYSQL_DATADIR=/home/ysoftman/mysql/data -DENABLED_LOCAL_INFILE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DSYSCONFDIR=/etc -DDEFAULT_CHARSET=utf8 -DMYSQL_TCP_PORT=3306 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all

make && make install
cd mysql

# 기본 설정 파일 복사(root권한)
cp ./support-files/my-large.cnf /etc/my.cnf

# 데몬 파일 복사(root권한)
cp ./support-files/mysql.server /etc/init.d/mysqld

# mysqld 설정 변경(root권한)
vi /etc/init.d/mysqld
datadir=/home/ysoftman/mysql/data

# db 설치
./scripts/mysql_install_db --user=ysoftman --basedir=/home/ysoftman/mysql --datadir=/home/ysoftman/mysql/data

# mysql  데몬 시작
# (만약 실패하면 ./bin/mysqld_safe --user=ysoftman& 후 mysql 데몬 시작 )
/etc/init.d/mysqld start

# my.cnf 파일 경로를 직접 설정할경우
/etc/init.d/mysqld --defaults-file=/home/ysoftman/ysoftman_my.cnf

# mysql 시작
./bin/mysql


#######################################################
# MySQL yum 을 이용한 설치
sudo yum install mysql*
# mysql 시작
sudo /etc/rc.d/init.d/mysqld start


#######################################################
# MySQL root 계정 암호를 잊어버렸을 경우
killall mysqld
./bin/mysqld_safe --skip-grant &
./bin/mysql
mysql> use mysql
mysql> update user set password=password('aaa') where user='root';
mysql> flush privileges;
myslq> quit

# mysqld_safe 프로세스 kill하고
/etc/init.d/mysqld start

# 변경한 암호로 접속
./bin/mysql -u root -paaa


#######################################################
# 윈도우에서 설치 및 실행하기
예) mysql-5.6.15-winx64.zip 압축 C:\mysql-5.6.15-winx64 해제
cd  C:\mysql-5.6.15-winx64

# 설정 파일 수정(my-default.ini)
# set basedir to your installation path(설정하지 않아도 디폴트로 설치경로가 됨)
basedir =  C:\\mysql-5.6.15-winx64

# set datadir to the location of your data directory(설정하지 않아도 디폴트로 설치경로\data)
datadir =  C:\\mysql-5.6.15-winx64\\data
port = 13306

# 수동으로 mysqld 시작
bin\mysqld

# 수동으로 mysqld 시작(설정파일 명시)
bin\mysqld.exe --default-file=C:\mysql-5.6.15-winx64\my-default.ini

# 수동으로 mysqld 중지
bin\mysqladmin --user root shutdown

# 윈도우 서비스로 등록하기(수동으로 올린 mysqld 는 모두 shutdown 시켜야 한다.)
bin\mysqld --install MySQL --defaults-file=C:\mysql-5.6.15-winx64\my-default.ini

# 윈도우 서비스에서 삭제하기
bin\mysqld --remove

# 기타 자세한 내용
https://dev.mysql.com/doc/refman/5.6/en/windows-install-archive.html