view src/INSTALLvms.txt @ 32936:c517845bd10e v9.0.1776

patch 9.0.1776: No support for stable Python 3 ABI Commit: https://github.com/vim/vim/commit/c13b3d1350b60b94fe87f0761ea31c0e7fb6ebf3 Author: Yee Cheng Chin <ychin.git@gmail.com> Date: Sun Aug 20 21:18:38 2023 +0200 patch 9.0.1776: No support for stable Python 3 ABI Problem: No support for stable Python 3 ABI Solution: Support Python 3 stable ABI Commits: 1) Support Python 3 stable ABI to allow mixed version interoperatbility Vim currently supports embedding Python for use with plugins, and the "dynamic" linking option allows the user to specify a locally installed version of Python by setting `pythonthreedll`. However, one caveat is that the Python 3 libs are not binary compatible across minor versions, and mixing versions can potentially be dangerous (e.g. let's say Vim was linked against the Python 3.10 SDK, but the user sets `pythonthreedll` to a 3.11 lib). Usually, nothing bad happens, but in theory this could lead to crashes, memory corruption, and other unpredictable behaviors. It's also difficult for the user to tell something is wrong because Vim has no way of reporting what Python 3 version Vim was linked with. For Vim installed via a package manager, this usually isn't an issue because all the dependencies would already be figured out. For prebuilt Vim binaries like MacVim (my motivation for working on this), AppImage, and Win32 installer this could potentially be an issue as usually a single binary is distributed. This is more tricky when a new Python version is released, as there's a chicken-and-egg issue with deciding what Python version to build against and hard to keep in sync when a new Python version just drops and we have a mix of users of different Python versions, and a user just blindly upgrading to a new Python could lead to bad interactions with Vim. Python 3 does have a solution for this problem: stable ABI / limited API (see https://docs.python.org/3/c-api/stable.html). The C SDK limits the API to a set of functions that are promised to be stable across versions. This pull request adds an ifdef config that allows us to turn it on when building Vim. Vim binaries built with this option should be safe to freely link with any Python 3 libraies without having the constraint of having to use the same minor version. Note: Python 2 has no such concept and this doesn't change how Python 2 integration works (not that there is going to be a new version of Python 2 that would cause compatibility issues in the future anyway). --- Technical details: ====== The stable ABI can be accessed when we compile with the Python 3 limited API (by defining `Py_LIMITED_API`). The Python 3 code (in `if_python3.c` and `if_py_both.h`) would now handle this and switch to limited API mode. Without it set, Vim will still use the full API as before so this is an opt-in change. The main difference is that `PyType_Object` is now an opaque struct that we can't directly create "static types" out of, and we have to create type objects as "heap types" instead. This is because the struct is not stable and changes from version to version (e.g. 3.8 added a `tp_vectorcall` field to it). I had to change all the types to be allocated on the heap instead with just a pointer to them. Other functions are also simply missing in limited API, or they are introduced too late (e.g. `PyUnicode_AsUTF8AndSize` in 3.10) to it that we need some other ways to do the same thing, so I had to abstract a few things into macros, and sometimes re-implement functions like `PyObject_NEW`. One caveat is that in limited API, `OutputType` (used for replacing `sys.stdout`) no longer inherits from `PyStdPrinter_Type` which I don't think has any real issue other than minor differences in how they convert to a string and missing a couple functions like `mode()` and `fileno()`. Also fixed an existing bug where `tp_basicsize` was set incorrectly for `BufferObject`, `TabListObject, `WinListObject`. Technically, there could be a small performance drop, there is a little more indirection with accessing type objects, and some APIs like `PyUnicode_AsUTF8AndSize` are missing, but in practice I didn't see any difference, and any well-written Python plugin should try to avoid excessing callbacks to the `vim` module in Python anyway. I only tested limited API mode down to Python 3.7, which seemes to compile and work fine. I haven't tried earlier Python versions. 2) Fix PyIter_Check on older Python vers / type##Ptr unused warning For PyIter_Check, older versions exposed them as either macros (used in full API), or a function (for use in limited API). A previous change exposed PyIter_Check to the dynamic build because Python just moved it to function-only in 3.10 anyway. Because of that, just make sure we always grab the function in dynamic builds in earlier versions since that's what Python eventually did anyway. 3) Move Py_LIMITED_API define to configure script Can now use --with-python-stable-abi flag to customize what stable ABI version to target. Can also use an env var to do so as well. 4) Show +python/dyn-stable in :version, and allow has() feature query Not sure if the "/dyn-stable" suffix would break things, or whether we should do it another way. Or just don't show it in version and rely on has() feature checking. 5) Documentation first draft. Still need to implement v:python3_version 6) Fix PyIter_Check build breaks when compiling against Python 3.8 7) Add CI coverage stable ABI on Linux/Windows / make configurable on Windows This adds configurable options for Windows make files (both MinGW and MSVC). CI will also now exercise both traditional full API and stable ABI for Linux and Windows in the matrix for coverage. Also added a "dynamic" option to Linux matrix as a drive-by change to make other scripting languages like Ruby / Perl testable under both static and dynamic builds. 8) Fix inaccuracy in Windows docs Python's own docs are confusing but you don't actually want to use `python3.dll` for the dynamic linkage. 9) Add generated autoconf file 10) Add v:python3_version support This variable indicates the version of Python3 that Vim was built against (PY_VERSION_HEX), and will be useful to check whether the Python library you are loading in dynamically actually fits it. When built with stable ABI, it will be the limited ABI version instead (`Py_LIMITED_API`), which indicates the minimum version of Python 3 the user should have, rather than the exact match. When stable ABI is used, we won't be exposing PY_VERSION_HEX in this var because it just doesn't seem necessary to do so (the whole point of stable ABI is the promise that it will work across versions), and I don't want to confuse the user with too many variables. Also, cleaned up some documentation, and added help tags. 11) Fix Python 3.7 compat issues Fix a couple issues when using limited API < 3.8 - Crash on exit: In Python 3.7, if a heap-allocated type is destroyed before all instances are, it would cause a crash later. This happens when we destroyed `OptionsType` before calling `Py_Finalize` when using the limited API. To make it worse, later versions changed the semantics and now each instance has a strong reference to its own type and the recommendation has changed to have each instance de-ref its own type and have its type in GC traversal. To avoid dealing with these cross-version variations, we just don't free the heap type. They are static types in non-limited-API anyway and are designed to last through the entirety of the app, and we also don't restart the Python runtime and therefore do not need it to have absolutely 0 leaks. See: - https://docs.python.org/3/whatsnew/3.8.html#changes-in-the-c-api - https://docs.python.org/3/whatsnew/3.9.html#changes-in-the-c-api - PyIter_Check: This function is not provided in limited APIs older than 3.8. Previously I was trying to mock it out using manual PyType_GetSlot() but it was brittle and also does not actually work properly for static types (it will generate a Python error). Just return false. It does mean using limited API < 3.8 is not recommended as you lose the functionality to handle iterators, but from playing with plugins I couldn't find it to be an issue. - Fix loading of PyIter_Check so it will be done when limited API < 3.8. Otherwise loading a 3.7 Python lib will fail even if limited API was specified to use it. 12) Make sure to only load `PyUnicode_AsUTF8AndSize` in needed in limited API We don't use this function unless limited API >= 3.10, but we were loading it regardless. Usually it's ok in Unix-like systems where Python just has a single lib that we load from, but in Windows where there is a separate python3.dll this would not work as the symbol would not have been exposed in this more limited DLL file. This makes it much clearer under what condition is this function needed. closes: #12032 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Yee Cheng Chin <ychin.git@gmail.com>
author Christian Brabandt <cb@256bit.org>
date Sun, 20 Aug 2023 21:30:04 +0200
parents 2295ee9c025d
children cb88e5c589d0
line wrap: on
line source

INSTALLvms.txt - Installation of Vim on OpenVMS

Maintainer:   Zoltan Arpadffy <arpadffy@polarhome.com>
Last change:  2008 Jan 06

This file contains instructions for compiling Vim on Openvms.
If you already have an executable version of Vim, you don't need this.

If you skip settings described here, then you will get the default Vim
behavior as it is documented, which should be fine for most users.

The file "feature.h" can be edited to match your preferences, but this file
does not describe possibilities hidden in feature.h acrobatics, however
parameters from MAKE_VMS.MMS actively use and set up parameters in relation
with feature.h

More information and case analysis you can find in os_vms.txt
([runtime.doc]os_vms.txt or :help vms from vim prompt)

Contents:
1. Download files
2. Configuration
3. Compilation DECC
4. Compilation VAXC
5. CTAGS, XXD
6. Deployment
7. GTK and other features
8. Notes
9. Authors

----------------------------------------------------------------------------
1. Download files

1.1. Visit the Vim ftp site (see ftp://ftp.vim.org/pub/vim/MIRRORS)
     and obtain the following three files:

     unix/vim-X.X-src.tar.gz
     unix/vim-X.X-rt.tar.gz
     extra/vim-X.X-extra.tar.gz

     where X.X is the version number.

1.2. Expand the three archives.

1.3. Apply patches if they exist.  (Patch files are found in the ftp
     site in the "patches" directory.)

1.4. You will need either the DECSET mms utility or the freely available clone
     of it called mmk (VMS has no make utility in the standard distribution).
     You can download mmk from http://www.openvms.digital.com/freeware/MMK/

1.5. If you want to have Perl, Python or Tcl support in Vim you will need VMS
     distributions for them as well.

1.6  If you want to have GTK executable, you need to have properly installed
     GTK libraries.

NOTE: procedure in chapter 1 describes source code preparation from multi OS
code, however it is available OpenVMS optimized (and tested) source code from:
ftp://ftp.polarhome.com/pub/vim/source/vms/
(http://www.polarhome.com/vim/files/source/vms/)

Current OpenVMS source code as .zip or .tar.gz file is possible to download
from CVS mirror ftp://ftp.polarhome.com/pub/cvs/SOURCE/
(http://www.polarhome.com/cvs/SOURCE/)

2.   Configuration

2.1. Edit vim-X.X/src/feature.h for your preference.  (You can skip
     this, then you will get the default behavior as is documented,
     which should be fine for most people.)

     For example, if you want to add the MULTI_BYTE feature, turn on
     #define MULTI_BYTE

2.2  Edit vim-X.X/src/Make_vms.mms to customize your Vim. Options are:

	Parameter name	: MODEL
	Description	: Build model selection
	Options:	: TINY	  - No optional features enabled
			  NORMAL  - A default selection of features enabled
				    (OpenVMS default)
			  HUGE	  - All possible features enabled.
			  Uncommented - will default to NORMAL
	Default		: MODEL = NORMAL

	Parameter name	: GUI
	Description	: GUI or terminal mode executable
	Options:	: YES - GUI executable
			  Uncommented - char only
	Default		: GUI = YES

	Parameter name	: GTK
	Description	: Enable GTK in GUI mode.
			  It enables features as toolbar etc.
	Options:	: YES - GTK executable
			  Uncommented - without GTK
	Default		: Uncommented

	Parameter name	: XPM
	Description	: Enable XPM libraries in GUI/Motif mode.
			  It enables features as toolbar etc.
	Options:	: YES - GUI executable
			  Uncommented - without XPM
	Default		: Uncommented

	Parameter name	: DECC
	Description	: Compiler selection
	Options:	: YES - DECC compiler
			  Uncommented - VAXC compiler
	Default		: DECC = YES

	Parameter name	: CCVER
	Description	: Compiler version with :ver command
	Options:	: YES - Compiler version info will be added
			  Uncommented - will not be added
	Default		: CCVER = YES

	Parameter name	: DEBUG
	Description	: Building a debug version
	Options:	: YES - debug version will be built
			  Uncommented - building normal executable
	Default		: Uncommented

	Parameter name	: VIM_TCL
	Description	: Add Tcl support
	Options:	: YES - Build with support
			  Uncommented - build without support.
	Default		: Uncommented

	Parameter name	: VIM_PERL
	Description	: Add Perl support
	Options:	: YES - Build with support
			  Uncommented - build without support.
	Default		: Uncommented

	Parameter name	: VIM_PYTHON
	Description	: Add Python support
	Options:	: YES - Build with support
			  Uncommented - build without support.
	Default		: Uncommented

	Parameter name	: VIM_XIM
	Description	: X Input Method. For entering special languages
			  like Chinese and Japanese. Please define just
			  one: VIM_XIM or VIM_HANGULIN
	Options:	: YES - Build with support
			  Uncommented - build without support.
	Default		: Uncommented

	Parameter name	: VIM_HANGULIN
	Description	: Internal Hangul input method. GUI only.
			  Please define just one: VIM_XIM or VIM_HANGULIN
	Options:	: YES - Build with support
			  Uncommented - build without support.
	Default		: Uncommented

	Parameter name	: VIM_TAG_ANYWHITE
	Description	: Allow any white space to separate the fields in a
			  tags file
			  When not defined, only a TAB is allowed.
	Options:	: YES - Build with support
			  Uncommented - build without support.
	Default		: Uncommented

     You can edit the *_INC and *_LIB qualifiers, but it is really
     not recommended for beginners.

3. Compilation DECC

3.1. If you have MSS on your system, the command

	mms /descrip=Make_vms.mms

     will start building your own customized version of Vim.
     The adequate command for mmk is:

	mmk /descrip=Make_vms.mms

     NOTE: Because of empty /auto/config.h (needed for Unix configure) build
     will fail with very strange messages. Therefore before building, it is
     recommended to make one clean up, to prepare everything for OpenVMS
     development. The command is:

	mms /descrip=Make_vms.mms clean

4. Compilation VAXC

4.1. VAXC compiler is not fully ANSI C compatible in pre-processor directives
     semantics, therefore you have to use a converter program what will do the
     lion part of the job.

	@os_vms_fix.com *.c *.h <.proto>*.pro

     more information can be found in os_vms_fix.com file itself.

     NOTE: even if os_vms_fix.com will fix all pre-processor directives it will
     leave single (long) line directives. You have to fix them manually.
     Known problematic files are option.h and option.c

4.2. After the conversion you can continue building as it has been described
     above.

5. CTAGS, XXD

5.1. MMS_VIM.EXE is building together with VIM.EXE, but for CTAGS.EXE and
     XXD.EXE you should change to subdirectory <.CTAGS> or <.XXD> and build
     them separately.

5.2. In these directories you can find one make file for VMS as well.
     Please read the detailed build instructions in the related *.MMS file.

6.   Deployment

6.1. Copy over all executables to the deployment directory.

6.2. Vim uses a special directory structure to hold the document and runtime
     files:

   vim (or wherever)
    |-- doc
    |-- syntax
    vimrc    (system rc files)
    gvimrc

6.3 Define logicals VIM

	define/nolog VIM device:[leading-path-here.vim]

     to get vim.exe to find its document, filetype, and syntax files.

     Now, if you are lucky you should have one own built, customized and
     working Vim.

7.   GTK and other features

7.1  General notes

     To be able to build external GUI or language support you have to enable
     related feature in MAKE_VMS.MMS file. Usually it needs some extra tuning
     around include files, shared libraries etc.

     Please note, that leading "," are valuable for MMS/MMK syntax.

     MAKE_VMS.MMS uses defines as described below:

7.1.1   feature_DEF = ,"SOME_FEATURE"

     Submits definition to compiler preprocessor to enable code blocks
     defined with
     #ifdef SOME_FEATURE
     {some code here}
     #endif

     Example:  TCL_DEF = ,"FEAT_TCL"


7.1.2   feature_SRC = code1.c code2.c

     Defines source code related with particular feature.
     Example:  TCL_SRC = if_tcl.c

7.1.3   feature_OBJ = code1.obj code2.obj

     Lists objects created from source codes listed in feature_SRC
     Example: PERL_OBJ = if_perlsfio.obj if_perl.obj

7.1.4  feature_LIB = ,OS_VMS_TCL.OPT/OPT

     Defines the libraries that have to be used for build.
     If it is an OPT file then MAKE_VMS.MMS creates OPT files
     in gen_feature procedure.

     Example:
     PERL_LIB = ,OS_VMS_PERL.OPT/OPT

.IFDEF VIM_PERL
perl_env :
	-@ write sys$output "creating OS_VMS_PERL.OPT file."
	-@ open/write opt_file OS_VMS_PERL.OPT
	-@ write opt_file "PERLSHR /share"
	-@ close opt_file
.ELSE
perl_env :
	-@ !
.ENDIF


7.1.5  feature_INC = ,dka0:[tcl80.generic]

     Defines the directory where the necessary include files are.
     Example: TCL_INC = ,dka0:[tcl80.generic]

7.2  GTK

     To build VIM with GTK you have to install GTK on your OpenVMS.
     So far it works just on Alpha and IA64. More information at:
     http://www.openvms.compaq.com/openvms/products/ips/gtk.html

     You also need the OpenVMS Porting Library:
     http://www.openvms.compaq.com/openvms/products/ips/porting.html

     Source code for GTK and porting library that is used to build
     VMS executables at polarhome.com are at
     http://www.polarhome.com/vim/files/source/vms/

     Enable GTK in make_vms.mms file with GTK = YES
     Define GTK_ROOT that points to your GTK root directory.

     You will need to edit GTKDIR variable in order to point
     to GTK header files and libraries.

     GTK_DIR  = ALPHA$DKA0:[GTK128.]

     ".]" at the end is very important.

     Build it as normally.

     Used shareable images are:
	gtk_root:[glib]libglib.exe /share,-
	gtk_root:[glib.gmodule]libgmodule.exe /share,-
	gtk_root:[gtk.gdk]libgdk.exe /share,-
	gtk_root:[gtk.gtk]libgtk.exe /share

     During runtime it is suggested to have all these files installed and
     copied to SYS$LIBRARY: to be able to use it without problems.
     Also VMS_JACKETS.EXE from OpenVMS Porting Library.

     Please note, that GTK uses /name=(as_is,short)/float=ieee/ieee=denorm
     compiler directives that is not compatible with "standard" VMS usage,
     therefore other external features might fail as PERL, PYTHON and TCL
     support.

7.3  PERL

     You have to install OpenVMS perl package from:
     http://www.openvms.compaq.com/openvms/products/ips/apache/csws_perl_relnotes.html or build on your own from sources downloaded from http://www.perl.org

     You need defined PERLSHR logical that points to PERL shareable image
     (or you can just copy over to SYS$LIBRARY:)

     Enable Perl feature at make_vms.mms with VIM_PERL = YES

     Edit PERL_INC = to point to perl includes directory where is extern.h

     Build as usual.

7.4  PYTHON

     You have to install an OpenVMS python package.
     Set up the normal Python work environment.

     You have to have defined PYTHON_INCLUDE and PYTHON_OLB logicals.
     PYTHON_INCLUDE should point to Python include files where for ex:
     python.h is located.
     Enable Python feature at make_vms.mms with VIM_PYTHON = YES

     Build as usual.

7.5  TCL

     You have to install an OpenVMS TCL package.
     Set up the normal TCL work environment.

     You have to have defined TCLSHR logical that points to shareable image.

     Enable TCL feature at make_vms.mms with VIM_TCL = YES

     Edit TCL_INC = to point to TCL includes directory where is tcl.h

     Build as usual.

8.   Notes

8.1. New Compaq C compiler

     If you are using Compaq C compiler V6.2 or newer, informational messages
     of the type QUESTCOMPARE will be displayed. You should ignore those
     messages ; they are generated only because some test comparisons are done
     with variables which type vary depending on the OS. Under VMS, those are
     "unsigned" and the compiler issue a message whenever the comparison is
     done with '<=' to 0. However, the code is correct and will behave as
     expected.
     ( Jerome Lauret <JLAURET@mail.chem.sunysb.edu> Vim 6.0n )
	NOTE: from version 6.0ad Vim code has been reviewed and these warnings
	have been corrected.

9.   Authors

     Initial version, 2000 Jul 19, Zoltan Arpadffy <arpadffy@polarhome.com>