Skip to content

Commit 18cd097

Browse files
committed
[GR-76470] Use build-generated extension suffix metadata
1 parent 24ce60c commit 18cd097

10 files changed

Lines changed: 52 additions & 59 deletions

File tree

graalpython/com.oracle.graal.python.resources/src/com/oracle/graal/python/resources/PythonResource.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,8 @@ public final class PythonResource implements InternalResource {
9090
while ((ch = is.read()) != '\n' && ch != -1) {
9191
// skip ABI version
9292
}
93-
PYTHON_ABIFLAGS = ch == -1 ? "" : new String(is.readAllBytes(), StandardCharsets.US_ASCII).strip();
93+
String[] abiParts = ch == -1 ? new String[0] : new String(is.readAllBytes(), StandardCharsets.US_ASCII).split("\\R", 4);
94+
PYTHON_ABIFLAGS = abiParts.length > 0 ? abiParts[0].strip() : "";
9495
} catch (IOException e) {
9596
throw new RuntimeException(e);
9697
}

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,9 @@ public final class PythonLanguage extends TruffleLanguage<PythonContext> {
203203
/** See {@code mx_graalpython.py:abi_version} */
204204
public static final String GRAALPY_ABI_VERSION;
205205
public static final String GRAALPY_ABIFLAGS;
206+
public static final String GRAALPY_SOABI;
207+
public static final String GRAALPY_EXT_SUFFIX;
208+
public static final String GRAALPY_MULTIARCH;
206209

207210
/* Magic number used to mark pyc files */
208211
public static final int MAGIC_NUMBER = 21000 + Compiler.BYTECODE_VERSION * 10;
@@ -252,9 +255,12 @@ public final class PythonLanguage extends TruffleLanguage<PythonContext> {
252255
default:
253256
RELEASE_LEVEL_STRING = tsLiteral("final");
254257
}
255-
String[] abiParts = new String(is.readAllBytes(), StandardCharsets.US_ASCII).split("\\R", 2);
258+
String[] abiParts = new String(is.readAllBytes(), StandardCharsets.US_ASCII).split("\\R", 5);
256259
GRAALPY_ABI_VERSION = abiParts[0].strip();
257260
GRAALPY_ABIFLAGS = abiParts.length > 1 ? abiParts[1].strip() : "";
261+
GRAALPY_SOABI = abiParts.length > 2 ? abiParts[2].strip() : "";
262+
GRAALPY_EXT_SUFFIX = abiParts.length > 3 ? abiParts[3].strip() : "";
263+
GRAALPY_MULTIARCH = abiParts.length > 4 ? abiParts[4].strip() : "";
258264
} catch (IOException e) {
259265
throw new RuntimeException(e);
260266
}

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/ImpModuleBuiltins.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,7 @@ public abstract static class ExtensionSuffixesNode extends PythonBuiltinNode {
833833
@Specialization
834834
Object run(
835835
@Bind PythonLanguage language) {
836-
return PFactory.createList(language, new Object[]{PythonContext.get(this).getSoAbi(), T_EXT_SO, T_EXT_PYD});
836+
return PFactory.createList(language, new Object[]{PythonContext.get(this).getExtensionSuffix(), T_EXT_SO, T_EXT_PYD});
837837
}
838838
}
839839

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/modules/SysModuleBuiltins.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@
6060
import static com.oracle.graal.python.builtins.modules.io.IONodes.T_R;
6161
import static com.oracle.graal.python.builtins.modules.io.IONodes.T_W;
6262
import static com.oracle.graal.python.builtins.modules.io.IONodes.T_WRITE;
63-
import static com.oracle.graal.python.builtins.objects.str.StringUtils.cat;
6463
import static com.oracle.graal.python.lib.PyTraceBackPrint.castToString;
6564
import static com.oracle.graal.python.lib.PyTraceBackPrint.classNameNoDot;
6665
import static com.oracle.graal.python.lib.PyTraceBackPrint.fileFlush;
@@ -119,7 +118,6 @@
119118
import static com.oracle.graal.python.nodes.StringLiterals.T_BASE_PREFIX;
120119
import static com.oracle.graal.python.nodes.StringLiterals.T_BIG;
121120
import static com.oracle.graal.python.nodes.StringLiterals.T_COMMA;
122-
import static com.oracle.graal.python.nodes.StringLiterals.T_DASH;
123121
import static com.oracle.graal.python.nodes.StringLiterals.T_DOT;
124122
import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING;
125123
import static com.oracle.graal.python.nodes.StringLiterals.T_JAVA;
@@ -561,7 +559,7 @@ public void initialize(Python3Core core) {
561559
if (os == PLATFORM_DARWIN) {
562560
addBuiltinConstant("_framework", FRAMEWORK);
563561
}
564-
final TruffleString gmultiarch = cat(PythonUtils.getPythonArch(), T_DASH, osName);
562+
final TruffleString gmultiarch = toTruffleStringUncached(PythonLanguage.GRAALPY_MULTIARCH);
565563
addBuiltinConstant("__gmultiarch", gmultiarch);
566564

567565
// Initialized later in postInitialize

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/capi/CApiContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1119,7 +1119,7 @@ public static Object loadCExtModule(Node location, PythonContext context, Module
11191119
CApiContext cApiContext = CApiContext.ensureCapiWasLoaded(location, context, spec.name, spec.path);
11201120
NativeLibrary library;
11211121

1122-
TruffleFile realPath = context.getPublicTruffleFileRelaxed(spec.path, context.getSoAbi()).getCanonicalFile();
1122+
TruffleFile realPath = context.getPublicTruffleFileRelaxed(spec.path, context.getExtensionSuffix()).getCanonicalFile();
11231123
String loadPath = cApiContext.nativeLibraryLocator.resolve(context, realPath);
11241124
getLogger(CApiContext.class).config(String.format("loading module %s (real path: %s) as native", spec.path, loadPath));
11251125
int dlopenFlags = context.getDlopenFlags();

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/builtins/objects/cext/copying/NativeLibraryLocator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ public static void replicate(TruffleFile venvDirectory, PythonContext context, i
149149
"but we are preparing %d copies. The extra copies will only be used if a different value " +
150150
"of the system property %s is set.", MAX_CEXT_COPIES, count, J_MAX_CAPI_COPIES));
151151
}
152-
String suffix = context.getSoAbi().toJavaStringUncached();
152+
String suffix = context.getExtensionSuffix().toJavaStringUncached();
153153
TruffleFile capiLibrary = context.getPublicTruffleFileRelaxed(context.getCAPIHome()).resolve(PythonContext.getSupportLibName("python-" + J_NATIVE));
154154
for (int i = 0; i < count; i++) {
155155
// Relocate the C API library

graalpython/com.oracle.graal.python/src/com/oracle/graal/python/runtime/PythonContext.java

Lines changed: 5 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,12 @@
2727

2828
import static com.oracle.graal.python.PythonLanguage.getPythonOS;
2929
import static com.oracle.graal.python.PythonLanguage.throwIfUnsupported;
30-
import static com.oracle.graal.python.annotations.PythonOS.PLATFORM_DARWIN;
3130
import static com.oracle.graal.python.annotations.PythonOS.PLATFORM_WIN32;
3231
import static com.oracle.graal.python.builtins.PythonBuiltinClassType.SystemError;
33-
import static com.oracle.graal.python.builtins.modules.SysModuleBuiltins.T_ABIFLAGS;
34-
import static com.oracle.graal.python.builtins.modules.SysModuleBuiltins.T_CACHE_TAG;
35-
import static com.oracle.graal.python.builtins.modules.SysModuleBuiltins.T__MULTIARCH;
3632
import static com.oracle.graal.python.builtins.modules.io.IONodes.T_CLOSED;
3733
import static com.oracle.graal.python.builtins.modules.io.IONodes.T_FLUSH;
3834
import static com.oracle.graal.python.builtins.objects.PythonAbstractObject.NATIVE_POINTER_FREED;
3935
import static com.oracle.graal.python.builtins.objects.PythonAbstractObject.UNINITIALIZED;
40-
import static com.oracle.graal.python.builtins.objects.str.StringUtils.cat;
4136
import static com.oracle.graal.python.builtins.objects.thread.PThread.GRAALPYTHON_THREADS;
4237
import static com.oracle.graal.python.nodes.BuiltinNames.T_PYEXPAT;
4338
import static com.oracle.graal.python.nodes.BuiltinNames.T_SHA3;
@@ -55,11 +50,8 @@
5550
import static com.oracle.graal.python.nodes.StringLiterals.J_EXT_DYLIB;
5651
import static com.oracle.graal.python.nodes.StringLiterals.J_EXT_SO;
5752
import static com.oracle.graal.python.nodes.StringLiterals.J_LIB_PREFIX;
58-
import static com.oracle.graal.python.nodes.StringLiterals.T_DASH;
5953
import static com.oracle.graal.python.nodes.StringLiterals.T_DOT;
6054
import static com.oracle.graal.python.nodes.StringLiterals.T_EMPTY_STRING;
61-
import static com.oracle.graal.python.nodes.StringLiterals.T_EXT_PYD;
62-
import static com.oracle.graal.python.nodes.StringLiterals.T_EXT_SO;
6355
import static com.oracle.graal.python.nodes.StringLiterals.T_JAVA;
6456
import static com.oracle.graal.python.nodes.StringLiterals.T_NATIVE;
6557
import static com.oracle.graal.python.nodes.StringLiterals.T_PATH;
@@ -151,7 +143,6 @@
151143
import com.oracle.graal.python.nodes.SpecialAttributeNames;
152144
import com.oracle.graal.python.nodes.SpecialMethodNames;
153145
import com.oracle.graal.python.nodes.WriteUnraisableNode;
154-
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromModuleNode;
155146
import com.oracle.graal.python.nodes.attributes.ReadAttributeFromObjectNode;
156147
import com.oracle.graal.python.nodes.bytecode_dsl.PBytecodeDSLRootNode;
157148
import com.oracle.graal.python.nodes.call.CallNode;
@@ -807,7 +798,7 @@ public enum CApiState {
807798
@CompilationFinal private boolean nativeAccessAllowed;
808799
@CompilationFinal private NativeContext nativeContext;
809800

810-
private TruffleString soABI;
801+
private TruffleString extensionSuffix;
811802

812803
private static final class GlobalInterpreterLock extends ReentrantLock {
813804
private static final long serialVersionUID = 1L;
@@ -2932,31 +2923,11 @@ public boolean isFinalizing() {
29322923
}
29332924

29342925
@TruffleBoundary
2935-
public TruffleString getSoAbi() {
2936-
if (soABI == null) {
2937-
PythonModule sysModule = this.lookupBuiltinModule(T_SYS);
2938-
Object implementationObj = ReadAttributeFromModuleNode.getUncached().execute(sysModule, T_IMPLEMENTATION);
2939-
// sys.implementation.cache_tag
2940-
TruffleString cacheTag = (TruffleString) PyObjectGetAttr.executeUncached(implementationObj, T_CACHE_TAG);
2941-
TruffleString abiFlags = (TruffleString) ReadAttributeFromModuleNode.getUncached().execute(sysModule, T_ABIFLAGS);
2942-
// sys.implementation._multiarch
2943-
TruffleString multiArch = (TruffleString) PyObjectGetAttr.executeUncached(implementationObj, T__MULTIARCH);
2944-
2945-
// only use '.pyd' if we are on 'Win32-native'
2946-
TruffleString soExt;
2947-
if (getPythonOS() == PLATFORM_DARWIN) {
2948-
// not ".dylib", similar to CPython:
2949-
// https://github.com/python/cpython/issues/37510
2950-
soExt = T_EXT_SO;
2951-
} else if (getPythonOS() == PLATFORM_WIN32) {
2952-
soExt = T_EXT_PYD;
2953-
} else {
2954-
soExt = T_EXT_SO;
2955-
}
2956-
2957-
soABI = cat(T_DOT, cacheTag, abiFlags, T_DASH, T_NATIVE, T_DASH, multiArch, soExt);
2926+
public TruffleString getExtensionSuffix() {
2927+
if (extensionSuffix == null) {
2928+
extensionSuffix = toTruffleStringUncached(PythonLanguage.GRAALPY_EXT_SUFFIX);
29582929
}
2959-
return soABI;
2930+
return extensionSuffix;
29602931
}
29612932

29622933
public Thread getMainThread() {

graalpython/graalpy-versions/CMakeLists.txt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,17 @@ endif()
3535
if (NOT DEFINED GRAALPY_ABIFLAGS)
3636
set(GRAALPY_ABIFLAGS "")
3737
endif()
38+
if (NOT DEFINED GRAALPY_EXT_SUFFIX)
39+
message(FATAL_ERROR "GRAALPY_EXT_SUFFIX needs to be set")
40+
endif()
41+
if (NOT DEFINED GRAALPY_MULTIARCH)
42+
message(FATAL_ERROR "GRAALPY_MULTIARCH needs to be set")
43+
endif()
44+
if (NOT DEFINED GRAALPY_SOABI)
45+
message(FATAL_ERROR "GRAALPY_SOABI needs to be set")
46+
endif()
3847

3948
# Generates file 'graalpy_versions' with the given content.
4049
# The file will be created if it does not exist and will only be updated if the
4150
# content changes.
42-
file(GENERATE OUTPUT "graalpy_versions" CONTENT "${GRAALPY_VER}\n${GRAALPY_ABIFLAGS}")
51+
file(GENERATE OUTPUT "graalpy_versions" CONTENT "${GRAALPY_VER}\n${GRAALPY_ABIFLAGS}\n${GRAALPY_SOABI}\n${GRAALPY_EXT_SUFFIX}\n${GRAALPY_MULTIARCH}\n")

mx.graalpython/mx_graalpython.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2347,17 +2347,12 @@ def graalpy_cmake_build_type(*_):
23472347
return 'Debug' if 'GRAALPY_NATIVE_DEBUG_BUILD' in os.environ else 'Release'
23482348

23492349

2350-
def _graalpy_sysconfig_platform(os):
2350+
def _graalpy_sysconfig_platform():
2351+
os = mx_subst.path_substitutions.substitute('<os>')
23512352
if os == 'darwin':
23522353
return 'darwin'
23532354
if os == 'windows':
23542355
return 'win32'
2355-
if _is_graalos_build():
2356-
libc = _libc()
2357-
if 'swcfi' in libc:
2358-
return 'graalos'
2359-
elif 'hwcfi' in libc:
2360-
return 'graalos_hwcfi'
23612356
return 'linux'
23622357

23632358

@@ -2371,27 +2366,33 @@ def _graalpy_sysconfig_arch():
23712366

23722367

23732368
def graalpy_soabi(*_):
2374-
os = mx_subst.path_substitutions.substitute('<os>')
2375-
pyos = _graalpy_sysconfig_platform(os)
2369+
pyos = _graalpy_sysconfig_platform()
23762370
return f'{abi_version()}{graalpy_abiflags()}-native-{graalpy_multiarch(os=pyos)}'
23772371

23782372

23792373
def graalpy_ext(*_):
2380-
os = mx_subst.path_substitutions.substitute('<os>')
2374+
os = _graalpy_sysconfig_platform()
23812375
# on Windows we use '.pyd' else '.so' but never '.dylib' (similar to CPython):
23822376
# https://github.com/python/cpython/issues/37510
2383-
ext = 'pyd' if os == 'windows' else 'so'
2377+
ext = 'pyd' if os == 'win32' else 'so'
23842378
return f'.{graalpy_soabi()}.{ext}'
23852379

23862380

23872381
def graalpy_sysconfigdata(*_):
2388-
os = mx_subst.path_substitutions.substitute('<os>')
2389-
pyos = _graalpy_sysconfig_platform(os)
2382+
pyos = _graalpy_sysconfig_platform()
23902383
return f'_sysconfigdata_{graalpy_abiflags()}_{pyos}_{graalpy_multiarch(os=pyos)}'
23912384

23922385

23932386
def graalpy_multiarch(*_, os=None):
2394-
pyos = os if os is not None else _graalpy_sysconfig_platform(mx_subst.path_substitutions.substitute('<os>'))
2387+
pyos = os if os is not None else _graalpy_sysconfig_platform()
2388+
if pyos == 'linux' and _is_graalos_build():
2389+
libc = _libc()
2390+
if 'swcfi' in libc:
2391+
pyos = 'graalos'
2392+
elif 'hwcfi' in libc:
2393+
pyos = 'graalos_hwcfi'
2394+
elif 'nocfi' in libc:
2395+
pyos = 'graalos_nocfi'
23952396
return f'{_graalpy_sysconfig_arch()}-{pyos}'
23962397

23972398

mx.graalpython/suite.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -647,11 +647,18 @@
647647
"graalpy-versions": {
648648
"subDir": "graalpython",
649649
"class": "CMakeNinjaProject",
650+
"multitarget": [
651+
{"libc": ["glibc", "default"]},
652+
{"libc": ["musl"], "variant": ["swcfi"]},
653+
],
650654
"max_jobs": "1",
651655
"ninja_targets": ["all"],
652656
"cmakeConfig": {
653657
"GRAALPY_VER": "<py_ver:binary><graal_ver:binary><release_level:binary><abi_version>",
654658
"GRAALPY_ABIFLAGS": "<graalpy_abiflags>",
659+
"GRAALPY_EXT_SUFFIX": "<graalpy_ext>",
660+
"GRAALPY_MULTIARCH": "<graalpy_multiarch>",
661+
"GRAALPY_SOABI": "<graalpy_soabi>",
655662
},
656663
"results": [
657664
"graalpy_versions"
@@ -950,13 +957,13 @@
950957
"GRAALPYTHON_VERSIONS_RES": {
951958
"type": "dir",
952959
"layout": {
953-
"./": "dependency:graalpy-versions/graalpy_versions",
960+
"./": "dependency:graalpy-versions/<os>-<arch>/<multitarget_libc_selection>/graalpy_versions",
954961
},
955962
},
956963
"GRAALPYTHON_VERSIONS_MAIN": {
957964
"type": "dir",
958965
"layout": {
959-
"./": "dependency:graalpy-versions/graalpy_versions",
966+
"./": "dependency:graalpy-versions/<os>-<arch>/<multitarget_libc_selection>/graalpy_versions",
960967
},
961968
},
962969

0 commit comments

Comments
 (0)