Browse Source

Library SCons boilerplate to build projects.

Fabio Alessandrelli 3 years ago
parent
commit
ca7cd22326
3 changed files with 55 additions and 166 deletions
  1. 41 22
      SConstruct
  2. 10 140
      test/SConstruct
  3. 4 4
      test/gdexample.gdnlib

+ 41 - 22
SConstruct

@@ -159,6 +159,8 @@ opts.Add(
     )
 )
 
+opts.Add(BoolVariable("build_library", "Build the godot-cpp library.", True))
+
 opts.Update(env)
 Help(opts.GenerateHelpText(env))
 
@@ -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":
@@ -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"]])
@@ -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"])
@@ -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"])
@@ -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,
@@ -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",
@@ -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:
@@ -390,6 +396,7 @@ 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=[
@@ -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"])
@@ -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")

+ 10 - 140
test/SConstruct

@@ -1,146 +1,16 @@
 #!/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=<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)
+env.Append(CPPPATH=['src/'])
+sources = Glob('src/*.cpp')
+
+library = env.SharedLibrary(
+    "bin/libgdexample.{}.{}.{}{}".format(
+        env["platform"], env["target"], env["arch_suffix"], env["SHLIBSUFFIX"]
+    ),
+    source=sources,
+)
 
 Default(library)

+ 4 - 4
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]