@@ -338,6 +338,42 @@ def options(opts, env):
338338 opts .Add (BoolVariable ("dev_build" , "Developer build with dev-only debugging code (DEV_ENABLED)" , False ))
339339 opts .Add (BoolVariable ("verbose" , "Enable verbose output for the compilation" , False ))
340340
341+
342+ # Scons lack a default install prefix, so use CMake's as a default for feature parity
343+ # https://cmake.org/cmake/help/latest/variable/CMAKE_INSTALL_PREFIX.html
344+ opts .Add (
345+ PathVariable (
346+ "install_prefix_dir" ,
347+ "The directory to install to" ,
348+ "C:/Program Files/godot-cpp" if default_platform == "windows" else "/usr/local" ,
349+ PathVariable .PathAccept ,
350+ )
351+ )
352+ opts .Add (
353+ PathVariable (
354+ "install_lib_dir" ,
355+ "The directory to install the library (relative from the prefix)" ,
356+ "lib" ,
357+ PathVariable .PathAccept ,
358+ )
359+ )
360+ opts .Add (
361+ PathVariable (
362+ "install_include_dir" ,
363+ "The directory to install the headers (relative from the prefix)" ,
364+ "include" ,
365+ PathVariable .PathAccept ,
366+ )
367+ )
368+ opts .Add (
369+ PathVariable (
370+ "install_data_dir" ,
371+ "The directory to install misc files (relative from the prefix)" ,
372+ "share/godot-cpp" ,
373+ PathVariable .PathAccept ,
374+ )
375+ )
376+
341377 # Add platform options (custom tools can override platforms)
342378 for pl in sorted (set (platforms + custom_platforms )):
343379 tool = Tool (pl , toolpath = get_platform_tools_paths (env ))
@@ -526,6 +562,7 @@ def generate(env):
526562 }
527563 )
528564 env .AddMethod (_godot_cpp , "GodotCPP" )
565+ env .AddMethod (_installable , "InstallableGodotCPP" )
529566
530567
531568def _godot_cpp (env ):
@@ -571,3 +608,61 @@ def _godot_cpp(env):
571608
572609 env .AppendUnique (LIBS = [env .File ("bin/%s" % library_name )])
573610 return library
611+
612+
613+ def _installable (env , library ):
614+ import itertools
615+ import json
616+
617+ install_lib_dir = os .path .join (env ["install_prefix_dir" ], env ["install_lib_dir" ])
618+ install_pkgconfig_dir = os .path .join (install_lib_dir , "pkgconfig" )
619+ install_include_dir = os .path .join (env ["install_prefix_dir" ], env ["install_include_dir" ])
620+ install_data_dir = os .path .join (env ["install_prefix_dir" ], env ["install_data_dir" ])
621+
622+ # Obtain the gdextension version
623+ extension_dir = normalize_path (env .get ("gdextension_dir" , env .Dir ("gdextension" ).abspath ), env )
624+ api_filename = normalize_path (
625+ env .get ("custom_api_file" , env .File (extension_dir + "/extension_api.json" ).abspath ),
626+ env ,
627+ )
628+ with open (api_filename , "r" ) as api_json_file :
629+ api_data = json .load (api_json_file )
630+ version_major = api_data ["header" ]["version_major" ]
631+ version_minor = api_data ["header" ]["version_minor" ]
632+ version_patch = api_data ["header" ]["version_patch" ]
633+ gd_version = f"{ version_major } .{ version_minor } .{ version_patch } "
634+ api_data = None
635+
636+ # Configure and install the pkgconfig file
637+ libname = str (library [0 ])
638+ pkgconfig = env .Substfile (
639+ target = "gen/godot-cpp.pc" ,
640+ source = "cmake/godot-cpp.pc.in" ,
641+ SUBST_DICT = {
642+ "@PROJECT_NAME@" : "godot-cpp" ,
643+ "@CMAKE_INSTALL_LIBDIR@" : install_lib_dir ,
644+ "@CMAKE_INSTALL_INCLUDEDIR@" : install_include_dir ,
645+ "@GODOT_API_VERSION@" : gd_version ,
646+ "@GODOTCPP_OUTPUT_NAME@" : libname ,
647+ },
648+ )
649+ env .Install (install_pkgconfig_dir , pkgconfig )
650+
651+ # Install the headers
652+ headers_from = []
653+ headers_to = []
654+ for dir_from , _ , file_lst in itertools .chain (os .walk ("include/godot_cpp" ), os .walk ("gen/include/godot_cpp" )):
655+ headers_from += [os .path .join (dir_from , filename ) for filename in file_lst ]
656+ dir_to = os .path .join (install_include_dir , dir_from [dir_from .find ("/godot_cpp" ) + 1 :])
657+ headers_to += [os .path .join (dir_to , filename ) for filename in file_lst ]
658+ env .InstallAs (headers_to , headers_from )
659+
660+ # Install the gdextension files
661+ interface_header = os .path .join (extension_dir , "gdextension_interface.h" )
662+ env .Install (install_include_dir , interface_header )
663+ env .Install (install_data_dir , api_filename )
664+
665+ # Install the static library
666+ env .Install (install_lib_dir , library )
667+
668+ env .Alias ("install" , env ["install_prefix_dir" ])
0 commit comments