From 9e68e589c67e5806f402c6a1873b53dc6411879b Mon Sep 17 00:00:00 2001 From: Fabio Alessandrelli Date: Thu, 10 Feb 2022 03:57:48 +0100 Subject: [PATCH] Library SCons boilerplate to build projects. --- SConstruct | 60 ++++++++++++++------ test/SConstruct | 128 +----------------------------------------- test/gdexample.gdnlib | 8 +-- 3 files changed, 48 insertions(+), 148 deletions(-) diff --git a/SConstruct b/SConstruct index 8b1d136cba..0edbb1bb5b 100644 --- a/SConstruct +++ b/SConstruct @@ -186,9 +186,14 @@ opts.Add(BoolVariable( True )) +opts.Add(BoolVariable("build_library", "Build the godot-cpp library.", True)) + opts.Update(env) Help(opts.GenerateHelpText(env)) +opts.Add(BoolVariable("build_library", "Build the godot-cpp library.", True)) +opts.Add("build_projects", "List of projects to build (comma-separated list of paths).", "") + # This makes sure to keep the session environment variables on Windows. # This way, you can run SCons in a Visual Studio 2017 prompt and it will find # all the required tools @@ -200,11 +205,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': @@ -235,8 +247,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']]) @@ -277,13 +287,12 @@ 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, '-F' + sdk_path @@ -320,14 +329,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', '-Wl,--no-undefined', @@ -340,9 +355,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: @@ -396,9 +412,11 @@ elif env['platform'] == 'android': 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["SHLIBSUFFIX"] = ".so" env.Append(CCFLAGS=['--target=' + arch_info['target'] + env['android_api_level'], '-march=' + arch_info['march'], '-fPIC']) 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']) @@ -482,12 +500,18 @@ elif env['platform'] == 'osx': elif env['platform'] == 'javascript': arch_suffix = 'wasm' -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["SHLIBSUFFIX"] = ".{}.{}.{}{}".format(env["platform"], env["target"], arch_suffix, env["SHLIBSUFFIX"]) +env.Append(CPPPATH=[env.Dir(f) for f in ["include/gen", "include/core", "include", "godot-headers"]]) +env.Append(LIBPATH=[env.Dir("bin")]) +env.Append(LIBS=library_name) +Return("env") + +Return("env") diff --git a/test/SConstruct b/test/SConstruct index a3423137a5..0e7329ea5b 100644 --- a/test/SConstruct +++ b/test/SConstruct @@ -1,135 +1,11 @@ #!/usr/bin/env python -import os -import sys -# 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=' - ) - -env = Environment(ENV = os.environ) - -opts = Variables([], ARGUMENTS) - -# Define our options -opts.Add(EnumVariable('target', "Compilation target", 'debug', ['d', 'debug', 'r', 'release'])) -opts.Add(EnumVariable('platform', "Compilation platform", host_platform, ['', 'windows', 'x11', 'linux', 'osx'])) -opts.Add(EnumVariable('p', "Compilation target, alias for 'platform'", host_platform, ['', 'windows', 'x11', 'linux', 'osx'])) -opts.Add(EnumVariable('bits', 'Target platform bits', '64', ('32', '64'))) -opts.Add(BoolVariable('use_llvm', "Use the LLVM / Clang compiler", 'no')) -opts.Add(PathVariable('target_path', 'The path where the lib is installed.', 'bin/', PathVariable.PathAccept)) -opts.Add(PathVariable('target_name', 'The library name.', 'libgdexample', PathVariable.PathAccept)) - -# Local dependency paths, adapt them to your setup -godot_headers_path = "../godot-headers/" -cpp_bindings_path = "../" -cpp_library = "libgodot-cpp" - -# only support 64 at this time.. -bits = 64 - -# Updates the environment with the option variables. -opts.Update(env) -# Generates help for the -h scons option. -Help(opts.GenerateHelpText(env)) - -# This makes sure to keep the session environment variables on Windows. -# This way, you can run SCons in a Visual Studio 2017 prompt and it will find -# all the required tools -if host_platform == 'windows' and env['platform'] != 'android': - if env['bits'] == '64': - env = Environment(TARGET_ARCH='amd64') - elif env['bits'] == '32': - env = Environment(TARGET_ARCH='x86') - - opts.Update(env) - -# Process some arguments -if env['use_llvm']: - env['CC'] = 'clang' - env['CXX'] = 'clang++' - -if env['p'] != '': - env['platform'] = env['p'] - -if env['platform'] == '': - print("No valid target platform selected.") - quit(); - -# For the reference: -# - CCFLAGS are compilation flags shared between C and C++ -# - CFLAGS are for C-specific compilation flags -# - CXXFLAGS are for C++-specific compilation flags -# - CPPFLAGS are for pre-processor flags -# - CPPDEFINES are for pre-processor defines -# - LINKFLAGS are for linking flags - -# Check our platform specifics -if env['platform'] == "osx": - env['target_path'] += 'osx/' - cpp_library += '.osx' - env.Append(CCFLAGS=['-arch', 'x86_64']) - env.Append(CXXFLAGS=['-std=c++17']) - env.Append(LINKFLAGS=['-arch', 'x86_64']) - if env['target'] in ('debug', 'd'): - env.Append(CCFLAGS=['-g', '-O2']) - else: - env.Append(CCFLAGS=['-g', '-O3']) - -elif env['platform'] in ('x11', 'linux'): - env['target_path'] += 'x11/' - cpp_library += '.linux' - env.Append(CCFLAGS=['-fPIC']) - env.Append(CXXFLAGS=['-std=c++17']) - if env['target'] in ('debug', 'd'): - env.Append(CCFLAGS=['-g3', '-Og']) - else: - env.Append(CCFLAGS=['-g', '-O3']) - -elif env['platform'] == "windows": - env['target_path'] += 'win64/' - cpp_library += '.windows' - # This makes sure to keep the session environment variables on windows, - # that way you can run scons in a vs 2017 prompt and it will find all the required tools - env.Append(ENV=os.environ) - - env.Append(CPPDEFINES=['WIN32', '_WIN32', '_WINDOWS', '_CRT_SECURE_NO_WARNINGS']) - env.Append(CCFLAGS=['-W3', '-GR']) - env.Append(CXXFLAGS=['-std:c++17']) - if env['target'] in ('debug', 'd'): - env.Append(CPPDEFINES=['_DEBUG']) - env.Append(CCFLAGS=['-EHsc', '-MDd', '-ZI']) - env.Append(LINKFLAGS=['-DEBUG']) - else: - env.Append(CPPDEFINES=['NDEBUG']) - env.Append(CCFLAGS=['-O2', '-EHsc', '-MD']) - -if env['target'] in ('debug', 'd'): - cpp_library += '.debug' -else: - cpp_library += '.release' - -cpp_library += '.' + str(bits) - -# make sure our binding library is properly includes -env.Append(CPPPATH=['.', godot_headers_path, cpp_bindings_path + 'include/', cpp_bindings_path + 'include/core/', cpp_bindings_path + 'include/gen/']) -env.Append(LIBPATH=[cpp_bindings_path + 'bin/']) -env.Append(LIBS=[cpp_library]) +env = SConscript("../SConstruct") # tweak this if you want to use different folders, or more folders, to store your source code in. env.Append(CPPPATH=['src/']) sources = Glob('src/*.cpp') -library = env.SharedLibrary(target=env['target_path'] + env['target_name'] , source=sources) +library = env.SharedLibrary("bin/libgdexample" + env["SHLIBSUFFIX"], source=sources) Default(library) - diff --git a/test/gdexample.gdnlib b/test/gdexample.gdnlib index 260b4eab6f..9744b98e0a 100644 --- a/test/gdexample.gdnlib +++ b/test/gdexample.gdnlib @@ -7,10 +7,10 @@ reloadable=false [entry] -X11.64="res://bin/x11/libgdexample.so" -Server.64="res://bin/x11/libgdexample.so" -Windows.64="res://bin/win64/libgdexample.dll" -OSX.64="res://bin/osx/libgdexample.dylib" +X11.64="res://bin/libgdexample.linux.release.64.so" +Server.64="res://bin/libgdexample.linux.release.64.so" +Windows.64="res://bin/libgdexample.windows.release.64.dll" +OSX.64="res://bin/libgdexample.osx.release.64.dylib" [dependencies]