mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-27 21:33:09 +00:00
b60a9d8c4a
Closes #5353.
400 lines
17 KiB
Text
Vendored
400 lines
17 KiB
Text
Vendored
Building PCRE2 without using autotools
|
|
--------------------------------------
|
|
|
|
This document contains the following sections:
|
|
|
|
General
|
|
Generic instructions for the PCRE2 C library
|
|
Stack size in Windows environments
|
|
Linking programs in Windows environments
|
|
Calling conventions in Windows environments
|
|
Comments about Win32 builds
|
|
Building PCRE2 on Windows with CMake
|
|
Building PCRE2 on Windows with Visual Studio
|
|
Testing with RunTest.bat
|
|
Building PCRE2 on native z/OS and z/VM
|
|
|
|
|
|
GENERAL
|
|
|
|
The basic PCRE2 library consists entirely of code written in Standard C, and so
|
|
should compile successfully on any system that has a Standard C compiler and
|
|
library.
|
|
|
|
The PCRE2 distribution includes a "configure" file for use by the
|
|
configure/make (autotools) build system, as found in many Unix-like
|
|
environments. The README file contains information about the options for
|
|
"configure".
|
|
|
|
There is also support for CMake, which some users prefer, especially in Windows
|
|
environments, though it can also be run in Unix-like environments. See the
|
|
section entitled "Building PCRE2 on Windows with CMake" below.
|
|
|
|
Versions of src/config.h and src/pcre2.h are distributed in the PCRE2 tarballs
|
|
under the names src/config.h.generic and src/pcre2.h.generic. These are
|
|
provided for those who build PCRE2 without using "configure" or CMake. If you
|
|
use "configure" or CMake, the .generic versions are not used.
|
|
|
|
|
|
GENERIC INSTRUCTIONS FOR THE PCRE2 C LIBRARY
|
|
|
|
The following are generic instructions for building the PCRE2 C library "by
|
|
hand". If you are going to use CMake, this section does not apply to you; you
|
|
can skip ahead to the CMake section.
|
|
|
|
(1) Copy or rename the file src/config.h.generic as src/config.h, and edit the
|
|
macro settings that it contains to whatever is appropriate for your
|
|
environment. In particular, you can alter the definition of the NEWLINE
|
|
macro to specify what character(s) you want to be interpreted as line
|
|
terminators by default.
|
|
|
|
When you compile any of the PCRE2 modules, you must specify
|
|
-DHAVE_CONFIG_H to your compiler so that src/config.h is included in the
|
|
sources.
|
|
|
|
An alternative approach is not to edit src/config.h, but to use -D on the
|
|
compiler command line to make any changes that you need to the
|
|
configuration options. In this case -DHAVE_CONFIG_H must not be set.
|
|
|
|
NOTE: There have been occasions when the way in which certain parameters
|
|
in src/config.h are used has changed between releases. (In the
|
|
configure/make world, this is handled automatically.) When upgrading to a
|
|
new release, you are strongly advised to review src/config.h.generic
|
|
before re-using what you had previously.
|
|
|
|
(2) Copy or rename the file src/pcre2.h.generic as src/pcre2.h.
|
|
|
|
(3) EITHER:
|
|
Copy or rename file src/pcre2_chartables.c.dist as
|
|
src/pcre2_chartables.c.
|
|
|
|
OR:
|
|
Compile src/dftables.c as a stand-alone program (using -DHAVE_CONFIG_H
|
|
if you have set up src/config.h), and then run it with the single
|
|
argument "src/pcre2_chartables.c". This generates a set of standard
|
|
character tables and writes them to that file. The tables are generated
|
|
using the default C locale for your system. If you want to use a locale
|
|
that is specified by LC_xxx environment variables, add the -L option to
|
|
the dftables command. You must use this method if you are building on a
|
|
system that uses EBCDIC code.
|
|
|
|
The tables in src/pcre2_chartables.c are defaults. The caller of PCRE2 can
|
|
specify alternative tables at run time.
|
|
|
|
(4) For an 8-bit library, compile the following source files from the src
|
|
directory, setting -DPCRE2_CODE_UNIT_WIDTH=8 as a compiler option. Also
|
|
set -DHAVE_CONFIG_H if you have set up src/config.h with your
|
|
configuration, or else use other -D settings to change the configuration
|
|
as required.
|
|
|
|
pcre2_auto_possess.c
|
|
pcre2_chartables.c
|
|
pcre2_compile.c
|
|
pcre2_config.c
|
|
pcre2_context.c
|
|
pcre2_convert.c
|
|
pcre2_dfa_match.c
|
|
pcre2_error.c
|
|
pcre2_extuni.c
|
|
pcre2_find_bracket.c
|
|
pcre2_jit_compile.c
|
|
pcre2_maketables.c
|
|
pcre2_match.c
|
|
pcre2_match_data.c
|
|
pcre2_newline.c
|
|
pcre2_ord2utf.c
|
|
pcre2_pattern_info.c
|
|
pcre2_serialize.c
|
|
pcre2_string_utils.c
|
|
pcre2_study.c
|
|
pcre2_substitute.c
|
|
pcre2_substring.c
|
|
pcre2_tables.c
|
|
pcre2_ucd.c
|
|
pcre2_valid_utf.c
|
|
pcre2_xclass.c
|
|
|
|
Make sure that you include -I. in the compiler command (or equivalent for
|
|
an unusual compiler) so that all included PCRE2 header files are first
|
|
sought in the src directory under the current directory. Otherwise you run
|
|
the risk of picking up a previously-installed file from somewhere else.
|
|
|
|
Note that you must compile pcre2_jit_compile.c, even if you have not
|
|
defined SUPPORT_JIT in src/config.h, because when JIT support is not
|
|
configured, dummy functions are compiled. When JIT support IS configured,
|
|
pcre2_jit_compile.c #includes other files from the sljit subdirectory,
|
|
all of whose names begin with "sljit". It also #includes
|
|
src/pcre2_jit_match.c and src/pcre2_jit_misc.c, so you should not compile
|
|
these yourself.
|
|
|
|
Note also that the pcre2_fuzzsupport.c file contains special code that is
|
|
useful to those who want to run fuzzing tests on the PCRE2 library. Unless
|
|
you are doing that, you can ignore it.
|
|
|
|
(5) Now link all the compiled code into an object library in whichever form
|
|
your system keeps such libraries. This is the basic PCRE2 C 8-bit library.
|
|
If your system has static and shared libraries, you may have to do this
|
|
once for each type.
|
|
|
|
(6) If you want to build a 16-bit library or 32-bit library (as well as, or
|
|
instead of the 8-bit library) just supply 16 or 32 as the value of
|
|
-DPCRE2_CODE_UNIT_WIDTH when you are compiling.
|
|
|
|
(7) If you want to build the POSIX wrapper functions (which apply only to the
|
|
8-bit library), ensure that you have the src/pcre2posix.h file and then
|
|
compile src/pcre2posix.c. Link the result (on its own) as the pcre2posix
|
|
library.
|
|
|
|
(8) The pcre2test program can be linked with any combination of the 8-bit,
|
|
16-bit and 32-bit libraries (depending on what you selected in
|
|
src/config.h). Compile src/pcre2test.c; don't forget -DHAVE_CONFIG_H if
|
|
necessary, but do NOT define PCRE2_CODE_UNIT_WIDTH. Then link with the
|
|
appropriate library/ies. If you compiled an 8-bit library, pcre2test also
|
|
needs the pcre2posix wrapper library.
|
|
|
|
(9) Run pcre2test on the testinput files in the testdata directory, and check
|
|
that the output matches the corresponding testoutput files. There are
|
|
comments about what each test does in the section entitled "Testing PCRE2"
|
|
in the README file. If you compiled more than one of the 8-bit, 16-bit and
|
|
32-bit libraries, you need to run pcre2test with the -16 option to do
|
|
16-bit tests and with the -32 option to do 32-bit tests.
|
|
|
|
Some tests are relevant only when certain build-time options are selected.
|
|
For example, test 4 is for Unicode support, and will not run if you have
|
|
built PCRE2 without it. See the comments at the start of each testinput
|
|
file. If you have a suitable Unix-like shell, the RunTest script will run
|
|
the appropriate tests for you. The command "RunTest list" will output a
|
|
list of all the tests.
|
|
|
|
Note that the supplied files are in Unix format, with just LF characters
|
|
as line terminators. You may need to edit them to change this if your
|
|
system uses a different convention.
|
|
|
|
(10) If you have built PCRE2 with SUPPORT_JIT, the JIT features can be tested
|
|
by running pcre2test with the -jit option. This is done automatically by
|
|
the RunTest script. You might also like to build and run the freestanding
|
|
JIT test program, src/pcre2_jit_test.c.
|
|
|
|
(11) If you want to use the pcre2grep command, compile and link
|
|
src/pcre2grep.c; it uses only the basic 8-bit PCRE2 library (it does not
|
|
need the pcre2posix library). If you have built the PCRE2 library with JIT
|
|
support by defining SUPPORT_JIT in src/config.h, you can also define
|
|
SUPPORT_PCRE2GREP_JIT, which causes pcre2grep to make use of JIT (unless
|
|
it is run with --no-jit). If you define SUPPORT_PCRE2GREP_JIT without
|
|
defining SUPPORT_JIT, pcre2grep does not try to make use of JIT.
|
|
|
|
|
|
STACK SIZE IN WINDOWS ENVIRONMENTS
|
|
|
|
Prior to release 10.30 the default system stack size of 1MiB in some Windows
|
|
environments caused issues with some tests. This should no longer be the case
|
|
for 10.30 and later releases.
|
|
|
|
|
|
LINKING PROGRAMS IN WINDOWS ENVIRONMENTS
|
|
|
|
If you want to statically link a program against a PCRE2 library in the form of
|
|
a non-dll .a file, you must define PCRE2_STATIC before including src/pcre2.h.
|
|
|
|
|
|
CALLING CONVENTIONS IN WINDOWS ENVIRONMENTS
|
|
|
|
It is possible to compile programs to use different calling conventions using
|
|
MSVC. Search the web for "calling conventions" for more information. To make it
|
|
easier to change the calling convention for the exported functions in the
|
|
PCRE2 library, the macro PCRE2_CALL_CONVENTION is present in all the external
|
|
definitions. It can be set externally when compiling (e.g. in CFLAGS). If it is
|
|
not set, it defaults to empty; the default calling convention is then used
|
|
(which is what is wanted most of the time).
|
|
|
|
|
|
COMMENTS ABOUT WIN32 BUILDS (see also "BUILDING PCRE2 ON WINDOWS WITH CMAKE")
|
|
|
|
There are two ways of building PCRE2 using the "configure, make, make install"
|
|
paradigm on Windows systems: using MinGW or using Cygwin. These are not at all
|
|
the same thing; they are completely different from each other. There is also
|
|
support for building using CMake, which some users find a more straightforward
|
|
way of building PCRE2 under Windows.
|
|
|
|
The MinGW home page (http://www.mingw.org/) says this:
|
|
|
|
MinGW: A collection of freely available and freely distributable Windows
|
|
specific header files and import libraries combined with GNU toolsets that
|
|
allow one to produce native Windows programs that do not rely on any
|
|
3rd-party C runtime DLLs.
|
|
|
|
The Cygwin home page (http://www.cygwin.com/) says this:
|
|
|
|
Cygwin is a Linux-like environment for Windows. It consists of two parts:
|
|
|
|
. A DLL (cygwin1.dll) which acts as a Linux API emulation layer providing
|
|
substantial Linux API functionality
|
|
|
|
. A collection of tools which provide Linux look and feel.
|
|
|
|
On both MinGW and Cygwin, PCRE2 should build correctly using:
|
|
|
|
./configure && make && make install
|
|
|
|
This should create two libraries called libpcre2-8 and libpcre2-posix. These
|
|
are independent libraries: when you link with libpcre2-posix you must also link
|
|
with libpcre2-8, which contains the basic functions.
|
|
|
|
Using Cygwin's compiler generates libraries and executables that depend on
|
|
cygwin1.dll. If a library that is generated this way is distributed,
|
|
cygwin1.dll has to be distributed as well. Since cygwin1.dll is under the GPL
|
|
licence, this forces not only PCRE2 to be under the GPL, but also the entire
|
|
application. A distributor who wants to keep their own code proprietary must
|
|
purchase an appropriate Cygwin licence.
|
|
|
|
MinGW has no such restrictions. The MinGW compiler generates a library or
|
|
executable that can run standalone on Windows without any third party dll or
|
|
licensing issues.
|
|
|
|
But there is more complication:
|
|
|
|
If a Cygwin user uses the -mno-cygwin Cygwin gcc flag, what that really does is
|
|
to tell Cygwin's gcc to use the MinGW gcc. Cygwin's gcc is only acting as a
|
|
front end to MinGW's gcc (if you install Cygwin's gcc, you get both Cygwin's
|
|
gcc and MinGW's gcc). So, a user can:
|
|
|
|
. Build native binaries by using MinGW or by getting Cygwin and using
|
|
-mno-cygwin.
|
|
|
|
. Build binaries that depend on cygwin1.dll by using Cygwin with the normal
|
|
compiler flags.
|
|
|
|
The test files that are supplied with PCRE2 are in UNIX format, with LF
|
|
characters as line terminators. Unless your PCRE2 library uses a default
|
|
newline option that includes LF as a valid newline, it may be necessary to
|
|
change the line terminators in the test files to get some of the tests to work.
|
|
|
|
|
|
BUILDING PCRE2 ON WINDOWS WITH CMAKE
|
|
|
|
CMake is an alternative configuration facility that can be used instead of
|
|
"configure". CMake creates project files (make files, solution files, etc.)
|
|
tailored to numerous development environments, including Visual Studio,
|
|
Borland, Msys, MinGW, NMake, and Unix. If possible, use short paths with no
|
|
spaces in the names for your CMake installation and your PCRE2 source and build
|
|
directories.
|
|
|
|
The following instructions were contributed by a PCRE1 user, but they should
|
|
also work for PCRE2. If they are not followed exactly, errors may occur. In the
|
|
event that errors do occur, it is recommended that you delete the CMake cache
|
|
before attempting to repeat the CMake build process. In the CMake GUI, the
|
|
cache can be deleted by selecting "File > Delete Cache".
|
|
|
|
1. Install the latest CMake version available from http://www.cmake.org/, and
|
|
ensure that cmake\bin is on your path.
|
|
|
|
2. Unzip (retaining folder structure) the PCRE2 source tree into a source
|
|
directory such as C:\pcre2. You should ensure your local date and time
|
|
is not earlier than the file dates in your source dir if the release is
|
|
very new.
|
|
|
|
3. Create a new, empty build directory, preferably a subdirectory of the
|
|
source dir. For example, C:\pcre2\pcre2-xx\build.
|
|
|
|
4. Run cmake-gui from the Shell envirornment of your build tool, for example,
|
|
Msys for Msys/MinGW or Visual Studio Command Prompt for VC/VC++. Do not try
|
|
to start Cmake from the Windows Start menu, as this can lead to errors.
|
|
|
|
5. Enter C:\pcre2\pcre2-xx and C:\pcre2\pcre2-xx\build for the source and
|
|
build directories, respectively.
|
|
|
|
6. Hit the "Configure" button.
|
|
|
|
7. Select the particular IDE / build tool that you are using (Visual
|
|
Studio, MSYS makefiles, MinGW makefiles, etc.)
|
|
|
|
8. The GUI will then list several configuration options. This is where
|
|
you can disable Unicode support or select other PCRE2 optional features.
|
|
|
|
9. Hit "Configure" again. The adjacent "Generate" button should now be
|
|
active.
|
|
|
|
10. Hit "Generate".
|
|
|
|
11. The build directory should now contain a usable build system, be it a
|
|
solution file for Visual Studio, makefiles for MinGW, etc. Exit from
|
|
cmake-gui and use the generated build system with your compiler or IDE.
|
|
E.g., for MinGW you can run "make", or for Visual Studio, open the PCRE2
|
|
solution, select the desired configuration (Debug, or Release, etc.) and
|
|
build the ALL_BUILD project.
|
|
|
|
12. If during configuration with cmake-gui you've elected to build the test
|
|
programs, you can execute them by building the test project. E.g., for
|
|
MinGW: "make test"; for Visual Studio build the RUN_TESTS project. The
|
|
most recent build configuration is targeted by the tests. A summary of
|
|
test results is presented. Complete test output is subsequently
|
|
available for review in Testing\Temporary under your build dir.
|
|
|
|
|
|
BUILDING PCRE2 ON WINDOWS WITH VISUAL STUDIO
|
|
|
|
The code currently cannot be compiled without a stdint.h header, which is
|
|
available only in relatively recent versions of Visual Studio. However, this
|
|
portable and permissively-licensed implementation of the header worked without
|
|
issue:
|
|
|
|
http://www.azillionmonkeys.com/qed/pstdint.h
|
|
|
|
Just rename it and drop it into the top level of the build tree.
|
|
|
|
|
|
TESTING WITH RUNTEST.BAT
|
|
|
|
If configured with CMake, building the test project ("make test" or building
|
|
ALL_TESTS in Visual Studio) creates (and runs) pcre2_test.bat (and depending
|
|
on your configuration options, possibly other test programs) in the build
|
|
directory. The pcre2_test.bat script runs RunTest.bat with correct source and
|
|
exe paths.
|
|
|
|
For manual testing with RunTest.bat, provided the build dir is a subdirectory
|
|
of the source directory: Open command shell window. Chdir to the location
|
|
of your pcre2test.exe and pcre2grep.exe programs. Call RunTest.bat with
|
|
"..\RunTest.Bat" or "..\..\RunTest.bat" as appropriate.
|
|
|
|
To run only a particular test with RunTest.Bat provide a test number argument.
|
|
|
|
Otherwise:
|
|
|
|
1. Copy RunTest.bat into the directory where pcre2test.exe and pcre2grep.exe
|
|
have been created.
|
|
|
|
2. Edit RunTest.bat to indentify the full or relative location of
|
|
the pcre2 source (wherein which the testdata folder resides), e.g.:
|
|
|
|
set srcdir=C:\pcre2\pcre2-10.00
|
|
|
|
3. In a Windows command environment, chdir to the location of your bat and
|
|
exe programs.
|
|
|
|
4. Run RunTest.bat. Test outputs will automatically be compared to expected
|
|
results, and discrepancies will be identified in the console output.
|
|
|
|
To independently test the just-in-time compiler, run pcre2_jit_test.exe.
|
|
|
|
|
|
BUILDING PCRE2 ON NATIVE Z/OS AND Z/VM
|
|
|
|
z/OS and z/VM are operating systems for mainframe computers, produced by IBM.
|
|
The character code used is EBCDIC, not ASCII or Unicode. In z/OS, UNIX APIs and
|
|
applications can be supported through UNIX System Services, and in such an
|
|
environment it should be possible to build PCRE2 in the same way as in other
|
|
systems, with the EBCDIC related configuration settings, but it is not known if
|
|
anybody has tried this.
|
|
|
|
In native z/OS (without UNIX System Services) and in z/VM, special ports are
|
|
required. For details, please see file 939 on this web site:
|
|
|
|
http://www.cbttape.org
|
|
|
|
Everything in that location, source and executable, is in EBCDIC and native
|
|
z/OS file formats. The port provides an API for LE languages such as COBOL and
|
|
for the z/OS and z/VM versions of the Rexx languages.
|
|
|
|
===========================
|
|
Last Updated: 19 April 2018
|
|
===========================
|