Skip to content

Commit 95c0dbc

Browse files
committed
Add Nuitka-Python hooks.
# Conflicts: # setuptools/_distutils/_msvccompiler.py # setuptools/_distutils/ccompiler.py # setuptools/_distutils/command/build_ext.py # setuptools/_distutils/unixccompiler.py
1 parent 6ead555 commit 95c0dbc

File tree

4 files changed

+59
-13
lines changed

4 files changed

+59
-13
lines changed

setuptools/_distutils/command/build_ext.py

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import re
1212
import sys
1313
from collections.abc import Callable
14+
import json
15+
import shutil
1416
from distutils._log import log
1517
from site import USER_BASE
1618
from typing import ClassVar
@@ -586,18 +588,33 @@ def build_extension(self, ext) -> None:
586588
# Detect target language, if not provided
587589
language = ext.language or self.compiler.detect_language(sources)
588590

589-
self.compiler.link_shared_object(
590-
objects,
591-
ext_path,
592-
libraries=self.get_libraries(ext),
593-
library_dirs=ext.library_dirs,
594-
runtime_library_dirs=ext.runtime_library_dirs,
595-
extra_postargs=extra_args,
596-
export_symbols=self.get_export_symbols(ext),
591+
self.compiler.create_static_lib(
592+
objects, ext_path,
593+
output_dir=os.path.abspath("."),
597594
debug=self.debug,
598-
build_temp=self.build_temp,
599-
target_lang=language,
600-
)
595+
target_lang=language)
596+
597+
result_path = self.compiler.library_filename(ext_path,
598+
output_dir=os.path.abspath("."))
599+
600+
with open(result_path + '.link.json', 'w') as f:
601+
json.dump({
602+
'libraries': self.get_libraries(ext),
603+
'library_dirs': ext.library_dirs,
604+
'runtime_library_dirs': ext.runtime_library_dirs,
605+
'extra_postargs': extra_args}, f)
606+
607+
for lib in self.get_libraries(ext):
608+
for dir in ext.library_dirs:
609+
lib_install_dir = os.path.join(os.path.dirname(ext_path), dir)
610+
print(os.path.join(ext_path, dir, lib + '.lib'))
611+
if os.path.isfile(os.path.join(dir, lib + '.lib')):
612+
if not os.path.isabs(dir):
613+
if not os.path.exists(lib_install_dir):
614+
os.makedirs(lib_install_dir)
615+
shutil.copyfile(os.path.join(dir, lib + '.lib'),
616+
os.path.join(lib_install_dir, lib + '.lib'))
617+
break
601618

602619
def swig_sources(self, sources, extension):
603620
"""Walk the list of source files in 'sources', looking for SWIG

setuptools/_distutils/sysconfig.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,10 @@ def customize_compiler(compiler: CCompiler) -> None:
354354
ldshared = _add_flags(ldshared, 'CPP')
355355
ldcxxshared = _add_flags(ldcxxshared, 'CPP')
356356

357+
cflags = ' '.join([x for x in cflags.split(' ') if
358+
not x.startswith('-I') or (
359+
'Nuitka-Python-Deps' not in x and 'dependencies' not in x)])
360+
357361
ar = os.environ.get('AR', ar)
358362

359363
archiver = ar + ' ' + os.environ.get('ARFLAGS', ar_flags)

setuptools/_vendor/packaging/tags.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,8 @@ def _generic_abi() -> list[str]:
255255
# - graalpy: '.graalpy-38-native-x86_64-darwin.dylib'
256256
# => graalpy_38_native
257257

258+
return [_normalize_string(sysconfig.get_config_var("SOABI"))]
259+
258260
ext_suffix = _get_config_var("EXT_SUFFIX", warn=True)
259261
if not isinstance(ext_suffix, str) or ext_suffix[0] != ".":
260262
raise SystemError("invalid sysconfig.get_config_var('EXT_SUFFIX')")

setuptools/command/build_ext.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
import os
55
import sys
66
from collections.abc import Iterator
7+
import itertools
8+
import json
9+
import shutil
710
from importlib.machinery import EXTENSION_SUFFIXES
811
from importlib.util import cache_from_source as _compiled_file_name
912
from pathlib import Path
@@ -399,7 +402,7 @@ def _compile_and_remove_stub(self, stub_file: str):
399402
os.unlink(stub_file)
400403

401404

402-
if use_stubs or os.name == 'nt':
405+
if False: # use_stubs or os.name == 'nt':
403406
# Build shared libraries
404407
#
405408
def link_shared_object(
@@ -460,10 +463,30 @@ def link_shared_object(
460463

461464
assert output_dir is None # distutils build_ext doesn't pass this
462465
output_dir, filename = os.path.split(output_libname)
463-
basename, _ext = os.path.splitext(filename)
466+
basename, ext = os.path.splitext(filename)
464467
if self.library_filename("x").startswith('lib'):
465468
# strip 'lib' prefix; this is kludgy if some platform uses
466469
# a different prefix
467470
basename = basename[3:]
468471

469472
self.create_static_lib(objects, basename, output_dir, debug, target_lang)
473+
474+
result_path = self.library_filename(basename, output_dir=os.path.abspath("."))
475+
476+
with open(result_path + '.link.json', 'w') as f:
477+
json.dump({
478+
'libraries': libraries,
479+
'library_dirs': library_dirs,
480+
'extra_postargs': extra_postargs,
481+
'extra_preargs': extra_preargs}, f)
482+
483+
for lib in libraries:
484+
for dir in library_dirs:
485+
lib_install_dir = os.path.join(output_dir, dir)
486+
if os.path.isfile(os.path.join(dir, lib + '.lib')):
487+
if not os.path.isabs(dir):
488+
if not os.path.exists(lib_install_dir):
489+
os.makedirs(lib_install_dir)
490+
shutil.copyfile(os.path.join(dir, lib + '.lib'),
491+
os.path.join(lib_install_dir, lib + '.lib'))
492+
break

0 commit comments

Comments
 (0)