Skip to content

Commit e64a9da

Browse files
committed
[GR-42007] Basic windows build
PullRequest: graalpython/2499
2 parents 27e9695 + 3f0ce9a commit e64a9da

File tree

30 files changed

+841
-164
lines changed

30 files changed

+841
-164
lines changed

ci.jsonnet

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{ "overlay": "b7f2a8abd1005a8ef57418f3f20a81c3696f9cfe" }
1+
{ "overlay": "0382241d2334bc7a645e23bbeb33b5775bc7a7a5" }
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
C extensions on Windows not supported yet

graalpython/com.oracle.graal.python.cext/include/Python.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,19 @@
7575
#include <stdlib.h>
7676
#include <sys/stat.h>
7777
#include <sys/types.h>
78+
#ifndef _MSC_VER
7879
#include <sys/dir.h>
7980
#include <dirent.h>
80-
#include <locale.h>
8181
#include <langinfo.h>
82-
#include <assert.h>
8382
#include <unistd.h>
83+
#else
84+
#define HAVE_COPYSIGN
85+
#define HAVE_ROUND
86+
#define HAVE_HYPOT
87+
#define NT_THREADS
88+
#endif
89+
#include <locale.h>
90+
#include <assert.h>
8491
#include <math.h>
8592

8693
#include "pyport.h"

graalpython/com.oracle.graal.python.cext/setup.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646

4747
import _sysconfig
4848

49-
__dir__ = __file__.rpartition("/")[0]
49+
__dir__ = os.path.dirname(__file__)
5050
cflags_warnings = [ "-Wno-int-to-pointer-cast"
5151
, "-Wno-int-conversion"
5252
, "-Wno-void-pointer-to-int-cast"
@@ -60,13 +60,15 @@
6060
libposix_name = "libposix"
6161

6262
MACOS = sys.platform == "darwin"
63+
WIN32 = sys.platform == "win32"
6364
verbosity = '--verbose' if sys.flags.verbose else '--quiet'
6465
darwin_native = MACOS and __graalpython__.platform_id == "native"
66+
win32_native = WIN32 and __graalpython__.platform_id == "native"
6567
relative_rpath = "@loader_path" if darwin_native else r"$ORIGIN"
6668
so_ext = get_config_var("EXT_SUFFIX")
6769
SOABI = get_config_var("SOABI")
6870
is_managed = 'managed' in SOABI
69-
lib_ext = 'dylib' if MACOS else 'so'
71+
lib_ext = 'dylib' if MACOS else ('pyd' if WIN32 else 'so')
7072

7173
# configure logger
7274
logger = logging.getLogger(__name__)

graalpython/com.oracle.graal.python.frozen/freeze_modules.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
"genericpath",
7171
"ntpath",
7272
"posixpath",
73-
# We must explicitly mark os.path as a frozen module
73+
# We must explicitly mark os.path as a frozen module, it is also special cased below
7474
("ntpath" if os.name == "nt" else "posixpath") + " : os.path",
7575
"os",
7676
"site",
@@ -279,7 +279,7 @@ def frozenid(self):
279279

280280
@property
281281
def modname(self):
282-
if self.pyfile.startswith(self.stdlib_path):
282+
if os.path.normpath(self.pyfile).startswith(os.path.normpath(self.stdlib_path)):
283283
return self.id
284284
return None
285285

@@ -369,7 +369,7 @@ def _iter_sources(modules):
369369

370370

371371
def _get_checksum(filename):
372-
with open(filename, "rb") as infile:
372+
with open(filename, "rb", encoding="utf-8") as infile:
373373
contents = infile.read()
374374
m = sha256()
375375
m.update(contents)
@@ -528,11 +528,13 @@ def lower_camel_case(str):
528528
*/
529529
package com.oracle.graal.python.builtins.objects.module;
530530
531+
import com.oracle.graal.python.builtins.PythonOS;
532+
531533
public final class FrozenModules {"""
532534

533535

534536
def freeze_module(src):
535-
with open(src.pyfile, "r") as src_file, open(src.binaryfile, "wb") as binary_file:
537+
with open(src.pyfile, "r", encoding="utf-8") as src_file, open(src.binaryfile, "wb") as binary_file:
536538
code_obj = compile(src_file.read(), f"<frozen {src.id}>", "exec")
537539
marshal.dump(code_obj, binary_file)
538540

@@ -561,6 +563,9 @@ def write_frozen_lookup(out_file, modules):
561563
out_file.write(
562564
f' return Map.{module.symbol}.asPackage({"true" if module.ispkg else "false"});\n'
563565
)
566+
elif module.name == "os.path": # Special case for os.path
567+
out_file.write(u' case "os.path":\n')
568+
out_file.write(u' return PythonOS.getPythonOS() != PythonOS.PLATFORM_WIN32 ? Map.POSIXPATH : Map.NTPATH;\n')
564569
else:
565570
out_file.write(f' case "{module.name}":\n')
566571
out_file.write(f" return Map.{module.symbol};\n")
@@ -572,21 +577,21 @@ def write_frozen_lookup(out_file, modules):
572577

573578
def write_frozen_module_file(file, modules):
574579
if os.path.exists(file):
575-
with open(file, "r") as f:
580+
with open(file, "r", encoding="utf-8") as f:
576581
content = f.read()
577582
stat_result = os.stat(file)
578583
atime, mtime = stat_result.st_atime, stat_result.st_mtime
579584
else:
580585
content = None
581586
os.makedirs(os.path.dirname(file), exist_ok=True)
582-
with open(file, "w") as out_file:
587+
with open(file, "w", encoding="utf-8") as out_file:
583588
out_file.write(FROZEN_MODULES_HEADER)
584589
out_file.write("\n\n")
585590
write_frozen_modules_map(out_file, modules)
586591
out_file.write("\n")
587592
write_frozen_lookup(out_file, modules)
588593
out_file.write("}\n")
589-
with open(file, "r") as f:
594+
with open(file, "r", encoding="utf-8") as f:
590595
new_content = f.read()
591596
if new_content == content:
592597
# set mtime to the old one, if we didn't change anything
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
C extensions on Windows not supported yet

graalpython/com.oracle.graal.python.shell/src/com/oracle/graal/python/shell/GraalPythonMain.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,11 @@ protected void launch(Builder contextBuilder) {
663663
}
664664
}
665665

666+
String osName = System.getProperty("os.name");
667+
if (osName != null && osName.toLowerCase().contains("windows")) {
668+
contextBuilder.option("python.PosixModuleBackend", "java");
669+
}
670+
666671
if (multiContext) {
667672
contextBuilder.engine(Engine.newBuilder().allowExperimentalOptions(true).options(enginePolyglotOptions).build());
668673
}
@@ -711,6 +716,10 @@ protected void launch(Builder contextBuilder) {
711716
}
712717

713718
private static String toAbsolutePath(String executable) {
719+
if (executable.contains(":")) {
720+
// this is either already an absolute windows path, or not a single executable
721+
return executable;
722+
}
714723
return Paths.get(executable).toAbsolutePath().toString();
715724
}
716725

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/PythonLanguage.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,24 @@
2525
*/
2626
package com.oracle.graal.python;
2727

28+
import static com.oracle.graal.python.builtins.PythonOS.PLATFORM_WIN32;
29+
import static com.oracle.graal.python.builtins.PythonOS.getPythonOS;
2830
import static com.oracle.graal.python.nodes.StringLiterals.J_PY_EXTENSION;
2931
import static com.oracle.graal.python.nodes.StringLiterals.T_PY_EXTENSION;
3032
import static com.oracle.graal.python.nodes.truffle.TruffleStringMigrationHelpers.isJavaString;
3133
import static com.oracle.graal.python.util.PythonUtils.TS_ENCODING;
3234
import static com.oracle.graal.python.util.PythonUtils.tsLiteral;
3335

3436
import java.io.IOException;
37+
import java.nio.file.InvalidPathException;
3538
import java.util.Arrays;
3639
import java.util.EnumSet;
3740
import java.util.List;
3841
import java.util.concurrent.ConcurrentHashMap;
3942
import java.util.concurrent.Semaphore;
4043
import java.util.logging.Level;
4144

45+
import org.graalvm.nativeimage.ImageInfo;
4246
import org.graalvm.options.OptionDescriptors;
4347
import org.graalvm.options.OptionKey;
4448
import org.graalvm.options.OptionValues;
@@ -523,7 +527,7 @@ private CallTarget parseForBytecodeInterpreter(ParsingRequest request) {
523527
private Source tryLoadSource(PythonContext context, CodeUnit code, boolean internal, String path) {
524528
try {
525529
return Source.newBuilder(PythonLanguage.ID, context.getEnv().getPublicTruffleFile(path)).name(code.name.toJavaStringUncached()).internal(internal).build();
526-
} catch (IOException | SecurityException | UnsupportedOperationException e) {
530+
} catch (IOException | SecurityException | UnsupportedOperationException | InvalidPathException e) {
527531
return null;
528532
}
529533
}
@@ -952,7 +956,7 @@ public static Source newSource(PythonContext ctxt, TruffleString tsrc, TruffleSt
952956
sourceBuilder.content(src);
953957
}
954958
}
955-
} catch (SecurityException | IOException e) {
959+
} catch (SecurityException | IOException | InvalidPathException e) {
956960
sourceBuilder = null;
957961
}
958962
}
@@ -973,6 +977,11 @@ public static Source newSource(PythonContext ctxt, TruffleFile src, String name)
973977
}
974978

975979
private static Source newSource(PythonContext context, SourceBuilder srcBuilder) throws IOException {
980+
if (getPythonOS() == PLATFORM_WIN32 && ImageInfo.inImageBuildtimeCode()) {
981+
// canonicalization on windows means something else than on linux and causes issues
982+
// with paths
983+
srcBuilder.canonicalizePath(false);
984+
}
976985
if (shouldMarkSourceInternal(context)) {
977986
srcBuilder.internal(true);
978987
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/Python3Core.java

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import java.util.regex.Matcher;
6161
import java.util.regex.Pattern;
6262

63+
import com.oracle.graal.python.builtins.modules.WinregModuleBuiltins;
6364
import com.oracle.graal.python.builtins.objects.itertools.PairwiseBuiltins;
6465
import org.graalvm.nativeimage.ImageInfo;
6566

@@ -93,6 +94,7 @@
9394
import com.oracle.graal.python.builtins.modules.MarshalModuleBuiltins;
9495
import com.oracle.graal.python.builtins.modules.MathModuleBuiltins;
9596
import com.oracle.graal.python.builtins.modules.MultiprocessingModuleBuiltins;
97+
import com.oracle.graal.python.builtins.modules.NtModuleBuiltins;
9698
import com.oracle.graal.python.builtins.modules.OperatorModuleBuiltins;
9799
import com.oracle.graal.python.builtins.modules.PolyglotModuleBuiltins;
98100
import com.oracle.graal.python.builtins.modules.PosixModuleBuiltins;
@@ -439,12 +441,14 @@ private static TruffleString[] initializeCoreFiles() {
439441

440442
private static void filterBuiltins(List<PythonBuiltins> builtins) {
441443
PythonOS currentOs = PythonOS.getPythonOS();
444+
List<PythonBuiltins> toRemove = new ArrayList<>();
442445
for (PythonBuiltins builtin : builtins) {
443446
CoreFunctions annotation = builtin.getClass().getAnnotation(CoreFunctions.class);
444447
if (annotation.os() != PythonOS.PLATFORM_ANY && annotation.os() != currentOs) {
445-
builtins.remove(builtin);
448+
toRemove.add(builtin);
446449
}
447450
}
451+
builtins.removeAll(toRemove);
448452
}
449453

450454
private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed) {
@@ -511,6 +515,8 @@ private static PythonBuiltins[] initializeBuiltins(boolean nativeAccessAllowed)
511515
new PropertyBuiltins(),
512516
new BaseExceptionBuiltins(),
513517
new PosixModuleBuiltins(),
518+
new NtModuleBuiltins(),
519+
new WinregModuleBuiltins(),
514520
new CryptModuleBuiltins(),
515521
new ScandirIteratorBuiltins(),
516522
new DirEntryBuiltins(),
@@ -871,7 +877,10 @@ private void initializeJavaCore() {
871877
}
872878

873879
private void initializeImportlib() {
874-
PythonModule bootstrap = ImpModuleBuiltins.importFrozenModuleObject(this, T__FROZEN_IMPORTLIB, false);
880+
PythonModule bootstrap = null;
881+
if (!ImageInfo.inImageBuildtimeCode()) {
882+
bootstrap = ImpModuleBuiltins.importFrozenModuleObject(this, T__FROZEN_IMPORTLIB, false);
883+
}
875884
PythonModule bootstrapExternal;
876885

877886
PyObjectCallMethodObjArgs callNode = PyObjectCallMethodObjArgs.getUncached();
@@ -945,8 +954,7 @@ public final void postInitialize() {
945954
* access is never allowed during native image build time.
946955
*/
947956
if (ImageInfo.inImageCode() && !getContext().isNativeAccessAllowed()) {
948-
builtinModules.remove(BuiltinNames.T_BZ2);
949-
sysModules.delItem(BuiltinNames.T_BZ2);
957+
removeBuiltinModule(BuiltinNames.T_BZ2);
950958
}
951959

952960
globalScopeObject = PythonMapScope.createTopScope(getContext());
@@ -955,6 +963,16 @@ public final void postInitialize() {
955963
}
956964
}
957965

966+
@TruffleBoundary
967+
public final void removeBuiltinModule(TruffleString name) {
968+
assert !initialized : "can only remove builtin modules before initialization is finished";
969+
builtinModules.remove(name);
970+
if (sysModules != null) {
971+
// may already be published
972+
sysModules.delItem(name);
973+
}
974+
}
975+
958976
@TruffleBoundary
959977
public final PythonModule lookupBuiltinModule(TruffleString name) {
960978
return builtinModules.get(name);

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/PythonBuiltins.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,6 @@ public void initialize(Python3Core core) {
163163
final boolean declaresExplicitSelf;
164164
PythonBuiltinClassType constructsClass = builtin.constructsClass();
165165
if ((annotation.defineModule().length() > 0 || annotation.extendsModule().length() > 0) && constructsClass == PythonBuiltinClassType.nil) {
166-
assert annotation.defineModule().isEmpty() && !annotation.extendsModule().isEmpty() || !annotation.defineModule().isEmpty() && annotation.extendsModule().isEmpty();
167166
assert !builtin.isGetter();
168167
assert !builtin.isSetter();
169168
assert annotation.extendClasses().length == 0;

0 commit comments

Comments
 (0)