0 votes

I've been having a great time with my gdnative c++ godot plugin, but the time has come to try to run the plugin on a different operating system. I know that in the documentation under https://docs.godotengine.org/en/stable/development/compiling/compiling_for_windows.html#cross-compiling-for-windows-from-other-operating-systems they suggest using mingw-w64 and I have managed to compile the godot-cpp with that, but when I modify the SConstruct file from here https://docs.godotengine.org/en/stable/_downloads/988fdf9bf1fed6991e760aadf423d3df/SConstruct and make some modifications (see under section starting with elif env['platform'] == "windows" and host_platform =="linux":) after I run sconstruct platform=windows target=release I get an .so file in the path that I expected a .dll

#!python
import os
import sys
opts = Variables([], ARGUMENTS)
if sys.platform.startswith("linux"):
    host_platform = "linux"
elif sys.platform.startswith("freebsd"):
    host_platform = "freebsd"
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>")

# Gets the standard flags CC, CCX, etc.
env = DefaultEnvironment()

# Define our options
opts.Add(EnumVariable('target', "Compilation target", 'debug', ['d', 'debug', 'r', 'release']))
opts.Add(EnumVariable('platform', "Compilation platform", '', ['', 'windows', 'x11', 'linux', 'osx']))
opts.Add(EnumVariable('p', "Compilation target, alias for 'platform'", '', ['', 'windows', 'x11', 'linux', 'osx']))
opts.Add(BoolVariable('use_llvm', "Use the LLVM / Clang compiler", 'no'))
opts.Add(PathVariable('target_path', 'The path where the lib is installed.', 'demo/bin/'))
opts.Add(PathVariable('target_name', 'The library name.', 'libgdexample', PathVariable.PathAccept))

# Local dependency paths, adapt them to your setup
godot_headers_path = "godot-cpp/godot-headers/"
cpp_bindings_path = "godot-cpp/"
cpp_library = "libgodot-cpp"

# only support 64 at this time..
bits = 64

# Updates the environment with the option variables.
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" and host_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'])
elif env['platform'] == "windows" and host_platform =="linux":
    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["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++"

    env.Append(CCFLAGS=["-O3", "-Wwrite-strings"])
    env.Append(
        LINKFLAGS=[
            "--static",
            "-Wl,--no-undefined",
            "-static-libgcc",
            "-static-libstdc++",
        ]
    )
    # env.Append(ENV=os.environ)

    # env.Append(CPPDEFINES=['WIN32', '_WIN32', '_WINDOWS', '_CRT_SECURE_NO_WARNINGS'])
    # env.Append(CCFLAGS=['-W3', '-GR'])
    # 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])

# 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')

print("debugging output name",env["target_name"],cpp_library)
library = env.SharedLibrary(target=env['target_path'] + env['target_name'] , source=sources)

Default(library)

# Generates help for the -h scons option.
Help(opts.GenerateHelpText(env))

output of scons command shown here

gitpod /workspace/phytoVRgodot (main) $ scons platform=windows target=release 
scons: Reading SConscript files ...
scons: done reading SConscript files.
scons: Building targets ...
x86_64-w64-mingw32-g++ -o src/gdexample.os -c -O3 -Wwrite-strings -fPIC -I. -Igodot-cpp/godot-headers -Igodot-cpp/include -Igodot-cpp/include/core -Igodot-cpp/include/gen -Isrc src/gdexample.cpp
x86_64-w64-mingw32-g++ -o src/gdlibrary.os -c -O3 -Wwrite-strings -fPIC -I. -Igodot-cpp/godot-headers -Igodot-cpp/include -Igodot-cpp/include/core -Igodot-cpp/include/gen -Isrc src/gdlibrary.cpp
x86_64-w64-mingw32-g++ -o demo/bin/win64/libgdexample.so --static -Wl,--no-undefined -static-libgcc -static-libstdc++ -shared src/gdexample.os src/gdlibrary.os -Lgodot-cpp/bin -lgodot-cpp.windows.release.64
scons: done building targets.

So the question is, how can I construct an SConstruct file so that it produces a .dll compiled on linux with mingw-w64 that I can use to load my custom plugin as gdnative script in windows?

Godot version 3.5.1
in Engine by (39 points)

Please log in or register to answer this question.

Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read Frequently asked questions and How to use this Q&A? before posting your first questions.
Social login is currently unavailable. If you've previously logged in with a Facebook or GitHub account, use the I forgot my password link in the login box to set a password for your account. If you still can't access your account, send an email to [email protected] with your username.