Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
180 changes: 71 additions & 109 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,56 @@ name: Continuous integration
on: [push, pull_request]

jobs:
linux:
name: Build (Linux, GCC)
runs-on: ubuntu-18.04
build:
name: ${{ matrix.name }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- name: 🐧 Linux (GCC)
os: ubuntu-18.04
platform: linux
artifact-name: godot-cpp-linux-glibc2.27-x86_64-release
artifact-path: bin/libgodot-cpp.linux.release.64.a
godot_zip: Godot_v3.4-stable_linux_server.64.zip
executable: Godot_v3.4-stable_linux_server.64

- name: 🏁 Windows (x86_64, MSVC)
os: windows-2019
platform: windows
artifact-name: godot-cpp-windows-msvc2019-x86_64-release
artifact-path: bin/libgodot-cpp.windows.release.64.lib

- name: 🏁 Windows (x86_64, MinGW)
os: windows-2019
platform: windows
artifact-name: godot-cpp-linux-mingw-x86_64-release
artifact-path: bin/libgodot-cpp.windows.release.64.a
flags: use_mingw=yes

- name: 🍎 macOS (universal)
os: macos-11
platform: osx
artifact-name: godot-cpp-macos-universal-release
artifact-path: bin/libgodot-cpp.osx.release.64.a
flags: macos_arch=universal
godot_zip: Godot_v3.4-stable_osx.universal.zip
executable: Godot.app/Contents/MacOS/Godot

- name: 🤖 Android (arm64)
os: ubuntu-18.04
platform: android
artifact-name: godot-cpp-android-arm64-release
artifact-path: bin/libgodot-cpp.android.release.arm64v8.a
flags: android_arch=arm64v8

- name: 🍏 iOS (arm64)
os: macos-11
platform: ios
artifact-name: godot-cpp-ios-arm64-release
artifact-path: bin/libgodot-cpp.ios.release.arm64.a

steps:
- name: Checkout
uses: actions/checkout@v2
Expand All @@ -16,133 +63,48 @@ jobs:
with:
python-version: '3.x'

- name: Install dependencies
- name: Linux dependencies
if: ${{ matrix.platform == 'linux' }}
run: |
sudo apt-get update -qq
sudo apt-get install -qqq build-essential pkg-config
python -m pip install scons
curl -LO https://downloads.tuxfamily.org/godotengine/3.4/Godot_v3.4-stable_linux_server.64.zip
unzip Godot_v3.4-stable_linux_server.64.zip

- name: Build godot-cpp
run: |
scons target=release generate_bindings=yes -j $(nproc)

- name: Upload artifact
uses: actions/upload-artifact@v2
with:
name: godot-cpp-linux-glibc2.27-x86_64-release
path: bin/libgodot-cpp.linux.release.64.a
if-no-files-found: error

- name: Build test GDNative library
run: |
scons target=release platform=linux bits=64 -j $(nproc) -C test

- name: Run test GDNative library
run: |
./Godot_v3.4-stable_linux_server.64 --path test -s script.gd

windows-msvc:
name: Build (Windows, MSVC)
runs-on: windows-2019
steps:
- name: Checkout
uses: actions/checkout@v2
with:
submodules: recursive

- name: Set up Python (for SCons)
uses: actions/setup-python@v2
with:
python-version: '3.x'

- name: Install dependencies
- name: Install scons
run: |
python -m pip install scons

- name: Build godot-cpp
run: |
scons target=release generate_bindings=yes -j $env:NUMBER_OF_PROCESSORS

- name: Upload artifact
uses: actions/upload-artifact@v2
with:
name: godot-cpp-windows-msvc2019-x86_64-release
path: bin/libgodot-cpp.windows.release.64.lib
if-no-files-found: error

windows-mingw:
name: Build (Windows, MinGW)
runs-on: windows-2019
steps:
- name: Checkout
uses: actions/checkout@v2
with:
submodules: recursive

- name: Set up Python (for SCons)
uses: actions/setup-python@v2
with:
python-version: '3.x'

- name: Install dependencies
run: |
python -m pip install scons

- name: Setup MinGW for Windows/MinGW build
- name: Windows dependency (MinGW)
if: ${{ matrix.platform == 'windows' }}
uses: egor-tensin/setup-mingw@v2

- name: Build godot-cpp
- name: Build godot-cpp (debug)
run: |
scons target=release generate_bindings=yes use_mingw=yes -j $env:NUMBER_OF_PROCESSORS

- name: Upload artifact
uses: actions/upload-artifact@v2
with:
name: godot-cpp-linux-mingw-x86_64-release
path: bin/libgodot-cpp.windows.release.64.a
if-no-files-found: error

macos:
name: Build (macOS, Clang)
runs-on: macos-11
steps:
- name: Checkout
uses: actions/checkout@v2
with:
submodules: recursive
scons platform=${{ matrix.platform }} target=debug generate_bindings=yes ${{ matrix.flags }} -j2

- name: Set up Python (for SCons)
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Build test without rebuilding godot-cpp (debug)
run: |
cd test
scons platform=${{ matrix.platform }} target=debug ${{ matrix.flags }} build_library=no -j2

- name: Install dependencies
- name: Build test and godot-cpp (release)
run: |
python -m pip install scons
curl -LO https://downloads.tuxfamily.org/godotengine/3.4/Godot_v3.4-stable_osx.universal.zip
unzip Godot_v3.4-stable_osx.universal.zip
cd test
scons platform=${{ matrix.platform }} target=release ${{ matrix.flags }} -j2

- name: Build godot-cpp
- name: Run test GDNative library
if: ${{ matrix.platform == 'linux' || matrix.platform == 'osx' }}
run: |
scons target=release generate_bindings=yes -j $(sysctl -n hw.logicalcpu)
curl -LO https://downloads.tuxfamily.org/godotengine/3.4/${{ matrix.godot_zip }}
unzip ${{ matrix.godot_zip }}
./${{ matrix.executable }} --path test -s script.gd

- name: Upload artifact
uses: actions/upload-artifact@v2
with:
name: godot-cpp-macos-universal-release
path: bin/libgodot-cpp.osx.release.64.a
name: ${{ matrix.artifact-name }}
path: ${{ matrix.artifact-path }}
if-no-files-found: error

- name: Build test GDNative library
run: |
scons target=release platform=osx bits=64 macos_arch=universal -j $(sysctl -n hw.logicalcpu) -C test

- name: Run test GDNative library
run: |
./Godot.app/Contents/MacOS/Godot --path test -s script.gd

static-checks:
name: Static Checks (clang-format)
runs-on: ubuntu-20.04
Expand Down
73 changes: 46 additions & 27 deletions SConstruct
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,8 @@ opts.Add(
)
)

opts.Add(BoolVariable("build_library", "Build the godot-cpp library.", True))

opts.Update(env)
Help(opts.GenerateHelpText(env))

Expand All @@ -173,11 +175,18 @@ if host_platform == "windows" and env["platform"] != "android":

opts.Update(env)

# Require C++14
if host_platform == "windows" and env["platform"] == "windows" and not env["use_mingw"]:
# MSVC
env.Append(CCFLAGS=["/std:c++14"])
else:
env.Append(CCFLAGS=["-std=c++14"])

if env["platform"] == "linux" or env["platform"] == "freebsd":
if env["use_llvm"]:
env["CXX"] = "clang++"

env.Append(CCFLAGS=["-fPIC", "-std=c++14", "-Wwrite-strings"])
env.Append(CCFLAGS=["-fPIC", "-Wwrite-strings"])
env.Append(LINKFLAGS=["-Wl,-R,'$$ORIGIN'"])

if env["target"] == "debug":
Expand Down Expand Up @@ -206,8 +215,6 @@ elif env["platform"] == "osx":
env.Append(LINKFLAGS=["-arch", env["macos_arch"]])
env.Append(CCFLAGS=["-arch", env["macos_arch"]])

env.Append(CCFLAGS=["-std=c++14"])

if env["macos_deployment_target"] != "default":
env.Append(CCFLAGS=["-mmacosx-version-min=" + env["macos_deployment_target"]])
env.Append(LINKFLAGS=["-mmacosx-version-min=" + env["macos_deployment_target"]])
Expand All @@ -216,13 +223,7 @@ elif env["platform"] == "osx":
env.Append(CCFLAGS=["-isysroot", env["macos_sdk_path"]])
env.Append(LINKFLAGS=["-isysroot", env["macos_sdk_path"]])

env.Append(
LINKFLAGS=[
"-framework",
"Cocoa",
"-Wl,-undefined,dynamic_lookup",
]
)
env.Append(LINKFLAGS=["-Wl,-undefined,dynamic_lookup"])

if env["target"] == "debug":
env.Append(CCFLAGS=["-Og", "-g"])
Expand All @@ -233,7 +234,6 @@ elif env["platform"] == "ios":
if env["ios_simulator"]:
sdk_name = "iphonesimulator"
env.Append(CCFLAGS=["-mios-simulator-version-min=10.0"])
env["LIBSUFFIX"] = ".simulator" + env["LIBSUFFIX"]
else:
sdk_name = "iphoneos"
env.Append(CCFLAGS=["-miphoneos-version-min=10.0"])
Expand All @@ -250,14 +250,13 @@ elif env["platform"] == "ios":
env["CXX"] = compiler_path + "clang++"
env["AR"] = compiler_path + "ar"
env["RANLIB"] = compiler_path + "ranlib"
env["SHLIBSUFFIX"] = ".dylib"

env.Append(CCFLAGS=["-std=c++14", "-arch", env["ios_arch"], "-isysroot", sdk_path])
env.Append(CCFLAGS=["-arch", env["ios_arch"], "-isysroot", sdk_path])
env.Append(
LINKFLAGS=[
"-arch",
env["ios_arch"],
"-framework",
"Cocoa",
"-Wl,-undefined,dynamic_lookup",
"-isysroot",
sdk_path,
Expand Down Expand Up @@ -296,14 +295,20 @@ elif env["platform"] == "windows":
# Don't Clone the environment. Because otherwise, SCons will pick up msvc stuff.
env = Environment(ENV=os.environ, tools=["mingw"])
opts.Update(env)
# env = env.Clone(tools=['mingw'])

# Still need to use C++14.
env.Append(CCFLAGS=["-std=c++14"])
# Don't want lib prefixes
env["IMPLIBPREFIX"] = ""
env["SHLIBPREFIX"] = ""

env["SPAWN"] = mySpawn
env.Replace(ARFLAGS=["q"])

# Native or cross-compilation using MinGW
if host_platform == "linux" or host_platform == "freebsd" or host_platform == "osx" or env["use_mingw"]:
# These options are for a release build even using target=debug
env.Append(CCFLAGS=["-O3", "-std=c++14", "-Wwrite-strings"])
env.Append(CCFLAGS=["-O3", "-Wwrite-strings"])
env.Append(
LINKFLAGS=[
"--static",
Expand All @@ -318,9 +323,10 @@ elif env["platform"] == "android":
# Don't Clone the environment. Because otherwise, SCons will pick up msvc stuff.
env = Environment(ENV=os.environ, tools=["mingw"])
opts.Update(env)
# env = env.Clone(tools=['mingw'])

# Long line hack. Use custom spawn, quick AR append (to avoid files with the same names to override each other).
env["SPAWN"] = mySpawn
env.Replace(ARFLAGS=["q"])

# Verify NDK root
if not "ANDROID_NDK_ROOT" in env:
Expand Down Expand Up @@ -385,11 +391,12 @@ elif env["platform"] == "android":
# Setup tools
env["CC"] = toolchain + "/bin/clang"
env["CXX"] = toolchain + "/bin/clang++"
env["AR"] = toolchain + "/bin/" + arch_info["tool_path"] + "-ar"
env["AS"] = toolchain + "/bin/" + arch_info["tool_path"] + "-as"
env["LD"] = toolchain + "/bin/" + arch_info["tool_path"] + "-ld"
env["STRIP"] = toolchain + "/bin/" + arch_info["tool_path"] + "-strip"
env["RANLIB"] = toolchain + "/bin/" + arch_info["tool_path"] + "-ranlib"
env["AR"] = toolchain + "/bin/llvm-ar"
env["AS"] = toolchain + "/bin/llvm-as"
env["LD"] = toolchain + "/bin/llvm-ld"
env["STRIP"] = toolchain + "/bin/llvm-strip"
env["RANLIB"] = toolchain + "/bin/llvm-ranlib"
env["SHLIBSUFFIX"] = ".so"

env.Append(
CCFLAGS=[
Expand All @@ -399,6 +406,7 @@ elif env["platform"] == "android":
]
)
env.Append(CCFLAGS=arch_info["ccflags"])
env.Append(LINKFLAGS=["--target=" + arch_info["target"] + env["android_api_level"], "-march=" + arch_info["march"]])

if env["target"] == "debug":
env.Append(CCFLAGS=["-Og", "-g"])
Expand Down Expand Up @@ -478,14 +486,25 @@ if env["platform"] == "android":
arch_suffix = env["android_arch"]
elif env["platform"] == "ios":
arch_suffix = env["ios_arch"]
if env["ios_simulator"]:
arch_suffix += ".simulator"
elif env["platform"] == "osx":
if env["macos_arch"] != "universal":
arch_suffix = env["macos_arch"]
elif env["platform"] == "javascript":
arch_suffix = "wasm"
# Expose it to projects that import this env.
env["arch_suffix"] = arch_suffix

library = env.StaticLibrary(
target="bin/" + "libgodot-cpp.{}.{}.{}{}".format(env["platform"], env["target"], arch_suffix, env["LIBSUFFIX"]),
source=sources,
)
Default(library)
library = None
env["OBJSUFFIX"] = ".{}.{}.{}{}".format(env["platform"], env["target"], arch_suffix, env["OBJSUFFIX"])
library_name = "libgodot-cpp.{}.{}.{}{}".format(env["platform"], env["target"], arch_suffix, env["LIBSUFFIX"])

if env["build_library"]:
library = env.StaticLibrary(target=env.File("bin/%s" % library_name), source=sources)
Default(library)

env.Append(CPPPATH=[env.Dir(f) for f in [env["headers_dir"], "include", "include/gen", "include/core"]])
env.Append(LIBPATH=[env.Dir("bin")])
env.Append(LIBS=library_name)
Return("env")
Loading