Files
nuitka-mirror/tests/library/compile_python_modules.py
Kay Hayen 0ac329ec01 Scons: Changed error message for using MinGW64 on newer Python to also mention Zig
* Also enhanced reporting error exit reporting through the scons logger to provide
  the exception in the compilation report.

* More error exits in scons should do this.
2026-01-28 13:44:29 +01:00

153 lines
4.2 KiB
Python
Executable File

#!/usr/bin/env python
# Copyright 2025, Kay Hayen, mailto:kay.hayen@gmail.com find license text at end of file
"""This test runner compiles all Python files as a module.
This is a test to achieve some coverage, it will only find assertions of
within Nuitka or warnings from the C compiler. Code will not be run
normally.
"""
import os
import sys
# Find nuitka package relative to us.
sys.path.insert(
0,
os.path.normpath(
os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "..")
),
)
# isort:start
import subprocess
from nuitka.tools.testing.Common import (
checkCompilesNotWithCPython,
compileLibraryTest,
createSearchMode,
getPythonArch,
getPythonVendor,
getTempDir,
my_print,
setup,
)
from nuitka.utils.Importing import getExtensionModuleSuffix
python_version = setup(suite="python_modules", needs_io_encoding=True)
python_vendor = getPythonVendor()
python_arch = getPythonArch()
search_mode = createSearchMode()
tmp_dir = getTempDir()
# spell-checker: ignore idnadata,tweedie
ignore_filenames_list = (
"__phello__.foo.py", # Triggers error for "." in module name
"idnadata", # Avoid too complex code for main program.
"joined_strings.py",
# Incredible amount of memory in C compiler for test code
"test_spin.py",
# Uses outside modules up the chain
"cheshire_tomography.py",
)
late_syntax_errors = (
# No syntax error with Python2 compileall, but run time only:
"_identifier.py",
"bench.py",
"_tweedie_compound_poisson.py",
"session.py",
)
def decide(_root, filename):
return (
filename.endswith(".py")
and filename not in ignore_filenames_list
and "(" not in filename
and filename.count(".") == 1
)
def action(stage_dir, _root, path):
command = [
sys.executable,
os.path.join("..", "..", "bin", "nuitka"),
"--mode=module",
"--output-dir=%s" % stage_dir,
"--remove-output",
"--quiet",
"--nofollow-imports",
"--no-progressbar",
]
command += os.environ.get("NUITKA_EXTRA_OPTIONS", "").split()
suffix = getExtensionModuleSuffix(preferred=True)
if os.path.basename(path) == "__init__.py":
source_filename = os.path.dirname(path)
target_filename = os.path.basename(source_filename) + suffix
else:
source_filename = path
target_filename = os.path.basename(source_filename)[:-3] + suffix
target_filename = target_filename.replace("(", "").replace(")", "")
command.append(source_filename)
try:
subprocess.check_call(command)
except subprocess.CalledProcessError:
basename = os.path.basename(path)
if basename in late_syntax_errors:
my_print("Syntax error is known unreliable with file %s." % basename)
else:
my_print("Falling back to full comparison due to error exit.")
checkCompilesNotWithCPython(
dirname=None, filename=path, search_mode=search_mode
)
else:
my_print("OK")
os.unlink(os.path.join(stage_dir, target_filename))
compileLibraryTest(
search_mode=search_mode,
stage_dir=os.path.join(
tmp_dir,
"compile_library_%s-%s-%s"
% (".".join(str(d) for d in python_version), python_arch, python_vendor),
),
decide=decide,
action=action,
)
search_mode.finish()
# Python test originally created or extracted from other peoples work. The
# parts from me are licensed as below. It is at least Free Software where
# it's copied from other people. In these cases, that will normally be
# indicated.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.