내가 벌써 이짓만 몇 번째 하는데, 이젠 정말로 잊어버릴 것만 같아서 적어놓는다. 과거의 나가 오늘의 나를 골탕먹이지 않도록 기록 좀 해놓으려고 한다.
내가 가지고 있는 프로젝트는 정말 쓰잘데기 없이 관리하기 어려운 환경을 가지고 있고, 아무래도 내가 이용하는 RbSFML이라는 라이브러리가 매우 오래되고 의미가 없어졌기 때문이라고 생각한다. 내가 아예 새로운 버전에도 이용할 수 있게 라이브러리를 하나 나중에 작성해 볼까 한다. 최신 보안 업데이트 문제도 있고 하니... 적잖이 이번 방학에 해보아야지. 아무튼, 그저 환경은 이렇다.
Ruby 2.4.10 + Devkit -> rubyinstaller
돌리려면 아무래도 ruby서버 자체가 나는 pc에 있는 것이 편했다. 근데 이제는 vnc로 제껴버릴까 생각이 든다. 서버컴 같은데다 넣어놓으면 좋은데, Docker라도 써볼까? (그게 이런 곳에 쓰이는 건지는 모르겠다.)
사실, ruby나 rails세팅은 쉬워도, rbSFML을 직접 까는게 문제가 심각하다. 환경이 달라질 때, 컴파일을 해주지 않으면 안되는 별 희한한 경우인데, 이건 조금 엿같은게 아니다.
1.ruby에서 dev-kit설치(msys2)를 할 때, 1,2,3 번을 전부 설치 할 것 특히 3번은 무조건 설치 필요
(Msys2 Mingw toolchain)
ruby에서 native library를 만들어 낼 것이라서 그렇다.(rbSFML컴파일 준비)
2.아마 msys2 버전이 오래되서 gpg key 오류가 뜰텐데, 이렇게 하면 해결할 수 있다.
직접 msys2의 폴더에 들어가서 .exe파일 을 열고 이 커맨드를 입력하자 :
curl -O http://repo.msys2.org/msys/x86_64/msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz
curl -O http://repo.msys2.org/msys/x86_64/msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz.sig
pacman-key --verify msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz{.sig,}
pacman -U --config <(echo) msys2-keyring-r21.b39fb11-1-any.pkg.tar.xz
pacman-key --init
pacman-key --populate msys2
pacman-key --refresh-keys --keyserver hkp://ipv4.pool.sks-keyservers.net:11371
이런 코드를 입력하면 다시 msys2의 pacman이 제기능을 할 수 있다.
근데 위의 커맨드가 안먹힐 수도 있다. 그럼 아래의 접은 글을 참조하길!
msys2의 /etc/pacman.conf 의 SigLevel을 잠시 Never로 바꾼다. ->
pacman -Syu
이 짓을 하면 한번 pc를 껏다 켜야한다. 락이 걸려있다.
pacman -S pacman
pacman -S $(pacman -Qq)
이후 위의 커맨드를 다시 실행해볼 것.
커맨드가 성공한다면, 다시 SigLevel을 원래대로 돌려놓아야한다. 이것은 보안을 잠시 푸는 행위이므로 그냥 놔누었다간 문제가 생길 수 있다.
3. PATH 세팅
환경변수를 각각 msys2와 ruby에 해준다.
4. gem 세팅
rails / opengl / glu / perlin을 깔 것이다.(rails는 굳이 이 프로젝트에 필요하지는 않은데.... 깔지 않아도 괜찮다.)
하지만, 아마 버전 땜에 한번에 알아서 깔리지는 않을 것이다.
gem.org 사이트를 드나들면서 버전을 조절하면서 깔자.
gem update
gem install rails opengl glu perlin
gem install opengl glu
gem install nokogiri -v 1.10.10
gem install sprockets -v 3.7.2
gem install rails -v 5.2.5
gem install rake-compiler
rake-compiler도 같이 깔아준다. 의외로 깔아햐할 gem이 많다.
5.msys2 내부의 mingw에 SFML라이브러리 설치
cmake를 이용해서, .a .dll .s파일 등 중요한 것은 전부 챙겨서
mingw64안에다 넣는다.(.dll) (그안의 x86_64-w64-mingw32에는 아무것도 넣지 않는다.)
6.msys2 내부의 mingw에 GLEW라이브러리 설치
다만 GLEW는 ms계열 컴파일러가 기반이라,
freeglut를 대신 설치하면 된다.
pacman -Ss glut해도 됨.
7. Rakefile modification
SFML_INC, SFML_LIB, GLEW_INC, GLEW_LIB
를 알맞게 조절한다.(설치한 곳과 같은 곳에 세팅한다. 환경변수를 건드려도 되긴하는데 그거보단 이게 낫다.)
GLEW와 SFML을 같은 곳에 설치했다면 한개만 세팅하고 나머지는 NULL만 안되게 해도 된다.
8.그리고 대망의 소스파일 고치기. Rake버전이나 깐 컴파일러에 따라서 결국 에러를 내는 코드가 있다. 그것들을 직접 보아가면서 고치지 않으면 결국 문제가 터지기 마련이므로. -Wall -Wextra 옵션을 컴파일 할 때 넣어보아서 무엇이 문제인지 직접 고치도록 하자 :
value.inc ->
template<const char* Name, typename ReturnType, typename ...Args>
ReturnType Value::call(Args... args)
{
static ID sym = rb_intern(Name);
VALUE returnValue = rb_funcall(myValue, sym, sizeof...(args), ((Value)Value::create(args)).to<VALUE>()...);
return Value::create(returnValue).to<ReturnType>();
}
template<const char* Name, typename ValueType>
void Value::setVar(ValueType value)
{
static ID sym = rb_intern(Name);
rb_ivar_set(myValue, sym, ((Value)Value::create(value)).to<VALUE>());
}
(Value)로 캐스팅 작업을 한번 해줘야지 된다. 아무래도 create()나 Value에 대한 것이 아닌 다른 엉뚱한 to를 가져온 것 같기도 하다.
다른 것들도 이렇게 몇몇 작업을 함 :
value.hpp
unsigned long 하나 추가!
Value::to<unsigned long>() 메소드 추가
base.cpp
33 -> Value Fixnum(rb_cInteger)
class.inc
44 -> VALUE object = rb_data_object_wrap(klass, memory, NULL, &free);
rbrect.cpp
146, 170에 있는 result 주석처리
rbwindows.cpp
188번째 줄 즈음, default return "Unknown";추가
rbblendmode.cpp
에도 비슷하게 switch문에 처리 추가
이렇게 하고 몇몇 링커 문제(라이브러리 못찾겠다고 징징대는거) 해결해주면, 드디어 RbSFML이 빌드가 된다.
... 제일 큰 문제점은 이 프로젝트는 Docker도 못 쓴다. 애초에 호스팅이 가능한 서비스가 아니니까. 실질적으로는 Desktop GUI프로그램을 만들어야하는 경우에는 이걸 이용할 방법이 없다. 게다가 컴파일이 이렇게 불친절하고 복잡한, 그마저도 오래되고 업데이트가 되지 않는 라이브러리를 프로젝트에 이용하는 것은 정말로 잘못된 생각일 수도 있겠다는 생각이 들었다. 내가 여태까지 만든 최대의, 그리고 첫번째 프로젝트이니 만큼 애착을 갖고 있는데 결국 얻는 교훈이 이런 것이라서 좀 가슴이 아프기는 하다.
-오늘의 교훈-
게임을 만들거면 Unity써라 제발 혼자서 게임 엔진 만들지 마.... ㅠㅠ
'프로그래밍 > Ruby' 카테고리의 다른 글
루비로 작성된 다양한 라이브러리 찾고 배워보기 (2) | 2021.12.12 |
---|---|
[남이 만든 프로젝트 무작정 따라하기] 2021-12-07 (0) | 2021.12.07 |
[남이 만든거 무작정 따라하기 프로젝트] git bash commands (0) | 2021.12.04 |
[남이 한거 무작정 따라하기 프로젝트] 2021 - 12 - 04 (0) | 2021.12.04 |
[Ruby on Rails] passenger-irb 없을 때 잠깐 쓸 수 있는 녀석 (2) | 2021.07.31 |