
개요
Windows에선 VisualStudio를 통해 편하게 빌드할 수 있었다면, Linux환경에선 Makefile을 통해 편하게 빌드할 수 있다.
CMake가 크로스 플랫폼에서의 빌드 환경에 강점이 있다고 하는데 실제로 사용해 보니 그렇게 Windows와 Linux환경이 조금 많이 차이가 나서 왜 강점이라고 하는지는 잘 느끼지 못했다. 내가 잘못 썼을 가능성이 가장 크긴 하지만...
Linux환경에선 패키지 유무가 C++ 프로젝트를 제대로 수행할 수 있는지 여부가 가장 크다, vcpkg를 clone하고 설치한 후 vcpkg.json을 통해 라이브러리를 설치 할 수 있다는 것은 Windows환경과 동일하다. 하지만 해당 라이브러리를 설치하는 과정에서 다양한 리눅스 패키지가 필요하기 때문에 오류가 자주 발생하곤 한다.
따라서 현재 리눅스 패키지 환경이 어떻게 되어있는지 모를 경우 아래와 같은 순서로 진행하는 쉘 스크립트를 제작하여 초기 세팅을 진행하는 것이 경험상 좋았다.
- 필요한 패키지들을 모두 설치
- vcpkg clone 및 설치 관련 쉘 스크립트 실행
- vcpkg.json을 통한 관련 라이브러리 설치
- 패키지 경로를 통한 라이브러리 환경 변수 설정
- Makefile실행, 빌드
- 빌드 결과물 실행
init.sh
#!/bin/bash
# 실패 시 스크립트 중단
set -e
echo "===== 시스템 패키지 업데이트 및 필요한 의존성 설치 ====="
sudo apt-get update
sudo apt-get install -y \
build-essential \
pkg-config \
bison \
flex \
libssl-dev \
zlib1g-dev \
autoconf \
automake \
libtool \
m4 \
cmake \
uuid-dev \
libpq-dev \
curl \
unzip \
tar \
python3 \
python3-pip \
ninja-build
echo "===== vcpkg 설정 ====="
# 이미 vcpkg가 존재하는 경우 제거
if [ -d "vcpkg" ]; then
echo "기존 vcpkg 디렉토리 제거 중..."
rm -rf vcpkg
fi
# vcpkg 클론
echo "vcpkg 저장소 클론 중..."
git clone https://github.com/microsoft/vcpkg.git
# vcpkg 부트스트랩
echo "vcpkg 부트스트랩 실행 중..."
cd vcpkg
./bootstrap-vcpkg.sh
cd ..
# vcpkg로 패키지 설치
echo "vcpkg로 필요한 패키지 설치 중..."
./vcpkg/vcpkg install --triplet=x64-linux
# 환경 변수 설정으로 빌드 시 vcpkg 라이브러리 사용
echo "===== Makefile 실행 ====="
# LD_LIBRARY_PATH에 vcpkg 라이브러리 경로 추가
export LD_LIBRARY_PATH="$PWD/vcpkg_installed/x64-linux/lib:$LD_LIBRARY_PATH"
# 프로젝트 빌드
make
echo "===== 설치 및 빌드 완료 ====="
해당 파일에 최초 레포지토리를 clone한 이후 과정에 대해 쭉 자동화를 진행해 주었다.
- apt-get update 후 install을 통해 vcpkg, g++빌드에 필요한 패키지들을 모두 설치해 준다.
- vcpkg를 클론하고, 설치 후 vcpkg.json에 명시된 라이브러리를 설치해 준다.
- vcpkg를 통해 설치한 라이브러리를 환경 변수에 추가해 준다.
- Makefile을 실행하여 빌드를 수행해 준다.
Makefile
CXX = ccache g++
# vcpkg 헤더 파일 경로 추가
CXXFLAGS = -std=c++20 -Wall -Wextra -I./ -I./src -I./src/core -I./src/controller -I./src/service -I./src/repository -I./src/util -I./vcpkg_installed/x64-linux/include
# vcpkg 라이브러리 경로 추가
LDFLAGS = -L./vcpkg_installed/x64-linux/lib -lpqxx -lpq -lboost_system -lssl -lcrypto -pthread -lfmt -lpgcommon -lpgport
SRC_DIR = ./src
BUILD_DIR = ./build
BIN_DIR = $(BUILD_DIR)/bin
SOURCES = $(SRC_DIR)/main.cpp \
$(SRC_DIR)/core/server.cpp \
$(SRC_DIR)/core/session.cpp \
$(SRC_DIR)/controller/auth_controller.cpp \
$(SRC_DIR)/controller/room_controller.cpp \
$(SRC_DIR)/controller/game_controller.cpp \
$(SRC_DIR)/service/auth_service.cpp \
$(SRC_DIR)/service/room_service.cpp \
$(SRC_DIR)/service/game_service.cpp \
$(SRC_DIR)/repository/user_repository.cpp \
$(SRC_DIR)/repository/room_repository.cpp \
$(SRC_DIR)/repository/game_repository.cpp \
$(SRC_DIR)/util/db_pool.cpp \
$(SRC_DIR)/util/password_util.cpp
OBJECTS = $(SOURCES:$(SRC_DIR)/%.cpp=$(BUILD_DIR)/%.o)
TARGET = $(BIN_DIR)/MatchingServer
# 디렉토리 자동 생성
$(shell mkdir -p $(BIN_DIR))
$(shell mkdir -p $(dir $(OBJECTS)))
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CXX) $(CXXFLAGS) $^ -o $@ $(LDFLAGS)
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
clean:
rm -rf $(BUILD_DIR)
.PHONY: all clean
g++ 기반의 C++ 프로젝트 빌드를 수행하는 Makefile이다.
- 좀 더 빠른 빌드를 위해 ccache를 통해 빌드 캐시로 속도를 올려준다.
- C++ 버전, 소스 파일이 위치한 디렉토리, vcpkg로 설치한 라이브러리가 위치한 디렉토리를 FLAG로 명시해 준다.
- build 후 파일이 위치할 경로를 지정해 주고, 실제 소스 파일명을 명시해 준다.
- 링커 파일을 제작할 경로를 명시해 주고, 빌드 이후 결과물이 위치할 디렉토리를 명시해 주고 mkdir를 통해 생성해 준다.
- 컴파일을 지냉 후 완료가 되면 결과물을 지정된 디렉토리에 위치해 준다.
이로서 make 단 한개의 명령어를 통해 C++ 프로젝트를 빌드할 수 있게 되었다.
build.sh
init.sh를 통해 초기 단계 세팅을 구현하였고, Makefile을 통해 라이브러리 의존성과 전반적인 빌드를 수행했다.
보통 윈도우 환경에서 코드구현을 하고 Linux환경에서 서버를 띄우기 때문에 코드가 변경될 때 마다 git pull을 통해 레포지토리를 땡겨와서 디렉토리를 이동해 make르 진행하고 다시 디렉토리를 이동해 결과물을 실행하기엔 너무 번거롭다.
#!/bin/bash
# 색상 코드
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[0;33m'
NC='\033[0m' # No Color
echo "===== 빌드 시작 ====="
# 빌드 디렉토리 정리
if [ -d "build" ]; then
echo "기존 빌드 디렉토리 정리 중..."
make clean
fi
# vcpkg 의존성 변경 확인
if [ -f "vcpkg.json" ]; then
VCPKG_HASH=$(md5sum vcpkg.json | awk '{print $1}')
VCPKG_HASH_FILE=".vcpkg_hash"
if [ -f "$VCPKG_HASH_FILE" ] && [ "$(cat $VCPKG_HASH_FILE)" = "$VCPKG_HASH" ]; then
echo "vcpkg 의존성 변경 없음, 설치 건너뜀..."
else
echo "vcpkg 의존성 변경 감지, 설치 중..."
./vcpkg/vcpkg install --triplet=x64-linux
echo "$VCPKG_HASH" > "$VCPKG_HASH_FILE"
fi
fi
# 빌드 실행
echo "프로젝트 빌드 중..."
make -j$(nproc)
# 빌드 결과 확인
if [ $? -eq 0 ]; then
echo -e "${GREEN}빌드 성공!${NC}"
echo "실행 파일 위치: ./build/bin/MatchingServer"
else
echo -e "${RED}빌드 실패${NC}"
exit 1
fi
echo "===== 빌드 완료 ====="
echo "서버 실행 중..."
./build/bin/MatchingServer
해당 파일을 통해 이전 빌드 제거, 빌드, 서버 실행까지 모두 진행할 수 있게 된다.
- 우선 build 디렉토리가 존재하면 make clean을 수행하여 이전 빌드 내용을 모두 지워준다.
- 만약 vcpkg.json파일이 변경되어 의존성에 변경된 점이 있다면 추가 라이브러리를 설치해 준다.
- make를 수행하는데 -j 명령어를 통해 병렬로 make작업을 수행하여 빌드 속도를 개선한다.
- 빌드가 성공적으로 완료된 경우 결과물이 위치한 디렉토리에서 결과물을 수행해 준다.
ci.sh
cd ..
git pull
cd ./MatchingServer
./build.sh
이 파일은 루트 디렉토리로 이동하여 git pull을 수행하고 다시 원래 디렉토리로 돌아와 build.sh를 실행해 주는 파일이다.
그냥 build.sh 파일에 해당 로직을 포함해도 되겠지만 그냥 모듈화를 위해 쉘 스크립트를 분리해 두었다. 리눅스는 실행 자동화가 너무 잘 되어있는 파일 관리 시스템이다.
CI/CD
Gitlab과 Github환경에서의 CI/CD 파이프라인을 구축하였다.
서버를 Docker로 컨테이너로 띄우고 AWS EC2에 원격 접속하여 pull부터 빌드, docker prune, donw, up 작업을 자동으로 수행해 주는 파이프라인을 구현하였다.
하지만 C++ 기반의 서버를 담을 적당한 도커 이미지를 찾지 못해 패키지 설치부터 직접 구현해 주어야 했으며, 파이프라인 내에서 빌드를 진행함에 있어 속도가 매우 느려 CI/CD 파이프라인 구축은 다시 rollback하였다.
실제로 git push 후 pull 및 빌드, 서버 실행 자동화 쉘 스크립트를 사용하는 것이 거의 10배는 빠른 수준이라 현재 빌드 시스템에 만족하고 있고, 추후 더 깊은 학습을 통해 최적화를 진행해 볼 예정이다.
'프로젝트 > 메타버스 게임' 카테고리의 다른 글
[메타버스 게임] 캐쥬얼 배틀로얄 프로젝트 계층형 아키텍쳐 구현 (0) | 2025.04.01 |
---|---|
[메타버스 게임] 캐쥬얼 배틀로얄 프로젝트 Windows 빌드 환경 세팅(VisualStudio) (0) | 2025.03.31 |
[메타버스 게임] 캐쥬얼 배틀로얄 프로젝트 vcpkg C++ 라이브러리 설치 (0) | 2025.03.31 |
[메타버스 게임] 캐쥬얼 배틀로얄 프로젝트 ERD 제작, 물리 DB 구현 (0) | 2025.03.27 |
[메타버스 게임] 캐쥬얼 배틀로얄 프로젝트 기술 스택 (0) | 2025.03.27 |