Update build files and GitHub Actions workflow

This commit is contained in:
Leroy Hopson 2023-01-26 07:12:07 +13:00
parent 237a456f99
commit 2ba480b4da
No known key found for this signature in database
GPG key ID: D2747312A6DB51AA
15 changed files with 172 additions and 429 deletions

View file

@ -3,4 +3,7 @@
entry_symbol = "godot_xterm_library_init"
[libraries]
linux.debug.x86_64 = "res://addons/godot_xterm/native/bin/libgodot-xterm.linux.64.so"
linux.debug.x86_64 = "res://addons/godot_xterm/native/bin/libgodot-xterm.linux.template_debug.x86_64.so"
linux.release.x86_64 = "res://addons/godot_xterm/native/bin/libgodot-xterm.linux.template_release.x86_64.so"
linux.debug.x86_32 = "res://addons/godot_xterm/native/bin/libgodot-xterm.linux.template_debug.x86_32.so"
linux.release.x86_32 = "res://addons/godot_xterm/native/bin/libgodot-xterm.linux.template_release.x86_32.so"

View file

@ -1,287 +1,40 @@
#!/usr/bin/env python
"""
This file is modified version of the godot-cpp SConstruct file: https://github.com/godotengine/godot-cpp/blob/master/SConstruct
which is published under the following license:
MIT License
Copyright (c) 2017-2020 GodotNativeTools
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
"""
# SPDX-FileCopyrightText: 2020-2023 Leroy Hopson <godot-xterm@leroy.geek.nz>
# SPDX-License-Identifier: MIT
import os
import sys
import subprocess
EnsureSConsVersion(4, 0)
# Try to detect the host platform automatically.
# This is used if no `platform` argument is passed.
if sys.platform.startswith('linux'):
host_platform = 'linux'
elif sys.platform == 'darwin':
host_platform = 'osx'
elif sys.platform == 'win32' or sys.platform == 'msys':
host_platform = 'windows'
else:
raise ValueError(
'Could not detect platform automatically, please specify with '
'platform=<platform>'
)
VariantDir('./thirdparty/libtsm/build', './thirdparty/libtsm/src', duplicate=0)
env = Environment(ENV = os.environ)
is64 = sys.maxsize > 2**32
if (
env['TARGET_ARCH'] == 'amd64' or
env['TARGET_ARCH'] == 'emt64' or
env['TARGET_ARCH'] == 'x86_64' or
env['TARGET_ARCH'] == 'arm64-v8a'
):
is64 = True
env = SConscript("./thirdparty/godot-cpp/SConstruct")
env['ENV'] = os.environ
opts = Variables([], ARGUMENTS)
opts.Add(EnumVariable(
'platform',
'Target platform',
host_platform,
allowed_values=('linux', 'javascript', 'osx', 'windows'),
ignorecase=2
))
opts.Add(EnumVariable(
'bits',
'Target platform bits',
'64' if is64 else '32',
('32', '64')
))
opts.Add(EnumVariable(
'target',
'Compilation target',
'editor',
allowed_values=('editor', 'release'),
ignorecase=2
))
opts.Add(EnumVariable("macos_arch", "Target macOS architecture",
"universal", ["universal", "x86_64", "arm64"]))
opts.Add(BoolVariable(
'disable_pty',
'Disables the PTY and its dependencies (LibuvUtils and Pipe). Has no effect on platforms where PTY is not supported',
False
))
opts.Update(env)
Help(opts.GenerateHelpText(env))
# Cache if SCONS_CACHE env var set.
scons_cache_path = os.environ.get("SCONS_CACHE")
if scons_cache_path is not None:
CacheDir(scons_cache_path)
Decider("MD5")
print("caching to " + scons_cache_path)
exit
# Allows 32bit builds on windows 64bit.
if env['platform'] == 'windows':
if env['bits'] == '64':
env = Environment(TARGET_ARCH='amd64')
elif env['bits'] == '32':
env = Environment(TARGET_ARCH='x86')
opts.Update(env)
# Add PATH to environment so scons can find commands such as g++, etc.
env.AppendENVPath('PATH', os.getenv('PATH'))
# Compile for Linux.
if env['platform'] == 'linux':
env.Append(CPPDEFINES=['__linux__'])
env['CC'] = 'gcc'
env['CXX'] = 'g++'
env['LIBSUFFIX'] = '.a'
env.Append(CCFLAGS=['-fPIC', '-Wwrite-strings'])
env.Append(LINKFLAGS=["-Wl,-R'$$ORIGIN'", '-static-libstdc++'])
if env['target'] == 'editor':
env.Append(CCFLAGS=['-Og', '-g'])
elif env['target'] == 'release':
env.Append(CCFLAGS=['-O3'])
if env['bits'] == '64':
env.Append(CCFLAGS=['-m64'])
env.Append(LINKFLAGS=['-m64'])
elif env['bits'] == '32':
env.Append(CCFLAGS=['-m32'])
env.Append(LINKFLAGS=['-m32'])
# Compile for HTML5.
elif env['platform'] == 'javascript':
env.Append(CPPDEFINES=['__EMSCRIPTEN__'])
env['bits'] = '32'
env['CC'] = 'emcc'
env['CXX'] = 'em++'
env['AR'] = 'emar'
env['RANLIB'] = 'emranlib'
env.Append(CPPFLAGS=['-s', 'SIDE_MODULE=1'])
env.Append(LINKFLAGS=['-s', 'SIDE_MODULE=1'])
env['SHOBJSUFFIX'] = '.bc'
env['SHLIBSUFFIX'] = '.wasm'
env['OBJPREFIX'] = ''
env['OBJSUFFIX'] = '.bc'
env['PROGPREFIX'] = ''
env['PROGSUFFIX'] = ''
env['LIBSUFFIX'] = '.a'
env['LIBPREFIXES'] = ['$LIBPREFIX']
env['LIBSUFFIXES'] = ['$LIBSUFFIX']
env.Replace(SHLINKFLAGS='$LINKFLAGS')
env.Replace(SHLINKFLAGS='$LINKFLAGS')
# Compile for OSX.
elif env['platform'] == 'osx':
env.Append(CPPDEFINES=['__APPLE__'])
env['CC'] = 'clang'
env['CXX'] = 'clang++'
env['LIBSUFFIX'] = '.a'
if env['bits'] == '32':
raise ValueError(
'Only 64-bit builds are supported for the osx platform.'
)
if env["macos_arch"] == "universal":
env.Append(LINKFLAGS=["-arch", "x86_64", "-arch", "arm64"])
env.Append(CCFLAGS=["-arch", "x86_64", "-arch", "arm64"])
else:
env.Append(LINKFLAGS=["-arch", env["macos_arch"]])
env.Append(CCFLAGS=["-arch", env["macos_arch"]])
env.Append(LINKFLAGS=['-Wl,-undefined,dynamic_lookup'])
if env['target'] == 'editor':
env.Append(CCFLAGS=['-Og', '-g'])
elif env['target'] == 'release':
env.Append(CCFLAGS=['-O3'])
# Compile for Windows.
elif env['platform'] == 'windows':
env.Append(CPPDEFINES=['__WIN32'])
env['LIBSUFFIX'] = '.lib'
# On Windows using MSVC.
if host_platform == 'windows':
if env['target'] == 'editor':
env.Append(CCFLAGS=['/Z7', '/Od', '/EHsc', '/D_DEBUG', '/MDd'])
elif env['target'] == 'release':
env.Append(CCFLAGS=['/O2', '/EHsc', '/DNDEBUG', '/MD'])
# On Windows, Linux, or MacOS using MinGW.
elif host_platform == 'linux' or host_platform == 'osx':
env.Append(CCFLAGS=['-std=c++17', '-Wwrite-strings'])
env.Append(LINKFLAGS=[
'--static',
'-Wl,--no-undefined',
'-static-libgcc',
'-static-libstdc++',
])
if env['target'] == 'editor':
env.Append(CCFLAGS=['-Og', '-g'])
elif env['target'] == 'release':
env.Append(CCFLAGS=['-O3'])
if env['bits'] == '64':
env['CC'] = 'x86_64-w64-mingw32-gcc'
env['CXX'] = 'x86_64-w64-mingw32-g++'
env['AR'] = "x86_64-w64-mingw32-ar"
env['RANLIB'] = "x86_64-w64-mingw32-ranlib"
env['LINK'] = "x86_64-w64-mingw32-g++"
elif env['bits'] == '32':
env['CC'] = 'i686-w64-mingw32-gcc'
env['CXX'] = 'i686-w64-mingw32-g++'
env['AR'] = "i686-w64-mingw32-ar"
env['RANLIB'] = "i686-w64-mingw32-ranlib"
env['LINK'] = "i686-w64-mingw32-g++"
# Build libtsm as a static library.
Execute([
Delete('thirdparty/libtsm/build/src'),
Delete('thirdparty/libtsm/build/external'),
Copy('thirdparty/libtsm/build/src', 'thirdparty/libtsm/src'),
Copy('thirdparty/libtsm/build/external', 'thirdparty/libtsm/external'),
])
env.Append(CPPPATH=[
'thirdparty/libtsm/src/shared',
'thirdparty/libtsm/external',
])
sources = []
sources.append('thirdparty/libtsm/build/external/wcwidth/wcwidth.c')
sources.append('thirdparty/libtsm/build/src/shared/shl-htable.c')
sources.append(Glob('thirdparty/libtsm/build/src/tsm/*.c'))
libtsm = env.StaticLibrary(
target='thirdparty/libtsm/build/bin/libtsm.{}.{}.{}{}'.format(
env['platform'],
env['target'],
env['bits'],
env['LIBSUFFIX']
), source=sources
)
Default(libtsm)
# Build libgodot-xterm.
if env['platform'] != 'windows':
env.Append(CXXFLAGS=['-std=c++17'])
env.Append(CPPPATH=[
'src/',
'thirdparty/libtsm/build/src/tsm',
'thirdparty/libtsm/build/src/shared',
'thirdparty/godot-cpp/gdextension',
'thirdparty/godot-cpp/include',
'thirdparty/godot-cpp/gen/include',
'thirdparty/libuv/src',
'thirdparty/libuv/include'
])
env.Append(LIBPATH=[
'thirdparty/godot-cpp/bin/',
'thirdparty/libtsm/build/bin/',
'thirdparty/libtsm/src/tsm',
'thirdparty/libtsm/external',
'thirdparty/libtsm/src/shared',
'thirdparty/libuv/include',
])
env.Append(LIBS=[
env.File('thirdparty/godot-cpp/bin/libgodot-cpp.{}.{}.{}{}'.format(
env['platform'],
env['target'],
'wasm' if env['platform'] == 'javascript' else env['macos_arch'] if (
env['macos_arch'] != 'universal' and env['platform'] == 'osx') else 'x86_64', # FIXME use correct arch.
env['LIBSUFFIX'],
)),
env.File('thirdparty/libtsm/build/bin/libtsm.{}.{}.{}{}'.format(
env['platform'],
env['target'],
env['bits'],
env['LIBSUFFIX'],
)),
sources = Glob('thirdparty/libtsm/src/tsm/*.c')
sources.append([
'thirdparty/libtsm/external/wcwidth/wcwidth.c',
'thirdparty/libtsm/src/shared/shl-htable.c',
'src/register_types.cpp',
'src/constants.cpp',
'src/terminal.cpp',
])
sources = []
sources.append('src/register_types.cpp')
sources.append('src/constants.cpp')
sources.append('src/terminal.cpp')
# PTY not supported on HTML5.
if env['disable_pty'] or env['platform'] == 'javascript':
env.Append(CPPDEFINES=['_PTY_DISABLED'])
else:
@ -301,24 +54,13 @@ else:
'Ws2_32.lib',
])
if env['platform'] == 'linux':
libsuffix = "a"
suffix = "so"
elif env['platform'] == 'javascript':
libsuffix = "a"
suffix = "wasm"
elif env['platform'] == 'windows':
libsuffix = "lib"
suffix = "dll"
elif env['platform'] == 'osx':
libsuffix = "a"
suffix = "dylib"
env.Append(LINKFLAGS=['-static-libstdc++'])
library = env.SharedLibrary(
target='bin/libgodot-xterm.{}.{}.{}'.format(
env['platform'],
env['bits'],
suffix,
target='bin/libgodot-xterm{}{}'.format(
env['suffix'],
env['SHLIBSUFFIX'],
), source=sources
)
Default(library)

View file

@ -1,4 +1,8 @@
#!/bin/sh
# SPDX-FileCopyrightText: 2020-2023 Leroy Hopson <godot-xterm@leroy.geek.nz>
# SPDX-License-Identifier: MIT
set -e
# Parse args.
@ -16,25 +20,21 @@ while [[ $# -gt 0 ]]; do
shift
;;
*)
echo "Usage: ./build.sh [-t|--target <release|editor>] [--disable_pty]";
echo "Usage: ./build.sh [-t|--target <release|debug>] [--disable_pty]";
exit 128
shift
;;
esac
done
# Set defaults.
target=${target:-editor}
target=${target:-debug}
disable_pty=${disable_pty:-no}
nproc=$(nproc || sysctl -n hw.ncpu)
#GODOT_DIR Get the absolute path to the directory this script is in.
# Get the absolute path to the directory this script is in.
NATIVE_DIR="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
# Cache built files.
export SCONS_CACHE=${NATIVE_DIR}/.cache
# Run script inside a nix shell if it is available.
if command -v nix-shell && [ $NIX_PATH ] && [ -z $IN_NIX_SHELL ]; then
cd ${NATIVE_DIR}
@ -42,7 +42,6 @@ if command -v nix-shell && [ $NIX_PATH ] && [ -z $IN_NIX_SHELL ]; then
exit
fi
# Update git submodules.
updateSubmodules() {
eval $1=$2 # E.g LIBUV_DIR=${NATIVE_DIR}/thirdparty/libuv
@ -57,11 +56,6 @@ updateSubmodules LIBUV_DIR ${NATIVE_DIR}/thirdparty/libuv
updateSubmodules LIBTSM_DIR ${NATIVE_DIR}/thirdparty/libtsm
updateSubmodules GODOT_CPP_DIR ${NATIVE_DIR}/thirdparty/godot-cpp
# Build godot-cpp bindings.
cd ${GODOT_CPP_DIR}
scons generate_bindings=yes macos_arch=$(uname -m) target=$target -j$nproc
# Build libuv as a static library.
cd ${LIBUV_DIR}
mkdir build || true
@ -79,7 +73,7 @@ cmake --build build --config $target -j$nproc
# Build libgodot-xterm.
cd ${NATIVE_DIR}
scons target=$target macos_arch=$(uname -m) disable_pty=$disable_pty -j$nproc
scons target=template_$target arch=$(uname -m) disable_pty=$disable_pty
# Use Docker to build libgodot-xterm javascript.
#if [ -x "$(command -v docker-compose)" ]; then

View file

@ -1,3 +1,4 @@
---
services:
javascript:
build:
@ -14,14 +15,6 @@ services:
scons platform=javascript target=$${TARGET:-debug} -j$$(nproc)
cd /src
scons platform=javascript target=$${TARGET:-debug} -j$$(nproc)
godot-cpp-linux:
user: ${UID_GID}
build:
context: .
dockerfile: linux.Dockerfile
volumes:
- ./thirdparty/godot-cpp:/godot-cpp
working_dir: /godot-cpp
libuv-linux:
user: ${UID_GID}
build:
@ -35,12 +28,12 @@ services:
- -c
- |
target=$${TARGET:-release}
bits=$${BITS:-'64'}
arch=$${ARCH:-x86_64}
mkdir build 2>/dev/null ;
args="-DCMAKE_BUILD_TYPE=$$target \
-DBUILD_SHARED_LIBS=OFF \
-DCMAKE_POSITION_INDEPENDENT_CODE=TRUE"
if [[ $$bits -eq 32 ]]; then
if [[ $$arch == "x86_32" ]]; then
args="$$args -DCMAKE_SYSTEM_PROCESSOR=i686 -DCMAKE_C_FLAGS=-m32";
else
args="$$args -DCMAKE_SYSTEM_PROCESSOR=x86_64 -DCMAKE_C_FLAGS=";
@ -57,3 +50,10 @@ services:
volumes:
- .:/godot-xterm
working_dir: /godot-xterm
environment:
- SCONS_CACHE=/scons-cache
command:
- /bin/bash
- -c
- |
scons target=template_$${TARGET:-debug} arch=$${ARCH:-x86_64}

View file

@ -1,4 +1,4 @@
# For convenient building of the library and gdnative export templates targeted at the javacript platform.
FROM emscripten/emsdk:3.1.14
RUN apt-get update && apt-get install pkg-config python3 -y
RUN pip3 install scons
RUN pip3 install scons==4.4.0

View file

@ -2,6 +2,14 @@
# with older versions of GLIBC installed on their systems can use the library.
FROM kroggen/ubuntu-16.04-gcc
RUN apt-get update -y
RUN apt-get install -y python3 python3-pip gcc-multilib g++-multilib
RUN pip3 install scons==4.3.0
CMD scons platform=linux generate_bindings=yes target=${TARGET:-release} bits=${BITS:-64} -j$(nproc)
RUN apt-get install -y software-properties-common
RUN add-apt-repository -y ppa:jblgf0/python
RUN add-apt-repository -y ppa:ubuntu-toolchain-r/test
RUN apt-get update -y
RUN apt-get install -y curl gcc-9-multilib g++-9-multilib python3.7
RUN curl -sS https://bootstrap.pypa.io/get-pip.py | python3.7
RUN pip3 install scons==4.4.0
RUN ln -sf /usr/bin/gcc-9 /usr/bin/gcc
RUN ln -s /usr/bin/g++-9 /usr/bin/g++
VOLUME /scons-cache
CMD scons target=${TARGET:-template_release} arch=${ARCH:-x86_64}

@ -1 +1 @@
Subproject commit 151ea35c5fbb0254e0d3d29e230270b60852915f
Subproject commit 19091138895d35e1ce69742889b8bfd82be57f17

@ -1 +1 @@
Subproject commit 0c2d956b3110b72d35951dbf38ef6ed71e4bda9a
Subproject commit 0102bc2c5480773bf64c1edbdfb5d1ddb3b63954