| # Top-level Makefile for Python | |
| # | |
| # As distributed, this file is called Makefile.pre.in; it is processed | |
| # into the real Makefile by running the script ./configure, which | |
| # replaces things like @spam@ with values appropriate for your system. | |
| # This means that if you edit Makefile, your changes get lost the next | |
| # time you run the configure script. Ideally, you can do: | |
| # | |
| # ./configure | |
| # make | |
| # make test | |
| # make install | |
| # | |
| # If you have a previous version of Python installed that you don't | |
| # want to overwrite, you can use "make altinstall" instead of "make | |
| # install". Refer to the "Installing" section in the README file for | |
| # additional details. | |
| # | |
| # See also the section "Build instructions" in the README file. | |
| # === Variables set by makesetup === | |
| MODBUILT_NAMES= _MODBUILT_NAMES_ | |
| MODSHARED_NAMES= _MODSHARED_NAMES_ | |
| MODDISABLED_NAMES= _MODDISABLED_NAMES_ | |
| MODOBJS= _MODOBJS_ | |
| MODLIBS= _MODLIBS_ | |
| # === Variables set by configure | |
| VERSION= @VERSION@ | |
| srcdir= @srcdir@ | |
| VPATH= @srcdir@ | |
| abs_srcdir= @abs_srcdir@ | |
| abs_builddir= @abs_builddir@ | |
| CC= @CC@ | |
| CXX= @CXX@ | |
| LINKCC= @LINKCC@ | |
| AR= @AR@ | |
| READELF= @READELF@ | |
| SOABI= @SOABI@ | |
| ABIFLAGS= @ABIFLAGS@ | |
| ABI_THREAD= @ABI_THREAD@ | |
| LDVERSION= @LDVERSION@ | |
| LIBPYTHON=@LIBPYTHON@ | |
| GITVERSION= @GITVERSION@ | |
| GITTAG= @GITTAG@ | |
| GITBRANCH= @GITBRANCH@ | |
| PGO_PROF_GEN_FLAG=@PGO_PROF_GEN_FLAG@ | |
| PGO_PROF_USE_FLAG=@PGO_PROF_USE_FLAG@ | |
| LLVM_PROF_MERGER=@LLVM_PROF_MERGER@ | |
| LLVM_PROF_FILE=@LLVM_PROF_FILE@ | |
| LLVM_PROF_ERR=@LLVM_PROF_ERR@ | |
| DTRACE= @DTRACE@ | |
| DFLAGS= @DFLAGS@ | |
| DTRACE_HEADERS= @DTRACE_HEADERS@ | |
| DTRACE_OBJS= @DTRACE_OBJS@ | |
| DSYMUTIL= @DSYMUTIL@ | |
| DSYMUTIL_PATH= @DSYMUTIL_PATH@ | |
| GNULD= @GNULD@ | |
| # Shell used by make (some versions default to the login shell, which is bad) | |
| SHELL= /bin/sh -e | |
| # Use this to make a link between python$(VERSION) and python in $(BINDIR) | |
| LN= @LN@ | |
| # Portable install script (configure doesn't always guess right) | |
| INSTALL= @INSTALL@ | |
| INSTALL_PROGRAM=@INSTALL_PROGRAM@ | |
| INSTALL_SCRIPT= @INSTALL_SCRIPT@ | |
| INSTALL_DATA= @INSTALL_DATA@ | |
| # Shared libraries must be installed with executable mode on some systems; | |
| # rather than figuring out exactly which, we always give them executable mode. | |
| INSTALL_SHARED= ${INSTALL} -m 755 | |
| MKDIR_P= @MKDIR_P@ | |
| MAKESETUP= $(srcdir)/Modules/makesetup | |
| # Compiler options | |
| OPT= @OPT@ | |
| BASECFLAGS= @BASECFLAGS@ | |
| BASECPPFLAGS= @BASECPPFLAGS@ | |
| CONFIGURE_CFLAGS= @CFLAGS@ | |
| # CFLAGS_NODIST is used for building the interpreter and stdlib C extensions. | |
| # Use it when a compiler flag should _not_ be part of the distutils CFLAGS | |
| # once Python is installed (Issue #21121). | |
| CONFIGURE_CFLAGS_NODIST=@CFLAGS_NODIST@ | |
| # LDFLAGS_NODIST is used in the same manner as CFLAGS_NODIST. | |
| # Use it when a linker flag should _not_ be part of the distutils LDFLAGS | |
| # once Python is installed (bpo-35257) | |
| CONFIGURE_LDFLAGS_NODIST=@LDFLAGS_NODIST@ | |
| # LDFLAGS_NOLTO is an extra flag to disable lto. It is used to speed up building | |
| # of _bootstrap_python and _freeze_module tools, which don't need LTO. | |
| CONFIGURE_LDFLAGS_NOLTO=@LDFLAGS_NOLTO@ | |
| CONFIGURE_CPPFLAGS= @CPPFLAGS@ | |
| CONFIGURE_LDFLAGS= @LDFLAGS@ | |
| # Avoid assigning CFLAGS, LDFLAGS, etc. so users can use them on the | |
| # command line to append to these values without stomping the pre-set | |
| # values. | |
| PY_CFLAGS= $(BASECFLAGS) $(OPT) $(CONFIGURE_CFLAGS) $(CFLAGS) $(EXTRA_CFLAGS) | |
| PY_CFLAGS_NODIST=$(CONFIGURE_CFLAGS_NODIST) $(CFLAGS_NODIST) -I$(srcdir)/Include/internal -I$(srcdir)/Include/internal/mimalloc | |
| # Both CPPFLAGS and LDFLAGS need to contain the shell's value for setup.py to | |
| # be able to build extension modules using the directories specified in the | |
| # environment variables | |
| PY_CPPFLAGS= $(BASECPPFLAGS) -I. -I$(srcdir)/Include $(CONFIGURE_CPPFLAGS) $(CPPFLAGS) | |
| PY_LDFLAGS= $(CONFIGURE_LDFLAGS) $(LDFLAGS) | |
| PY_LDFLAGS_NODIST=$(CONFIGURE_LDFLAGS_NODIST) $(LDFLAGS_NODIST) | |
| PY_LDFLAGS_NOLTO=$(PY_LDFLAGS) $(CONFIGURE_LDFLAGS_NOLTO) $(LDFLAGS_NODIST) | |
| NO_AS_NEEDED= @NO_AS_NEEDED@ | |
| CCSHARED= @CCSHARED@ | |
| # LINKFORSHARED are the flags passed to the $(CC) command that links | |
| # the python executable -- this is only needed for a few systems | |
| LINKFORSHARED= @LINKFORSHARED@ | |
| ARFLAGS= @ARFLAGS@ | |
| # Extra C flags added for building the interpreter object files. | |
| CFLAGSFORSHARED=@CFLAGSFORSHARED@ | |
| # C flags used for building the interpreter object files | |
| PY_STDMODULE_CFLAGS= $(PY_CFLAGS) $(PY_CFLAGS_NODIST) $(PY_CPPFLAGS) $(CFLAGSFORSHARED) | |
| PY_BUILTIN_MODULE_CFLAGS= $(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE_BUILTIN | |
| PY_CORE_CFLAGS= $(PY_STDMODULE_CFLAGS) -DPy_BUILD_CORE | |
| # Linker flags used for building the interpreter object files | |
| # In particular, EXE_LDFLAGS is an extra flag to provide fine grain distinction between | |
| # LDFLAGS used to build executables and shared targets. | |
| PY_CORE_LDFLAGS=$(PY_LDFLAGS) $(PY_LDFLAGS_NODIST) | |
| CONFIGURE_EXE_LDFLAGS=@EXE_LDFLAGS@ | |
| PY_CORE_EXE_LDFLAGS:= $(if $(CONFIGURE_EXE_LDFLAGS), $(CONFIGURE_EXE_LDFLAGS) $(PY_LDFLAGS_NODIST), $(PY_CORE_LDFLAGS)) | |
| # Strict or non-strict aliasing flags used to compile dtoa.c, see above | |
| CFLAGS_ALIASING=@CFLAGS_ALIASING@ | |
| # Compilation flags only for ceval.c. | |
| CFLAGS_CEVAL=@CFLAGS_CEVAL@ | |
| # Machine-dependent subdirectories | |
| MACHDEP= @MACHDEP@ | |
| # Multiarch directory (may be empty) | |
| MULTIARCH= @MULTIARCH@ | |
| MULTIARCH_CPPFLAGS = @MULTIARCH_CPPFLAGS@ | |
| # Install prefix for architecture-independent files | |
| prefix= @prefix@ | |
| # Install prefix for architecture-dependent files | |
| exec_prefix= @exec_prefix@ | |
| # For cross compilation, we distinguish between "prefix" (where we install the | |
| # files) and "host_prefix" (where getpath.c expects to find the files at | |
| # runtime) | |
| host_prefix= @host_prefix@ | |
| host_exec_prefix= @host_exec_prefix@ | |
| # Install prefix for data files | |
| datarootdir= @datarootdir@ | |
| # Expanded directories | |
| BINDIR= @bindir@ | |
| LIBDIR= @libdir@ | |
| MANDIR= @mandir@ | |
| INCLUDEDIR= @includedir@ | |
| CONFINCLUDEDIR= $(exec_prefix)/include | |
| PLATLIBDIR= @PLATLIBDIR@ | |
| SCRIPTDIR= $(prefix)/$(PLATLIBDIR) | |
| # executable name for shebangs | |
| EXENAME= $(BINDIR)/python$(LDVERSION)$(EXE) | |
| # Variable used by ensurepip | |
| WHEEL_PKG_DIR= @WHEEL_PKG_DIR@ | |
| # Detailed destination directories | |
| BINLIBDEST= @BINLIBDEST@ | |
| LIBDEST= @LIBDEST@ | |
| INCLUDEPY= $(INCLUDEDIR)/python$(LDVERSION) | |
| CONFINCLUDEPY= $(CONFINCLUDEDIR)/python$(LDVERSION) | |
| # Symbols used for using shared libraries | |
| SHLIB_SUFFIX= @SHLIB_SUFFIX@ | |
| EXT_SUFFIX= @EXT_SUFFIX@ | |
| LDSHARED= @LDSHARED@ $(PY_LDFLAGS) | |
| BLDSHARED= @BLDSHARED@ $(PY_CORE_LDFLAGS) | |
| LDCXXSHARED= @LDCXXSHARED@ $(PY_LDFLAGS) | |
| DESTSHARED= $(BINLIBDEST)/lib-dynload | |
| # List of exported symbols for AIX | |
| EXPORTSYMS= @EXPORTSYMS@ | |
| EXPORTSFROM= @EXPORTSFROM@ | |
| # Executable suffix (.exe on Windows and Mac OS X) | |
| EXE= @EXEEXT@ | |
| BUILDEXE= @BUILDEXEEXT@ | |
| # Name of the patch file to apply for app store compliance | |
| APP_STORE_COMPLIANCE_PATCH=@APP_STORE_COMPLIANCE_PATCH@ | |
| # Short name and location for Mac OS X Python framework | |
| UNIVERSALSDK=@UNIVERSALSDK@ | |
| PYTHONFRAMEWORK= @PYTHONFRAMEWORK@ | |
| PYTHONFRAMEWORKDIR= @PYTHONFRAMEWORKDIR@ | |
| PYTHONFRAMEWORKPREFIX= @PYTHONFRAMEWORKPREFIX@ | |
| PYTHONFRAMEWORKINSTALLDIR= @PYTHONFRAMEWORKINSTALLDIR@ | |
| PYTHONFRAMEWORKINSTALLNAMEPREFIX= @PYTHONFRAMEWORKINSTALLNAMEPREFIX@ | |
| RESSRCDIR= @RESSRCDIR@ | |
| # macOS deployment target selected during configure, to be checked | |
| # by distutils. The export statement is needed to ensure that the | |
| # deployment target is active during build. | |
| MACOSX_DEPLOYMENT_TARGET=@CONFIGURE_MACOSX_DEPLOYMENT_TARGET@ | |
| @EXPORT_MACOSX_DEPLOYMENT_TARGET@export MACOSX_DEPLOYMENT_TARGET | |
| # iOS Deployment target selected during configure. Unlike macOS, the iOS | |
| # deployment target is controlled using `-mios-version-min` arguments added to | |
| # CFLAGS and LDFLAGS by the configure script. This variable is not used during | |
| # the build, and is only listed here so it will be included in sysconfigdata. | |
| IPHONEOS_DEPLOYMENT_TARGET=@IPHONEOS_DEPLOYMENT_TARGET@ | |
| BUILD_DETAILS=@BUILD_DETAILS@ | |
| # Option to install to strip binaries | |
| STRIPFLAG=-s | |
| # Flags to lipo to produce a 32-bit-only universal executable | |
| LIPO_32BIT_FLAGS=@LIPO_32BIT_FLAGS@ | |
| # Flags to lipo to produce an intel-64-only universal executable | |
| LIPO_INTEL64_FLAGS=@LIPO_INTEL64_FLAGS@ | |
| # Environment to run shared python without installed libraries | |
| RUNSHARED= @RUNSHARED@ | |
| # ensurepip options | |
| ENSUREPIP= @ENSUREPIP@ | |
| # Internal static libraries | |
| LIBEXPAT_A= Modules/expat/libexpat.a | |
| # HACL* build configuration | |
| LIBHACL_CFLAGS=@LIBHACL_CFLAGS@ | |
| LIBHACL_LDFLAGS=@LIBHACL_LDFLAGS@ | |
| LIBHACL_BLAKE2_SIMD128_CFLAGS=@LIBHACL_SIMD128_FLAGS@ -DHACL_CAN_COMPILE_VEC128 | |
| LIBHACL_BLAKE2_SIMD256_CFLAGS=@LIBHACL_SIMD256_FLAGS@ -DHACL_CAN_COMPILE_VEC256 | |
| # Module state, compiler flags and linker flags | |
| # Empty CFLAGS and LDFLAGS are omitted. | |
| # states: | |
| # * yes: module is available | |
| # * missing: build dependency is missing | |
| # * disabled: module is disabled | |
| # * n/a: module is not available on the current platform | |
| # MODULE_EGG_STATE=yes # yes, missing, disabled, n/a | |
| # MODULE_EGG_CFLAGS= | |
| # MODULE_EGG_LDFLAGS= | |
| @MODULE_BLOCK@ | |
| # Default zoneinfo.TZPATH. Added here to expose it in sysconfig.get_config_var | |
| TZPATH=@TZPATH@ | |
| # If to install mimalloc headers | |
| INSTALL_MIMALLOC=@INSTALL_MIMALLOC@ | |
| # Modes for directories, executables and data files created by the | |
| # install process. Default to user-only-writable for all file types. | |
| DIRMODE= 755 | |
| EXEMODE= 755 | |
| FILEMODE= 644 | |
| # configure script arguments | |
| CONFIG_ARGS= @CONFIG_ARGS@ | |
| # Subdirectories with code | |
| SRCDIRS= @SRCDIRS@ | |
| # Other subdirectories | |
| SUBDIRSTOO= Include Lib Misc | |
| # Files and directories to be distributed | |
| CONFIGFILES= configure configure.ac acconfig.h pyconfig.h.in Makefile.pre.in | |
| DISTFILES= README.rst ChangeLog $(CONFIGFILES) | |
| DISTDIRS= $(SUBDIRS) $(SUBDIRSTOO) Ext-dummy | |
| DIST= $(DISTFILES) $(DISTDIRS) | |
| LIBRARY= @LIBRARY@ | |
| LDLIBRARY= @LDLIBRARY@ | |
| BLDLIBRARY= @BLDLIBRARY@ | |
| MODULE_LDFLAGS_SHARED=$(if $(LIBPYTHON),$(BLDLIBRARY)) | |
| PY3LIBRARY= @PY3LIBRARY@ | |
| DLLLIBRARY= @DLLLIBRARY@ | |
| LDLIBRARYDIR= @LDLIBRARYDIR@ | |
| INSTSONAME= @INSTSONAME@ | |
| LIBRARY_DEPS= @LIBRARY_DEPS@ | |
| LINK_PYTHON_DEPS=@LINK_PYTHON_DEPS@ | |
| JIT_OBJS= @JIT_SHIM_O@ | |
| PY_ENABLE_SHARED= @PY_ENABLE_SHARED@ | |
| STATIC_LIBPYTHON= @STATIC_LIBPYTHON@ | |
| LIBS= @LIBS@ | |
| LIBM= @LIBM@ | |
| LIBC= @LIBC@ | |
| SYSLIBS= $(LIBM) $(LIBC) | |
| SHLIBS= @SHLIBS@ | |
| DLINCLDIR= @DLINCLDIR@ | |
| DYNLOADFILE= @DYNLOADFILE@ | |
| MACHDEP_OBJS= @MACHDEP_OBJS@ | |
| LIBOBJDIR= Python/ | |
| LIBOBJS= @LIBOBJS@ | |
| PYTHON= python$(EXE) | |
| BUILDPYTHON= python$(BUILDEXE) | |
| HOSTRUNNER= @HOSTRUNNER@ | |
| PYTHON_FOR_REGEN?=@PYTHON_FOR_REGEN@ | |
| UPDATE_FILE=$(PYTHON_FOR_REGEN) $(srcdir)/Tools/build/update_file.py | |
| PYTHON_FOR_BUILD=@PYTHON_FOR_BUILD@ | |
| # Single-platform builds depend on $(BUILDPYTHON). Cross builds use an | |
| # external "build Python" and have an empty PYTHON_FOR_BUILD_DEPS. | |
| PYTHON_FOR_BUILD_DEPS=@PYTHON_FOR_BUILD_DEPS@ | |
| # Single-platform builds use Programs/_freeze_module.c for bootstrapping and | |
| # ./_bootstrap_python Programs/_freeze_module.py for remaining modules | |
| # Cross builds use an external "build Python" for all modules. | |
| PYTHON_FOR_FREEZE=@PYTHON_FOR_FREEZE@ | |
| FREEZE_MODULE_BOOTSTRAP=@FREEZE_MODULE_BOOTSTRAP@ | |
| FREEZE_MODULE_BOOTSTRAP_DEPS=@FREEZE_MODULE_BOOTSTRAP_DEPS@ | |
| FREEZE_MODULE=@FREEZE_MODULE@ | |
| FREEZE_MODULE_DEPS=@FREEZE_MODULE_DEPS@ | |
| _PYTHON_HOST_PLATFORM=@_PYTHON_HOST_PLATFORM@ | |
| BUILD_GNU_TYPE= @build@ | |
| HOST_GNU_TYPE= @host@ | |
| # The task to run while instrumented when building the profile-opt target. | |
| # To speed up profile generation, we don't run the full unit test suite | |
| # by default. The default is "-m test --pgo". To run more tests, use | |
| # PROFILE_TASK="-m test --pgo-extended" | |
| PROFILE_TASK= @PROFILE_TASK@ | |
| # report files for gcov / lcov coverage report | |
| COVERAGE_INFO= $(abs_builddir)/coverage.info | |
| COVERAGE_REPORT=$(abs_builddir)/lcov-report | |
| COVERAGE_LCOV_OPTIONS=--rc lcov_branch_coverage=1 | |
| COVERAGE_REPORT_OPTIONS=--rc lcov_branch_coverage=1 --branch-coverage --title "CPython $(VERSION) LCOV report [commit $(shell $(GITVERSION))]" | |
| # === Definitions added by makesetup === | |
| ########################################################################## | |
| # Modules | |
| MODULE_OBJS= \ | |
| Modules/config.o \ | |
| Modules/main.o \ | |
| Modules/gcmodule.o | |
| IO_H= Modules/_io/_iomodule.h | |
| IO_OBJS= \ | |
| Modules/_io/_iomodule.o \ | |
| Modules/_io/iobase.o \ | |
| Modules/_io/fileio.o \ | |
| Modules/_io/bufferedio.o \ | |
| Modules/_io/textio.o \ | |
| Modules/_io/bytesio.o \ | |
| Modules/_io/stringio.o | |
| ########################################################################## | |
| # mimalloc | |
| MIMALLOC_HEADERS= \ | |
| $(srcdir)/Include/internal/pycore_mimalloc.h \ | |
| $(srcdir)/Include/internal/mimalloc/mimalloc.h \ | |
| $(srcdir)/Include/internal/mimalloc/mimalloc/atomic.h \ | |
| $(srcdir)/Include/internal/mimalloc/mimalloc/internal.h \ | |
| $(srcdir)/Include/internal/mimalloc/mimalloc/prim.h \ | |
| $(srcdir)/Include/internal/mimalloc/mimalloc/track.h \ | |
| $(srcdir)/Include/internal/mimalloc/mimalloc/types.h | |
| ########################################################################## | |
| # Parser | |
| PEGEN_OBJS= \ | |
| Parser/pegen.o \ | |
| Parser/pegen_errors.o \ | |
| Parser/action_helpers.o \ | |
| Parser/parser.o \ | |
| Parser/string_parser.o \ | |
| Parser/peg_api.o | |
| TOKENIZER_OBJS= \ | |
| Parser/lexer/lexer.o \ | |
| Parser/lexer/layout.o \ | |
| Parser/lexer/number.o \ | |
| Parser/lexer/state.o \ | |
| Parser/lexer/string.o \ | |
| Parser/tokenizer/decoder.o \ | |
| Parser/tokenizer/api.o \ | |
| Parser/tokenizer/reader.o \ | |
| Parser/tokenizer/source.o \ | |
| Parser/tokenizer/helpers.o | |
| PEGEN_HEADERS= \ | |
| $(srcdir)/Include/internal/pycore_parser.h \ | |
| $(srcdir)/Parser/pegen.h \ | |
| $(srcdir)/Parser/string_parser.h | |
| TOKENIZER_HEADERS= \ | |
| Parser/lexer/lexer_internal.h \ | |
| Parser/lexer/state.h \ | |
| Parser/tokenizer/reader.h \ | |
| Parser/tokenizer/reader_internal.h \ | |
| Parser/tokenizer/source.h \ | |
| Parser/tokenizer/types.h \ | |
| Parser/tokenizer/tokenizer.h \ | |
| Parser/tokenizer/helpers.h | |
| POBJS= \ | |
| Parser/token.o \ | |
| PARSER_OBJS= $(POBJS) $(PEGEN_OBJS) $(TOKENIZER_OBJS) Parser/myreadline.o | |
| PARSER_HEADERS= \ | |
| $(PEGEN_HEADERS) \ | |
| $(TOKENIZER_HEADERS) | |
| ########################################################################## | |
| # Python | |
| PYTHON_OBJS= \ | |
| Python/_contextvars.o \ | |
| Python/_warnings.o \ | |
| Python/Python-ast.o \ | |
| Python/Python-tokenize.o \ | |
| Python/asdl.o \ | |
| Python/assemble.o \ | |
| Python/ast.o \ | |
| Python/ast_preprocess.o \ | |
| Python/ast_unparse.o \ | |
| Python/bltinmodule.o \ | |
| Python/brc.o \ | |
| Python/ceval.o \ | |
| Python/codecs.o \ | |
| Python/codegen.o \ | |
| Python/compile.o \ | |
| Python/context.o \ | |
| Python/critical_section.o \ | |
| Python/crossinterp.o \ | |
| Python/dynamic_annotations.o \ | |
| Python/errors.o \ | |
| Python/flowgraph.o \ | |
| Python/frame.o \ | |
| Python/frozenmain.o \ | |
| Python/future.o \ | |
| Python/gc.o \ | |
| Python/gc_free_threading.o \ | |
| Python/gc_gil.o \ | |
| Python/getargs.o \ | |
| Python/getcompiler.o \ | |
| Python/getcopyright.o \ | |
| Python/getplatform.o \ | |
| Python/getversion.o \ | |
| Python/ceval_gil.o \ | |
| Python/hamt.o \ | |
| Python/hashtable.o \ | |
| Python/import.o \ | |
| Python/importdl.o \ | |
| Python/index_pool.o \ | |
| Python/initconfig.o \ | |
| Python/interpconfig.o \ | |
| Python/instrumentation.o \ | |
| Python/instruction_sequence.o \ | |
| Python/intrinsics.o \ | |
| Python/jit.o \ | |
| Python/jit_publish.o \ | |
| $(JIT_OBJS) \ | |
| Python/legacy_tracing.o \ | |
| Python/lock.o \ | |
| Python/marshal.o \ | |
| Python/modsupport.o \ | |
| Python/mysnprintf.o \ | |
| Python/mystrtoul.o \ | |
| Python/object_stack.o \ | |
| Python/optimizer.o \ | |
| Python/optimizer_analysis.o \ | |
| Python/optimizer_symbols.o \ | |
| Python/parking_lot.o \ | |
| Python/pathconfig.o \ | |
| Python/preconfig.o \ | |
| Python/pyarena.o \ | |
| Python/pyctype.o \ | |
| Python/pyfpe.o \ | |
| Python/pyhash.o \ | |
| Python/pylifecycle.o \ | |
| Python/pymath.o \ | |
| Python/pystate.o \ | |
| Python/pystats.o \ | |
| Python/pythonrun.o \ | |
| Python/pytime.o \ | |
| Python/qsbr.o \ | |
| Python/bootstrap_hash.o \ | |
| Python/specialize.o \ | |
| Python/slots.o \ | |
| Python/slots_generated.o \ | |
| Python/stackrefs.o \ | |
| Python/structmember.o \ | |
| Python/symtable.o \ | |
| Python/sysmodule.o \ | |
| Python/thread.o \ | |
| Python/traceback.o \ | |
| Python/tracemalloc.o \ | |
| Python/typecache.o \ | |
| Python/uniqueid.o \ | |
| Python/getopt.o \ | |
| Python/pystrcmp.o \ | |
| Python/pystrtod.o \ | |
| Python/pystrhex.o \ | |
| Python/dtoa.o \ | |
| Python/fileutils.o \ | |
| Python/suggestions.o \ | |
| Python/perf_trampoline.o \ | |
| Python/perf_jit_trampoline.o \ | |
| Python/jit_unwind.o \ | |
| Python/remote_debugging.o \ | |
| Python/$(DYNLOADFILE) \ | |
| $(LIBOBJS) \ | |
| $(MACHDEP_OBJS) \ | |
| $(DTRACE_OBJS) \ | |
| @PLATFORM_OBJS@ | |
| ########################################################################## | |
| # Objects | |
| OBJECT_OBJS= \ | |
| Objects/abstract.o \ | |
| Objects/boolobject.o \ | |
| Objects/bytes_methods.o \ | |
| Objects/bytearrayobject.o \ | |
| Objects/bytesobject.o \ | |
| Objects/call.o \ | |
| Objects/capsule.o \ | |
| Objects/cellobject.o \ | |
| Objects/classobject.o \ | |
| Objects/codeobject.o \ | |
| Objects/complexobject.o \ | |
| Objects/descrobject.o \ | |
| Objects/enumobject.o \ | |
| Objects/exceptions.o \ | |
| Objects/genericaliasobject.o \ | |
| Objects/genobject.o \ | |
| Objects/fileobject.o \ | |
| Objects/floatobject.o \ | |
| Objects/frameobject.o \ | |
| Objects/funcobject.o \ | |
| Objects/interpolationobject.o \ | |
| Objects/iterobject.o \ | |
| Objects/lazyimportobject.o \ | |
| Objects/listobject.o \ | |
| Objects/longobject.o \ | |
| Objects/dictobject.o \ | |
| Objects/odictobject.o \ | |
| Objects/memoryobject.o \ | |
| Objects/methodobject.o \ | |
| Objects/moduleobject.o \ | |
| Objects/namespaceobject.o \ | |
| Objects/object.o \ | |
| Objects/obmalloc.o \ | |
| Objects/picklebufobject.o \ | |
| Objects/rangeobject.o \ | |
| Objects/sentinelobject.o \ | |
| Objects/setobject.o \ | |
| Objects/sliceobject.o \ | |
| Objects/structseq.o \ | |
| Objects/templateobject.o \ | |
| Objects/tupleobject.o \ | |
| Objects/typeobject.o \ | |
| Objects/typevarobject.o \ | |
| Objects/unicode_format.o \ | |
| Objects/unicode_formatter.o \ | |
| Objects/unicode_writer.o \ | |
| Objects/unicodectype.o \ | |
| Objects/unicodeobject.o \ | |
| Objects/unionobject.o \ | |
| Objects/weakrefobject.o \ | |
| @PERF_TRAMPOLINE_OBJ@ | |
| ########################################################################## | |
| # objects that get linked into the Python library | |
| LIBRARY_OBJS_OMIT_FROZEN= \ | |
| Modules/getbuildinfo.o \ | |
| $(PARSER_OBJS) \ | |
| $(OBJECT_OBJS) \ | |
| $(PYTHON_OBJS) \ | |
| $(MODULE_OBJS) \ | |
| $(MODOBJS) | |
| LIBRARY_OBJS= \ | |
| $(LIBRARY_OBJS_OMIT_FROZEN) \ | |
| Modules/getpath.o \ | |
| Python/frozen.o | |
| LINK_PYTHON_OBJS=@LINK_PYTHON_OBJS@ | |
| ########################################################################## | |
| # DTrace | |
| # On some systems, object files that reference DTrace probes need to be modified | |
| # in-place by dtrace(1). | |
| DTRACE_DEPS = \ | |
| Python/ceval.o Python/gc.o Python/import.o Python/sysmodule.o | |
| ########################################################################## | |
| # pyexpat's expat library | |
| LIBEXPAT_OBJS= \ | |
| Modules/expat/xmlparse.o \ | |
| Modules/expat/xmlrole.o \ | |
| Modules/expat/xmltok.o | |
| LIBEXPAT_HEADERS= \ | |
| Modules/expat/ascii.h \ | |
| Modules/expat/asciitab.h \ | |
| Modules/expat/expat.h \ | |
| Modules/expat/expat_config.h \ | |
| Modules/expat/expat_external.h \ | |
| Modules/expat/fallthrough.h \ | |
| Modules/expat/hash_table.h \ | |
| Modules/expat/iasciitab.h \ | |
| Modules/expat/internal.h \ | |
| Modules/expat/latin1tab.h \ | |
| Modules/expat/memory_sanitizer.h \ | |
| Modules/expat/nametab.h \ | |
| Modules/expat/pyexpatns.h \ | |
| Modules/expat/siphash.h \ | |
| Modules/expat/utf8tab.h \ | |
| Modules/expat/xcsinc.c \ | |
| Modules/expat/xmlrole.h \ | |
| Modules/expat/xmltok.h \ | |
| Modules/expat/xmltok_impl.h \ | |
| Modules/expat/xmltok_impl.c \ | |
| Modules/expat/xmltok_ns.c | |
| ########################################################################## | |
| # hashlib's HACL* library | |
| # | |
| # On WASI, static build is required. | |
| # On other platforms, a shared library is used. | |
| LIBHACL_MD5_OBJS= \ | |
| Modules/_hacl/Hacl_Hash_MD5.o | |
| LIBHACL_MD5_LIB_STATIC=Modules/_hacl/libHacl_Hash_MD5.a | |
| LIBHACL_MD5_LIB_SHARED=$(LIBHACL_MD5_OBJS) | |
| LIBHACL_SHA1_OBJS= \ | |
| Modules/_hacl/Hacl_Hash_SHA1.o | |
| LIBHACL_SHA1_LIB_STATIC=Modules/_hacl/libHacl_Hash_SHA1.a | |
| LIBHACL_SHA1_LIB_SHARED=$(LIBHACL_SHA1_OBJS) | |
| LIBHACL_SHA2_OBJS= \ | |
| Modules/_hacl/Hacl_Hash_SHA2.o | |
| LIBHACL_SHA2_LIB_STATIC=Modules/_hacl/libHacl_Hash_SHA2.a | |
| LIBHACL_SHA2_LIB_SHARED=$(LIBHACL_SHA2_OBJS) | |
| LIBHACL_SHA3_OBJS= \ | |
| Modules/_hacl/Hacl_Hash_SHA3.o | |
| LIBHACL_SHA3_LIB_STATIC=Modules/_hacl/libHacl_Hash_SHA3.a | |
| LIBHACL_SHA3_LIB_SHARED=$(LIBHACL_SHA3_OBJS) | |
| LIBHACL_BLAKE2_SIMD128_OBJS=@LIBHACL_BLAKE2_SIMD128_OBJS@ | |
| LIBHACL_BLAKE2_SIMD256_OBJS=@LIBHACL_BLAKE2_SIMD256_OBJS@ | |
| LIBHACL_BLAKE2_OBJS= \ | |
| Modules/_hacl/Hacl_Hash_Blake2s.o \ | |
| Modules/_hacl/Hacl_Hash_Blake2b.o \ | |
| Modules/_hacl/Lib_Memzero0.o \ | |
| $(LIBHACL_BLAKE2_SIMD128_OBJS) \ | |
| $(LIBHACL_BLAKE2_SIMD256_OBJS) | |
| LIBHACL_BLAKE2_LIB_STATIC=Modules/_hacl/libHacl_Hash_BLAKE2.a | |
| LIBHACL_BLAKE2_LIB_SHARED=$(LIBHACL_BLAKE2_OBJS) | |
| LIBHACL_HMAC_OBJS= \ | |
| Modules/_hacl/Hacl_HMAC.o \ | |
| Modules/_hacl/Hacl_Streaming_HMAC.o \ | |
| $(LIBHACL_MD5_OBJS) \ | |
| $(LIBHACL_SHA1_OBJS) \ | |
| $(LIBHACL_SHA2_OBJS) \ | |
| $(LIBHACL_SHA3_OBJS) \ | |
| $(LIBHACL_BLAKE2_OBJS) | |
| LIBHACL_HMAC_LIB_STATIC=Modules/_hacl/libHacl_HMAC.a | |
| LIBHACL_HMAC_LIB_SHARED=$(LIBHACL_HMAC_OBJS) | |
| LIBHACL_HEADERS= \ | |
| Modules/_hacl/include/krml/FStar_UInt128_Verified.h \ | |
| Modules/_hacl/include/krml/FStar_UInt_8_16_32_64.h \ | |
| Modules/_hacl/include/krml/fstar_uint128_struct_endianness.h \ | |
| Modules/_hacl/include/krml/internal/compat.h \ | |
| Modules/_hacl/include/krml/internal/target.h \ | |
| Modules/_hacl/include/krml/internal/types.h \ | |
| Modules/_hacl/include/krml/lowstar_endianness.h \ | |
| Modules/_hacl/Hacl_Streaming_Types.h \ | |
| Modules/_hacl/internal/Hacl_Streaming_Types.h \ | |
| Modules/_hacl/libintvector.h \ | |
| Modules/_hacl/python_hacl_namespaces.h | |
| LIBHACL_MD5_HEADERS= \ | |
| Modules/_hacl/Hacl_Hash_MD5.h \ | |
| Modules/_hacl/internal/Hacl_Hash_MD5.h \ | |
| $(LIBHACL_HEADERS) | |
| LIBHACL_SHA1_HEADERS= \ | |
| Modules/_hacl/Hacl_Hash_SHA1.h \ | |
| Modules/_hacl/internal/Hacl_Hash_SHA1.h \ | |
| $(LIBHACL_HEADERS) | |
| LIBHACL_SHA2_HEADERS= \ | |
| Modules/_hacl/Hacl_Hash_SHA2.h \ | |
| Modules/_hacl/internal/Hacl_Hash_SHA2.h \ | |
| $(LIBHACL_HEADERS) | |
| LIBHACL_SHA3_HEADERS= \ | |
| Modules/_hacl/Hacl_Hash_SHA3.h \ | |
| Modules/_hacl/internal/Hacl_Hash_SHA3.h \ | |
| $(LIBHACL_HEADERS) | |
| LIBHACL_BLAKE2_HEADERS= \ | |
| Modules/_hacl/Hacl_Hash_Blake2b.h \ | |
| Modules/_hacl/Hacl_Hash_Blake2s.h \ | |
| Modules/_hacl/Hacl_Hash_Blake2s_Simd128.h \ | |
| Modules/_hacl/Hacl_Hash_Blake2b_Simd256.h \ | |
| Modules/_hacl/internal/Hacl_Hash_Blake2b.h \ | |
| Modules/_hacl/internal/Hacl_Hash_Blake2s.h \ | |
| Modules/_hacl/internal/Hacl_Impl_Blake2_Constants.h \ | |
| Modules/_hacl/internal/Hacl_Hash_Blake2s_Simd128.h \ | |
| Modules/_hacl/internal/Hacl_Hash_Blake2b_Simd256.h \ | |
| $(LIBHACL_HEADERS) | |
| LIBHACL_HMAC_HEADERS= \ | |
| Modules/_hacl/Hacl_HMAC.h \ | |
| Modules/_hacl/Hacl_Streaming_HMAC.h \ | |
| Modules/_hacl/internal/Hacl_HMAC.h \ | |
| Modules/_hacl/internal/Hacl_Streaming_HMAC.h \ | |
| Modules/_hacl/libintvector-shim.h \ | |
| $(LIBHACL_MD5_HEADERS) \ | |
| $(LIBHACL_SHA1_HEADERS) \ | |
| $(LIBHACL_SHA2_HEADERS) \ | |
| $(LIBHACL_SHA3_HEADERS) \ | |
| $(LIBHACL_BLAKE2_HEADERS) \ | |
| $(LIBHACL_HEADERS) | |
| ######################################################################### | |
| # Rules | |
| # Default target | |
| all: @DEF_MAKE_ALL_RULE@ | |
| # First target in Makefile is implicit default. So .PHONY needs to come after | |
| # all. | |
| .PHONY: all | |
| # Provide quick help for common Makefile targets. | |
| .PHONY: help | |
| help: | |
| @echo "Run 'make' to build the Python executable and extension modules" | |
| @echo "" | |
| @echo "or 'make <target>' where <target> is one of:" | |
| @echo " test run the test suite" | |
| @echo " install install built files" | |
| @echo " regen-all regenerate a number of generated source files" | |
| @echo " clinic run Argument Clinic over source files" | |
| @echo "" | |
| @echo " clean to remove build files" | |
| @echo " distclean 'clean' + remove other generated files (patch, exe, etc)" | |
| @echo "" | |
| @echo " recheck rerun configure with last cmdline options" | |
| @echo " reindent reindent .py files in Lib directory" | |
| @echo " tags build a tags file (useful for Emacs and other editors)" | |
| @echo " list-targets list all targets in the Makefile" | |
| # Display a full list of Makefile targets | |
| .PHONY: list-targets | |
| list-targets: | |
| @grep -E '^[A-Za-z][-A-Za-z0-9]+:' Makefile | awk -F : '{print $$1}' | |
| .PHONY: build_all | |
| build_all: check-clean-src check-app-store-compliance $(BUILDPYTHON) platform sharedmods \ | |
| gdbhooks Programs/_testembed scripts checksharedmods rundsymutil $(BUILD_DETAILS) | |
| .PHONY: build_wasm | |
| build_wasm: check-clean-src $(BUILDPYTHON) platform sharedmods \ | |
| python-config checksharedmods $(BUILD_DETAILS) | |
| .PHONY: build_emscripten | |
| build_emscripten: build_wasm web_example web_example_pyrepl_jspi | |
| # Check that the source is clean when building out of source. | |
| .PHONY: check-clean-src | |
| check-clean-src: | |
| @if test -n "$(VPATH)" -a \( \ | |
| -f "$(srcdir)/$(BUILDPYTHON)" \ | |
| -o -f "$(srcdir)/Programs/python.o" \ | |
| -o -f "$(srcdir)/Python/frozen_modules/importlib._bootstrap.h" \ | |
| \); then \ | |
| echo "Error: The source directory ($(srcdir)) is not clean" ; \ | |
| echo "Building Python out of the source tree (in $(abs_builddir)) requires a clean source tree ($(abs_srcdir))" ; \ | |
| echo "Build artifacts such as .o files, executables, and Python/frozen_modules/*.h must not exist within $(srcdir)." ; \ | |
| echo "Try to run:" ; \ | |
| echo " (cd \"$(srcdir)\" && make distclean || git clean -fdx -e Doc/venv)" ; \ | |
| exit 1; \ | |
| fi | |
| # Check that the app store compliance patch can be applied (if configured). | |
| # This is checked as a dry-run against the original library sources; | |
| # the patch will be actually applied during the install phase. | |
| .PHONY: check-app-store-compliance | |
| check-app-store-compliance: | |
| @if [ "$(APP_STORE_COMPLIANCE_PATCH)" != "" ]; then \ | |
| patch --dry-run --quiet --force --strip 1 --directory "$(abs_srcdir)" --input "$(abs_srcdir)/$(APP_STORE_COMPLIANCE_PATCH)"; \ | |
| echo "App store compliance patch can be applied."; \ | |
| fi | |
| # Profile generation build must start from a clean tree. | |
| profile-clean-stamp: | |
| $(MAKE) clean-profile | |
| touch $@ | |
| # Compile with profile generation enabled. | |
| profile-gen-stamp: profile-clean-stamp | |
| @if [ $(LLVM_PROF_ERR) = yes ]; then \ | |
| echo "Error: Cannot perform PGO build because llvm-profdata was not found in PATH" ;\ | |
| echo "Please add it to PATH and run ./configure again" ;\ | |
| exit 1;\ | |
| fi | |
| @echo "Building with support for profile generation:" | |
| $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS_NODIST) $(PGO_PROF_GEN_FLAG)" LDFLAGS_NODIST="$(LDFLAGS_NODIST) $(PGO_PROF_GEN_FLAG)" LIBS="$(LIBS)" | |
| touch $@ | |
| # Run task with profile generation build to create profile information. | |
| profile-run-stamp: | |
| @echo "Running code to generate profile data (this can take a while):" | |
| # First, we need to create a clean build with profile generation | |
| # enabled. | |
| $(MAKE) profile-gen-stamp | |
| # Next, run the profile task to generate the profile information. | |
| @ # FIXME: can't run for a cross build | |
| $(LLVM_PROF_FILE) $(RUNSHARED) ./$(BUILDPYTHON) $(PROFILE_TASK) | |
| $(LLVM_PROF_MERGER) | |
| # Remove profile generation binary since we are done with it. | |
| $(MAKE) clean-retain-profile | |
| # This is an expensive target to build and it does not have proper | |
| # makefile dependency information. So, we create a "stamp" file | |
| # to record its completion and avoid re-running it. | |
| touch $@ | |
| # Compile Python binary with profile guided optimization. | |
| # To force re-running of the profile task, remove the profile-run-stamp file. | |
| .PHONY: profile-opt | |
| profile-opt: profile-run-stamp | |
| @echo "Rebuilding with profile guided optimizations:" | |
| -rm -f profile-clean-stamp | |
| $(MAKE) @DEF_MAKE_RULE@ CFLAGS_NODIST="$(CFLAGS_NODIST) $(PGO_PROF_USE_FLAG)" LDFLAGS_NODIST="$(LDFLAGS_NODIST)" | |
| # List of binaries that BOLT runs on. | |
| BOLT_BINARIES := @BOLT_BINARIES@ | |
| BOLT_INSTRUMENT_FLAGS := @BOLT_INSTRUMENT_FLAGS@ | |
| BOLT_APPLY_FLAGS := @BOLT_APPLY_FLAGS@ | |
| .PHONY: clean-bolt | |
| clean-bolt: | |
| # Profile data. | |
| rm -f *.fdata | |
| # Pristine binaries before BOLT optimization. | |
| rm -f *.prebolt | |
| # BOLT instrumented binaries. | |
| rm -f *.bolt_inst | |
| profile-bolt-stamp: $(BUILDPYTHON) | |
| # Ensure a pristine, pre-BOLT copy of the binary and no profile data from last run. | |
| for bin in $(BOLT_BINARIES); do \ | |
| prebolt="$${bin}.prebolt"; \ | |
| if [ -e "$${prebolt}" ]; then \ | |
| echo "Restoring pre-BOLT binary $${prebolt}"; \ | |
| mv "$${bin}.prebolt" "$${bin}"; \ | |
| fi; \ | |
| cp "$${bin}" "$${prebolt}"; \ | |
| rm -f $${bin}.bolt.*.fdata $${bin}.fdata; \ | |
| done | |
| # Instrument each binary. | |
| for bin in $(BOLT_BINARIES); do \ | |
| @LLVM_BOLT@ "$${bin}" -instrument -instrumentation-file-append-pid -instrumentation-file=$(abspath $${bin}.bolt) -o $${bin}.bolt_inst $(BOLT_INSTRUMENT_FLAGS); \ | |
| mv "$${bin}.bolt_inst" "$${bin}"; \ | |
| done | |
| # Run instrumented binaries to collect data. | |
| $(RUNSHARED) ./$(BUILDPYTHON) $(PROFILE_TASK) | |
| # Merge all the data files together. | |
| for bin in $(BOLT_BINARIES); do \ | |
| @MERGE_FDATA@ $${bin}.*.fdata > "$${bin}.fdata"; \ | |
| rm -f $${bin}.*.fdata; \ | |
| done | |
| # Run bolt against the merged data to produce an optimized binary. | |
| for bin in $(BOLT_BINARIES); do \ | |
| @LLVM_BOLT@ "$${bin}.prebolt" -o "$${bin}.bolt" -data="$${bin}.fdata" $(BOLT_APPLY_FLAGS); \ | |
| mv "$${bin}.bolt" "$${bin}"; \ | |
| done | |
| touch $@ | |
| .PHONY: bolt-opt | |
| bolt-opt: | |
| $(MAKE) @PREBOLT_RULE@ | |
| $(MAKE) profile-bolt-stamp | |
| # Compile and run with gcov | |
| .PHONY: coverage | |
| coverage: | |
| @echo "Building with support for coverage checking:" | |
| $(MAKE) clean | |
| $(MAKE) @DEF_MAKE_RULE@ CFLAGS="$(CFLAGS) -O0 -pg --coverage" LDFLAGS="$(LDFLAGS) --coverage" | |
| .PHONY: coverage-lcov | |
| coverage-lcov: | |
| @echo "Creating Coverage HTML report with LCOV:" | |
| @rm -f $(COVERAGE_INFO) | |
| @rm -rf $(COVERAGE_REPORT) | |
| @lcov $(COVERAGE_LCOV_OPTIONS) --capture \ | |
| --directory $(abs_builddir) \ | |
| --base-directory $(realpath $(abs_builddir)) \ | |
| --path $(realpath $(abs_srcdir)) \ | |
| --output-file $(COVERAGE_INFO) | |
| @ # remove 3rd party modules, system headers and internal files with | |
| @ # debug, test or dummy functions. | |
| @lcov $(COVERAGE_LCOV_OPTIONS) --remove $(COVERAGE_INFO) \ | |
| '*/Modules/_hacl/*' \ | |
| '*/Modules/_ctypes/libffi*/*' \ | |
| '*/Modules/expat/*' \ | |
| '*/Modules/xx*.c' \ | |
| '*/Python/pyfpe.c' \ | |
| '*/Python/pystrcmp.c' \ | |
| '/usr/include/*' \ | |
| '/usr/local/include/*' \ | |
| '/usr/lib/gcc/*' \ | |
| --output-file $(COVERAGE_INFO) | |
| @genhtml $(COVERAGE_INFO) \ | |
| --output-directory $(COVERAGE_REPORT) \ | |
| $(COVERAGE_REPORT_OPTIONS) | |
| @echo | |
| @echo "lcov report at $(COVERAGE_REPORT)/index.html" | |
| @echo | |
| # Force regeneration of parser and frozen modules | |
| .PHONY: coverage-report | |
| coverage-report: regen-token regen-frozen | |
| @ # build with coverage info | |
| $(MAKE) coverage | |
| @ # run tests, ignore failures | |
| $(TESTRUNNER) --fast-ci --timeout=$(TESTTIMEOUT) $(TESTOPTS) || true | |
| @ # build lcov report | |
| $(MAKE) coverage-lcov | |
| # Run "Argument Clinic" over all source files | |
| .PHONY: clinic | |
| clinic: check-clean-src | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/clinic/clinic.py --force --make --exclude Lib/test/clinic.test.c --srcdir $(srcdir) | |
| .PHONY: clinic-tests | |
| clinic-tests: check-clean-src $(srcdir)/Lib/test/clinic.test.c | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/clinic/clinic.py -f $(srcdir)/Lib/test/clinic.test.c | |
| # Build the interpreter | |
| $(BUILDPYTHON): Programs/python.o $(LINK_PYTHON_DEPS) | |
| $(LINKCC) $(PY_CORE_EXE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/python.o $(LINK_PYTHON_OBJS) $(LIBS) $(MODLIBS) $(SYSLIBS) | |
| platform: $(PYTHON_FOR_BUILD_DEPS) pybuilddir.txt | |
| $(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import sys ; from sysconfig import get_platform ; print("%s-%d.%d" % (get_platform(), *sys.version_info[:2]))' >platform | |
| # Create build directory and generate the sysconfig build-time data there. | |
| # pybuilddir.txt contains the name of the build dir and is used for | |
| # sys.path fixup -- see Modules/getpath.c. | |
| # Since this step runs before shared modules are built, try to avoid bootstrap | |
| # problems by creating a dummy pybuilddir.txt just to allow interpreter | |
| # initialization to succeed. It will be overwritten by generate-posix-vars | |
| # or removed in case of failure. | |
| pybuilddir.txt: $(PYTHON_FOR_BUILD_DEPS) | |
| @echo "none" > ./pybuilddir.txt | |
| $(RUNSHARED) $(PYTHON_FOR_BUILD) -S -X pathconfig_warnings=0 -m sysconfig --generate-posix-vars ;\ | |
| if test $$? -ne 0 ; then \ | |
| echo "generate-posix-vars failed" ; \ | |
| rm -f ./pybuilddir.txt ; \ | |
| exit 1 ; \ | |
| fi | |
| $(BUILD_DETAILS): pybuilddir.txt | |
| $(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/Tools/build/generate-build-details.py `cat pybuilddir.txt`/$(BUILD_DETAILS) | |
| # Build static library | |
| $(LIBRARY): $(LIBRARY_OBJS) | |
| -rm -f $@ | |
| $(AR) $(ARFLAGS) $@ $(LIBRARY_OBJS) | |
| libpython$(LDVERSION).so: $(LIBRARY_OBJS) $(DTRACE_OBJS) | |
| # AIX Linker don't support "-h" option | |
| if test "$(MACHDEP)" != "aix"; then \ | |
| $(BLDSHARED) -Wl,-h$(INSTSONAME) -o $(INSTSONAME) $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM); \ | |
| else \ | |
| $(BLDSHARED) -o $@ $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM); \ | |
| fi | |
| if test $(INSTSONAME) != $@; then \ | |
| $(LN) -f $(INSTSONAME) $@; \ | |
| fi | |
| libpython3.so: libpython$(LDVERSION).so | |
| $(BLDSHARED) $(NO_AS_NEEDED) -o $@ -Wl,-h$@ $^ | |
| libpython$(LDVERSION).dylib: $(LIBRARY_OBJS) | |
| $(CC) -dynamiclib $(PY_CORE_LDFLAGS) -undefined dynamic_lookup -Wl,-install_name,$(prefix)/lib/libpython$(LDVERSION).dylib -Wl,-compatibility_version,$(VERSION) -Wl,-current_version,$(VERSION) -o $@ $(LIBRARY_OBJS) $(DTRACE_OBJS) $(SHLIBS) $(LIBC) $(LIBM); \ | |
| libpython$(VERSION).sl: $(LIBRARY_OBJS) | |
| $(LDSHARED) -o $@ $(LIBRARY_OBJS) $(MODLIBS) $(SHLIBS) $(LIBC) $(LIBM) | |
| # List of exported symbols for AIX | |
| Modules/python.exp: $(LIBRARY) | |
| $(srcdir)/Modules/makexp_aix $@ "$(EXPORTSFROM)" $? | |
| # Copy up the gdb python hooks into a position where they can be automatically | |
| # loaded by gdb during Lib/test/test_gdb.py | |
| # | |
| # Distributors are likely to want to install this somewhere else e.g. relative | |
| # to the stripped DWARF data for the shared library. | |
| .PHONY: gdbhooks | |
| gdbhooks: $(BUILDPYTHON)-gdb.py | |
| SRC_GDB_HOOKS=$(srcdir)/Tools/gdb/libpython.py | |
| $(BUILDPYTHON)-gdb.py: $(SRC_GDB_HOOKS) | |
| $(INSTALL_DATA) $(SRC_GDB_HOOKS) $(BUILDPYTHON)-gdb.py | |
| # This rule is here for OPENSTEP/Rhapsody/MacOSX. It builds a temporary | |
| # minimal framework (not including the Lib directory and such) in the current | |
| # directory. | |
| $(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/$(PYTHONFRAMEWORK): \ | |
| $(LIBRARY) \ | |
| $(RESSRCDIR)/Info.plist | |
| $(INSTALL) -d -m $(DIRMODE) $(PYTHONFRAMEWORKDIR)/Versions/$(VERSION) | |
| $(CC) -o $(LDLIBRARY) $(PY_CORE_LDFLAGS) -dynamiclib \ | |
| -all_load $(LIBRARY) \ | |
| -install_name $(PYTHONFRAMEWORKINSTALLNAMEPREFIX)/$(PYTHONFRAMEWORK) \ | |
| -compatibility_version $(VERSION) \ | |
| -current_version $(VERSION) \ | |
| -framework CoreFoundation $(LIBS); | |
| $(INSTALL) -d -m $(DIRMODE) \ | |
| $(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/Resources/English.lproj | |
| $(INSTALL_DATA) $(RESSRCDIR)/Info.plist \ | |
| $(PYTHONFRAMEWORKDIR)/Versions/$(VERSION)/Resources/Info.plist | |
| $(LN) -fsn $(VERSION) $(PYTHONFRAMEWORKDIR)/Versions/Current | |
| $(LN) -fsn Versions/Current/$(PYTHONFRAMEWORK) $(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK) | |
| $(LN) -fsn Versions/Current/Resources $(PYTHONFRAMEWORKDIR)/Resources | |
| # This rule is for iOS, which requires an annoyingly just slightly different | |
| # format for frameworks to macOS. It *doesn't* use a versioned framework, and | |
| # the Info.plist must be in the root of the framework. | |
| $(PYTHONFRAMEWORKDIR)/$(PYTHONFRAMEWORK): \ | |
| $(LIBRARY) \ | |
| $(RESSRCDIR)/Info.plist | |
| $(INSTALL) -d -m $(DIRMODE) $(PYTHONFRAMEWORKDIR) | |
| $(CC) -o $(LDLIBRARY) $(PY_CORE_LDFLAGS) -dynamiclib \ | |
| -all_load $(LIBRARY) \ | |
| -install_name $(PYTHONFRAMEWORKINSTALLNAMEPREFIX)/$(PYTHONFRAMEWORK) \ | |
| -compatibility_version $(VERSION) \ | |
| -current_version $(VERSION) \ | |
| -framework CoreFoundation $(LIBS); | |
| $(INSTALL_DATA) $(RESSRCDIR)/Info.plist $(PYTHONFRAMEWORKDIR)/Info.plist | |
| # This rule builds the Cygwin Python DLL and import library if configured | |
| # for a shared core library; otherwise, this rule is a noop. | |
| $(DLLLIBRARY) libpython$(LDVERSION).dll.a: $(LIBRARY_OBJS) | |
| if test -n "$(DLLLIBRARY)"; then \ | |
| $(LDSHARED) -Wl,--out-implib=$@ -o $(DLLLIBRARY) $^ \ | |
| $(LIBS) $(MODLIBS) $(SYSLIBS); \ | |
| else true; \ | |
| fi | |
| # wasm32-emscripten browser web example | |
| EMSCRIPTEN_DIR=$(srcdir)/Platforms/emscripten | |
| WEBEX_DIR=$(EMSCRIPTEN_DIR)/web_example/ | |
| ZIP_STDLIB=python$(VERSION)$(ABI_THREAD).zip | |
| $(ZIP_STDLIB): $(srcdir)/Lib/*.py $(srcdir)/Lib/*/*.py \ | |
| $(EMSCRIPTEN_DIR)/wasm_assets.py \ | |
| Makefile pybuilddir.txt Modules/Setup.local | |
| $(PYTHON_FOR_BUILD) $(EMSCRIPTEN_DIR)/wasm_assets.py \ | |
| --buildroot . --prefix $(prefix) -o $@ | |
| web_example/index.html: $(WEBEX_DIR)/index.html | |
| @mkdir -p web_example | |
| @cp $< $@ | |
| web_example/python.worker.mjs: $(WEBEX_DIR)/python.worker.mjs | |
| @mkdir -p web_example | |
| @cp $< $@ | |
| web_example/server.py: $(WEBEX_DIR)/server.py | |
| @mkdir -p web_example | |
| @cp $< $@ | |
| web_example/$(ZIP_STDLIB): $(ZIP_STDLIB) | |
| @mkdir -p web_example | |
| @cp $< $@ | |
| web_example/python.mjs web_example/python.wasm: $(BUILDPYTHON) | |
| @if test $(HOST_GNU_TYPE) != 'wasm32-unknown-emscripten' ; then \ | |
| echo "Can only build web_example when target is Emscripten" ;\ | |
| exit 1 ;\ | |
| fi | |
| cp python.mjs web_example/python.mjs | |
| cp python.wasm web_example/python.wasm | |
| .PHONY: web_example | |
| web_example: web_example/python.mjs web_example/python.worker.mjs web_example/index.html web_example/server.py web_example/$(ZIP_STDLIB) | |
| WEBEX2=web_example_pyrepl_jspi | |
| WEBEX2_DIR=$(EMSCRIPTEN_DIR)/$(WEBEX2)/ | |
| $(WEBEX2)/python.mjs $(WEBEX2)/python.wasm: $(BUILDPYTHON) | |
| @if test $(HOST_GNU_TYPE) != 'wasm32-unknown-emscripten' ; then \ | |
| echo "Can only build web_example when target is Emscripten" ;\ | |
| exit 1 ;\ | |
| fi | |
| @mkdir -p $(WEBEX2) | |
| @cp python.mjs $(WEBEX2)/python.mjs | |
| @cp python.wasm $(WEBEX2)/python.wasm | |
| $(WEBEX2)/index.html: $(WEBEX2_DIR)/index.html | |
| @mkdir -p $(WEBEX2) | |
| @cp $< $@ | |
| $(WEBEX2)/src.mjs: $(WEBEX2_DIR)/src.mjs | |
| @mkdir -p $(WEBEX2) | |
| @cp $< $@ | |
| $(WEBEX2)/$(ZIP_STDLIB): $(ZIP_STDLIB) | |
| @mkdir -p $(WEBEX2) | |
| @cp $< $@ | |
| .PHONY: web_example_pyrepl_jspi | |
| web_example_pyrepl_jspi: $(WEBEX2)/python.mjs $(WEBEX2)/index.html $(WEBEX2)/src.mjs $(WEBEX2)/$(ZIP_STDLIB) | |
| ############################################################################ | |
| # Header files | |
| PYTHON_HEADERS= \ | |
| $(srcdir)/Include/Python.h \ | |
| $(srcdir)/Include/abstract.h \ | |
| $(srcdir)/Include/audit.h \ | |
| $(srcdir)/Include/bltinmodule.h \ | |
| $(srcdir)/Include/boolobject.h \ | |
| $(srcdir)/Include/bytearrayobject.h \ | |
| $(srcdir)/Include/bytesobject.h \ | |
| $(srcdir)/Include/ceval.h \ | |
| $(srcdir)/Include/codecs.h \ | |
| $(srcdir)/Include/compile.h \ | |
| $(srcdir)/Include/complexobject.h \ | |
| $(srcdir)/Include/critical_section.h \ | |
| $(srcdir)/Include/descrobject.h \ | |
| $(srcdir)/Include/dictobject.h \ | |
| $(srcdir)/Include/dynamic_annotations.h \ | |
| $(srcdir)/Include/enumobject.h \ | |
| $(srcdir)/Include/errcode.h \ | |
| $(srcdir)/Include/exports.h \ | |
| $(srcdir)/Include/fileobject.h \ | |
| $(srcdir)/Include/fileutils.h \ | |
| $(srcdir)/Include/floatobject.h \ | |
| $(srcdir)/Include/frameobject.h \ | |
| $(srcdir)/Include/genericaliasobject.h \ | |
| $(srcdir)/Include/import.h \ | |
| $(srcdir)/Include/intrcheck.h \ | |
| $(srcdir)/Include/iterobject.h \ | |
| $(srcdir)/Include/listobject.h \ | |
| $(srcdir)/Include/longobject.h \ | |
| $(srcdir)/Include/marshal.h \ | |
| $(srcdir)/Include/memoryobject.h \ | |
| $(srcdir)/Include/methodobject.h \ | |
| $(srcdir)/Include/modsupport.h \ | |
| $(srcdir)/Include/moduleobject.h \ | |
| $(srcdir)/Include/object.h \ | |
| $(srcdir)/Include/objimpl.h \ | |
| $(srcdir)/Include/opcode.h \ | |
| $(srcdir)/Include/opcode_ids.h \ | |
| $(srcdir)/Include/osdefs.h \ | |
| $(srcdir)/Include/osmodule.h \ | |
| $(srcdir)/Include/patchlevel.h \ | |
| $(srcdir)/Include/pyabi.h \ | |
| $(srcdir)/Include/pyatomic.h \ | |
| $(srcdir)/Include/pybuffer.h \ | |
| $(srcdir)/Include/pycapsule.h \ | |
| $(srcdir)/Include/pydtrace.h \ | |
| $(srcdir)/Include/pyerrors.h \ | |
| $(srcdir)/Include/pyexpat.h \ | |
| $(srcdir)/Include/pyframe.h \ | |
| $(srcdir)/Include/pyhash.h \ | |
| $(srcdir)/Include/pylifecycle.h \ | |
| $(srcdir)/Include/pymacconfig.h \ | |
| $(srcdir)/Include/pymacro.h \ | |
| $(srcdir)/Include/pymath.h \ | |
| $(srcdir)/Include/pymem.h \ | |
| $(srcdir)/Include/pyport.h \ | |
| $(srcdir)/Include/pystate.h \ | |
| $(srcdir)/Include/pystats.h \ | |
| $(srcdir)/Include/pystrcmp.h \ | |
| $(srcdir)/Include/pystrtod.h \ | |
| $(srcdir)/Include/pythonrun.h \ | |
| $(srcdir)/Include/pythread.h \ | |
| $(srcdir)/Include/pytypedefs.h \ | |
| $(srcdir)/Include/rangeobject.h \ | |
| $(srcdir)/Include/refcount.h \ | |
| $(srcdir)/Include/setobject.h \ | |
| $(srcdir)/Include/sliceobject.h \ | |
| $(srcdir)/Include/slots.h \ | |
| $(srcdir)/Include/slots_generated.h \ | |
| $(srcdir)/Include/structmember.h \ | |
| $(srcdir)/Include/structseq.h \ | |
| $(srcdir)/Include/sysmodule.h \ | |
| $(srcdir)/Include/traceback.h \ | |
| $(srcdir)/Include/tupleobject.h \ | |
| $(srcdir)/Include/unicodeobject.h \ | |
| $(srcdir)/Include/warnings.h \ | |
| $(srcdir)/Include/weakrefobject.h \ | |
| $(srcdir)/Python/remote_debug.h \ | |
| \ | |
| pyconfig.h \ | |
| $(PARSER_HEADERS) \ | |
| \ | |
| $(srcdir)/Include/cpython/abstract.h \ | |
| $(srcdir)/Include/cpython/audit.h \ | |
| $(srcdir)/Include/cpython/bytearrayobject.h \ | |
| $(srcdir)/Include/cpython/bytesobject.h \ | |
| $(srcdir)/Include/cpython/cellobject.h \ | |
| $(srcdir)/Include/cpython/ceval.h \ | |
| $(srcdir)/Include/cpython/classobject.h \ | |
| $(srcdir)/Include/cpython/code.h \ | |
| $(srcdir)/Include/cpython/compile.h \ | |
| $(srcdir)/Include/cpython/complexobject.h \ | |
| $(srcdir)/Include/cpython/context.h \ | |
| $(srcdir)/Include/cpython/critical_section.h \ | |
| $(srcdir)/Include/cpython/descrobject.h \ | |
| $(srcdir)/Include/cpython/dictobject.h \ | |
| $(srcdir)/Include/cpython/fileobject.h \ | |
| $(srcdir)/Include/cpython/fileutils.h \ | |
| $(srcdir)/Include/cpython/floatobject.h \ | |
| $(srcdir)/Include/cpython/frameobject.h \ | |
| $(srcdir)/Include/cpython/funcobject.h \ | |
| $(srcdir)/Include/cpython/genobject.h \ | |
| $(srcdir)/Include/cpython/import.h \ | |
| $(srcdir)/Include/cpython/initconfig.h \ | |
| $(srcdir)/Include/cpython/listobject.h \ | |
| $(srcdir)/Include/cpython/pylock.h \ | |
| $(srcdir)/Include/cpython/longintrepr.h \ | |
| $(srcdir)/Include/cpython/longobject.h \ | |
| $(srcdir)/Include/cpython/marshal.h \ | |
| $(srcdir)/Include/cpython/memoryobject.h \ | |
| $(srcdir)/Include/cpython/methodobject.h \ | |
| $(srcdir)/Include/cpython/modsupport.h \ | |
| $(srcdir)/Include/cpython/monitoring.h \ | |
| $(srcdir)/Include/cpython/object.h \ | |
| $(srcdir)/Include/cpython/objimpl.h \ | |
| $(srcdir)/Include/cpython/odictobject.h \ | |
| $(srcdir)/Include/cpython/picklebufobject.h \ | |
| $(srcdir)/Include/cpython/pthread_stubs.h \ | |
| $(srcdir)/Include/cpython/pyatomic.h \ | |
| $(srcdir)/Include/cpython/pyatomic_gcc.h \ | |
| $(srcdir)/Include/cpython/pyatomic_std.h \ | |
| $(srcdir)/Include/cpython/pyctype.h \ | |
| $(srcdir)/Include/cpython/pydebug.h \ | |
| $(srcdir)/Include/cpython/pyerrors.h \ | |
| $(srcdir)/Include/cpython/pyfpe.h \ | |
| $(srcdir)/Include/cpython/pyframe.h \ | |
| $(srcdir)/Include/cpython/pyhash.h \ | |
| $(srcdir)/Include/cpython/pylifecycle.h \ | |
| $(srcdir)/Include/cpython/pymem.h \ | |
| $(srcdir)/Include/cpython/pystate.h \ | |
| $(srcdir)/Include/cpython/pystats.h \ | |
| $(srcdir)/Include/cpython/pythonrun.h \ | |
| $(srcdir)/Include/cpython/pythread.h \ | |
| $(srcdir)/Include/cpython/sentinelobject.h \ | |
| $(srcdir)/Include/cpython/setobject.h \ | |
| $(srcdir)/Include/cpython/sliceobject.h \ | |
| $(srcdir)/Include/cpython/structseq.h \ | |
| $(srcdir)/Include/cpython/traceback.h \ | |
| $(srcdir)/Include/cpython/tracemalloc.h \ | |
| $(srcdir)/Include/cpython/tupleobject.h \ | |
| $(srcdir)/Include/cpython/unicodeobject.h \ | |
| $(srcdir)/Include/cpython/warnings.h \ | |
| $(srcdir)/Include/cpython/weakrefobject.h \ | |
| \ | |
| $(MIMALLOC_HEADERS) \ | |
| \ | |
| $(srcdir)/Include/internal/pycore_abstract.h \ | |
| $(srcdir)/Include/internal/pycore_asdl.h \ | |
| $(srcdir)/Include/internal/pycore_ast.h \ | |
| $(srcdir)/Include/internal/pycore_ast_state.h \ | |
| $(srcdir)/Include/internal/pycore_atexit.h \ | |
| $(srcdir)/Include/internal/pycore_audit.h \ | |
| $(srcdir)/Include/internal/pycore_backoff.h \ | |
| $(srcdir)/Include/internal/pycore_bitutils.h \ | |
| $(srcdir)/Include/internal/pycore_blocks_output_buffer.h \ | |
| $(srcdir)/Include/internal/pycore_brc.h \ | |
| $(srcdir)/Include/internal/pycore_bytes_methods.h \ | |
| $(srcdir)/Include/internal/pycore_bytesobject.h \ | |
| $(srcdir)/Include/internal/pycore_call.h \ | |
| $(srcdir)/Include/internal/pycore_capsule.h \ | |
| $(srcdir)/Include/internal/pycore_cell.h \ | |
| $(srcdir)/Include/internal/pycore_ceval.h \ | |
| $(srcdir)/Include/internal/pycore_ceval_state.h \ | |
| $(srcdir)/Include/internal/pycore_code.h \ | |
| $(srcdir)/Include/internal/pycore_codecs.h \ | |
| $(srcdir)/Include/internal/pycore_compile.h \ | |
| $(srcdir)/Include/internal/pycore_complexobject.h \ | |
| $(srcdir)/Include/internal/pycore_condvar.h \ | |
| $(srcdir)/Include/internal/pycore_context.h \ | |
| $(srcdir)/Include/internal/pycore_critical_section.h \ | |
| $(srcdir)/Include/internal/pycore_crossinterp.h \ | |
| $(srcdir)/Include/internal/pycore_crossinterp_data_registry.h \ | |
| $(srcdir)/Include/internal/pycore_debug_offsets.h \ | |
| $(srcdir)/Include/internal/pycore_descrobject.h \ | |
| $(srcdir)/Include/internal/pycore_dict.h \ | |
| $(srcdir)/Include/internal/pycore_dict_state.h \ | |
| $(srcdir)/Include/internal/pycore_dtoa.h \ | |
| $(srcdir)/Include/internal/pycore_exceptions.h \ | |
| $(srcdir)/Include/internal/pycore_faulthandler.h \ | |
| $(srcdir)/Include/internal/pycore_fileutils.h \ | |
| $(srcdir)/Include/internal/pycore_floatobject.h \ | |
| $(srcdir)/Include/internal/pycore_flowgraph.h \ | |
| $(srcdir)/Include/internal/pycore_format.h \ | |
| $(srcdir)/Include/internal/pycore_frame.h \ | |
| $(srcdir)/Include/internal/pycore_freelist.h \ | |
| $(srcdir)/Include/internal/pycore_freelist_state.h \ | |
| $(srcdir)/Include/internal/pycore_function.h \ | |
| $(srcdir)/Include/internal/pycore_gc.h \ | |
| $(srcdir)/Include/internal/pycore_genobject.h \ | |
| $(srcdir)/Include/internal/pycore_getopt.h \ | |
| $(srcdir)/Include/internal/pycore_gil.h \ | |
| $(srcdir)/Include/internal/pycore_global_objects.h \ | |
| $(srcdir)/Include/internal/pycore_global_objects_fini.h \ | |
| $(srcdir)/Include/internal/pycore_global_objects_fini_generated.h \ | |
| $(srcdir)/Include/internal/pycore_global_strings.h \ | |
| $(srcdir)/Include/internal/pycore_hamt.h \ | |
| $(srcdir)/Include/internal/pycore_hashtable.h \ | |
| $(srcdir)/Include/internal/pycore_import.h \ | |
| $(srcdir)/Include/internal/pycore_importdl.h \ | |
| $(srcdir)/Include/internal/pycore_index_pool.h \ | |
| $(srcdir)/Include/internal/pycore_initconfig.h \ | |
| $(srcdir)/Include/internal/pycore_instruments.h \ | |
| $(srcdir)/Include/internal/pycore_instruction_sequence.h \ | |
| $(srcdir)/Include/internal/pycore_interp.h \ | |
| $(srcdir)/Include/internal/pycore_interp_structs.h \ | |
| $(srcdir)/Include/internal/pycore_interpframe.h \ | |
| $(srcdir)/Include/internal/pycore_interpframe_structs.h \ | |
| $(srcdir)/Include/internal/pycore_interpolation.h \ | |
| $(srcdir)/Include/internal/pycore_intrinsics.h \ | |
| $(srcdir)/Include/internal/pycore_iterobject.h \ | |
| $(srcdir)/Include/internal/pycore_jit.h \ | |
| $(srcdir)/Include/internal/pycore_lazyimportobject.h \ | |
| $(srcdir)/Include/internal/pycore_list.h \ | |
| $(srcdir)/Include/internal/pycore_llist.h \ | |
| $(srcdir)/Include/internal/pycore_lock.h \ | |
| $(srcdir)/Include/internal/pycore_long.h \ | |
| $(srcdir)/Include/internal/pycore_memoryobject.h \ | |
| $(srcdir)/Include/internal/pycore_mimalloc.h \ | |
| $(srcdir)/Include/internal/pycore_mmap.h \ | |
| $(srcdir)/Include/internal/pycore_modsupport.h \ | |
| $(srcdir)/Include/internal/pycore_moduleobject.h \ | |
| $(srcdir)/Include/internal/pycore_namespace.h \ | |
| $(srcdir)/Include/internal/pycore_object.h \ | |
| $(srcdir)/Include/internal/pycore_object_alloc.h \ | |
| $(srcdir)/Include/internal/pycore_object_deferred.h \ | |
| $(srcdir)/Include/internal/pycore_object_stack.h \ | |
| $(srcdir)/Include/internal/pycore_object_state.h \ | |
| $(srcdir)/Include/internal/pycore_obmalloc.h \ | |
| $(srcdir)/Include/internal/pycore_obmalloc_init.h \ | |
| $(srcdir)/Include/internal/pycore_opcode_metadata.h \ | |
| $(srcdir)/Include/internal/pycore_opcode_utils.h \ | |
| $(srcdir)/Include/internal/pycore_optimizer.h \ | |
| $(srcdir)/Include/internal/pycore_parking_lot.h \ | |
| $(srcdir)/Include/internal/pycore_parser.h \ | |
| $(srcdir)/Include/internal/pycore_pathconfig.h \ | |
| $(srcdir)/Include/internal/pycore_pyarena.h \ | |
| $(srcdir)/Include/internal/pycore_pyatomic_ft_wrappers.h \ | |
| $(srcdir)/Include/internal/pycore_pybuffer.h \ | |
| $(srcdir)/Include/internal/pycore_pyerrors.h \ | |
| $(srcdir)/Include/internal/pycore_pyhash.h \ | |
| $(srcdir)/Include/internal/pycore_pylifecycle.h \ | |
| $(srcdir)/Include/internal/pycore_pymath.h \ | |
| $(srcdir)/Include/internal/pycore_pymem.h \ | |
| $(srcdir)/Include/internal/pycore_pymem_init.h \ | |
| $(srcdir)/Include/internal/pycore_pystate.h \ | |
| $(srcdir)/Include/internal/pycore_pystats.h \ | |
| $(srcdir)/Include/internal/pycore_pythonrun.h \ | |
| $(srcdir)/Include/internal/pycore_pythread.h \ | |
| $(srcdir)/Include/internal/pycore_qsbr.h \ | |
| $(srcdir)/Include/internal/pycore_range.h \ | |
| $(srcdir)/Include/internal/pycore_runtime.h \ | |
| $(srcdir)/Include/internal/pycore_runtime_init.h \ | |
| $(srcdir)/Include/internal/pycore_runtime_init_generated.h \ | |
| $(srcdir)/Include/internal/pycore_runtime_structs.h \ | |
| $(srcdir)/Include/internal/pycore_semaphore.h \ | |
| $(srcdir)/Include/internal/pycore_setobject.h \ | |
| $(srcdir)/Include/internal/pycore_signal.h \ | |
| $(srcdir)/Include/internal/pycore_sliceobject.h \ | |
| $(srcdir)/Include/internal/pycore_slots.h \ | |
| $(srcdir)/Include/internal/pycore_slots_generated.h \ | |
| $(srcdir)/Include/internal/pycore_stats.h \ | |
| $(srcdir)/Include/internal/pycore_strhex.h \ | |
| $(srcdir)/Include/internal/pycore_stackref.h \ | |
| $(srcdir)/Include/internal/pycore_structs.h \ | |
| $(srcdir)/Include/internal/pycore_structseq.h \ | |
| $(srcdir)/Include/internal/pycore_symtable.h \ | |
| $(srcdir)/Include/internal/pycore_sysmodule.h \ | |
| $(srcdir)/Include/internal/pycore_template.h \ | |
| $(srcdir)/Include/internal/pycore_time.h \ | |
| $(srcdir)/Include/internal/pycore_token.h \ | |
| $(srcdir)/Include/internal/pycore_traceback.h \ | |
| $(srcdir)/Include/internal/pycore_tracemalloc.h \ | |
| $(srcdir)/Include/internal/pycore_tstate.h \ | |
| $(srcdir)/Include/internal/pycore_tuple.h \ | |
| $(srcdir)/Include/internal/pycore_typecache.h \ | |
| $(srcdir)/Include/internal/pycore_typedefs.h \ | |
| $(srcdir)/Include/internal/pycore_typeobject.h \ | |
| $(srcdir)/Include/internal/pycore_typevarobject.h \ | |
| $(srcdir)/Include/internal/pycore_ucnhash.h \ | |
| $(srcdir)/Include/internal/pycore_unicodectype.h \ | |
| $(srcdir)/Include/internal/pycore_unicodeobject.h \ | |
| $(srcdir)/Include/internal/pycore_unicodeobject_generated.h \ | |
| $(srcdir)/Include/internal/pycore_unionobject.h \ | |
| $(srcdir)/Include/internal/pycore_uniqueid.h \ | |
| $(srcdir)/Include/internal/pycore_uop.h \ | |
| $(srcdir)/Include/internal/pycore_uop_ids.h \ | |
| $(srcdir)/Include/internal/pycore_uop_metadata.h \ | |
| $(srcdir)/Include/internal/pycore_wasm_trampoline.h \ | |
| $(srcdir)/Include/internal/pycore_warnings.h \ | |
| $(srcdir)/Include/internal/pycore_weakref.h \ | |
| $(DTRACE_HEADERS) \ | |
| @PLATFORM_HEADERS@ \ | |
| \ | |
| $(srcdir)/Python/stdlib_module_names.h | |
| ########################################################################## | |
| # Build static libexpat.a | |
| LIBEXPAT_CFLAGS=@LIBEXPAT_CFLAGS@ $(PY_STDMODULE_CFLAGS) $(CCSHARED) | |
| Modules/expat/xmlparse.o: $(srcdir)/Modules/expat/xmlparse.c $(LIBEXPAT_HEADERS) $(PYTHON_HEADERS) | |
| $(CC) -c $(LIBEXPAT_CFLAGS) -o $@ $(srcdir)/Modules/expat/xmlparse.c | |
| Modules/expat/xmlrole.o: $(srcdir)/Modules/expat/xmlrole.c $(LIBEXPAT_HEADERS) $(PYTHON_HEADERS) | |
| $(CC) -c $(LIBEXPAT_CFLAGS) -o $@ $(srcdir)/Modules/expat/xmlrole.c | |
| Modules/expat/xmltok.o: $(srcdir)/Modules/expat/xmltok.c $(LIBEXPAT_HEADERS) $(PYTHON_HEADERS) | |
| $(CC) -c $(LIBEXPAT_CFLAGS) -o $@ $(srcdir)/Modules/expat/xmltok.c | |
| $(LIBEXPAT_A): $(LIBEXPAT_OBJS) | |
| -rm -f $@ | |
| $(AR) $(ARFLAGS) $@ $(LIBEXPAT_OBJS) | |
| ########################################################################## | |
| # HACL* library build | |
| # | |
| # The HACL* modules are dynamically compiled and linked with the | |
| # corresponding CPython built-in modules on demand, depending on | |
| # whether the module is built or not. | |
| # | |
| # In particular, the HACL* objects are also dependencies of the | |
| # corresponding C extension modules but makesetup must NOT create | |
| # a rule for them. | |
| # | |
| # For WASI, static linking is needed and HACL* is statically linked instead. | |
| Modules/_hacl/Lib_Memzero0.o: $(srcdir)/Modules/_hacl/Lib_Memzero0.c $(LIBHACL_HEADERS) | |
| $(CC) -c $(LIBHACL_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Lib_Memzero0.c | |
| Modules/_hacl/Hacl_Hash_MD5.o: $(srcdir)/Modules/_hacl/Hacl_Hash_MD5.c $(LIBHACL_MD5_HEADERS) | |
| $(CC) -c $(LIBHACL_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_MD5.c | |
| $(LIBHACL_MD5_LIB_STATIC): $(LIBHACL_MD5_OBJS) | |
| -rm -f $@ | |
| $(AR) $(ARFLAGS) $@ $(LIBHACL_MD5_OBJS) | |
| Modules/_hacl/Hacl_Hash_SHA1.o: $(srcdir)/Modules/_hacl/Hacl_Hash_SHA1.c $(LIBHACL_SHA1_HEADERS) | |
| $(CC) -c $(LIBHACL_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_SHA1.c | |
| $(LIBHACL_SHA1_LIB_STATIC): $(LIBHACL_SHA1_OBJS) | |
| -rm -f $@ | |
| $(AR) $(ARFLAGS) $@ $(LIBHACL_SHA1_OBJS) | |
| Modules/_hacl/Hacl_Hash_SHA2.o: $(srcdir)/Modules/_hacl/Hacl_Hash_SHA2.c $(LIBHACL_SHA2_HEADERS) | |
| $(CC) -c $(LIBHACL_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_SHA2.c | |
| $(LIBHACL_SHA2_LIB_STATIC): $(LIBHACL_SHA2_OBJS) | |
| -rm -f $@ | |
| $(AR) $(ARFLAGS) $@ $(LIBHACL_SHA2_OBJS) | |
| Modules/_hacl/Hacl_Hash_SHA3.o: $(srcdir)/Modules/_hacl/Hacl_Hash_SHA3.c $(LIBHACL_SHA3_HEADERS) | |
| $(CC) -c $(LIBHACL_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_SHA3.c | |
| $(LIBHACL_SHA3_LIB_STATIC): $(LIBHACL_SHA3_OBJS) | |
| -rm -f $@ | |
| $(AR) $(ARFLAGS) $@ $(LIBHACL_SHA3_OBJS) | |
| Modules/_hacl/Hacl_Hash_Blake2s.o: $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2s.c $(LIBHACL_BLAKE2_HEADERS) | |
| $(CC) -c $(LIBHACL_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2s.c | |
| Modules/_hacl/Hacl_Hash_Blake2b.o: $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2b.c $(LIBHACL_BLAKE2_HEADERS) | |
| $(CC) -c $(LIBHACL_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2b.c | |
| Modules/_hacl/Hacl_Hash_Blake2s_Simd128.o: $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2s_Simd128.c $(LIBHACL_BLAKE2_HEADERS) | |
| $(CC) -c $(LIBHACL_CFLAGS) $(LIBHACL_BLAKE2_SIMD128_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2s_Simd128.c | |
| Modules/_hacl/Hacl_Hash_Blake2s_Simd128_universal2.o: $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2s_Simd128_universal2.c $(LIBHACL_BLAKE2_HEADERS) | |
| $(CC) -c $(LIBHACL_CFLAGS) $(LIBHACL_BLAKE2_SIMD128_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2s_Simd128_universal2.c | |
| Modules/_hacl/Hacl_Hash_Blake2b_Simd256.o: $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2b_Simd256.c $(LIBHACL_BLAKE2_HEADERS) | |
| $(CC) -c $(LIBHACL_CFLAGS) $(LIBHACL_BLAKE2_SIMD256_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2b_Simd256.c | |
| Modules/_hacl/Hacl_Hash_Blake2b_Simd256_universal2.o: $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2b_Simd256_universal2.c $(LIBHACL_BLAKE2_HEADERS) | |
| $(CC) -c $(LIBHACL_CFLAGS) $(LIBHACL_BLAKE2_SIMD256_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Hash_Blake2b_Simd256_universal2.c | |
| $(LIBHACL_BLAKE2_LIB_STATIC): $(LIBHACL_BLAKE2_OBJS) | |
| -rm -f $@ | |
| $(AR) $(ARFLAGS) $@ $(LIBHACL_BLAKE2_OBJS) | |
| # Other HACL* cryptographic primitives | |
| Modules/_hacl/Hacl_HMAC.o: $(srcdir)/Modules/_hacl/Hacl_HMAC.c $(LIBHACL_HMAC_HEADERS) | |
| $(CC) -c $(LIBHACL_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_HMAC.c | |
| Modules/_hacl/Hacl_Streaming_HMAC.o: $(srcdir)/Modules/_hacl/Hacl_Streaming_HMAC.c $(LIBHACL_HMAC_HEADERS) | |
| $(CC) -Wno-unused-variable -c $(LIBHACL_CFLAGS) -o $@ $(srcdir)/Modules/_hacl/Hacl_Streaming_HMAC.c | |
| $(LIBHACL_HMAC_LIB_STATIC): $(LIBHACL_HMAC_OBJS) | |
| -rm -f $@ | |
| $(AR) $(ARFLAGS) $@ $(LIBHACL_HMAC_OBJS) | |
| ########################################################################## | |
| # create relative links from build/lib.platform/egg.so to Modules/egg.so | |
| # pybuilddir.txt is created too late. We cannot use it in Makefile | |
| # targets. ln --relative is not portable. | |
| .PHONY: sharedmods | |
| sharedmods: $(SHAREDMODS) pybuilddir.txt | |
| @target=`cat pybuilddir.txt`; \ | |
| $(MKDIR_P) $$target; \ | |
| for mod in X $(SHAREDMODS); do \ | |
| if test $$mod != X; then \ | |
| $(LN) -sf ../../$$mod $$target/`basename $$mod`; \ | |
| fi; \ | |
| done | |
| # dependency on BUILDPYTHON ensures that the target is run last | |
| .PHONY: checksharedmods | |
| checksharedmods: sharedmods $(PYTHON_FOR_BUILD_DEPS) $(BUILDPYTHON) | |
| @if [ -n "@MISSING_STDLIB_CONFIG@" ]; then \ | |
| $(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/Tools/build/check_extension_modules.py --generate-missing-stdlib-info --with-missing-stdlib-config="@MISSING_STDLIB_CONFIG@"; \ | |
| else \ | |
| $(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/Tools/build/check_extension_modules.py --generate-missing-stdlib-info; \ | |
| fi | |
| @$(RUNSHARED) $(PYTHON_FOR_BUILD) $(srcdir)/Tools/build/check_extension_modules.py | |
| .PHONY: rundsymutil | |
| rundsymutil: sharedmods $(PYTHON_FOR_BUILD_DEPS) $(BUILDPYTHON) | |
| @if [ ! -z $(DSYMUTIL) ] ; then \ | |
| echo $(DSYMUTIL_PATH) $(BUILDPYTHON); \ | |
| $(DSYMUTIL_PATH) $(BUILDPYTHON); \ | |
| if test -f $(LDLIBRARY); then \ | |
| echo $(DSYMUTIL_PATH) $(LDLIBRARY); \ | |
| $(DSYMUTIL_PATH) $(LDLIBRARY); \ | |
| fi; \ | |
| for mod in X $(SHAREDMODS); do \ | |
| if test $$mod != X; then \ | |
| echo $(DSYMUTIL_PATH) $$mod; \ | |
| $(DSYMUTIL_PATH) $$mod; \ | |
| fi; \ | |
| done \ | |
| fi | |
| Modules/Setup.local: | |
| @# Create empty Setup.local when file was deleted by user | |
| echo "# Edit this file for local setup changes" > $@ | |
| Modules/Setup.bootstrap: $(srcdir)/Modules/Setup.bootstrap.in config.status | |
| ./config.status $@ | |
| Modules/Setup.stdlib: $(srcdir)/Modules/Setup.stdlib.in config.status | |
| ./config.status $@ | |
| Makefile Modules/config.c: Makefile.pre \ | |
| $(srcdir)/Modules/config.c.in \ | |
| $(MAKESETUP) \ | |
| $(srcdir)/Modules/Setup \ | |
| Modules/Setup.local \ | |
| Modules/Setup.bootstrap \ | |
| Modules/Setup.stdlib | |
| $(MAKESETUP) -c $(srcdir)/Modules/config.c.in \ | |
| -s Modules \ | |
| Modules/Setup.local \ | |
| Modules/Setup.stdlib \ | |
| Modules/Setup.bootstrap \ | |
| $(srcdir)/Modules/Setup | |
| @mv config.c Modules | |
| @echo "The Makefile was updated, you may need to re-run make." | |
| .PHONY: regen-test-frozenmain | |
| regen-test-frozenmain: $(BUILDPYTHON) | |
| # Regenerate Programs/test_frozenmain.h | |
| # from Programs/test_frozenmain.py | |
| # using Programs/freeze_test_frozenmain.py | |
| $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Programs/freeze_test_frozenmain.py Programs/test_frozenmain.h | |
| .PHONY: regen-test-levenshtein | |
| regen-test-levenshtein: | |
| # Regenerate Lib/test/levenshtein_examples.json | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/build/generate_levenshtein_examples.py $(srcdir)/Lib/test/levenshtein_examples.json | |
| .PHONY: regen-re | |
| regen-re: $(BUILDPYTHON) | |
| # Regenerate Lib/re/_casefix.py | |
| # using Tools/build/generate_re_casefix.py | |
| $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/build/generate_re_casefix.py $(srcdir)/Lib/re/_casefix.py | |
| Programs/_testembed: Programs/_testembed.o $(LINK_PYTHON_DEPS) | |
| $(LINKCC) $(PY_CORE_EXE_LDFLAGS) $(LINKFORSHARED) -o $@ Programs/_testembed.o $(LINK_PYTHON_OBJS) $(LIBS) $(MODLIBS) $(SYSLIBS) | |
| ############################################################################ | |
| # "Bootstrap Python" used to run Programs/_freeze_module.py | |
| BOOTSTRAP_HEADERS = \ | |
| Python/frozen_modules/importlib._bootstrap.h \ | |
| Python/frozen_modules/importlib._bootstrap_external.h \ | |
| Python/frozen_modules/zipimport.h \ | |
| Python/frozen_modules/builtins.h | |
| Programs/_bootstrap_python.o: Programs/_bootstrap_python.c $(BOOTSTRAP_HEADERS) $(PYTHON_HEADERS) | |
| _bootstrap_python: $(LIBRARY_OBJS_OMIT_FROZEN) Programs/_bootstrap_python.o Modules/getpath.o Modules/Setup.local | |
| $(LINKCC) $(PY_LDFLAGS_NOLTO) -o $@ $(LIBRARY_OBJS_OMIT_FROZEN) \ | |
| Programs/_bootstrap_python.o Modules/getpath.o $(LIBS) $(MODLIBS) $(SYSLIBS) | |
| # Dummy pybuilddir.txt is needed for _bootstrap_python to be runnable | |
| @echo "none" > ./pybuilddir.txt | |
| ############################################################################ | |
| # frozen modules (including importlib) | |
| # | |
| # Freezing is a multi step process. It works differently for standard builds | |
| # and cross builds. Standard builds use Programs/_freeze_module and | |
| # _bootstrap_python for freezing, so users can build Python | |
| # without an existing Python installation. Cross builds cannot execute | |
| # compiled binaries and therefore rely on an external build Python | |
| # interpreter. The build interpreter must have same version and same bytecode | |
| # as the host (target) binary. | |
| # | |
| # Standard build process: | |
| # 1) compile minimal core objects for Py_Compile*() and PyMarshal_Write*(). | |
| # 2) build Programs/_freeze_module binary. | |
| # 3) create frozen module headers for importlib and getpath. | |
| # 4) build _bootstrap_python binary. | |
| # 5) create remaining frozen module headers with | |
| # ``./_bootstrap_python Programs/_freeze_module.py``. The pure Python | |
| # script is used to test the cross compile code path. | |
| # | |
| # Cross compile process: | |
| # 1) create all frozen module headers with external build Python and | |
| # Programs/_freeze_module.py script. | |
| # | |
| # FROZEN_FILES_* are auto-generated by Tools/build/freeze_modules.py. | |
| FROZEN_FILES_IN = \ | |
| Lib/importlib/_bootstrap.py \ | |
| Lib/importlib/_bootstrap_external.py \ | |
| Lib/zipimport.py \ | |
| Lib/_pybuiltins.py \ | |
| Lib/abc.py \ | |
| Lib/codecs.py \ | |
| Lib/io.py \ | |
| Lib/_collections_abc.py \ | |
| Lib/_sitebuiltins.py \ | |
| Lib/genericpath.py \ | |
| Lib/ntpath.py \ | |
| Lib/posixpath.py \ | |
| Lib/os.py \ | |
| Lib/site.py \ | |
| Lib/stat.py \ | |
| Lib/linecache.py \ | |
| Lib/importlib/util.py \ | |
| Lib/importlib/machinery.py \ | |
| Lib/runpy.py \ | |
| Lib/__hello__.py \ | |
| Lib/__phello__/__init__.py \ | |
| Lib/__phello__/ham/__init__.py \ | |
| Lib/__phello__/ham/eggs.py \ | |
| Lib/__phello__/spam.py \ | |
| Tools/freeze/flag.py | |
| # End FROZEN_FILES_IN | |
| FROZEN_FILES_OUT = \ | |
| Python/frozen_modules/importlib._bootstrap.h \ | |
| Python/frozen_modules/importlib._bootstrap_external.h \ | |
| Python/frozen_modules/zipimport.h \ | |
| Python/frozen_modules/builtins.h \ | |
| Python/frozen_modules/abc.h \ | |
| Python/frozen_modules/codecs.h \ | |
| Python/frozen_modules/io.h \ | |
| Python/frozen_modules/_collections_abc.h \ | |
| Python/frozen_modules/_sitebuiltins.h \ | |
| Python/frozen_modules/genericpath.h \ | |
| Python/frozen_modules/ntpath.h \ | |
| Python/frozen_modules/posixpath.h \ | |
| Python/frozen_modules/os.h \ | |
| Python/frozen_modules/site.h \ | |
| Python/frozen_modules/stat.h \ | |
| Python/frozen_modules/linecache.h \ | |
| Python/frozen_modules/importlib.util.h \ | |
| Python/frozen_modules/importlib.machinery.h \ | |
| Python/frozen_modules/runpy.h \ | |
| Python/frozen_modules/__hello__.h \ | |
| Python/frozen_modules/__phello__.h \ | |
| Python/frozen_modules/__phello__.ham.h \ | |
| Python/frozen_modules/__phello__.ham.eggs.h \ | |
| Python/frozen_modules/__phello__.spam.h \ | |
| Python/frozen_modules/frozen_only.h | |
| # End FROZEN_FILES_OUT | |
| Programs/_freeze_module.o: Programs/_freeze_module.c Makefile | |
| Modules/getpath_noop.o: $(srcdir)/Modules/getpath_noop.c Makefile | |
| Programs/_freeze_module: Programs/_freeze_module.o Modules/getpath_noop.o $(LIBRARY_OBJS_OMIT_FROZEN) | |
| $(LINKCC) $(PY_CORE_LDFLAGS) -o $@ Programs/_freeze_module.o Modules/getpath_noop.o $(LIBRARY_OBJS_OMIT_FROZEN) $(LIBS) $(MODLIBS) $(SYSLIBS) | |
| # We manually freeze getpath.py rather than through freeze_modules | |
| Python/frozen_modules/getpath.h: Modules/getpath.py $(FREEZE_MODULE_BOOTSTRAP_DEPS) | |
| $(FREEZE_MODULE_BOOTSTRAP) getpath $(srcdir)/Modules/getpath.py Python/frozen_modules/getpath.h | |
| # BEGIN: freezing modules | |
| Python/frozen_modules/importlib._bootstrap.h: Lib/importlib/_bootstrap.py $(FREEZE_MODULE_BOOTSTRAP_DEPS) | |
| $(FREEZE_MODULE_BOOTSTRAP) importlib._bootstrap $(srcdir)/Lib/importlib/_bootstrap.py Python/frozen_modules/importlib._bootstrap.h | |
| Python/frozen_modules/importlib._bootstrap_external.h: Lib/importlib/_bootstrap_external.py $(FREEZE_MODULE_BOOTSTRAP_DEPS) | |
| $(FREEZE_MODULE_BOOTSTRAP) importlib._bootstrap_external $(srcdir)/Lib/importlib/_bootstrap_external.py Python/frozen_modules/importlib._bootstrap_external.h | |
| Python/frozen_modules/zipimport.h: Lib/zipimport.py $(FREEZE_MODULE_BOOTSTRAP_DEPS) | |
| $(FREEZE_MODULE_BOOTSTRAP) zipimport $(srcdir)/Lib/zipimport.py Python/frozen_modules/zipimport.h | |
| Python/frozen_modules/builtins.h: Lib/_pybuiltins.py $(FREEZE_MODULE_BOOTSTRAP_DEPS) | |
| $(FREEZE_MODULE_BOOTSTRAP) builtins $(srcdir)/Lib/_pybuiltins.py Python/frozen_modules/builtins.h | |
| Python/frozen_modules/abc.h: Lib/abc.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) abc $(srcdir)/Lib/abc.py Python/frozen_modules/abc.h | |
| Python/frozen_modules/codecs.h: Lib/codecs.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) codecs $(srcdir)/Lib/codecs.py Python/frozen_modules/codecs.h | |
| Python/frozen_modules/io.h: Lib/io.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) io $(srcdir)/Lib/io.py Python/frozen_modules/io.h | |
| Python/frozen_modules/_collections_abc.h: Lib/_collections_abc.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) _collections_abc $(srcdir)/Lib/_collections_abc.py Python/frozen_modules/_collections_abc.h | |
| Python/frozen_modules/_sitebuiltins.h: Lib/_sitebuiltins.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) _sitebuiltins $(srcdir)/Lib/_sitebuiltins.py Python/frozen_modules/_sitebuiltins.h | |
| Python/frozen_modules/genericpath.h: Lib/genericpath.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) genericpath $(srcdir)/Lib/genericpath.py Python/frozen_modules/genericpath.h | |
| Python/frozen_modules/ntpath.h: Lib/ntpath.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) ntpath $(srcdir)/Lib/ntpath.py Python/frozen_modules/ntpath.h | |
| Python/frozen_modules/posixpath.h: Lib/posixpath.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) posixpath $(srcdir)/Lib/posixpath.py Python/frozen_modules/posixpath.h | |
| Python/frozen_modules/os.h: Lib/os.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) os $(srcdir)/Lib/os.py Python/frozen_modules/os.h | |
| Python/frozen_modules/site.h: Lib/site.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) site $(srcdir)/Lib/site.py Python/frozen_modules/site.h | |
| Python/frozen_modules/stat.h: Lib/stat.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) stat $(srcdir)/Lib/stat.py Python/frozen_modules/stat.h | |
| Python/frozen_modules/linecache.h: Lib/linecache.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) linecache $(srcdir)/Lib/linecache.py Python/frozen_modules/linecache.h | |
| Python/frozen_modules/importlib.util.h: Lib/importlib/util.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) importlib.util $(srcdir)/Lib/importlib/util.py Python/frozen_modules/importlib.util.h | |
| Python/frozen_modules/importlib.machinery.h: Lib/importlib/machinery.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) importlib.machinery $(srcdir)/Lib/importlib/machinery.py Python/frozen_modules/importlib.machinery.h | |
| Python/frozen_modules/runpy.h: Lib/runpy.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) runpy $(srcdir)/Lib/runpy.py Python/frozen_modules/runpy.h | |
| Python/frozen_modules/__hello__.h: Lib/__hello__.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) __hello__ $(srcdir)/Lib/__hello__.py Python/frozen_modules/__hello__.h | |
| Python/frozen_modules/__phello__.h: Lib/__phello__/__init__.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) __phello__ $(srcdir)/Lib/__phello__/__init__.py Python/frozen_modules/__phello__.h | |
| Python/frozen_modules/__phello__.ham.h: Lib/__phello__/ham/__init__.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) __phello__.ham $(srcdir)/Lib/__phello__/ham/__init__.py Python/frozen_modules/__phello__.ham.h | |
| Python/frozen_modules/__phello__.ham.eggs.h: Lib/__phello__/ham/eggs.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) __phello__.ham.eggs $(srcdir)/Lib/__phello__/ham/eggs.py Python/frozen_modules/__phello__.ham.eggs.h | |
| Python/frozen_modules/__phello__.spam.h: Lib/__phello__/spam.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) __phello__.spam $(srcdir)/Lib/__phello__/spam.py Python/frozen_modules/__phello__.spam.h | |
| Python/frozen_modules/frozen_only.h: Tools/freeze/flag.py $(FREEZE_MODULE_DEPS) | |
| $(FREEZE_MODULE) frozen_only $(srcdir)/Tools/freeze/flag.py Python/frozen_modules/frozen_only.h | |
| # END: freezing modules | |
| Tools/build/freeze_modules.py: $(FREEZE_MODULE) | |
| .PHONY: regen-frozen | |
| regen-frozen: Tools/build/freeze_modules.py $(FROZEN_FILES_IN) | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/build/freeze_modules.py --frozen-modules | |
| @echo "The Makefile was updated, you may need to re-run make." | |
| # We keep this renamed target around for folks with muscle memory. | |
| .PHONY: regen-importlib | |
| regen-importlib: regen-frozen | |
| ############################################################################ | |
| # Global objects | |
| # Dependencies which can add and/or remove _Py_ID() identifiers: | |
| # - "make clinic" | |
| .PHONY: regen-global-objects | |
| regen-global-objects: $(srcdir)/Tools/build/generate_global_objects.py clinic | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/build/generate_global_objects.py | |
| ############################################################################ | |
| # ABI | |
| .PHONY: regen-abidump | |
| regen-abidump: all | |
| @$(MKDIR_P) $(srcdir)/Doc/data/ | |
| abidw "libpython$(LDVERSION).so" --no-architecture --out-file $(srcdir)/Doc/data/python$(LDVERSION).abi.new | |
| @$(UPDATE_FILE) --create $(srcdir)/Doc/data/python$(LDVERSION).abi $(srcdir)/Doc/data/python$(LDVERSION).abi.new | |
| .PHONY: check-abidump | |
| check-abidump: all | |
| abidiff $(srcdir)/Doc/data/python$(LDVERSION).abi "libpython$(LDVERSION).so" --drop-private-types --no-architecture --no-added-syms --suppressions $(srcdir)/Misc/libabigail.abignore | |
| .PHONY: regen-limited-abi | |
| regen-limited-abi: all | |
| $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/build/stable_abi.py --generate-all | |
| ############################################################################ | |
| # Regenerate Unicode Data | |
| .PHONY: regen-unicodedata | |
| regen-unicodedata: | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/unicode/makeunicodedata.py | |
| ############################################################################ | |
| # Regenerate all generated files | |
| # "clinic" is regenerated implicitly via "regen-global-objects". | |
| .PHONY: regen-all | |
| regen-all: regen-cases regen-slots \ | |
| regen-token regen-ast regen-keyword regen-sre regen-frozen \ | |
| regen-pegen-metaparser regen-pegen regen-test-frozenmain \ | |
| regen-test-levenshtein regen-global-objects | |
| @echo | |
| @echo "Note: make regen-stdlib-module-names, make regen-limited-abi, " | |
| @echo "make regen-configure, make regen-sbom, and make regen-unicodedata should be run manually" | |
| ############################################################################ | |
| # Special rules for object files | |
| Modules/getbuildinfo.o: $(PARSER_OBJS) \ | |
| $(OBJECT_OBJS) \ | |
| $(PYTHON_OBJS) \ | |
| $(MODULE_OBJS) \ | |
| $(MODOBJS) \ | |
| $(DTRACE_OBJS) \ | |
| $(srcdir)/Modules/getbuildinfo.c | |
| $(CC) -c $(PY_CORE_CFLAGS) \ | |
| -DGITVERSION="\"`LC_ALL=C $(GITVERSION)`\"" \ | |
| -DGITTAG="\"`LC_ALL=C $(GITTAG)`\"" \ | |
| -DGITBRANCH="\"`LC_ALL=C $(GITBRANCH)`\"" \ | |
| -o $@ $(srcdir)/Modules/getbuildinfo.c | |
| Modules/getpath.o: $(srcdir)/Modules/getpath.c Python/frozen_modules/getpath.h Makefile $(PYTHON_HEADERS) | |
| $(CC) -c $(PY_CORE_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ | |
| -DPREFIX='"$(host_prefix)"' \ | |
| -DEXEC_PREFIX='"$(host_exec_prefix)"' \ | |
| -DVERSION='"$(VERSION)"' \ | |
| -DVPATH='"$(VPATH)"' \ | |
| -DPLATLIBDIR='"$(PLATLIBDIR)"' \ | |
| -DPYTHONFRAMEWORK='"$(PYTHONFRAMEWORK)"' \ | |
| -o $@ $(srcdir)/Modules/getpath.c | |
| Programs/python.o: $(srcdir)/Programs/python.c | |
| $(CC) -c $(PY_CORE_CFLAGS) -o $@ $(srcdir)/Programs/python.c | |
| Programs/_testembed.o: $(srcdir)/Programs/_testembed.c Programs/test_frozenmain.h $(PYTHON_HEADERS) | |
| $(CC) -c $(PY_CORE_CFLAGS) -o $@ $(srcdir)/Programs/_testembed.c | |
| Modules/_sre/sre.o: $(srcdir)/Modules/_sre/sre.c $(srcdir)/Modules/_sre/sre.h $(srcdir)/Modules/_sre/sre_constants.h $(srcdir)/Modules/_sre/sre_lib.h | |
| Modules/posixmodule.o: $(srcdir)/Modules/posixmodule.c $(srcdir)/Modules/posixmodule.h | |
| Modules/grpmodule.o: $(srcdir)/Modules/grpmodule.c $(srcdir)/Modules/posixmodule.h | |
| Modules/pwdmodule.o: $(srcdir)/Modules/pwdmodule.c $(srcdir)/Modules/posixmodule.h | |
| Modules/signalmodule.o: $(srcdir)/Modules/signalmodule.c $(srcdir)/Modules/posixmodule.h | |
| Modules/_interpretersmodule.o: $(srcdir)/Modules/_interpretersmodule.c $(srcdir)/Modules/_interpreters_common.h | |
| Modules/_interpqueuesmodule.o: $(srcdir)/Modules/_interpqueuesmodule.c $(srcdir)/Modules/_interpreters_common.h | |
| Modules/_interpchannelsmodule.o: $(srcdir)/Modules/_interpchannelsmodule.c $(srcdir)/Modules/_interpreters_common.h | |
| Python/crossinterp.o: $(srcdir)/Python/crossinterp.c $(srcdir)/Python/crossinterp_data_lookup.h $(srcdir)/Python/crossinterp_exceptions.h | |
| Python/initconfig.o: $(srcdir)/Python/initconfig.c $(srcdir)/Python/config_common.h | |
| Python/interpconfig.o: $(srcdir)/Python/interpconfig.c $(srcdir)/Python/config_common.h | |
| Python/dynload_shlib.o: $(srcdir)/Python/dynload_shlib.c Makefile | |
| $(CC) -c $(PY_CORE_CFLAGS) \ | |
| -DSOABI='"$(SOABI)"' \ | |
| -o $@ $(srcdir)/Python/dynload_shlib.c | |
| Python/dynload_hpux.o: $(srcdir)/Python/dynload_hpux.c Makefile | |
| $(CC) -c $(PY_CORE_CFLAGS) \ | |
| -DSHLIB_EXT='"$(EXT_SUFFIX)"' \ | |
| -o $@ $(srcdir)/Python/dynload_hpux.c | |
| Python/sysmodule.o: $(srcdir)/Python/sysmodule.c Makefile $(srcdir)/Include/pydtrace.h | |
| $(CC) -c $(PY_CORE_CFLAGS) \ | |
| -DABIFLAGS='"$(ABIFLAGS)"' \ | |
| $(MULTIARCH_CPPFLAGS) \ | |
| -o $@ $(srcdir)/Python/sysmodule.c | |
| $(IO_OBJS): $(IO_H) | |
| .PHONY: regen-pegen-metaparser | |
| regen-pegen-metaparser: | |
| @$(MKDIR_P) $(srcdir)/Tools/peg_generator/pegen | |
| PYTHONPATH=$(srcdir)/Tools/peg_generator $(PYTHON_FOR_REGEN) -m pegen -q python \ | |
| $(srcdir)/Tools/peg_generator/pegen/metagrammar.gram \ | |
| -o $(srcdir)/Tools/peg_generator/pegen/grammar_parser.py.new | |
| $(UPDATE_FILE) $(srcdir)/Tools/peg_generator/pegen/grammar_parser.py \ | |
| $(srcdir)/Tools/peg_generator/pegen/grammar_parser.py.new | |
| .PHONY: regen-pegen | |
| regen-pegen: | |
| @$(MKDIR_P) $(srcdir)/Parser | |
| @$(MKDIR_P) $(srcdir)/Parser/tokenizer | |
| @$(MKDIR_P) $(srcdir)/Parser/lexer | |
| PYTHONPATH=$(srcdir)/Tools/peg_generator $(PYTHON_FOR_REGEN) -m pegen -q c \ | |
| $(srcdir)/Grammar/python.gram \ | |
| $(srcdir)/Grammar/Tokens \ | |
| -o $(srcdir)/Parser/parser.c.new | |
| $(UPDATE_FILE) --create $(srcdir)/Parser/parser.c $(srcdir)/Parser/parser.c.new | |
| .PHONY: regen-ast | |
| regen-ast: | |
| # Regenerate 3 files using Parser/asdl_c.py: | |
| # - Include/internal/pycore_ast.h | |
| # - Include/internal/pycore_ast_state.h | |
| # - Python/Python-ast.c | |
| $(MKDIR_P) $(srcdir)/Include | |
| $(MKDIR_P) $(srcdir)/Python | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Parser/asdl_c.py \ | |
| $(srcdir)/Parser/Python.asdl \ | |
| -H $(srcdir)/Include/internal/pycore_ast.h.new \ | |
| -I $(srcdir)/Include/internal/pycore_ast_state.h.new \ | |
| -C $(srcdir)/Python/Python-ast.c.new | |
| $(UPDATE_FILE) $(srcdir)/Include/internal/pycore_ast.h $(srcdir)/Include/internal/pycore_ast.h.new | |
| $(UPDATE_FILE) $(srcdir)/Include/internal/pycore_ast_state.h $(srcdir)/Include/internal/pycore_ast_state.h.new | |
| $(UPDATE_FILE) $(srcdir)/Python/Python-ast.c $(srcdir)/Python/Python-ast.c.new | |
| .PHONY: regen-token | |
| regen-token: | |
| # Regenerate Doc/library/token-list.inc from Grammar/Tokens | |
| # using Tools/build/generate_token.py | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/build/generate_token.py rst \ | |
| $(srcdir)/Grammar/Tokens \ | |
| $(srcdir)/Doc/library/token-list.inc \ | |
| $(srcdir)/Doc/library/token.rst | |
| # Regenerate Include/internal/pycore_token.h from Grammar/Tokens | |
| # using Tools/build/generate_token.py | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/build/generate_token.py h \ | |
| $(srcdir)/Grammar/Tokens \ | |
| $(srcdir)/Include/internal/pycore_token.h | |
| # Regenerate Parser/token.c from Grammar/Tokens | |
| # using Tools/build/generate_token.py | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/build/generate_token.py c \ | |
| $(srcdir)/Grammar/Tokens \ | |
| $(srcdir)/Parser/token.c | |
| # Regenerate Lib/token.py from Grammar/Tokens | |
| # using Tools/build/generate_token.py | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/build/generate_token.py py \ | |
| $(srcdir)/Grammar/Tokens \ | |
| $(srcdir)/Lib/token.py | |
| .PHONY: regen-keyword | |
| regen-keyword: | |
| # Regenerate Lib/keyword.py from Grammar/python.gram and Grammar/Tokens | |
| # using Tools/peg_generator/pegen | |
| PYTHONPATH=$(srcdir)/Tools/peg_generator $(PYTHON_FOR_REGEN) -m pegen.keywordgen \ | |
| $(srcdir)/Grammar/python.gram \ | |
| $(srcdir)/Grammar/Tokens \ | |
| $(srcdir)/Lib/keyword.py.new | |
| $(UPDATE_FILE) $(srcdir)/Lib/keyword.py $(srcdir)/Lib/keyword.py.new | |
| .PHONY: regen-stdlib-module-names | |
| regen-stdlib-module-names: all Programs/_testembed | |
| # Regenerate Python/stdlib_module_names.h | |
| # using Tools/build/generate_stdlib_module_names.py | |
| $(RUNSHARED) ./$(BUILDPYTHON) \ | |
| $(srcdir)/Tools/build/generate_stdlib_module_names.py \ | |
| > $(srcdir)/Python/stdlib_module_names.h.new | |
| $(UPDATE_FILE) $(srcdir)/Python/stdlib_module_names.h $(srcdir)/Python/stdlib_module_names.h.new | |
| .PHONY: regen-sre | |
| regen-sre: | |
| # Regenerate Modules/_sre/sre_constants.h and Modules/_sre/sre_targets.h | |
| # from Lib/re/_constants.py using Tools/build/generate_sre_constants.py | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/build/generate_sre_constants.py \ | |
| $(srcdir)/Lib/re/_constants.py \ | |
| $(srcdir)/Modules/_sre/sre_constants.h \ | |
| $(srcdir)/Modules/_sre/sre_targets.h | |
| Python/compile.o Python/codegen.o Python/symtable.o Python/ast_unparse.o Python/ast.o Python/future.o: $(srcdir)/Include/internal/pycore_ast.h $(srcdir)/Include/internal/pycore_ast.h | |
| Python/getplatform.o: $(srcdir)/Python/getplatform.c | |
| $(CC) -c $(PY_CORE_CFLAGS) -DPLATFORM='"$(MACHDEP)"' -o $@ $(srcdir)/Python/getplatform.c | |
| Python/importdl.o: $(srcdir)/Python/importdl.c | |
| $(CC) -c $(PY_CORE_CFLAGS) -I$(DLINCLDIR) -o $@ $(srcdir)/Python/importdl.c | |
| Objects/unicodectype.o: $(srcdir)/Objects/unicodectype.c \ | |
| $(srcdir)/Objects/unicodetype_db.h | |
| BYTESTR_DEPS = \ | |
| $(srcdir)/Objects/stringlib/count.h \ | |
| $(srcdir)/Objects/stringlib/ctype.h \ | |
| $(srcdir)/Objects/stringlib/fastsearch.h \ | |
| $(srcdir)/Objects/stringlib/find.h \ | |
| $(srcdir)/Objects/stringlib/join.h \ | |
| $(srcdir)/Objects/stringlib/partition.h \ | |
| $(srcdir)/Objects/stringlib/split.h \ | |
| $(srcdir)/Objects/stringlib/stringdefs.h \ | |
| $(srcdir)/Objects/stringlib/transmogrify.h | |
| UNICODE_DEPS = \ | |
| $(srcdir)/Objects/stringlib/asciilib.h \ | |
| $(srcdir)/Objects/stringlib/codecs.h \ | |
| $(srcdir)/Objects/stringlib/count.h \ | |
| $(srcdir)/Objects/stringlib/fastsearch.h \ | |
| $(srcdir)/Objects/stringlib/find.h \ | |
| $(srcdir)/Objects/stringlib/find_max_char.h \ | |
| $(srcdir)/Objects/stringlib/partition.h \ | |
| $(srcdir)/Objects/stringlib/replace.h \ | |
| $(srcdir)/Objects/stringlib/repr.h \ | |
| $(srcdir)/Objects/stringlib/split.h \ | |
| $(srcdir)/Objects/stringlib/ucs1lib.h \ | |
| $(srcdir)/Objects/stringlib/ucs2lib.h \ | |
| $(srcdir)/Objects/stringlib/ucs4lib.h \ | |
| $(srcdir)/Objects/stringlib/undef.h \ | |
| $(srcdir)/Objects/stringlib/unicode_format.h | |
| Objects/bytes_methods.o: $(srcdir)/Objects/bytes_methods.c $(BYTESTR_DEPS) | |
| Objects/bytesobject.o: $(srcdir)/Objects/bytesobject.c $(BYTESTR_DEPS) | |
| Objects/bytearrayobject.o: $(srcdir)/Objects/bytearrayobject.c $(BYTESTR_DEPS) | |
| Objects/unicode_format.o: $(srcdir)/Objects/unicode_format.c $(UNICODE_DEPS) | |
| Objects/unicodeobject.o: $(srcdir)/Objects/unicodeobject.c $(UNICODE_DEPS) | |
| Objects/dictobject.o: $(srcdir)/Objects/stringlib/eq.h | |
| Objects/setobject.o: $(srcdir)/Objects/stringlib/eq.h | |
| Objects/obmalloc.o: $(srcdir)/Objects/mimalloc/alloc.c \ | |
| $(srcdir)/Objects/mimalloc/alloc-aligned.c \ | |
| $(srcdir)/Objects/mimalloc/alloc-posix.c \ | |
| $(srcdir)/Objects/mimalloc/arena.c \ | |
| $(srcdir)/Objects/mimalloc/bitmap.c \ | |
| $(srcdir)/Objects/mimalloc/heap.c \ | |
| $(srcdir)/Objects/mimalloc/init.c \ | |
| $(srcdir)/Objects/mimalloc/options.c \ | |
| $(srcdir)/Objects/mimalloc/os.c \ | |
| $(srcdir)/Objects/mimalloc/page.c \ | |
| $(srcdir)/Objects/mimalloc/random.c \ | |
| $(srcdir)/Objects/mimalloc/segment.c \ | |
| $(srcdir)/Objects/mimalloc/segment-map.c \ | |
| $(srcdir)/Objects/mimalloc/stats.c \ | |
| $(srcdir)/Objects/mimalloc/prim/prim.c \ | |
| $(srcdir)/Objects/mimalloc/prim/osx/prim.c \ | |
| $(srcdir)/Objects/mimalloc/prim/unix/prim.c \ | |
| $(srcdir)/Objects/mimalloc/prim/wasi/prim.c | |
| Objects/mimalloc/page.o: $(srcdir)/Objects/mimalloc/page-queue.c | |
| # Regenerate various files from Python/bytecodes.c | |
| # Pass CASESFLAG=-l to insert #line directives in the output | |
| .PHONY: regen-cases | |
| regen-cases: \ | |
| regen-opcode-ids regen-opcode-targets regen-uop-ids regen-opcode-metadata-py \ | |
| regen-generated-cases regen-executor-cases regen-optimizer-cases regen-record-functions \ | |
| regen-opcode-metadata regen-uop-metadata regen-test-cases regen-test-opcode-targets | |
| .PHONY: regen-opcode-ids | |
| regen-opcode-ids: | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/cases_generator/opcode_id_generator.py \ | |
| -o $(srcdir)/Include/opcode_ids.h.new $(srcdir)/Python/bytecodes.c | |
| $(UPDATE_FILE) $(srcdir)/Include/opcode_ids.h $(srcdir)/Include/opcode_ids.h.new | |
| .PHONY: regen-opcode-targets | |
| regen-opcode-targets: | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/cases_generator/target_generator.py \ | |
| -o $(srcdir)/Python/opcode_targets.h.new $(srcdir)/Python/bytecodes.c | |
| $(UPDATE_FILE) $(srcdir)/Python/opcode_targets.h $(srcdir)/Python/opcode_targets.h.new | |
| .PHONY: regen-uop-ids | |
| regen-uop-ids: | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/cases_generator/uop_id_generator.py \ | |
| -o $(srcdir)/Include/internal/pycore_uop_ids.h.new $(srcdir)/Python/bytecodes.c | |
| $(UPDATE_FILE) $(srcdir)/Include/internal/pycore_uop_ids.h $(srcdir)/Include/internal/pycore_uop_ids.h.new | |
| .PHONY: regen-opcode-metadata-py | |
| regen-opcode-metadata-py: | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/cases_generator/py_metadata_generator.py \ | |
| -o $(srcdir)/Lib/_opcode_metadata.py.new $(srcdir)/Python/bytecodes.c | |
| $(UPDATE_FILE) $(srcdir)/Lib/_opcode_metadata.py $(srcdir)/Lib/_opcode_metadata.py.new | |
| .PHONY: regen-generated-cases | |
| regen-generated-cases: | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/cases_generator/tier1_generator.py \ | |
| -o $(srcdir)/Python/generated_cases.c.h.new $(srcdir)/Python/bytecodes.c | |
| $(UPDATE_FILE) $(srcdir)/Python/generated_cases.c.h $(srcdir)/Python/generated_cases.c.h.new | |
| .PHONY: regen-record-functions | |
| regen-record-functions: | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/cases_generator/record_function_generator.py \ | |
| -o $(srcdir)/Python/record_functions.c.h.new $(srcdir)/Python/bytecodes.c | |
| $(UPDATE_FILE) $(srcdir)/Python/record_functions.c.h $(srcdir)/Python/record_functions.c.h.new | |
| .PHONY: regen-test-cases | |
| regen-test-cases: | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/cases_generator/tier1_generator.py \ | |
| -o $(srcdir)/Modules/_testinternalcapi/test_cases.c.h.new $(srcdir)/Python/bytecodes.c \ | |
| $(srcdir)/Modules/_testinternalcapi/testbytecodes.c | |
| $(UPDATE_FILE) $(srcdir)/Modules/_testinternalcapi/test_cases.c.h $(srcdir)/Modules/_testinternalcapi/test_cases.c.h.new | |
| .PHONY: regen-test-opcode-targets | |
| regen-test-opcode-targets: | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/cases_generator/target_generator.py \ | |
| -o $(srcdir)/Modules/_testinternalcapi/test_targets.h.new $(srcdir)/Python/bytecodes.c \ | |
| $(srcdir)/Modules/_testinternalcapi/testbytecodes.c | |
| $(UPDATE_FILE) $(srcdir)/Modules/_testinternalcapi/test_targets.h $(srcdir)/Modules/_testinternalcapi/test_targets.h.new | |
| .PHONY: regen-executor-cases | |
| regen-executor-cases: | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/cases_generator/tier2_generator.py \ | |
| -o $(srcdir)/Python/executor_cases.c.h.new $(srcdir)/Python/bytecodes.c | |
| $(UPDATE_FILE) $(srcdir)/Python/executor_cases.c.h $(srcdir)/Python/executor_cases.c.h.new | |
| .PHONY: regen-optimizer-cases | |
| regen-optimizer-cases: | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/cases_generator/optimizer_generator.py \ | |
| -o $(srcdir)/Python/optimizer_cases.c.h.new \ | |
| $(srcdir)/Python/optimizer_bytecodes.c \ | |
| $(srcdir)/Python/bytecodes.c | |
| $(UPDATE_FILE) $(srcdir)/Python/optimizer_cases.c.h $(srcdir)/Python/optimizer_cases.c.h.new | |
| .PHONY: regen-opcode-metadata | |
| regen-opcode-metadata: | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/cases_generator/opcode_metadata_generator.py \ | |
| -o $(srcdir)/Include/internal/pycore_opcode_metadata.h.new $(srcdir)/Python/bytecodes.c | |
| $(UPDATE_FILE) $(srcdir)/Include/internal/pycore_opcode_metadata.h $(srcdir)/Include/internal/pycore_opcode_metadata.h.new | |
| .PHONY: regen-uop-metadata | |
| regen-uop-metadata: | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/cases_generator/uop_metadata_generator.py -o \ | |
| $(srcdir)/Include/internal/pycore_uop_metadata.h.new $(srcdir)/Python/bytecodes.c | |
| $(UPDATE_FILE) $(srcdir)/Include/internal/pycore_uop_metadata.h $(srcdir)/Include/internal/pycore_uop_metadata.h.new | |
| Python/compile.o Python/codegen.o Python/assemble.o Python/flowgraph.o Python/instruction_sequence.o: \ | |
| $(srcdir)/Include/internal/pycore_compile.h \ | |
| $(srcdir)/Include/internal/pycore_flowgraph.h \ | |
| $(srcdir)/Include/internal/pycore_instruction_sequence.h \ | |
| $(srcdir)/Include/internal/pycore_opcode_metadata.h \ | |
| $(srcdir)/Include/internal/pycore_opcode_utils.h | |
| Python/ceval.o: \ | |
| $(srcdir)/Python/ceval_macros.h \ | |
| $(srcdir)/Python/condvar.h \ | |
| $(srcdir)/Python/generated_cases.c.h \ | |
| $(srcdir)/Python/executor_cases.c.h \ | |
| $(srcdir)/Python/opcode_targets.h \ | |
| $(srcdir)/Python/record_functions.c.h | |
| Python/flowgraph.o: \ | |
| $(srcdir)/Include/internal/pycore_opcode_metadata.h | |
| Python/optimizer.o: \ | |
| $(srcdir)/Python/executor_cases.c.h \ | |
| $(srcdir)/Include/internal/pycore_opcode_metadata.h \ | |
| $(srcdir)/Include/internal/pycore_optimizer.h | |
| Python/optimizer_analysis.o: \ | |
| $(srcdir)/Include/internal/pycore_opcode_metadata.h \ | |
| $(srcdir)/Include/internal/pycore_optimizer.h \ | |
| $(srcdir)/Python/optimizer_cases.c.h | |
| Python/frozen.o: $(FROZEN_FILES_OUT) | |
| # Generate DTrace probe macros, then rename them (PYTHON_ -> PyDTrace_) to | |
| # follow our naming conventions. dtrace(1) uses the output filename to generate | |
| # an include guard, so we can't use a pipeline to transform its output. | |
| Include/pydtrace_probes.h: $(srcdir)/Include/pydtrace.d | |
| $(MKDIR_P) Include | |
| CC="$(CC)" CFLAGS="$(CFLAGS)" $(DTRACE) $(DFLAGS) -o $@ -h -s $(srcdir)/Include/pydtrace.d | |
| : sed in-place edit with POSIX-only tools | |
| sed 's/PYTHON_/PyDTrace_/' $@ > $@.tmp | |
| mv $@.tmp $@ | |
| Python/ceval.o: $(srcdir)/Include/pydtrace.h | |
| Python/gc.o: $(srcdir)/Include/pydtrace.h | |
| Python/import.o: $(srcdir)/Include/pydtrace.h | |
| Python/pydtrace.o: $(srcdir)/Include/pydtrace.d $(DTRACE_DEPS) | |
| CC="$(CC)" CFLAGS="$(CFLAGS)" $(DTRACE) $(DFLAGS) -o $@ -G -s $(srcdir)/Include/pydtrace.d $(DTRACE_DEPS) | |
| .PHONY: regen-typeslots | |
| regen-typeslots: | |
| echo 'NOTE: "regen-typeslots" was renamed to "regen-slots"' | |
| $(MAKE) regen-slots | |
| .PHONY: regen-slots | |
| regen-slots: Python/slots.toml | |
| # Regenerate {Python,Include}/slots_generated.{c,h} | |
| # from Python/slots.toml using Tools/build/generate_slots.py | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/build/generate_slots.py \ | |
| --generate-all | |
| $(LIBRARY_OBJS) $(MODOBJS) Programs/python.o: $(PYTHON_HEADERS) | |
| ###################################################################### | |
| TESTOPTS= $(EXTRATESTOPTS) | |
| TESTPYTHON= $(RUNSHARED) $(PYTHON_FOR_BUILD) $(TESTPYTHONOPTS) | |
| TESTRUNNER= $(TESTPYTHON) -m test | |
| TESTTIMEOUT= | |
| # Remove "test_python_*" directories of previous failed test jobs. | |
| # Pass TESTOPTS options because it can contain --tempdir option. | |
| .PHONY: cleantest | |
| cleantest: all | |
| $(TESTRUNNER) $(TESTOPTS) --cleanup | |
| # Run a basic set of regression tests. | |
| # This excludes some tests that are particularly resource-intensive. | |
| # Similar to buildbottest, but use --fast-ci option, instead of --slow-ci. | |
| .PHONY: test | |
| test: all | |
| $(TESTRUNNER) --fast-ci -u-gui --timeout=$(TESTTIMEOUT) $(TESTOPTS) | |
| # Run a basic set of regression tests inside the CI. | |
| # This excludes some tests that are particularly resource-intensive. | |
| # Similar to test, but also runs GUI tests. | |
| ci: all | |
| $(TESTRUNNER) --fast-ci --timeout=$(TESTTIMEOUT) $(TESTOPTS) | |
| # Run the test suite for both architectures in a Universal build on OSX. | |
| # Must be run on an Intel box. | |
| .PHONY: testuniversal | |
| testuniversal: all | |
| @if [ `arch` != 'i386' ]; then \ | |
| echo "This can only be used on OSX/i386" ;\ | |
| exit 1 ;\ | |
| fi | |
| $(TESTRUNNER) --slow-ci --timeout=$(TESTTIMEOUT) $(TESTOPTS) | |
| $(RUNSHARED) /usr/libexec/oah/translate \ | |
| ./$(BUILDPYTHON) -E -m test -j 0 -u all $(TESTOPTS) | |
| # Run the test suite on the iOS simulator. Must be run on a macOS machine with | |
| # a full Xcode install that has an iPhone SE (3rd edition) simulator available. | |
| # This must be run *after* a `make install` has completed the build. The | |
| # testbed is configured for the framework name used to configure the build; | |
| # that name is expected to be `Python`, optionally followed by uppercased ABI | |
| # flags (e.g., `PythonT`). | |
| XCFOLDER:=iOSTestbed.$(MULTIARCH).$(shell date +%s).$$PPID | |
| .PHONY: testios | |
| testios: | |
| @if test "$(MACHDEP)" != "ios"; then \ | |
| echo "Cannot run the iOS testbed for a non-iOS build."; \ | |
| exit 1;\ | |
| fi | |
| @if test "$(findstring -iphonesimulator,$(MULTIARCH))" != "-iphonesimulator"; then \ | |
| echo "Cannot run the iOS testbed for non-simulator builds."; \ | |
| exit 1;\ | |
| fi | |
| @if ! test -d $(PYTHONFRAMEWORKPREFIX); then \ | |
| echo "Cannot find a finalized iOS Python.framework. Have you run 'make install' to finalize the framework build?"; \ | |
| exit 1;\ | |
| fi | |
| # Clone the testbed project into the XCFOLDER | |
| $(PYTHON_FOR_BUILD) $(srcdir)/Platforms/Apple/testbed clone --framework $(PYTHONFRAMEWORKPREFIX) "$(XCFOLDER)" | |
| # Run the testbed project | |
| $(PYTHON_FOR_BUILD) "$(XCFOLDER)" run --verbose -- test -uall --single-process --rerun -W --pythoninfo | |
| # Like test, but using --slow-ci which enables all test resources and use | |
| # longer timeout. Run an optional pybuildbot.identify script to include | |
| # information about the build environment. | |
| .PHONY: buildbottest | |
| buildbottest: all | |
| -@if which pybuildbot.identify >/dev/null 2>&1; then \ | |
| pybuildbot.identify "CC='$(CC)'" "CXX='$(CXX)'"; \ | |
| fi | |
| $(TESTRUNNER) --slow-ci --timeout=$(TESTTIMEOUT) $(TESTOPTS) | |
| .PHONY: pythoninfo | |
| pythoninfo: all | |
| $(RUNSHARED) $(HOSTRUNNER) ./$(BUILDPYTHON) -m test.pythoninfo | |
| QUICKTESTOPTS= -x test_subprocess test_io \ | |
| test_multibytecodec test_urllib2_localnet test_itertools \ | |
| test_multiprocessing_fork test_multiprocessing_spawn \ | |
| test_multiprocessing_forkserver \ | |
| test_mailbox test_socket test_poll \ | |
| test_select test_zipfile test_concurrent_futures | |
| .PHONY: quicktest | |
| quicktest: all | |
| $(TESTRUNNER) --fast-ci --timeout=$(TESTTIMEOUT) $(TESTOPTS) $(QUICKTESTOPTS) | |
| # SSL tests | |
| .PHONY: multisslcompile | |
| multisslcompile: all | |
| $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/ssl/multissltests.py --steps=modules | |
| .PHONY: multissltest | |
| multissltest: all | |
| $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/ssl/multissltests.py | |
| # All install targets use the "all" target as synchronization point to | |
| # prevent race conditions with PGO builds. PGO builds use recursive make, | |
| # which can lead to two parallel `./python setup.py build` processes that | |
| # step on each others toes. | |
| # Only the main install gets a build-details.json. | |
| .PHONY: install | |
| install: @FRAMEWORKINSTALLFIRST@ @INSTALLTARGETS@ @FRAMEWORKINSTALLLAST@ | |
| $(INSTALL_DATA) `cat pybuilddir.txt`/$(BUILD_DETAILS) $(DESTDIR)$(LIBDEST); \ | |
| if test "x$(ENSUREPIP)" != "xno" ; then \ | |
| case $(ENSUREPIP) in \ | |
| upgrade) ensurepip="--upgrade" ;; \ | |
| install|*) ensurepip="" ;; \ | |
| esac; \ | |
| $(RUNSHARED) $(PYTHON_FOR_BUILD) -m ensurepip \ | |
| $$ensurepip --root=$(DESTDIR)/ ; \ | |
| fi | |
| .PHONY: altinstall | |
| altinstall: commoninstall | |
| if test "x$(ENSUREPIP)" != "xno" ; then \ | |
| case $(ENSUREPIP) in \ | |
| upgrade) ensurepip="--altinstall --upgrade" ;; \ | |
| install|*) ensurepip="--altinstall" ;; \ | |
| esac; \ | |
| $(RUNSHARED) $(PYTHON_FOR_BUILD) -m ensurepip \ | |
| $$ensurepip --root=$(DESTDIR)/ ; \ | |
| fi | |
| .PHONY: commoninstall | |
| commoninstall: check-clean-src @FRAMEWORKALTINSTALLFIRST@ \ | |
| altbininstall libinstall inclinstall libainstall \ | |
| sharedinstall altmaninstall @FRAMEWORKALTINSTALLLAST@ | |
| # Install shared libraries enabled by Setup | |
| DESTDIRS= $(exec_prefix) $(LIBDIR) $(BINLIBDEST) $(DESTSHARED) | |
| .PHONY: sharedinstall | |
| sharedinstall: all | |
| @for i in $(DESTDIRS); \ | |
| do \ | |
| if test ! -d $(DESTDIR)$$i; then \ | |
| echo "Creating directory $$i"; \ | |
| $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$$i; \ | |
| else true; \ | |
| fi; \ | |
| done | |
| @for i in X $(SHAREDMODS); do \ | |
| if test $$i != X; then \ | |
| echo $(INSTALL_SHARED) $$i $(DESTSHARED)/`basename $$i`; \ | |
| $(INSTALL_SHARED) $$i $(DESTDIR)$(DESTSHARED)/`basename $$i`; \ | |
| if test -d "$$i.dSYM"; then \ | |
| echo $(DSYMUTIL_PATH) $(DESTDIR)$(DESTSHARED)/`basename $$i`; \ | |
| $(DSYMUTIL_PATH) $(DESTDIR)$(DESTSHARED)/`basename $$i`; \ | |
| fi; \ | |
| fi; \ | |
| done | |
| # Install the interpreter with $(VERSION) affixed | |
| # This goes into $(exec_prefix) | |
| .PHONY: altbininstall | |
| altbininstall: $(BUILDPYTHON) @FRAMEWORKPYTHONW@ | |
| @for i in $(BINDIR) $(LIBDIR); \ | |
| do \ | |
| if test ! -d $(DESTDIR)$$i; then \ | |
| echo "Creating directory $$i"; \ | |
| $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$$i; \ | |
| else true; \ | |
| fi; \ | |
| done | |
| if test "$(PYTHONFRAMEWORKDIR)" = "no-framework" ; then \ | |
| $(INSTALL_PROGRAM) $(BUILDPYTHON) $(DESTDIR)$(BINDIR)/python$(LDVERSION)$(EXE); \ | |
| else \ | |
| $(INSTALL_PROGRAM) $(STRIPFLAG) Mac/pythonw $(DESTDIR)$(BINDIR)/python$(LDVERSION)$(EXE); \ | |
| fi | |
| -if test "$(VERSION)" != "$(LDVERSION)"; then \ | |
| if test -f $(DESTDIR)$(BINDIR)/python$(VERSION)$(EXE) -o -h $(DESTDIR)$(BINDIR)/python$(VERSION)$(EXE); \ | |
| then rm -f $(DESTDIR)$(BINDIR)/python$(VERSION)$(EXE); \ | |
| fi; \ | |
| (cd $(DESTDIR)$(BINDIR); $(LN) python$(LDVERSION)$(EXE) python$(VERSION)$(EXE)); \ | |
| fi | |
| @if test "$(PY_ENABLE_SHARED)" = 1 -o "$(STATIC_LIBPYTHON)" = 1; then \ | |
| if test -f $(LDLIBRARY) && test "$(PYTHONFRAMEWORKDIR)" = "no-framework" ; then \ | |
| if test -n "$(DLLLIBRARY)" ; then \ | |
| $(INSTALL_SHARED) $(DLLLIBRARY) $(DESTDIR)$(BINDIR); \ | |
| else \ | |
| $(INSTALL_SHARED) $(LDLIBRARY) $(DESTDIR)$(LIBDIR)/$(INSTSONAME); \ | |
| if test $(LDLIBRARY) != $(INSTSONAME); then \ | |
| (cd $(DESTDIR)$(LIBDIR); $(LN) -sf $(INSTSONAME) $(LDLIBRARY)) \ | |
| fi \ | |
| fi; \ | |
| if test -n "$(PY3LIBRARY)"; then \ | |
| $(INSTALL_SHARED) $(PY3LIBRARY) $(DESTDIR)$(LIBDIR)/$(PY3LIBRARY); \ | |
| fi; \ | |
| else true; \ | |
| fi; \ | |
| fi | |
| if test "x$(LIPO_32BIT_FLAGS)" != "x" ; then \ | |
| rm -f $(DESTDIR)$(BINDIR)/python$(VERSION)-32$(EXE); \ | |
| lipo $(LIPO_32BIT_FLAGS) \ | |
| -output $(DESTDIR)$(BINDIR)/python$(VERSION)-32$(EXE) \ | |
| $(DESTDIR)$(BINDIR)/python$(VERSION)$(EXE); \ | |
| fi | |
| if test "x$(LIPO_INTEL64_FLAGS)" != "x" ; then \ | |
| rm -f $(DESTDIR)$(BINDIR)/python$(VERSION)-intel64$(EXE); \ | |
| lipo $(LIPO_INTEL64_FLAGS) \ | |
| -output $(DESTDIR)$(BINDIR)/python$(VERSION)-intel64$(EXE) \ | |
| $(DESTDIR)$(BINDIR)/python$(VERSION)$(EXE); \ | |
| fi | |
| # Install macOS debug information (if available) | |
| if test -d "$(BUILDPYTHON).dSYM"; then \ | |
| echo $(DSYMUTIL_PATH) $(DESTDIR)$(BINDIR)/python$(LDVERSION)$(EXE); \ | |
| $(DSYMUTIL_PATH) $(DESTDIR)$(BINDIR)/python$(LDVERSION)$(EXE); \ | |
| fi | |
| if test "$(PYTHONFRAMEWORKDIR)" = "no-framework" ; then \ | |
| if test -d "$(LDLIBRARY).dSYM"; then \ | |
| echo $(DSYMUTIL_PATH) $(DESTDIR)$(LIBDIR)/$(INSTSONAME); \ | |
| $(DSYMUTIL_PATH) $(DESTDIR)$(LIBDIR)/$(INSTSONAME); \ | |
| fi \ | |
| else \ | |
| if test -d "$(LDLIBRARY).dSYM"; then \ | |
| echo $(DSYMUTIL_PATH) $(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/$(INSTSONAME); \ | |
| $(DSYMUTIL_PATH) $(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/$(INSTSONAME); \ | |
| fi \ | |
| fi | |
| .PHONY: bininstall | |
| # We depend on commoninstall here to make sure the installation is already usable | |
| # before we possibly overwrite the global 'python3' symlink to avoid causing | |
| # problems for anything else trying to run 'python3' while we install, particularly | |
| # if we're installing in parallel with -j. | |
| bininstall: commoninstall altbininstall | |
| if test ! -d $(DESTDIR)$(LIBPC); then \ | |
| echo "Creating directory $(LIBPC)"; \ | |
| $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(LIBPC); \ | |
| fi | |
| -if test -f $(DESTDIR)$(BINDIR)/python3$(EXE) -o -h $(DESTDIR)$(BINDIR)/python3$(EXE); \ | |
| then rm -f $(DESTDIR)$(BINDIR)/python3$(EXE); \ | |
| else true; \ | |
| fi | |
| (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)$(EXE) python3$(EXE)) | |
| -if test "$(VERSION)" != "$(LDVERSION)"; then \ | |
| rm -f $(DESTDIR)$(BINDIR)/python$(VERSION)-config; \ | |
| (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(LDVERSION)-config python$(VERSION)-config); \ | |
| rm -f $(DESTDIR)$(LIBPC)/python-$(VERSION).pc; \ | |
| (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(LDVERSION).pc python-$(VERSION).pc); \ | |
| rm -f $(DESTDIR)$(LIBPC)/python-$(VERSION)-embed.pc; \ | |
| (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(LDVERSION)-embed.pc python-$(VERSION)-embed.pc); \ | |
| fi | |
| -rm -f $(DESTDIR)$(BINDIR)/python3-config | |
| (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)-config python3-config) | |
| -rm -f $(DESTDIR)$(LIBPC)/python3.pc | |
| (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION).pc python3.pc) | |
| -rm -f $(DESTDIR)$(LIBPC)/python3-embed.pc | |
| (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION)-embed.pc python3-embed.pc) | |
| -rm -f $(DESTDIR)$(BINDIR)/idle3 | |
| (cd $(DESTDIR)$(BINDIR); $(LN) -s idle$(VERSION) idle3) | |
| -rm -f $(DESTDIR)$(BINDIR)/pydoc3 | |
| (cd $(DESTDIR)$(BINDIR); $(LN) -s pydoc$(VERSION) pydoc3) | |
| if test "x$(LIPO_32BIT_FLAGS)" != "x" ; then \ | |
| rm -f $(DESTDIR)$(BINDIR)/python3-32$(EXE); \ | |
| (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)-32$(EXE) python3-32$(EXE)) \ | |
| fi | |
| if test "x$(LIPO_INTEL64_FLAGS)" != "x" ; then \ | |
| rm -f $(DESTDIR)$(BINDIR)/python3-intel64$(EXE); \ | |
| (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)-intel64$(EXE) python3-intel64$(EXE)) \ | |
| fi | |
| # Install the versioned manual page | |
| .PHONY: altmaninstall | |
| altmaninstall: | |
| @for i in $(MANDIR) $(MANDIR)/man1; \ | |
| do \ | |
| if test ! -d $(DESTDIR)$$i; then \ | |
| echo "Creating directory $$i"; \ | |
| $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$$i; \ | |
| else true; \ | |
| fi; \ | |
| done | |
| $(INSTALL_DATA) $(srcdir)/Misc/python.man \ | |
| $(DESTDIR)$(MANDIR)/man1/python$(VERSION).1 | |
| # Install the unversioned manual page | |
| .PHONY: maninstall | |
| maninstall: altmaninstall | |
| -rm -f $(DESTDIR)$(MANDIR)/man1/python3.1 | |
| (cd $(DESTDIR)$(MANDIR)/man1; $(LN) -s python$(VERSION).1 python3.1) | |
| # Install the library | |
| XMLLIBSUBDIRS= xml xml/dom xml/etree xml/parsers xml/sax | |
| LIBSUBDIRS= asyncio \ | |
| collections \ | |
| compression compression/_common compression/zstd \ | |
| concurrent concurrent/futures concurrent/interpreters \ | |
| csv \ | |
| ctypes ctypes/macholib \ | |
| curses \ | |
| dbm \ | |
| email email/mime \ | |
| encodings \ | |
| ensurepip ensurepip/_bundled \ | |
| html \ | |
| http \ | |
| idlelib idlelib/Icons \ | |
| importlib importlib/resources importlib/metadata \ | |
| json \ | |
| logging \ | |
| multiprocessing multiprocessing/dummy \ | |
| pathlib \ | |
| profile \ | |
| profiling profiling/sampling profiling/tracing \ | |
| profiling/sampling/_assets \ | |
| profiling/sampling/_heatmap_assets \ | |
| profiling/sampling/_flamegraph_assets \ | |
| profiling/sampling/_shared_assets \ | |
| profiling/sampling/live_collector \ | |
| profiling/sampling/_vendor/d3/7.8.5 \ | |
| profiling/sampling/_vendor/d3-flame-graph/4.1.3 \ | |
| pydoc_data \ | |
| re \ | |
| site-packages \ | |
| sqlite3 \ | |
| string \ | |
| sysconfig \ | |
| tkinter \ | |
| tomllib \ | |
| turtledemo \ | |
| unittest \ | |
| urllib \ | |
| venv venv/scripts venv/scripts/common venv/scripts/posix \ | |
| wsgiref \ | |
| $(XMLLIBSUBDIRS) \ | |
| xmlrpc \ | |
| zipfile zipfile/_path \ | |
| zoneinfo \ | |
| _pyrepl \ | |
| __phello__ | |
| TESTSUBDIRS= idlelib/idle_test \ | |
| test \ | |
| test/test_ast \ | |
| test/test_ast/data \ | |
| test/archivetestdata \ | |
| test/audit_test_data \ | |
| test/audiodata \ | |
| test/certdata \ | |
| test/certdata/capath \ | |
| test/cjkencodings \ | |
| test/configdata \ | |
| test/crashers \ | |
| test/data \ | |
| test/decimaltestdata \ | |
| test/dtracedata \ | |
| test/encoded_modules \ | |
| test/leakers \ | |
| test/libregrtest \ | |
| test/mathdata \ | |
| test/regrtestdata \ | |
| test/regrtestdata/import_from_tests \ | |
| test/regrtestdata/import_from_tests/test_regrtest_b \ | |
| test/subprocessdata \ | |
| test/support \ | |
| test/support/_hypothesis_stubs \ | |
| test/test_asyncio \ | |
| test/test_capi \ | |
| test/test_cext \ | |
| test/test_concurrent_futures \ | |
| test/test_ctypes \ | |
| test/test_dataclasses \ | |
| test/test_doctest \ | |
| test/test_email \ | |
| test/test_email/data \ | |
| test/test_free_threading \ | |
| test/test_future_stmt \ | |
| test/test_gdb \ | |
| test/test_import \ | |
| test/test_import/data \ | |
| test/test_import/data/circular_imports \ | |
| test/test_import/data/circular_imports/subpkg \ | |
| test/test_import/data/circular_imports/subpkg2 \ | |
| test/test_import/data/circular_imports/subpkg2/parent \ | |
| test/test_import/data/package \ | |
| test/test_import/data/package2 \ | |
| test/test_import/data/package3 \ | |
| test/test_import/data/package4 \ | |
| test/test_import/data/unwritable \ | |
| test/test_importlib \ | |
| test/test_importlib/builtin \ | |
| test/test_importlib/extension \ | |
| test/test_importlib/frozen \ | |
| test/test_importlib/import_ \ | |
| test/test_importlib/metadata \ | |
| test/test_importlib/metadata/data \ | |
| test/test_importlib/metadata/data/sources \ | |
| test/test_importlib/metadata/data/sources/example \ | |
| test/test_importlib/metadata/data/sources/example/example \ | |
| test/test_importlib/metadata/data/sources/example2 \ | |
| test/test_importlib/metadata/data/sources/example2/example2 \ | |
| test/test_importlib/namespace_pkgs \ | |
| test/test_importlib/namespace_pkgs/both_portions \ | |
| test/test_importlib/namespace_pkgs/both_portions/foo \ | |
| test/test_importlib/namespace_pkgs/foo \ | |
| test/test_importlib/namespace_pkgs/module_and_namespace_package \ | |
| test/test_importlib/namespace_pkgs/module_and_namespace_package/a_test \ | |
| test/test_importlib/namespace_pkgs/not_a_namespace_pkg \ | |
| test/test_importlib/namespace_pkgs/not_a_namespace_pkg/foo \ | |
| test/test_importlib/namespace_pkgs/portion1 \ | |
| test/test_importlib/namespace_pkgs/portion1/foo \ | |
| test/test_importlib/namespace_pkgs/portion2 \ | |
| test/test_importlib/namespace_pkgs/portion2/foo \ | |
| test/test_importlib/namespace_pkgs/project1 \ | |
| test/test_importlib/namespace_pkgs/project1/parent \ | |
| test/test_importlib/namespace_pkgs/project1/parent/child \ | |
| test/test_importlib/namespace_pkgs/project2 \ | |
| test/test_importlib/namespace_pkgs/project2/parent \ | |
| test/test_importlib/namespace_pkgs/project2/parent/child \ | |
| test/test_importlib/namespace_pkgs/project3 \ | |
| test/test_importlib/namespace_pkgs/project3/parent \ | |
| test/test_importlib/namespace_pkgs/project3/parent/child \ | |
| test/test_importlib/partial \ | |
| test/test_importlib/resources \ | |
| test/test_importlib/source \ | |
| test/test_inspect \ | |
| test/test_interpreters \ | |
| test/test_io \ | |
| test/test_json \ | |
| test/test_lazy_import \ | |
| test/test_lazy_import/data \ | |
| test/test_lazy_import/data/pkg \ | |
| test/test_lazy_import/data/badsyntax \ | |
| test/test_lazy_import/data/circular_import_pkg \ | |
| test/test_lazy_import/data/lazypkg \ | |
| test/test_lazy_import/data/metasyntactic \ | |
| test/test_lazy_import/data/metasyntactic/foo \ | |
| test/test_lazy_import/data/metasyntactic/foo/ack \ | |
| test/test_lazy_import/data/metasyntactic/foo/bar \ | |
| test/test_lazy_import/data/metasyntactic/foo/bar/baz \ | |
| test/test_lazy_import/data/metasyntactic/foo/bar/baz/qux \ | |
| test/test_lazy_import/data/metasyntactic/foo/bar/thud \ | |
| test/test_lazy_import/data/metasyntactic/plugh \ | |
| test/test_lazy_import/data/metasyntactic/waldo \ | |
| test/test_lazy_import/data/metasyntactic/waldo/fred \ | |
| test/test_lazy_import/data/module_same_name_var_order1 \ | |
| test/test_lazy_import/data/module_same_name_var_order2 \ | |
| test/test_lazy_import/data/versioned \ | |
| test/test_module \ | |
| test/test_multiprocessing_fork \ | |
| test/test_multiprocessing_forkserver \ | |
| test/test_multiprocessing_spawn \ | |
| test/test_os \ | |
| test/test_pathlib \ | |
| test/test_pathlib/support \ | |
| test/test_peg_generator \ | |
| test/test_profiling \ | |
| test/test_profiling/test_sampling_profiler \ | |
| test/test_pydoc \ | |
| test/test_pyrepl \ | |
| test/test_string \ | |
| test/test_sqlite3 \ | |
| test/test_tkinter \ | |
| test/test_tomllib \ | |
| test/test_tomllib/data \ | |
| test/test_tomllib/data/invalid \ | |
| test/test_tomllib/data/invalid/array \ | |
| test/test_tomllib/data/invalid/array-of-tables \ | |
| test/test_tomllib/data/invalid/boolean \ | |
| test/test_tomllib/data/invalid/dates-and-times \ | |
| test/test_tomllib/data/invalid/dotted-keys \ | |
| test/test_tomllib/data/invalid/inline-table \ | |
| test/test_tomllib/data/invalid/keys-and-vals \ | |
| test/test_tomllib/data/invalid/literal-str \ | |
| test/test_tomllib/data/invalid/multiline-basic-str \ | |
| test/test_tomllib/data/invalid/multiline-literal-str \ | |
| test/test_tomllib/data/invalid/table \ | |
| test/test_tomllib/data/valid \ | |
| test/test_tomllib/data/valid/array \ | |
| test/test_tomllib/data/valid/dates-and-times \ | |
| test/test_tomllib/data/valid/inline-table \ | |
| test/test_tomllib/data/valid/multiline-basic-str \ | |
| test/test_tools \ | |
| test/test_tools/i18n_data \ | |
| test/test_tools/msgfmt_data \ | |
| test/test_ttk \ | |
| test/test_unittest \ | |
| test/test_unittest/namespace_test_pkg \ | |
| test/test_unittest/namespace_test_pkg/bar \ | |
| test/test_unittest/namespace_test_pkg/noop \ | |
| test/test_unittest/namespace_test_pkg/noop/no2 \ | |
| test/test_unittest/testmock \ | |
| test/test_warnings \ | |
| test/test_warnings/data \ | |
| test/test_zipfile \ | |
| test/test_zipfile/_path \ | |
| test/test_zoneinfo \ | |
| test/test_zoneinfo/data \ | |
| test/tkinterdata \ | |
| test/tokenizedata \ | |
| test/tracedmodules \ | |
| test/translationdata \ | |
| test/translationdata/argparse \ | |
| test/translationdata/getopt \ | |
| test/translationdata/optparse \ | |
| test/typinganndata \ | |
| test/typinganndata/partialexecution \ | |
| test/wheeldata \ | |
| test/xmltestdata \ | |
| test/xmltestdata/c14n-20 \ | |
| test/zipimport_data | |
| COMPILEALL_OPTS=-j0 | |
| TEST_MODULES=@TEST_MODULES@ | |
| .PHONY: libinstall | |
| libinstall: all $(srcdir)/Modules/xxmodule.c | |
| @for i in $(SCRIPTDIR) $(LIBDEST); \ | |
| do \ | |
| if test ! -d $(DESTDIR)$$i; then \ | |
| echo "Creating directory $$i"; \ | |
| $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$$i; \ | |
| else true; \ | |
| fi; \ | |
| done | |
| @if test "$(TEST_MODULES)" = yes; then \ | |
| subdirs="$(LIBSUBDIRS) $(TESTSUBDIRS)"; \ | |
| else \ | |
| subdirs="$(LIBSUBDIRS)"; \ | |
| fi; \ | |
| for d in $$subdirs; \ | |
| do \ | |
| a=$(srcdir)/Lib/$$d; \ | |
| if test ! -d $$a; then continue; else true; fi; \ | |
| b=$(LIBDEST)/$$d; \ | |
| if test ! -d $(DESTDIR)$$b; then \ | |
| echo "Creating directory $$b"; \ | |
| $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$$b; \ | |
| else true; \ | |
| fi; \ | |
| done | |
| @for i in $(srcdir)/Lib/*.py; \ | |
| do \ | |
| if test -x $$i; then \ | |
| $(INSTALL_SCRIPT) $$i $(DESTDIR)$(LIBDEST); \ | |
| echo $(INSTALL_SCRIPT) $$i $(LIBDEST); \ | |
| else \ | |
| $(INSTALL_DATA) $$i $(DESTDIR)$(LIBDEST); \ | |
| echo $(INSTALL_DATA) $$i $(LIBDEST); \ | |
| fi; \ | |
| done | |
| @if test "$(TEST_MODULES)" = yes; then \ | |
| subdirs="$(LIBSUBDIRS) $(TESTSUBDIRS)"; \ | |
| else \ | |
| subdirs="$(LIBSUBDIRS)"; \ | |
| fi; \ | |
| for d in $$subdirs; \ | |
| do \ | |
| a=$(srcdir)/Lib/$$d; \ | |
| if test ! -d $$a; then continue; else true; fi; \ | |
| if test `ls $$a | wc -l` -lt 1; then continue; fi; \ | |
| b=$(LIBDEST)/$$d; \ | |
| for i in $$a/*; \ | |
| do \ | |
| case $$i in \ | |
| *CVS) ;; \ | |
| *.py[co]) ;; \ | |
| *.orig) ;; \ | |
| *~) ;; \ | |
| *) \ | |
| if test -d $$i; then continue; fi; \ | |
| if test -x $$i; then \ | |
| echo $(INSTALL_SCRIPT) $$i $$b; \ | |
| $(INSTALL_SCRIPT) $$i $(DESTDIR)$$b; \ | |
| else \ | |
| echo $(INSTALL_DATA) $$i $$b; \ | |
| $(INSTALL_DATA) $$i $(DESTDIR)$$b; \ | |
| fi;; \ | |
| esac; \ | |
| done; \ | |
| done | |
| $(INSTALL_DATA) `cat pybuilddir.txt`/_sysconfigdata_$(ABIFLAGS)_$(MACHDEP)_$(MULTIARCH).py $(DESTDIR)$(LIBDEST); \ | |
| $(INSTALL_DATA) `cat pybuilddir.txt`/_sysconfig_vars_$(ABIFLAGS)_$(MACHDEP)_$(MULTIARCH).json $(DESTDIR)$(LIBDEST); \ | |
| $(INSTALL_DATA) `cat pybuilddir.txt`/_missing_stdlib_info.py $(DESTDIR)$(LIBDEST); \ | |
| $(INSTALL_DATA) $(srcdir)/LICENSE $(DESTDIR)$(LIBDEST)/LICENSE.txt | |
| @ # If app store compliance has been configured, apply the patch to the | |
| @ # installed library code. The patch has been previously validated against | |
| @ # the original source tree, so we can ignore any errors that are raised | |
| @ # due to files that are missing because of --disable-test-modules etc. | |
| @if [ "$(APP_STORE_COMPLIANCE_PATCH)" != "" ]; then \ | |
| echo "Applying app store compliance patch"; \ | |
| patch --force --reject-file "$(abs_builddir)/app-store-compliance.rej" --strip 2 --directory "$(DESTDIR)$(LIBDEST)" --input "$(abs_srcdir)/$(APP_STORE_COMPLIANCE_PATCH)" || true ; \ | |
| fi | |
| @ # Build PYC files for the 3 optimization levels (0, 1, 2) | |
| -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ | |
| $(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \ | |
| -o 0 -o 1 -o 2 $(COMPILEALL_OPTS) -d $(LIBDEST) -f \ | |
| -x 'bad_coding|badsyntax|site-packages' \ | |
| $(DESTDIR)$(LIBDEST) | |
| -PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \ | |
| $(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \ | |
| -o 0 -o 1 -o 2 $(COMPILEALL_OPTS) -d $(LIBDEST)/site-packages -f \ | |
| -x badsyntax $(DESTDIR)$(LIBDEST)/site-packages | |
| # bpo-21536: Misc/python-config.sh is generated in the build directory | |
| # from $(srcdir)Misc/python-config.sh.in. | |
| python-config: $(srcdir)/Misc/python-config.in Misc/python-config.sh | |
| @ # Substitution happens here, as the completely-expanded BINDIR | |
| @ # is not available in configure | |
| sed -e "s,@EXENAME@,$(EXENAME)," < $(srcdir)/Misc/python-config.in >python-config.py | |
| @ # Replace makefile compat. variable references with shell script compat. ones; $(VAR) -> ${VAR} | |
| LC_ALL=C sed -e 's,\$$(\([A-Za-z0-9_]*\)),\$$\{\1\},g' < Misc/python-config.sh >python-config | |
| @ # On Darwin, always use the python version of the script, the shell | |
| @ # version doesn't use the compiler customizations that are provided | |
| @ # in python (_osx_support.py). | |
| @if test `uname -s` = Darwin; then \ | |
| cp python-config.py python-config; \ | |
| fi | |
| # macOS' make seems to ignore a dependency on a | |
| # "$(BUILD_SCRIPTS_DIR): $(MKDIR_P) $@" rule. | |
| BUILD_SCRIPTS_DIR=build/scripts-$(VERSION) | |
| SCRIPT_IDLE=$(BUILD_SCRIPTS_DIR)/idle$(VERSION) | |
| SCRIPT_PYDOC=$(BUILD_SCRIPTS_DIR)/pydoc$(VERSION) | |
| $(SCRIPT_IDLE): $(srcdir)/Tools/scripts/idle3 | |
| @$(MKDIR_P) $(BUILD_SCRIPTS_DIR) | |
| sed -e "s,/usr/bin/env python3,$(EXENAME)," < $(srcdir)/Tools/scripts/idle3 > $@ | |
| @chmod +x $@ | |
| $(SCRIPT_PYDOC): $(srcdir)/Tools/scripts/pydoc3 | |
| @$(MKDIR_P) $(BUILD_SCRIPTS_DIR) | |
| sed -e "s,/usr/bin/env python3,$(EXENAME)," < $(srcdir)/Tools/scripts/pydoc3 > $@ | |
| @chmod +x $@ | |
| .PHONY: scripts | |
| scripts: $(SCRIPT_IDLE) $(SCRIPT_PYDOC) python-config | |
| # Install the include files | |
| INCLDIRSTOMAKE=$(INCLUDEDIR) $(CONFINCLUDEDIR) $(INCLUDEPY) $(CONFINCLUDEPY) | |
| .PHONY: inclinstall | |
| inclinstall: | |
| @for i in $(INCLDIRSTOMAKE); \ | |
| do \ | |
| if test ! -d $(DESTDIR)$$i; then \ | |
| echo "Creating directory $$i"; \ | |
| $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$$i; \ | |
| else true; \ | |
| fi; \ | |
| done | |
| @if test ! -d $(DESTDIR)$(INCLUDEPY)/cpython; then \ | |
| echo "Creating directory $(DESTDIR)$(INCLUDEPY)/cpython"; \ | |
| $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(INCLUDEPY)/cpython; \ | |
| else true; \ | |
| fi | |
| @if test ! -d $(DESTDIR)$(INCLUDEPY)/internal; then \ | |
| echo "Creating directory $(DESTDIR)$(INCLUDEPY)/internal"; \ | |
| $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(INCLUDEPY)/internal; \ | |
| else true; \ | |
| fi | |
| @if test "$(INSTALL_MIMALLOC)" = "yes"; then \ | |
| if test ! -d $(DESTDIR)$(INCLUDEPY)/internal/mimalloc/mimalloc; then \ | |
| echo "Creating directory $(DESTDIR)$(INCLUDEPY)/internal/mimalloc/mimalloc"; \ | |
| $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(INCLUDEPY)/internal/mimalloc/mimalloc; \ | |
| fi; \ | |
| fi | |
| @for i in $(srcdir)/Include/*.h; \ | |
| do \ | |
| echo $(INSTALL_DATA) $$i $(INCLUDEPY); \ | |
| $(INSTALL_DATA) $$i $(DESTDIR)$(INCLUDEPY); \ | |
| done | |
| @for i in $(srcdir)/Include/cpython/*.h; \ | |
| do \ | |
| echo $(INSTALL_DATA) $$i $(INCLUDEPY)/cpython; \ | |
| $(INSTALL_DATA) $$i $(DESTDIR)$(INCLUDEPY)/cpython; \ | |
| done | |
| @for i in $(srcdir)/Include/internal/*.h; \ | |
| do \ | |
| echo $(INSTALL_DATA) $$i $(INCLUDEPY)/internal; \ | |
| $(INSTALL_DATA) $$i $(DESTDIR)$(INCLUDEPY)/internal; \ | |
| done | |
| @if test "$(INSTALL_MIMALLOC)" = "yes"; then \ | |
| echo $(INSTALL_DATA) $(srcdir)/Include/internal/mimalloc/mimalloc.h $(DESTDIR)$(INCLUDEPY)/internal/mimalloc/mimalloc.h; \ | |
| $(INSTALL_DATA) $(srcdir)/Include/internal/mimalloc/mimalloc.h $(DESTDIR)$(INCLUDEPY)/internal/mimalloc/mimalloc.h; \ | |
| for i in $(srcdir)/Include/internal/mimalloc/mimalloc/*.h; \ | |
| do \ | |
| echo $(INSTALL_DATA) $$i $(INCLUDEPY)/internal/mimalloc/mimalloc; \ | |
| $(INSTALL_DATA) $$i $(DESTDIR)$(INCLUDEPY)/internal/mimalloc/mimalloc; \ | |
| done; \ | |
| fi | |
| echo $(INSTALL_DATA) pyconfig.h $(DESTDIR)$(CONFINCLUDEPY)/pyconfig.h | |
| $(INSTALL_DATA) pyconfig.h $(DESTDIR)$(CONFINCLUDEPY)/pyconfig.h | |
| # Install the library and miscellaneous stuff needed for extending/embedding | |
| # This goes into $(exec_prefix) | |
| LIBPL= @LIBPL@ | |
| # pkgconfig directory | |
| LIBPC= $(LIBDIR)/pkgconfig | |
| .PHONY: libainstall | |
| libainstall: all scripts | |
| @for i in $(LIBDIR) $(LIBPL) $(LIBPC) $(BINDIR); \ | |
| do \ | |
| if test ! -d $(DESTDIR)$$i; then \ | |
| echo "Creating directory $$i"; \ | |
| $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$$i; \ | |
| else true; \ | |
| fi; \ | |
| done | |
| @if test "$(STATIC_LIBPYTHON)" = 1; then \ | |
| if test -d $(LIBRARY); then :; else \ | |
| if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \ | |
| if test "$(SHLIB_SUFFIX)" = .dll; then \ | |
| $(INSTALL_DATA) $(LDLIBRARY) $(DESTDIR)$(LIBPL) ; \ | |
| else \ | |
| $(INSTALL_DATA) $(LIBRARY) $(DESTDIR)$(LIBPL)/$(LIBRARY) ; \ | |
| fi; \ | |
| else \ | |
| echo Skip install of $(LIBRARY) - use make frameworkinstall; \ | |
| fi; \ | |
| fi; \ | |
| $(INSTALL_DATA) Programs/python.o $(DESTDIR)$(LIBPL)/python.o; \ | |
| fi | |
| $(INSTALL_DATA) Modules/config.c $(DESTDIR)$(LIBPL)/config.c | |
| $(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(DESTDIR)$(LIBPL)/config.c.in | |
| $(INSTALL_DATA) Makefile $(DESTDIR)$(LIBPL)/Makefile | |
| $(INSTALL_DATA) $(srcdir)/Modules/Setup $(DESTDIR)$(LIBPL)/Setup | |
| $(INSTALL_DATA) Modules/Setup.bootstrap $(DESTDIR)$(LIBPL)/Setup.bootstrap | |
| $(INSTALL_DATA) Modules/Setup.stdlib $(DESTDIR)$(LIBPL)/Setup.stdlib | |
| $(INSTALL_DATA) Modules/Setup.local $(DESTDIR)$(LIBPL)/Setup.local | |
| $(INSTALL_DATA) Misc/python.pc $(DESTDIR)$(LIBPC)/python-$(LDVERSION).pc | |
| $(INSTALL_DATA) Misc/python-embed.pc $(DESTDIR)$(LIBPC)/python-$(LDVERSION)-embed.pc | |
| $(INSTALL_SCRIPT) $(srcdir)/Modules/makesetup $(DESTDIR)$(LIBPL)/makesetup | |
| $(INSTALL_SCRIPT) $(srcdir)/install-sh $(DESTDIR)$(LIBPL)/install-sh | |
| $(INSTALL_SCRIPT) python-config.py $(DESTDIR)$(LIBPL)/python-config.py | |
| $(INSTALL_SCRIPT) python-config $(DESTDIR)$(BINDIR)/python$(LDVERSION)-config | |
| $(INSTALL_SCRIPT) $(SCRIPT_IDLE) $(DESTDIR)$(BINDIR)/idle$(VERSION) | |
| $(INSTALL_SCRIPT) $(SCRIPT_PYDOC) $(DESTDIR)$(BINDIR)/pydoc$(VERSION) | |
| @if [ -s Modules/python.exp -a \ | |
| "`echo $(MACHDEP) | sed 's/^\(...\).*/\1/'`" = "aix" ]; then \ | |
| echo; echo "Installing support files for building shared extension modules on AIX:"; \ | |
| $(INSTALL_DATA) Modules/python.exp \ | |
| $(DESTDIR)$(LIBPL)/python.exp; \ | |
| echo; echo "$(LIBPL)/python.exp"; \ | |
| $(INSTALL_SCRIPT) $(srcdir)/Modules/makexp_aix \ | |
| $(DESTDIR)$(LIBPL)/makexp_aix; \ | |
| echo "$(LIBPL)/makexp_aix"; \ | |
| $(INSTALL_SCRIPT) Modules/ld_so_aix \ | |
| $(DESTDIR)$(LIBPL)/ld_so_aix; \ | |
| echo "$(LIBPL)/ld_so_aix"; \ | |
| echo; echo "See Misc/README.AIX for details."; \ | |
| else true; \ | |
| fi | |
| # Here are a couple of targets for MacOSX again, to install a full | |
| # framework-based Python. frameworkinstall installs everything, the | |
| # subtargets install specific parts. Much of the actual work is offloaded to | |
| # the Makefile in Mac | |
| # | |
| # | |
| # This target is here for backward compatibility, previous versions of Python | |
| # hadn't integrated framework installation in the normal install process. | |
| .PHONY: frameworkinstall | |
| frameworkinstall: install | |
| # On install, we re-make the framework | |
| # structure in the install location, /Library/Frameworks/ or the argument to | |
| # --enable-framework. If --enable-framework has been specified then we have | |
| # automatically set prefix to the location deep down in the framework, so we | |
| # only have to cater for the structural bits of the framework. | |
| .PHONY: frameworkinstallframework | |
| frameworkinstallframework: @FRAMEWORKINSTALLFIRST@ install frameworkinstallmaclib | |
| # macOS uses a versioned frameworks structure that includes a full install | |
| .PHONY: frameworkinstallversionedstructure | |
| frameworkinstallversionedstructure: $(LDLIBRARY) | |
| @if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \ | |
| echo Not configured with --enable-framework; \ | |
| exit 1; \ | |
| else true; \ | |
| fi | |
| @for i in $(prefix)/Resources/English.lproj $(prefix)/lib; do\ | |
| if test ! -d $(DESTDIR)$$i; then \ | |
| echo "Creating directory $(DESTDIR)$$i"; \ | |
| $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$$i; \ | |
| else true; \ | |
| fi; \ | |
| done | |
| $(LN) -fsn include/python$(LDVERSION) $(DESTDIR)$(prefix)/Headers | |
| sed 's/%VERSION%/'"`$(RUNSHARED) ./$(BUILDPYTHON) -c 'import platform; print(platform.python_version())'`"'/g' < $(RESSRCDIR)/Info.plist > $(DESTDIR)$(prefix)/Resources/Info.plist | |
| $(LN) -fsn $(VERSION) $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Versions/Current | |
| $(LN) -fsn Versions/Current/$(PYTHONFRAMEWORK) $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/$(PYTHONFRAMEWORK) | |
| $(LN) -fsn Versions/Current/Headers $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Headers | |
| $(LN) -fsn Versions/Current/Resources $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Resources | |
| $(INSTALL_SHARED) $(LDLIBRARY) $(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/$(LDLIBRARY) | |
| # iOS/tvOS/watchOS uses a non-versioned framework with Info.plist in the | |
| # framework root, no .lproj data, and only stub compilation assistance binaries | |
| .PHONY: frameworkinstallunversionedstructure | |
| frameworkinstallunversionedstructure: $(LDLIBRARY) | |
| @if test "$(PYTHONFRAMEWORKDIR)" = no-framework; then \ | |
| echo Not configured with --enable-framework; \ | |
| exit 1; \ | |
| else true; \ | |
| fi | |
| if test -d $(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/include; then \ | |
| echo "Clearing stale header symlink directory"; \ | |
| rm -rf $(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/include; \ | |
| fi | |
| $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR) | |
| sed 's/%VERSION%/'"`$(RUNSHARED) $(PYTHON_FOR_BUILD) -c 'import platform; print(platform.python_version())'`"'/g' < $(RESSRCDIR)/Info.plist > $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Info.plist | |
| $(INSTALL_SHARED) $(LDLIBRARY) $(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/$(LDLIBRARY) | |
| $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(LIBDIR) | |
| $(LN) -fs "../$(LDLIBRARY)" "$(DESTDIR)$(prefix)/lib/libpython$(LDVERSION).dylib" | |
| $(LN) -fs "../$(LDLIBRARY)" "$(DESTDIR)$(prefix)/lib/libpython$(VERSION).dylib" | |
| $(INSTALL) -d -m $(DIRMODE) $(DESTDIR)$(BINDIR) | |
| for file in $(srcdir)/$(RESSRCDIR)/bin/* ; do \ | |
| $(INSTALL) -m $(EXEMODE) $$file $(DESTDIR)$(BINDIR); \ | |
| done | |
| # This installs Mac/Lib into the framework | |
| # Install a number of symlinks to keep software that expects a normal unix | |
| # install (which includes python-config) happy. | |
| .PHONY: frameworkinstallmaclib | |
| frameworkinstallmaclib: | |
| $(LN) -fs "../../../$(PYTHONFRAMEWORK)" "$(DESTDIR)$(LIBPL)/libpython$(LDVERSION).a" | |
| $(LN) -fs "../../../$(PYTHONFRAMEWORK)" "$(DESTDIR)$(LIBPL)/libpython$(LDVERSION).dylib" | |
| $(LN) -fs "../../../$(PYTHONFRAMEWORK)" "$(DESTDIR)$(LIBPL)/libpython$(VERSION).a" | |
| $(LN) -fs "../../../$(PYTHONFRAMEWORK)" "$(DESTDIR)$(LIBPL)/libpython$(VERSION).dylib" | |
| $(LN) -fs "../$(PYTHONFRAMEWORK)" "$(DESTDIR)$(prefix)/lib/libpython$(LDVERSION).dylib" | |
| $(LN) -fs "../$(PYTHONFRAMEWORK)" "$(DESTDIR)$(prefix)/lib/libpython$(VERSION).dylib" | |
| # This installs the IDE, the Launcher and other apps into /Applications | |
| .PHONY: frameworkinstallapps | |
| frameworkinstallapps: | |
| cd Mac && $(MAKE) installapps DESTDIR="$(DESTDIR)" | |
| # Build the bootstrap executable that will spawn the interpreter inside | |
| # an app bundle within the framework. This allows the interpreter to | |
| # run OS X GUI APIs. | |
| .PHONY: frameworkpythonw | |
| frameworkpythonw: | |
| cd Mac && $(MAKE) pythonw | |
| # This installs the python* and other bin symlinks in $prefix/bin or in | |
| # a bin directory relative to the framework root | |
| .PHONY: frameworkinstallunixtools | |
| frameworkinstallunixtools: | |
| cd Mac && $(MAKE) installunixtools DESTDIR="$(DESTDIR)" | |
| .PHONY: frameworkaltinstallunixtools | |
| frameworkaltinstallunixtools: | |
| cd Mac && $(MAKE) altinstallunixtools DESTDIR="$(DESTDIR)" | |
| # This installs the Tools into the applications directory. | |
| # It is not part of a normal frameworkinstall | |
| .PHONY: frameworkinstallextras | |
| frameworkinstallextras: | |
| cd Mac && $(MAKE) installextras DESTDIR="$(DESTDIR)" | |
| # On iOS, bin/lib can't live inside the framework; include needs to be called | |
| # "Headers", but *must* be in the framework, and *not* include the `python3.X` | |
| # subdirectory. The install has put these folders in the same folder as | |
| # Python.framework; Move the headers to their final framework-compatible home. | |
| .PHONY: frameworkinstallmobileheaders | |
| frameworkinstallmobileheaders: frameworkinstallunversionedstructure inclinstall | |
| if test -d $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Headers; then \ | |
| echo "Removing old framework headers"; \ | |
| rm -rf $(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Headers; \ | |
| fi | |
| mv "$(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/include/python$(LDVERSION)" "$(DESTDIR)$(PYTHONFRAMEWORKINSTALLDIR)/Headers" | |
| $(LN) -fs "../$(PYTHONFRAMEWORKDIR)/Headers" "$(DESTDIR)$(PYTHONFRAMEWORKPREFIX)/include/python$(LDVERSION)" | |
| # Build the toplevel Makefile | |
| Makefile.pre: $(srcdir)/Makefile.pre.in config.status | |
| CONFIG_FILES=Makefile.pre CONFIG_HEADERS= ./config.status | |
| $(MAKE) -f Makefile.pre Makefile | |
| # Run the configure script. | |
| config.status: $(srcdir)/configure | |
| $(srcdir)/configure $(CONFIG_ARGS) | |
| .PRECIOUS: config.status $(BUILDPYTHON) Makefile Makefile.pre | |
| Python/asm_trampoline_x86_64.o: $(srcdir)/Python/asm_trampoline_x86_64.S | |
| $(CC) -c $(PY_CORE_CFLAGS) -o $@ $< | |
| Python/asm_trampoline_aarch64.o: $(srcdir)/Python/asm_trampoline_aarch64.S | |
| $(CC) -c $(PY_CORE_CFLAGS) -o $@ $< | |
| Python/asm_trampoline_riscv64.o: $(srcdir)/Python/asm_trampoline_riscv64.S | |
| $(CC) -c $(PY_CORE_CFLAGS) -o $@ $< | |
| # On macOS universal2 builds, $(PY_CORE_CFLAGS) contains "-arch arm64 -arch x86_64", | |
| # which would produce fat .o files containing both architectures for each .S input. | |
| # lipo -create then refuses to combine them because they share architectures. | |
| # Build each per-arch object with a single -arch flag before merging with lipo. | |
| Python/asm_trampoline_universal2.o: $(srcdir)/Python/asm_trampoline_aarch64.S $(srcdir)/Python/asm_trampoline_x86_64.S | |
| $(CC) -c $(filter-out -arch arm64 x86_64,$(PY_CORE_CFLAGS)) -arch arm64 \ | |
| -o Python/asm_trampoline_arm64-apple-darwin.o $(srcdir)/Python/asm_trampoline_aarch64.S | |
| $(CC) -c $(filter-out -arch arm64 x86_64,$(PY_CORE_CFLAGS)) -arch x86_64 \ | |
| -o Python/asm_trampoline_x86_64-apple-darwin.o $(srcdir)/Python/asm_trampoline_x86_64.S | |
| lipo -create -output $@ \ | |
| Python/asm_trampoline_arm64-apple-darwin.o \ | |
| Python/asm_trampoline_x86_64-apple-darwin.o | |
| rm -f Python/asm_trampoline_arm64-apple-darwin.o \ | |
| Python/asm_trampoline_x86_64-apple-darwin.o | |
| JIT_SHIM_BUILD_OBJS= @JIT_SHIM_BUILD_O@ | |
| JIT_UNWIND_INFO_H= $(if $(JIT_OBJS),jit_unwind_info.h $(patsubst jit_stencils-%.h,jit_unwind_info-%.h,@JIT_STENCILS_H@)) | |
| JIT_BUILD_TARGETS= jit_stencils.h @JIT_STENCILS_H@ $(JIT_UNWIND_INFO_H) $(JIT_SHIM_BUILD_OBJS) | |
| JIT_TARGETS= $(JIT_BUILD_TARGETS) $(filter-out $(JIT_SHIM_BUILD_OBJS),$(JIT_OBJS)) | |
| JIT_GENERATED_STAMP= .jit-stamp | |
| JIT_DEPS = \ | |
| $(srcdir)/Tools/jit/*.c \ | |
| $(srcdir)/Tools/jit/*.h \ | |
| $(srcdir)/Tools/jit/*.py \ | |
| $(srcdir)/Python/executor_cases.c.h \ | |
| pyconfig.h | |
| $(JIT_GENERATED_STAMP): $(JIT_DEPS) | |
| @REGEN_JIT_COMMAND@ | |
| @touch $@ | |
| $(JIT_BUILD_TARGETS): $(JIT_GENERATED_STAMP) | |
| @if test ! -f "$@"; then \ | |
| rm -f $(JIT_GENERATED_STAMP); \ | |
| $(MAKE) $(JIT_GENERATED_STAMP); \ | |
| test -f "$@"; \ | |
| fi | |
| jit_shim-universal2-apple-darwin.o: jit_shim-aarch64-apple-darwin.o jit_shim-x86_64-apple-darwin.o | |
| lipo -create -output $@ jit_shim-aarch64-apple-darwin.o jit_shim-x86_64-apple-darwin.o | |
| Python/jit.o: $(srcdir)/Python/jit.c @JIT_STENCILS_H@ | |
| $(CC) -c $(PY_CORE_CFLAGS) -o $@ $< | |
| Python/jit_unwind.o: $(srcdir)/Python/jit_unwind.c $(JIT_UNWIND_INFO_H) | |
| $(CC) -c $(PY_CORE_CFLAGS) -o $@ $< | |
| .PHONY: regen-jit | |
| regen-jit: $(JIT_TARGETS) | |
| # Some make's put the object file in the current directory | |
| .c.o: | |
| $(CC) -c $(PY_CORE_CFLAGS) -o $@ $< | |
| # bpo-30104: dtoa.c uses union to cast double to unsigned long[2]. clang 4.0 | |
| # with -O2 or higher and strict aliasing miscompiles the ratio() function | |
| # causing rounding issues. Compile dtoa.c using -fno-strict-aliasing on clang. | |
| # https://bugs.llvm.org//show_bug.cgi?id=31928 | |
| Python/dtoa.o: Python/dtoa.c | |
| $(CC) -c $(PY_CORE_CFLAGS) $(CFLAGS_ALIASING) -o $@ $< | |
| Python/ceval.o: Python/ceval.c | |
| $(CC) -c $(PY_CORE_CFLAGS) $(CFLAGS_CEVAL) -o $@ $< | |
| # Run reindent on the library | |
| .PHONY: reindent | |
| reindent: | |
| ./$(BUILDPYTHON) $(srcdir)/Tools/patchcheck/reindent.py -r $(srcdir)/Lib | |
| # Rerun configure with the same options as it was run last time, | |
| # provided the config.status script exists | |
| .PHONY: recheck | |
| recheck: | |
| ./config.status --recheck | |
| ./config.status | |
| # Regenerate configure and pyconfig.h.in | |
| .PHONY: autoconf | |
| autoconf: | |
| (cd $(srcdir); autoreconf -ivf -Werror) | |
| .PHONY: regen-configure | |
| regen-configure: | |
| $(srcdir)/Tools/build/regen-configure.sh | |
| .PHONY: regen-sbom | |
| regen-sbom: | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/build/generate_sbom.py | |
| # Create a tags file for vi | |
| tags:: | |
| ctags -w $(srcdir)/Include/*.h $(srcdir)/Include/cpython/*.h $(srcdir)/Include/internal/*.h | |
| for i in $(SRCDIRS); do ctags -f tags -w -a $(srcdir)/$$i/*.[ch]; done | |
| ctags -f tags -w -a $(srcdir)/Modules/_ctypes/*.[ch] | |
| find $(srcdir)/Lib -type f -name "*.py" -not -name "test_*.py" -not -path "*/test/*" -not -path "*/tests/*" -not -path "*/*_test/*" | ctags -f tags -w -a -L - | |
| LC_ALL=C sort -o tags tags | |
| # Create a tags file for GNU Emacs | |
| TAGS:: | |
| cd $(srcdir); \ | |
| etags Include/*.h Include/cpython/*.h Include/internal/*.h; \ | |
| for i in $(SRCDIRS); do etags -a $$i/*.[ch]; done | |
| etags -a $(srcdir)/Modules/_ctypes/*.[ch] | |
| find $(srcdir)/Lib -type f -name "*.py" -not -name "test_*.py" -not -path "*/test/*" -not -path "*/tests/*" -not -path "*/*_test/*" | etags - -a | |
| # Sanitation targets -- clean leaves libraries, executables and tags | |
| # files, which clobber removes as well | |
| .PHONY: pycremoval | |
| pycremoval: | |
| -find $(srcdir) -depth -name '__pycache__' -exec rm -rf {} ';' | |
| -find $(srcdir) -name '*.py[co]' -exec rm -f {} ';' | |
| .PHONY: rmtestturds | |
| rmtestturds: | |
| -rm -f *BAD *GOOD *SKIPPED | |
| -rm -rf OUT | |
| -rm -f *.TXT | |
| -rm -f *.txt | |
| -rm -f gb-18030-2000.xml | |
| .PHONY: docclean | |
| docclean: | |
| $(MAKE) -C $(srcdir)/Doc clean | |
| # like the 'clean' target but retain the profile guided optimization (PGO) | |
| # data. The PGO data is only valid if source code remains unchanged. | |
| .PHONY: clean-retain-profile | |
| clean-retain-profile: pycremoval | |
| # Keep the generated JIT shim objects with the rest of the JIT generated | |
| # files: they are regenerated as a group and tracked by .jit-stamp. | |
| find . -name '*.[oa]' ! -name 'jit_shim*.o' -exec rm -f {} ';' | |
| find . -name '*.s[ol]' -exec rm -f {} ';' | |
| find . -name '*.so.[0-9]*.[0-9]*' -exec rm -f {} ';' | |
| find . -name '*.lto' -exec rm -f {} ';' | |
| find . -name '*.wasm' -exec rm -f {} ';' | |
| find . -name '*.lst' -exec rm -f {} ';' | |
| find build -name 'fficonfig.h' -exec rm -f {} ';' || true | |
| find build -name '*.py' -exec rm -f {} ';' || true | |
| find build -name '*.py[co]' -exec rm -f {} ';' || true | |
| -rm -f pybuilddir.txt | |
| -rm -f _bootstrap_python | |
| -rm -rf web_example python.mjs python.wasm python*.symbols python*.map | |
| -rm -f Programs/_testembed Programs/_freeze_module | |
| -rm -rf Python/deepfreeze | |
| -rm -f Python/frozen_modules/*.h | |
| -rm -f Python/frozen_modules/MANIFEST | |
| -find build -type f -a ! -name '*.gc??' -exec rm -f {} ';' | |
| -rm -f Include/pydtrace_probes.h | |
| -rm -f profile-gen-stamp | |
| -rm -rf Platforms/Apple/iOS/testbed/Python.xcframework/ios-*/bin | |
| -rm -rf Platforms/Apple/iOS/testbed/Python.xcframework/ios-*/lib | |
| -rm -rf Platforms/Apple/iOS/testbed/Python.xcframework/ios-*/include | |
| -rm -rf Platforms/Apple/iOS/testbed/Python.xcframework/ios-*/Python.framework | |
| .PHONY: profile-removal | |
| profile-removal: | |
| find . -name '*.gc??' -exec rm -f {} ';' | |
| find . -name '*.profclang?' -exec rm -f {} ';' | |
| find . -name '*.dyn' -exec rm -f {} ';' | |
| rm -f $(COVERAGE_INFO) | |
| rm -rf $(COVERAGE_REPORT) | |
| rm -f profile-run-stamp | |
| rm -f profile-bolt-stamp | |
| .PHONY: clean-profile | |
| clean-profile: clean-retain-profile clean-bolt | |
| @if test @DEF_MAKE_ALL_RULE@ = profile-opt -o @DEF_MAKE_ALL_RULE@ = bolt-opt; then \ | |
| rm -f profile-gen-stamp profile-clean-stamp; \ | |
| $(MAKE) profile-removal; \ | |
| fi | |
| # gh-141808: The JIT stencils are deliberately kept in clean-profile | |
| .PHONY: clean-jit-stencils | |
| clean-jit-stencils: | |
| -rm -f $(JIT_TARGETS) $(JIT_GENERATED_STAMP) jit_stencils*.h jit_unwind_info*.h jit_shim*.o | |
| .PHONY: clean | |
| clean: clean-profile clean-jit-stencils | |
| .PHONY: clobber | |
| clobber: clean | |
| -rm -f $(BUILDPYTHON) $(LIBRARY) $(LDLIBRARY) $(DLLLIBRARY) \ | |
| tags TAGS \ | |
| config.cache config.log pyconfig.h Modules/config.c | |
| -rm -rf build platform | |
| -rm -rf $(PYTHONFRAMEWORKDIR) | |
| -rm -rf Platforms/Apple/iOS/Frameworks | |
| -rm -rf iOSTestbed.* | |
| -rm -f python-config.py python-config | |
| -rm -rf cross-build | |
| # Make things extra clean, before making a distribution: | |
| # remove all generated files, even Makefile[.pre] | |
| # Keep configure and Python-ast.[ch], it's possible they can't be generated | |
| .PHONY: distclean | |
| distclean: clobber docclean | |
| for file in $(srcdir)/Lib/test/data/* ; do \ | |
| if test "$$file" != "$(srcdir)/Lib/test/data/README"; then rm "$$file"; fi; \ | |
| done | |
| -rm -f core Makefile Makefile.pre config.status Modules/Setup.local \ | |
| Modules/Setup.bootstrap Modules/Setup.stdlib \ | |
| Modules/ld_so_aix Modules/python.exp Misc/python.pc \ | |
| Misc/python-embed.pc Misc/python-config.sh | |
| -rm -f python*-gdb.py | |
| # Issue #28258: set LC_ALL to avoid issues with Estonian locale. | |
| # Expansion is performed here by shell (spawned by make) itself before | |
| # arguments are passed to find. So LC_ALL=C must be set as a separate | |
| # command. | |
| LC_ALL=C; find $(srcdir)/[a-zA-Z]* '(' -name '*.fdc' -o -name '*~' \ | |
| -o -name '[@,#]*' -o -name '*.old' \ | |
| -o -name '*.orig' -o -name '*.rej' \ | |
| -o -name '*.bak' ')' \ | |
| -exec rm -f {} ';' | |
| # Check that all symbols exported by libpython start with "Py" or "_Py" | |
| .PHONY: smelly | |
| smelly: all | |
| $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/build/smelly.py | |
| # Check if any unsupported C global variables have been added. | |
| .PHONY: check-c-globals | |
| check-c-globals: | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/c-analyzer/check-c-globals.py \ | |
| --format summary \ | |
| --traceback | |
| # Check for undocumented C APIs. | |
| .PHONY: check-c-api-docs | |
| check-c-api-docs: | |
| $(PYTHON_FOR_REGEN) $(srcdir)/Tools/check-c-api-docs/main.py | |
| # Find files with funny names | |
| .PHONY: funny | |
| funny: | |
| find $(SUBDIRS) $(SUBDIRSTOO) \ | |
| -type d \ | |
| -o -name '*.[chs]' \ | |
| -o -name '*.py' \ | |
| -o -name '*.pyw' \ | |
| -o -name '*.dat' \ | |
| -o -name '*.el' \ | |
| -o -name '*.fd' \ | |
| -o -name '*.in' \ | |
| -o -name '*.gif' \ | |
| -o -name '*.txt' \ | |
| -o -name '*.xml' \ | |
| -o -name '*.xbm' \ | |
| -o -name '*.xpm' \ | |
| -o -name '*.uue' \ | |
| -o -name '*.decTest' \ | |
| -o -name '*.tmCommand' \ | |
| -o -name '*.tmSnippet' \ | |
| -o -name 'Setup' \ | |
| -o -name 'Setup.*' \ | |
| -o -name README \ | |
| -o -name NEWS \ | |
| -o -name HISTORY \ | |
| -o -name Makefile \ | |
| -o -name ChangeLog \ | |
| -o -name .hgignore \ | |
| -o -name MANIFEST \ | |
| -o -print | |
| # Perform some verification checks on any modified files. | |
| .PHONY: patchcheck | |
| patchcheck: all | |
| $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/patchcheck/patchcheck.py | |
| .PHONY: check-limited-abi | |
| check-limited-abi: all | |
| $(RUNSHARED) ./$(BUILDPYTHON) $(srcdir)/Tools/build/stable_abi.py --all | |
| .PHONY: update-config | |
| update-config: | |
| curl -sL -o config.guess 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD' | |
| curl -sL -o config.sub 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD' | |
| chmod +x config.guess config.sub | |
| # Dependencies | |
| Python/thread.o: @THREADHEADERS@ $(srcdir)/Python/condvar.h | |
| ########################################################################## | |
| # Module dependencies and platform-specific files | |
| # force rebuild when header file or module build flavor (static/shared) is changed | |
| MODULE_DEPS_STATIC=Modules/config.c | |
| MODULE_DEPS_SHARED=@MODULE_DEPS_SHARED@ | |
| MODULE__CURSES_DEPS=$(srcdir)/Include/py_curses.h | |
| MODULE__CURSES_PANEL_DEPS=$(srcdir)/Include/py_curses.h | |
| MODULE__DATETIME_DEPS=$(srcdir)/Include/datetime.h | |
| MODULE_CMATH_DEPS=$(srcdir)/Modules/_math.h | |
| MODULE_MATH_DEPS=$(srcdir)/Modules/_math.h | |
| MODULE_PYEXPAT_DEPS=@LIBEXPAT_INTERNAL@ | |
| MODULE_UNICODEDATA_DEPS=$(srcdir)/Modules/unicodedata_db.h $(srcdir)/Modules/unicodename_db.h | |
| MODULE__CTYPES_DEPS=$(srcdir)/Modules/_ctypes/ctypes.h | |
| MODULE__CTYPES_TEST_DEPS=$(srcdir)/Modules/_ctypes/_ctypes_test_generated.c.h | |
| MODULE__CTYPES_MALLOC_CLOSURE=@MODULE__CTYPES_MALLOC_CLOSURE@ | |
| MODULE__ELEMENTTREE_DEPS=$(srcdir)/Modules/pyexpat.c @LIBEXPAT_INTERNAL@ | |
| MODULE__HASHLIB_DEPS=$(srcdir)/Modules/hashlib.h $(srcdir)/Modules/_openssl_mem.h | |
| MODULE__IO_DEPS=$(srcdir)/Modules/_io/_iomodule.h | |
| MODULE__REMOTE_DEBUGGING_DEPS=$(srcdir)/Modules/_remote_debugging/_remote_debugging.h $(srcdir)/Modules/_remote_debugging/gc_stats.h | |
| # HACL*-based cryptographic primitives | |
| MODULE__MD5_DEPS=$(srcdir)/Modules/hashlib.h $(LIBHACL_MD5_HEADERS) $(LIBHACL_MD5_LIB_@LIBHACL_LDEPS_LIBTYPE@) | |
| MODULE__MD5_LDEPS=$(LIBHACL_MD5_LIB_@LIBHACL_LDEPS_LIBTYPE@) | |
| MODULE__SHA1_DEPS=$(srcdir)/Modules/hashlib.h $(LIBHACL_SHA1_HEADERS) $(LIBHACL_SHA1_LIB_@LIBHACL_LDEPS_LIBTYPE@) | |
| MODULE__SHA1_LDEPS=$(LIBHACL_SHA1_LIB_@LIBHACL_LDEPS_LIBTYPE@) | |
| MODULE__SHA2_DEPS=$(srcdir)/Modules/hashlib.h $(LIBHACL_SHA2_HEADERS) $(LIBHACL_SHA2_LIB_@LIBHACL_LDEPS_LIBTYPE@) | |
| MODULE__SHA2_LDEPS=$(LIBHACL_SHA2_LIB_@LIBHACL_LDEPS_LIBTYPE@) | |
| MODULE__SHA3_DEPS=$(srcdir)/Modules/hashlib.h $(LIBHACL_SHA3_HEADERS) $(LIBHACL_SHA3_LIB_@LIBHACL_LDEPS_LIBTYPE@) | |
| MODULE__SHA3_LDEPS=$(LIBHACL_SHA3_LIB_@LIBHACL_LDEPS_LIBTYPE@) | |
| MODULE__BLAKE2_DEPS=$(srcdir)/Modules/hashlib.h $(LIBHACL_BLAKE2_HEADERS) $(LIBHACL_BLAKE2_LIB_@LIBHACL_LDEPS_LIBTYPE@) | |
| MODULE__BLAKE2_LDEPS=$(LIBHACL_BLAKE2_LIB_@LIBHACL_LDEPS_LIBTYPE@) | |
| MODULE__HMAC_DEPS=$(srcdir)/Modules/hashlib.h $(LIBHACL_HMAC_HEADERS) $(LIBHACL_HMAC_LIB_@LIBHACL_LDEPS_LIBTYPE@) | |
| MODULE__HMAC_LDEPS=$(LIBHACL_HMAC_LIB_@LIBHACL_LDEPS_LIBTYPE@) | |
| MODULE__SOCKET_DEPS=$(srcdir)/Modules/socketmodule.h $(srcdir)/Modules/addrinfo.h $(srcdir)/Modules/getaddrinfo.c $(srcdir)/Modules/getnameinfo.c | |
| MODULE__SSL_DEPS=$(srcdir)/Modules/_ssl.h $(srcdir)/Modules/_openssl_mem.h $(srcdir)/Modules/_ssl/cert.c $(srcdir)/Modules/_ssl/debughelpers.c $(srcdir)/Modules/_ssl/misc.c $(srcdir)/Modules/_ssl_data_111.h $(srcdir)/Modules/_ssl_data_300.h $(srcdir)/Modules/socketmodule.h | |
| MODULE__TESTCAPI_DEPS=$(srcdir)/Modules/_testcapi/parts.h $(srcdir)/Modules/_testcapi/util.h | |
| MODULE__TESTLIMITEDCAPI_DEPS=$(srcdir)/Modules/_testlimitedcapi/testcapi_long.h $(srcdir)/Modules/_testlimitedcapi/parts.h $(srcdir)/Modules/_testlimitedcapi/util.h | |
| MODULE__TESTINTERNALCAPI_DEPS=$(srcdir)/Modules/_testinternalcapi/parts.h $(srcdir)/Parser/tokenizer/source.h $(srcdir)/Parser/tokenizer/types.h $(srcdir)/Python/ceval.h $(srcdir)/Modules/_testinternalcapi/test_targets.h $(srcdir)/Modules/_testinternalcapi/test_cases.c.h | |
| MODULE__SQLITE3_DEPS=$(srcdir)/Modules/_sqlite/connection.h $(srcdir)/Modules/_sqlite/cursor.h $(srcdir)/Modules/_sqlite/microprotocols.h $(srcdir)/Modules/_sqlite/module.h $(srcdir)/Modules/_sqlite/prepare_protocol.h $(srcdir)/Modules/_sqlite/row.h $(srcdir)/Modules/_sqlite/util.h | |
| MODULE__ZSTD_DEPS=$(srcdir)/Modules/_zstd/_zstdmodule.h $(srcdir)/Modules/_zstd/buffer.h $(srcdir)/Modules/_zstd/zstddict.h | |
| CODECS_COMMON_HEADERS=$(srcdir)/Modules/cjkcodecs/multibytecodec.h $(srcdir)/Modules/cjkcodecs/cjkcodecs.h | |
| MODULE__CODECS_CN_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_cn.h $(CODECS_COMMON_HEADERS) | |
| MODULE__CODECS_HK_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_hk.h $(CODECS_COMMON_HEADERS) | |
| MODULE__CODECS_ISO2022_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_jisx0213_pair.h $(srcdir)/Modules/cjkcodecs/alg_jisx0201.h $(srcdir)/Modules/cjkcodecs/emu_jisx0213_2000.h $(CODECS_COMMON_HEADERS) | |
| MODULE__CODECS_JP_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_jisx0213_pair.h $(srcdir)/Modules/cjkcodecs/alg_jisx0201.h $(srcdir)/Modules/cjkcodecs/emu_jisx0213_2000.h $(srcdir)/Modules/cjkcodecs/mappings_jp.h $(CODECS_COMMON_HEADERS) | |
| MODULE__CODECS_KR_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_kr.h $(CODECS_COMMON_HEADERS) | |
| MODULE__CODECS_TW_DEPS=$(srcdir)/Modules/cjkcodecs/mappings_tw.h $(CODECS_COMMON_HEADERS) | |
| MODULE__MULTIBYTECODEC_DEPS=$(srcdir)/Modules/cjkcodecs/multibytecodec.h | |
| # IF YOU PUT ANYTHING HERE IT WILL GO AWAY | |
| # Local Variables: | |
| # mode: makefile | |
| # End: |