Files
gnatstudio/python/core/gps-python_core.adb
boulanger b75b66fe4e Fix local run of testsuite on Windows
add_dll_directory will print the new directory in stdout which
will make the GS testsuite fails.
2023-02-09 12:12:16 +01:00

117 lines
4.8 KiB
Ada

------------------------------------------------------------------------------
-- GNAT Studio --
-- --
-- Copyright (C) 2013-2023, AdaCore --
-- --
-- This is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
-- ware Foundation; either version 3, or (at your option) any later ver- --
-- sion. This software is distributed in the hope that it will be useful, --
-- but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHAN- --
-- TABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public --
-- License for more details. You should have received a copy of the GNU --
-- General Public License distributed with this software; see file --
-- COPYING3. If not, go to http://www.gnu.org/licenses for a complete copy --
-- of the license. --
------------------------------------------------------------------------------
with VSS.Application;
with VSS.String_Vectors;
with VSS.Strings.Conversions;
with Config; use Config;
with GNATCOLL.Arg_Lists;
with GNATCOLL.Scripts;
with GNATCOLL.Scripts.Python; use GNATCOLL.Scripts.Python;
with GNATCOLL.Utils; use GNATCOLL.Utils;
with GNATCOLL.VFS; use GNATCOLL.VFS;
package body GPS.Python_Core is
---------------------
-- Register_Python --
---------------------
procedure Register_Python
(Kernel : access GPS.Core_Kernels.Core_Kernel_Record'Class) is
begin
declare
Python_Home : constant VSS.Strings.Virtual_String :=
VSS.Application.System_Environment.Value ("GNATSTUDIO_PYTHONHOME");
begin
if Python_Home.Is_Empty then
declare
Packaged_Python_Location : constant Virtual_File :=
Create (+Executable_Location)
/ (+"share") / (+"gnatstudio") / (+"python");
begin
Register_Python_Scripting
(Kernel.Scripts,
Module => "GPS",
Python_Home => Packaged_Python_Location.Display_Full_Name);
end;
else
Register_Python_Scripting
(Kernel.Scripts,
Module => "GPS",
Python_Home =>
VSS.Strings.Conversions.To_UTF_8_String (Python_Home));
end if;
end;
declare
Paths : constant VSS.String_Vectors.Virtual_String_Vector :=
VSS.Application.System_Environment.Value_Paths
("GNATSTUDIO_PYDLLPATH", False);
Script : constant GNATCOLL.Scripts.Scripting_Language :=
Kernel.Scripts.Lookup_Scripting_Language (Python_Name);
Errors : Boolean;
begin
-- Dynamically load the gtk DLLs on windows for python3.8+
-- if the DLLs are not relatively located to PYTHONHOME.
if Config.Host = Windows then
Script.Execute_Command
(CL => GNATCOLL.Arg_Lists.Create
("import os; import io;"
& "save_stdout = sys.stdout; sys.stdout = io.StringIO()"),
Hide_Output => True,
Errors => Errors);
for Path of Paths loop
Script.Execute_Command
(CL => GNATCOLL.Arg_Lists.Create
("os.add_dll_directory('"
& VSS.Strings.Conversions.To_UTF_8_String (Path)
& "')"),
Hide_Output => True,
Errors => Errors);
end loop;
Script.Execute_Command
(CL => GNATCOLL.Arg_Lists.Create
("sys.stdout = save_stdout"),
Hide_Output => True,
Errors => Errors);
end if;
-- Register GPS module as GS to use both in transition period
Script.Execute_Command
(CL => GNATCOLL.Arg_Lists.Create
("sys.modules['GS'] = GPS"),
Hide_Output => True,
Errors => Errors);
pragma Assert (not Errors);
-- Force the interpreter to load all files as utf8
Script.Execute_Command
(CL => GNATCOLL.Arg_Lists.Create
("import _locale; _locale._getdefaultlocale" &
" = (lambda *args: ['en_US', 'utf8'])"),
Hide_Output => True,
Errors => Errors);
pragma Assert (not Errors);
end;
end Register_Python;
end GPS.Python_Core;