Skip to content

Commit c0c5429

Browse files
committed
Including an option to the Project menu to enable Pytho and select the desired version
Former-commit-id: 3e2cc82996dbe8c1e4c422c8a35296f4999dcdd2 [formerly 7aa43d73a626a19d37b29d4704f46fd1ebf69b49] [formerly 9f027c789c3095375a2cc00636516f942f334d65 [formerly c7b1e6ef4dced0a6ef206f41879d09eb9b7fb4c5]] Former-commit-id: d4f2b7787daf42d51c4c8d2d4e5a058dc4d4cbb3 [formerly 38fdabeebe8e5fa23d4d9f61af0140c361c1aa6a] Former-commit-id: 6ab906cc282ca770abdcabb7e506e6ff1d03b818
1 parent d69d427 commit c0c5429

7 files changed

+1728
-0
lines changed
Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
unit PyEnvironment.Project.IDE.Deploy;
2+
3+
interface
4+
5+
uses
6+
System.Generics.Collections,
7+
DeploymentAPI,
8+
PyEnvironment.Project.IDE.Types;
9+
10+
type
11+
TPyEnvironmentProjectDeploy = class
12+
strict private
13+
class var
14+
FDeployableFiles: TDictionary<string, TArray<TPyEnvironmentDeployFile>>;
15+
FAbsolutePath: string;
16+
FPath: string;
17+
FPathChecked: Boolean;
18+
class procedure FindPath(out APath, AAbsolutePath: string); static;
19+
class function GetAbsolutePath: string; static;
20+
class function GetFound: Boolean; static;
21+
class function GetPath: string; static;
22+
class function IsValidPythonEnvironmentDir(const APath: string): Boolean; static;
23+
public
24+
const
25+
DEPLOYMENT_CLASS = 'Python';
26+
PROJECT_USE_PYTHON = 'PYTHON';
27+
PROJECT_NO_USE_PYTHON = 'NOPYTHON';
28+
PYTHON_ENVIRONMENT_DIR_VARIABLE = 'PYTHONENVIRONMENTDIR';
29+
PYTHON_VERSIONS: array[0..3] of string = ('3.7', '3.8', '3.9', '3.10');
30+
SUPPORTED_PLATFORMS = [
31+
TPyEnvironmentProjectPlatform.Win32, TPyEnvironmentProjectPlatform.Win64,
32+
TPyEnvironmentProjectPlatform.Android, TPyEnvironmentProjectPlatform.Android64,
33+
//TPyEnvironmentProjectPlatform.iOSDevice64,
34+
TPyEnvironmentProjectPlatform.OSX64, TPyEnvironmentProjectPlatform.OSXARM64,
35+
TPyEnvironmentProjectPlatform.Linux64];
36+
public
37+
class constructor Create();
38+
class destructor Destroy();
39+
40+
class function GetDeployFiles(const APythonVersion: string; const APlatform: TPyEnvironmentProjectPlatform): TArray<TPyEnvironmentDeployFile>; static;
41+
class property AbsolutePath: string read GetAbsolutePath;
42+
class property Found: Boolean read GetFound;
43+
class property Path: string read GetPath;
44+
end;
45+
46+
implementation
47+
48+
uses
49+
System.SysUtils, System.IOUtils,
50+
PyEnvironment.Project.IDE.Helper;
51+
52+
{ TPyEnvironmentProject }
53+
54+
class constructor TPyEnvironmentProjectDeploy.Create;
55+
begin
56+
FDeployableFiles := TDictionary<string, TArray<TPyEnvironmentDeployFile>>.Create();
57+
58+
FDeployableFiles.Add('3.7', [
59+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Win32, 'python\python3-windows-3.7.9-win32.zip', '.\', True, True, TDeployOperation.doCopyOnly, ''), // Win32
60+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Win64, 'python\python3-windows-3.7.9-amd64.zip', '.\', True, True, TDeployOperation.doCopyOnly, ''), // Win64
61+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android, 'python\python3-android-3.7.13-arm.zip', '.\assets\internal', False, True, TDeployOperation.doCopyOnly, ''), // Android
62+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\python3-android-3.7.13-arm64.zip', '.\assets\internal', False, True, TDeployOperation.doCopyOnly, ''), // Android64
63+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\python3-android-3.7.13-arm.zip', '.\assets\internal', False, True, TDeployOperation.doCopyOnly, '''$(AndroidAppBundle)''==''true'''), // Android64
64+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android, 'python\android\3.7.13\arm\libpython3.7m.so', 'library\lib\armeabi-v7a\', False, True, TDeployOperation.doSetExecBit, ''), // Android
65+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\android\3.7.13\arm64\libpython3.7m.so', 'library\lib\arm64-v8a\', False, True, TDeployOperation.doSetExecBit, ''), // Android64
66+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\android\3.7.13\arm\libpython3.7m.so', 'library\lib\armeabi-v7a\', False, True, TDeployOperation.doSetExecBit, '''$(AndroidAppBundle)''==''true'''), // Android64
67+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android, 'python\android\3.7.13\arm\python3.7', 'library\lib\armeabi-v7a\', False, True, TDeployOperation.doSetExecBit, ''), // Android
68+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\android\3.7.13\arm64\python3.7', 'library\lib\arm64-v8a\', False, True, TDeployOperation.doSetExecBit, ''), // Android64
69+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\android\3.7.13\arm\python3.7', 'library\lib\armeabi-v7a\', False, True, TDeployOperation.doSetExecBit, '''$(AndroidAppBundle)''==''true'''), // Android64
70+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.OSX64, 'python\python3-macos-3.7.13-x86_64.zip', 'Contents\MacOS\', True, True, TDeployOperation.doCopyOnly, ''), // OSX64
71+
//TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.OSXARM64, 'python\python3-macos-3.7.13-universal2.zip', 'Contents\MacOS\', True, True, TDeployOperation.doCopyOnly, ''), // OSXARM64 //3.7 is not available for M1
72+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Linux64, 'python\python3-linux-3.7.13-x86_64.zip', '.\', True, True, TDeployOperation.doCopyOnly, '') // Linux64
73+
]);
74+
75+
FDeployableFiles.Add('3.8', [
76+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Win32, 'python\python3-windows-3.8.10-win32.zip', '.\', True, True, TDeployOperation.doCopyOnly, ''), // Win32
77+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Win64, 'python\python3-windows-3.8.10-amd64.zip', '.\', True, True, TDeployOperation.doCopyOnly, ''), // Win64
78+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android, 'python\python3-android-3.8.13-arm.zip', '.\assets\internal', False, True, TDeployOperation.doCopyOnly, ''), // Android
79+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\python3-android-3.8.13-arm64.zip', '.\assets\internal', False, True, TDeployOperation.doCopyOnly, ''), // Android64
80+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\python3-android-3.8.13-arm.zip', '.\assets\internal', False, True, TDeployOperation.doCopyOnly, '''$(AndroidAppBundle)''==''true'''), // Android64
81+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android, 'python\android\3.8.13\arm\libpython3.8.so', 'library\lib\armeabi-v7a\', False, True, TDeployOperation.doSetExecBit, ''), // Android
82+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\android\3.8.13\arm64\libpython3.8.so', 'library\lib\arm64-v8a\', False, True, TDeployOperation.doSetExecBit, ''), // Android64
83+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\android\3.8.13\arm\libpython3.8.so', 'library\lib\armeabi-v7a\', False, True, TDeployOperation.doSetExecBit, '''$(AndroidAppBundle)''==''true'''), // Android64
84+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android, 'python\android\3.8.13\arm\python3.8', 'library\lib\armeabi-v7a\', False, True, TDeployOperation.doSetExecBit, ''), // Android
85+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\android\3.8.13\arm64\python3.8', 'library\lib\arm64-v8a\', False, True, TDeployOperation.doSetExecBit, ''), // Android64
86+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\android\3.8.13\arm\python3.8', 'library\lib\armeabi-v7a\', False, True, TDeployOperation.doSetExecBit, '''$(AndroidAppBundle)''==''true'''), // Android64
87+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.OSX64, 'python\python3-macos-3.8.13-x86_64.zip', 'Contents\MacOS\', True, True, TDeployOperation.doCopyOnly, ''), // OSX64
88+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.OSXARM64, 'python\python3-macos-3.8.13-universal2.zip', 'Contents\MacOS\', True, True, TDeployOperation.doCopyOnly, ''), // OSXARM64 //3.7 is not available for M1
89+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Linux64, 'python\python3-linux-3.8.13-x86_64.zip', '.\', True, True, TDeployOperation.doCopyOnly, '') // Linux64
90+
]);
91+
92+
FDeployableFiles.Add('3.9', [
93+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Win32, 'python\python3-windows-3.9.12-win32.zip', '.\', True, True, TDeployOperation.doCopyOnly, ''), // Win32
94+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Win64, 'python\python3-windows-3.9.12-amd64.zip', '.\', True, True, TDeployOperation.doCopyOnly, ''), // Win64
95+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android, 'python\python3-android-3.9.12-arm.zip', '.\assets\internal', False, True, TDeployOperation.doCopyOnly, ''), // Android
96+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\python3-android-3.9.12-arm64.zip', '.\assets\internal', False, True, TDeployOperation.doCopyOnly, ''), // Android64
97+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\python3-android-3.9.12-arm.zip', '.\assets\internal', False, True, TDeployOperation.doCopyOnly, '''$(AndroidAppBundle)''==''true'''), // Android64
98+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android, 'python\android\3.9.12\arm\libpython3.9.so', 'library\lib\armeabi-v7a\', False, True, TDeployOperation.doSetExecBit, ''), // Android
99+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\android\3.9.12\arm64\libpython3.9.so', 'library\lib\arm64-v8a\', False, True, TDeployOperation.doSetExecBit, ''), // Android64
100+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\android\3.9.12\arm\libpython3.9.so', 'library\lib\armeabi-v7a\', False, True, TDeployOperation.doSetExecBit, '''$(AndroidAppBundle)''==''true'''), // Android64
101+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android, 'python\android\3.9.12\arm\python3.9', 'library\lib\armeabi-v7a\', False, True, TDeployOperation.doSetExecBit, ''), // Android
102+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\android\3.9.12\arm64\python3.9', 'library\lib\arm64-v8a\', False, True, TDeployOperation.doSetExecBit, ''), // Android64
103+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\android\3.9.12\arm\python3.9', 'library\lib\armeabi-v7a\', False, True, TDeployOperation.doSetExecBit, '''$(AndroidAppBundle)''==''true'''), // Android64
104+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.OSX64, 'python\python3-macos-3.9.12-x86_64.zip', 'Contents\MacOS\', True, True, TDeployOperation.doCopyOnly, ''), // OSX64
105+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.OSXARM64, 'python\python3-macos-3.9.12-universal2.zip', 'Contents\MacOS\', True, True, TDeployOperation.doCopyOnly, ''), // OSXARM64 //3.7 is not available for M1
106+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Linux64, 'python\python3-linux-3.9.12-x86_64.zip', '.\', True, True, TDeployOperation.doCopyOnly, '') // Linux64
107+
]);
108+
109+
FDeployableFiles.Add('3.10', [
110+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Win32, 'python\python3-windows-3.10.4-win32.zip', '.\', True, True, TDeployOperation.doCopyOnly, ''), // Win32
111+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Win64, 'python\python3-windows-3.10.4-amd64.zip', '.\', True, True, TDeployOperation.doCopyOnly, ''), // Win64
112+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android, 'python\python3-android-3.10.4-arm.zip', '.\assets\internal', False, True, TDeployOperation.doCopyOnly, ''), // Android
113+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\python3-android-3.10.4-arm64.zip', '.\assets\internal', False, True, TDeployOperation.doCopyOnly, ''), // Android64
114+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\python3-android-3.10.4-arm.zip', '.\assets\internal', False, True, TDeployOperation.doCopyOnly, '''$(AndroidAppBundle)''==''true'''), // Android64
115+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android, 'python\android\3.10.4\arm\libpython3.10.so', 'library\lib\armeabi-v7a\', False, True, TDeployOperation.doSetExecBit, ''), // Android
116+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\android\3.10.4\arm64\libpython3.10.so', 'library\lib\arm64-v8a\', False, True, TDeployOperation.doSetExecBit, ''), // Android64
117+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\android\3.10.4\arm\libpython3.10.so', 'library\lib\armeabi-v7a\', False, True, TDeployOperation.doSetExecBit, '''$(AndroidAppBundle)''==''true'''), // Android64
118+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android, 'python\android\3.10.4\arm\python3.10', 'library\lib\armeabi-v7a\', False, True, TDeployOperation.doSetExecBit, ''), // Android
119+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\android\3.10.4\arm64\python3.10', 'library\lib\arm64-v8a\', False, True, TDeployOperation.doSetExecBit, ''), // Android64
120+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Android64, 'python\android\3.10.4\arm\python3.10', 'library\lib\armeabi-v7a\', False, True, TDeployOperation.doSetExecBit, '''$(AndroidAppBundle)''==''true'''), // Android64
121+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.OSX64, 'python\python3-macos-3.10.4-x86_64.zip', 'Contents\MacOS\', True, True, TDeployOperation.doCopyOnly, ''), // OSX64
122+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.OSXARM64, 'python\python3-macos-3.10.4-universal2.zip', 'Contents\MacOS\', True, True, TDeployOperation.doCopyOnly, ''), // OSXARM64 //3.7 is not available for M1
123+
TPyEnvironmentDeployFile.Create(TPyEnvironmentProjectPlatform.Linux64, 'python\python3-linux-3.10.4-x86_64.zip', '.\', True, True, TDeployOperation.doCopyOnly, '') // Linux64
124+
]);
125+
end;
126+
127+
class destructor TPyEnvironmentProjectDeploy.Destroy;
128+
begin
129+
FDeployableFiles.Free();
130+
end;
131+
132+
class procedure TPyEnvironmentProjectDeploy.FindPath(out APath,
133+
AAbsolutePath: string);
134+
begin
135+
AAbsolutePath := TPyEnvironmentOTAHelper.GetEnvironmentVar(PYTHON_ENVIRONMENT_DIR_VARIABLE, True);
136+
if IsValidPythonEnvironmentDir(AAbsolutePath) then
137+
APath := '$(' + PYTHON_ENVIRONMENT_DIR_VARIABLE + ')'
138+
else begin
139+
APath := '';
140+
AAbsolutePath := '';
141+
end;
142+
end;
143+
144+
class function TPyEnvironmentProjectDeploy.GetAbsolutePath: string;
145+
begin
146+
if not FPathChecked then
147+
GetPath();
148+
Result := FAbsolutePath;
149+
end;
150+
151+
class function TPyEnvironmentProjectDeploy.GetDeployFiles(const APythonVersion: string;
152+
const APlatform: TPyEnvironmentProjectPlatform): TArray<TPyEnvironmentDeployFile>;
153+
var
154+
I: Integer;
155+
LAllFiles: TArray<TPyEnvironmentDeployFile>;
156+
begin
157+
Result := [];
158+
159+
if not FDeployableFiles.ContainsKey(APythonVersion) then
160+
Exit();
161+
162+
LAllFiles := FDeployableFiles[APythonVersion];
163+
for I := Low(LAllFiles) to High(LAllFiles) do
164+
if LAllFiles[I].Platform = APlatform then
165+
Result := Result + [LAllFiles[I]];
166+
end;
167+
168+
class function TPyEnvironmentProjectDeploy.GetFound: Boolean;
169+
begin
170+
Result := not Path.IsEmpty;
171+
end;
172+
173+
class function TPyEnvironmentProjectDeploy.GetPath: string;
174+
begin
175+
if not FPathChecked then begin
176+
FindPath(FPath, FAbsolutePath);
177+
FPathChecked := True;
178+
end;
179+
Result := FPath;
180+
end;
181+
182+
class function TPyEnvironmentProjectDeploy.IsValidPythonEnvironmentDir(
183+
const APath: string): Boolean;
184+
begin
185+
Result := TDirectory.Exists(APath);
186+
end;
187+
188+
end.

0 commit comments

Comments
 (0)