※ 이 글에서는 OmniOS r151038 버전과 JGRPP v0.52.0 버전이 사용되었습니다.
글 작성 시점에서 r151038 버전은 OmniOS LTS 릴리즈의 가장 최신 버전이고, v0.52.0은 JGRPP의 가장 최신 릴리즈입니다.
OS 정보
~$ uname -a
SunOS omnioslts 5.11 omnios-r151038-7bb369b3b5 i86pc i386 i86pc
~$ cat /etc/os-release
NAME="OmniOS"
PRETTY_NAME="OmniOS Community Edition v11 r151038cs"
CPE_NAME="cpe:/o:omniosce:omnios:11:151038:97"
ID=omnios
VERSION=r151038cs
VERSION_ID=r151038cs
BUILD_ID=151038.97.2023.03.11
HOME_URL="https://omnios.org/"
SUPPORT_URL="https://omnios.org/"
BUG_REPORT_URL="https://github.com/omniosorg/omnios-build/issues/new"
필요한 패키지 설치
~$ sudo pkg install gcc10 cmake gnu-make
설치할 패키지: 2
변경할 서비스: 1
부트 환경 만들기: 아니오
백업 부트 환경 만들기: 아니오
다운로드 패키지 파일 XFER(MB) 속도
완료됨 2/2 3199/3199 25.5/25.5 471k/s
단계 항목
새 작업 설치 3358/3358
패키지 상태 데이터베이스 업데이트 완료
패키지 캐시 업데이트 0/0
이미지 상태 업데이트 완료
빠른 조회 데이터베이스 만들기 완료
검색 색인 읽기 완료
검색 색인 업데이트 2/2
패키지 캐시 업데이트 2/2
~$ gcc --version
gcc (OmniOS 151038/10.4.0-il-1) 10.4.0
Copyright (C) 2020 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
~$ cmake --version
cmake version 3.25.3
CMake suite maintained and supported by Kitware (kitware.com/cmake).
~$ gmake --version
GNU Make 4.3
Built for x86_64-pc-solaris2.11
Copyright (C) 1988-2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
JGRPP 소스 다운로드 및 압축 해제
~$ wget https://github.com/JGRennison/OpenTTD-patches/archive/refs/tags/jgrpp-0.52.0.tar.gz
--2023-03-24 15:02:55-- https://github.com/JGRennison/OpenTTD-patches/archive/refs/tags/jgrpp-0.52.0.tar.gz
Resolving github.com... 20.200.245.247
Connecting to github.com|20.200.245.247|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://codeload.github.com/JGRennison/OpenTTD-patches/tar.gz/refs/tags/jgrpp-0.52.0 [following]
--2023-03-24 15:02:56-- https://codeload.github.com/JGRennison/OpenTTD-patches/tar.gz/refs/tags/jgrpp-0.52.0
Resolving codeload.github.com... 20.200.245.246
Connecting to codeload.github.com|20.200.245.246|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [application/x-gzip]
Saving to: ‘jgrpp-0.52.0.tar.gz’
jgrpp-0.52.0.tar.gz [ <=> ] 11.64M 6.13MB/s in 1.9s
2023-03-24 15:02:58 (6.13 MB/s) - ‘jgrpp-0.52.0.tar.gz’ saved [12207921]
~$ tar xzf jgrpp-0.52.0.tar.gz
소스 파일 수정
압축을 풀어서 나온 소스 폴더로 이동.
~$ cd OpenTTD-patches-jgrpp-0.52.0
CMakeLists.txt
를 텍스트 편집기로 열어 313 줄에 위치한 target_link_libraries
함수 내부에 아래 세 줄을 추가.
${CMAKE_DL_LIBS}
-lsocket
-lnsl
⋮
add_dependencies(openttd
find_version)
target_link_libraries(openttd
openttd::languages
openttd::settings
openttd::media
openttd::basesets
openttd::script_api
openttd::binfiles
Threads::Threads
${CMAKE_DL_LIBS}
-lsocket
-lnsl
)
if(HAIKU)
target_link_libraries(openttd "be" "network" "midi")
endif()
⋮
build-dedicated.sh
를 텍스트 편집기로 열어 7 줄 중간에 위치한 make를 gmake로 변경.
⋮
cd build
rm CMakeCache.txt
cmake .. -DOPTION_DEDICATED=true && gmake -j$(nproc 2>/dev/null || echo "1")
src/core/alloc_func.hpp
를 텍스트 편집기로 열어 맨 위에 아래 세 줄을 추가.
#ifdef __sun
#include <alloca.h>
#endif
#ifdef __sun
#include <alloca.h>
#endif
/*
* This file is part of OpenTTD.
⋮
src/string_func.h
를 텍스트 편집기로 열어 279 줄 앞에 //
를 추가해 주석 처리.
⋮
# define DEFINE_STRCASESTR
// char *strcasestr(const char *haystack, const char *needle);
#endif /* strcasestr is available */
⋮
src/network/core/os_abstraction.cpp
를 텍스트 편집기로 열어 196 줄 중간의 SO_REUSEPORT
를 SO_REUSEADDR
로 변경.
⋮
#else
int reuse_port = 1;
return setsockopt(d, SOL_SOCKET, SO_REUSEADDR, &reuse_port, sizeof(reuse_port)) == 0;
#endif
}
⋮
src/3rdparty/randombytes/randombytes.h
를 텍스트 편집기로 열어 19 줄의 randombytes
함수를 아래와 같이 수정.
⋮
/*
* Write `n` bytes of high quality random bytes to `buf`
*/
int randombytes(unsigned char *buf, size_t n);
#ifdef __cplusplus
}
#endif
⋮
src/3rdparty/randombytes/randombytes.c
를 텍스트 편집기로 열어 내용을 모두 삭제한 뒤 아래 내용으로 채우기.
#include "randombytes.h"
#include <fcntl.h>
#include <unistd.h>
#include <assert.h>
int randombytes(unsigned char *x, size_t xlen)
{
int fd;
ssize_t bytes_read;
if (xlen == 0) return 0;
assert(x != NULL);
fd = open("/dev/urandom", O_RDONLY);
if (fd == -1) {
fd = open("/dev/random", O_RDONLY);
}
assert(fd != -1);
bytes_read = read(fd, x, xlen);
assert(bytes_read == xlen);
close(fd);
return 0;
}
src/os/unix/crashlog_unix.cpp
를 텍스트 편집기로 열어 #include <ucontext.h>
한 줄을 25 줄에 위치한 #include <sys/mman.h>
아래에 추가.
⋮
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/mman.h>
#include <ucontext.h>
#if defined(WITH_DBG_GDB)
#include <sys/syscall.h>
#endif /* WITH_DBG_GDB */
⋮
같은 파일에서 400, 418 줄에 위치한 gregs[REG_EFL]
두 개를 gregs[REG_RFL]
로 변경.
⋮
gregs[REG_R14],
gregs[REG_R15],
gregs[REG_RIP],
gregs[REG_RFL]
);
#elif defined(__i386)
const gregset_t &gregs = ucontext->uc_mcontext.gregs;
buffer += seprintf(buffer, last,
⋮
gregs[REG_EBP],
gregs[REG_ESP],
gregs[REG_EIP],
gregs[REG_RFL]
);
#endif
#endif
⋮
빌드
~$ ./build-dedicated.sh
Base Graphics 다운로드 및 압축 해제
~$ wget https://cdn.openttd.org/opengfx-releases/7.1/opengfx-7.1-all.zip
Resolving cdn.openttd.org... 54.230.167.118, 54.230.167.93, 54.230.167.82, ...
Connecting to cdn.openttd.org|54.230.167.118|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3547160 (3.4M) [application/zip]
Saving to: ‘opengfx-7.1-all.zip’
opengfx-7.1-all.zip 100%[=====================================================================>] 3.38M 9.53MB/s in 0.4s
2023-03-24 16:02:24 (9.53 MB/s) - ‘opengfx-7.1-all.zip’ saved [3547160/3547160]
~$ unzip opengfx-7.1-all.zip && mv opengfx-7.1.tar build/baseset/
Archive: opengfx-7.1-all.zip
inflating: opengfx-7.1.tar
설치
~$ cd build && sudo gmake install
서버 실행
~$ /usr/local/games/openttd -D