이번에는 코드 구현부가 자동으로 생성되는 파이썬 파일을 만들 것이다.
파이썬 설치
1. Visual Studio Installer에서 python 설치
2. 새프로젝트 만들기 - Python 프로젝트
3. cmd창에서 python 명령어로 설치 확인
-> 환경변수 등록하기
4. 라이브러리 설치
jinja2, pyinstaller
jinja2로 자동화하기
cpp로 작성한 .h파일을 그대로 복사한다.
주의) cpp의 .h파일로 만들어졌기 때문에 python 문법과 다르게 띄어쓰기가 적용된다.
띄어쓰기가 틀리면 'tag name expected' 에러가 뜨니 자동완성에 주의하자.
완성된 코드는 cmd창에서 확인이 가능하다.
// PacketHandler.h
#pragma once
#include "Protocol.pb.h"
using PacketHandlerFunc = std::function<bool(PacketSessionRef&, BYTE*, int32)>;
extern PacketHandlerFunc GPacketHandler[UINT16_MAX];
// [1]
enum : uint16
{
{%- for pkt in parser.total_pkt %}
PKT_{{pkt.name}} = {{pkt.id}},
{%- endfor %}
};
// Custom Handler
bool Handle_INVALID(PacketSessionRef& session, BYTE* buffer, int32 len);
// [2]
{%- for pkt in parser.recv_pkt %}
bool Handle_{{pkt.name}}(PacketSessionRef& session, Protocol::{{pkt.name}} &pkt);
{%- endfor %}
class {{output}}
{
public:
...
pyinstaller로 실행파일 만들기
자동화가 빌드되면 다음과 같이 파일이 생성된다.
빌드가 되지 않고도 결과물을 만들기 위해 배치파일을 구성해보자.
1) 배치파일을 만든다.
// MakeExe.bat
pushd %~dp0 rem 현재 경로 저장
pyinstaller --onefile PacketGenerator.py
MOVE .\dist\PacketGenerator.exe .\GenPackets.exe
@RD /S /Q .\build
@RD /S /Q .\dist
DEL /S /F /Q .\PacketGenerator.spec
PAUSE
2) 배치파일을 실행하면 파일이 생성된다.
3) 폴더 정리
4) GenPackets.bat 파일 수정
// GenPacket.bat
Rem Path Setting
pushd %~dp0
protoc -I=./ --cpp_out=./ ./Enum.proto
protoc -I=./ --cpp_out=./ ./Struct.proto
protoc -I=./ --cpp_out=./ ./Protocol.proto
Rem PacketHandler auto create
GenPackets.exe --path=./Protocol.proto --output=ClientPacketHandler --recv=C_ --send=S_
GenPackets.exe --path=./Protocol.proto --output=ServerPacketHandler --recv=S_ --send=C_
Rem Error -> Pause cmd
IF ERRORLEVEL 1 PAUSE
Rem Excute bat -> Make file -> Copy with folder
XCOPY /Y Enum.pb.h "../../../GameServer"
XCOPY /Y Enum.pb.cc "../../../GameServer"
XCOPY /Y Struct.pb.h "../../../GameServer"
XCOPY /Y Struct.pb.cc "../../../GameServer"
XCOPY /Y Protocol.pb.h "../../../GameServer"
XCOPY /Y Protocol.pb.cc "../../../GameServer"
XCOPY /Y ClientPacketHandler "../../../GameServer"
XCOPY /Y Enum.pb.h "../../../DummyClient"
XCOPY /Y Enum.pb.cc "../../../DummyClient"
XCOPY /Y Struct.pb.h "../../../DummyClient"
XCOPY /Y Struct.pb.cc "../../../DummyClient"
XCOPY /Y Protocol.pb.h "../../../DummyClient"
XCOPY /Y Protocol.pb.cc "../../../DummyClient"
XCOPY /Y ServerPacketHandler "../../../DummyClient"
DEL /Q /F *.pb.h
DEL /Q /F *pb.cc
DEL /Q /F *.h
PAUSE
프로그램을 빌드하면 처음에 에러가 날 것인데, 자동화 기능으로 h파일에 선언된 함수의 구현부가 cpp파일에 없어서 그렇다.
-> cpp 파일에 구현부를 작성하고 다시 빌드하면 에러가 나지 않게된다.
코드)
https://github.com/Juzdalua/Study-Cpp-Server/blob/master/Tools/PacketGenerator/PacketGenerator.py
Study-Cpp-Server/Tools/PacketGenerator/PacketGenerator.py at master · Juzdalua/Study-Cpp-Server
Study C++ IOCP. Contribute to Juzdalua/Study-Cpp-Server development by creating an account on GitHub.
github.com
'Server > C++' 카테고리의 다른 글
Boost 라이브러리 사용하기 (0) | 2024.11.19 |
---|---|
C++ MySQL 연동 - Connector/C++ (0) | 2024.08.30 |
Google Protobuf - 3) 자동화 - 1 (0) | 2024.08.21 |
Google Protobuf - 2) 패킷 송수신 (0) | 2024.08.21 |
Google Protobuf - 1) 21.3 설치 (0) | 2024.08.20 |