1Compiling PCRE on non-Unix systems 2---------------------------------- 3 4This document contains the following sections: 5 6 General 7 Generic instructions for the PCRE C library 8 The C++ wrapper functions 9 Building for virtual Pascal 10 Stack size in Windows environments 11 Linking programs in Windows environments 12 Comments about Win32 builds 13 Building PCRE on Windows with CMake 14 Use of relative paths with CMake on Windows 15 Testing with RunTest.bat 16 Building under Windows with BCC5.5 17 Building PCRE on OpenVMS 18 Building PCRE on Stratus OpenVOS 19 20 21GENERAL 22 23I (Philip Hazel) have no experience of Windows or VMS sytems and how their 24libraries work. The items in the PCRE distribution and Makefile that relate to 25anything other than Unix-like systems are untested by me. 26 27There are some other comments and files (including some documentation in CHM 28format) in the Contrib directory on the FTP site: 29 30 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib 31 32If you want to compile PCRE for a non-Unix system (especially for a system that 33does not support "configure" and "make" files), note that the basic PCRE 34library consists entirely of code written in Standard C, and so should compile 35successfully on any system that has a Standard C compiler and library. The C++ 36wrapper functions are a separate issue (see below). 37 38The PCRE distribution includes a "configure" file for use by the Configure/Make 39build system, as found in many Unix-like environments. There is also support 40support for CMake, which some users prefer, especially in Windows environments. 41There are some instructions for CMake under Windows in the section entitled 42"Building PCRE with CMake" below. CMake can also be used to build PCRE in 43Unix-like systems. 44 45 46GENERIC INSTRUCTIONS FOR THE PCRE C LIBRARY 47 48The following are generic comments about building the PCRE C library "by hand". 49 50 (1) Copy or rename the file config.h.generic as config.h, and edit the macro 51 settings that it contains to whatever is appropriate for your environment. 52 In particular, if you want to force a specific value for newline, you can 53 define the NEWLINE macro. When you compile any of the PCRE modules, you 54 must specify -DHAVE_CONFIG_H to your compiler so that config.h is included 55 in the sources. 56 57 An alternative approach is not to edit config.h, but to use -D on the 58 compiler command line to make any changes that you need to the 59 configuration options. In this case -DHAVE_CONFIG_H must not be set. 60 61 NOTE: There have been occasions when the way in which certain parameters 62 in config.h are used has changed between releases. (In the configure/make 63 world, this is handled automatically.) When upgrading to a new release, 64 you are strongly advised to review config.h.generic before re-using what 65 you had previously. 66 67 (2) Copy or rename the file pcre.h.generic as pcre.h. 68 69 (3) EITHER: 70 Copy or rename file pcre_chartables.c.dist as pcre_chartables.c. 71 72 OR: 73 Compile dftables.c as a stand-alone program (using -DHAVE_CONFIG_H if 74 you have set up config.h), and then run it with the single argument 75 "pcre_chartables.c". This generates a set of standard character tables 76 and writes them to that file. The tables are generated using the default 77 C locale for your system. If you want to use a locale that is specified 78 by LC_xxx environment variables, add the -L option to the dftables 79 command. You must use this method if you are building on a system that 80 uses EBCDIC code. 81 82 The tables in pcre_chartables.c are defaults. The caller of PCRE can 83 specify alternative tables at run time. 84 85 (4) Ensure that you have the following header files: 86 87 pcre_internal.h 88 ucp.h 89 90 (5) Also ensure that you have the following file, which is #included as source 91 when building a debugging version of PCRE, and is also used by pcretest. 92 93 pcre_printint.src 94 95 (6) Compile the following source files, setting -DHAVE_CONFIG_H as a compiler 96 option if you have set up config.h with your configuration, or else use 97 other -D settings to change the configuration as required. 98 99 pcre_chartables.c 100 pcre_compile.c 101 pcre_config.c 102 pcre_dfa_exec.c 103 pcre_exec.c 104 pcre_fullinfo.c 105 pcre_get.c 106 pcre_globals.c 107 pcre_info.c 108 pcre_maketables.c 109 pcre_newline.c 110 pcre_ord2utf8.c 111 pcre_refcount.c 112 pcre_study.c 113 pcre_tables.c 114 pcre_try_flipped.c 115 pcre_ucd.c 116 pcre_valid_utf8.c 117 pcre_version.c 118 pcre_xclass.c 119 120 Make sure that you include -I. in the compiler command (or equivalent for 121 an unusual compiler) so that all included PCRE header files are first 122 sought in the current directory. Otherwise you run the risk of picking up 123 a previously-installed file from somewhere else. 124 125 (7) Now link all the compiled code into an object library in whichever form 126 your system keeps such libraries. This is the basic PCRE C library. If 127 your system has static and shared libraries, you may have to do this once 128 for each type. 129 130 (8) Similarly, if you want to build the POSIX wrapper functions, ensure that 131 you have the pcreposix.h file and then compile pcreposix.c (remembering 132 -DHAVE_CONFIG_H if necessary). Link the result (on its own) as the 133 pcreposix library. 134 135 (9) Compile the test program pcretest.c (again, don't forget -DHAVE_CONFIG_H). 136 This needs the functions in the PCRE library when linking. It also needs 137 the pcreposix wrapper functions unless you compile it with -DNOPOSIX. The 138 pcretest.c program also needs the pcre_printint.src source file, which it 139 #includes. 140 141(10) Run pcretest on the testinput files in the testdata directory, and check 142 that the output matches the corresponding testoutput files. Note that the 143 supplied files are in Unix format, with just LF characters as line 144 terminators. You may need to edit them to change this if your system uses 145 a different convention. If you are using Windows, you probably should use 146 the wintestinput3 file instead of testinput3 (and the corresponding output 147 file). This is a locale test; wintestinput3 sets the locale to "french" 148 rather than "fr_FR", and there some minor output differences. 149 150(11) If you want to use the pcregrep command, compile and link pcregrep.c; it 151 uses only the basic PCRE library (it does not need the pcreposix library). 152 153 154THE C++ WRAPPER FUNCTIONS 155 156The PCRE distribution also contains some C++ wrapper functions and tests, 157contributed by Google Inc. On a system that can use "configure" and "make", 158the functions are automatically built into a library called pcrecpp. It should 159be straightforward to compile the .cc files manually on other systems. The 160files called xxx_unittest.cc are test programs for each of the corresponding 161xxx.cc files. 162 163 164BUILDING FOR VIRTUAL PASCAL 165 166A script for building PCRE using Borland's C++ compiler for use with VPASCAL 167was contributed by Alexander Tokarev. Stefan Weber updated the script and added 168additional files. The following files in the distribution are for building PCRE 169for use with VP/Borland: makevp_c.txt, makevp_l.txt, makevp.bat, pcregexp.pas. 170 171 172STACK SIZE IN WINDOWS ENVIRONMENTS 173 174The default processor stack size of 1Mb in some Windows environments is too 175small for matching patterns that need much recursion. In particular, test 2 may 176fail because of this. Normally, running out of stack causes a crash, but there 177have been cases where the test program has just died silently. See your linker 178documentation for how to increase stack size if you experience problems. The 179Linux default of 8Mb is a reasonable choice for the stack, though even that can 180be too small for some pattern/subject combinations. 181 182PCRE has a compile configuration option to disable the use of stack for 183recursion so that heap is used instead. However, pattern matching is 184significantly slower when this is done. There is more about stack usage in the 185"pcrestack" documentation. 186 187 188LINKING PROGRAMS IN WINDOWS ENVIRONMENTS 189 190If you want to statically link a program against a PCRE library in the form of 191a non-dll .a file, you must define PCRE_STATIC before including pcre.h or 192pcrecpp.h, otherwise the pcre_malloc() and pcre_free() exported functions will 193be declared __declspec(dllimport), with unwanted results. 194 195 196CALLING CONVENTIONS IN WINDOWS ENVIRONMENTS 197 198It is possible to compile programs to use different calling conventions using 199MSVC. Search the web for "calling conventions" for more information. To make it 200easier to change the calling convention for the exported functions in the 201PCRE library, the macro PCRE_CALL_CONVENTION is present in all the external 202definitions. It can be set externally when compiling (e.g. in CFLAGS). If it is 203not set, it defaults to empty; the default calling convention is then used 204(which is what is wanted most of the time). 205 206 207COMMENTS ABOUT WIN32 BUILDS (see also "BUILDING PCRE WITH CMAKE" below) 208 209There are two ways of building PCRE using the "configure, make, make install" 210paradigm on Windows systems: using MinGW or using Cygwin. These are not at all 211the same thing; they are completely different from each other. There is also 212support for building using CMake, which some users find a more straightforward 213way of building PCRE under Windows. However, the tests are not run 214automatically when CMake is used. 215 216The MinGW home page (http://www.mingw.org/) says this: 217 218 MinGW: A collection of freely available and freely distributable Windows 219 specific header files and import libraries combined with GNU toolsets that 220 allow one to produce native Windows programs that do not rely on any 221 3rd-party C runtime DLLs. 222 223The Cygwin home page (http://www.cygwin.com/) says this: 224 225 Cygwin is a Linux-like environment for Windows. It consists of two parts: 226 227 . A DLL (cygwin1.dll) which acts as a Linux API emulation layer providing 228 substantial Linux API functionality 229 230 . A collection of tools which provide Linux look and feel. 231 232 The Cygwin DLL currently works with all recent, commercially released x86 32 233 bit and 64 bit versions of Windows, with the exception of Windows CE. 234 235On both MinGW and Cygwin, PCRE should build correctly using: 236 237 ./configure && make && make install 238 239This should create two libraries called libpcre and libpcreposix, and, if you 240have enabled building the C++ wrapper, a third one called libpcrecpp. These are 241independent libraries: when you like with libpcreposix or libpcrecpp you must 242also link with libpcre, which contains the basic functions. (Some earlier 243releases of PCRE included the basic libpcre functions in libpcreposix. This no 244longer happens.) 245 246A user submitted a special-purpose patch that makes it easy to create 247"pcre.dll" under mingw32 using the "msys" environment. It provides "pcre.dll" 248as a special target. If you use this target, no other files are built, and in 249particular, the pcretest and pcregrep programs are not built. An example of how 250this might be used is: 251 252 ./configure --enable-utf --disable-cpp CFLAGS="-03 -s"; make pcre.dll 253 254Using Cygwin's compiler generates libraries and executables that depend on 255cygwin1.dll. If a library that is generated this way is distributed, 256cygwin1.dll has to be distributed as well. Since cygwin1.dll is under the GPL 257licence, this forces not only PCRE to be under the GPL, but also the entire 258application. A distributor who wants to keep their own code proprietary must 259purchase an appropriate Cygwin licence. 260 261MinGW has no such restrictions. The MinGW compiler generates a library or 262executable that can run standalone on Windows without any third party dll or 263licensing issues. 264 265But there is more complication: 266 267If a Cygwin user uses the -mno-cygwin Cygwin gcc flag, what that really does is 268to tell Cygwin's gcc to use the MinGW gcc. Cygwin's gcc is only acting as a 269front end to MinGW's gcc (if you install Cygwin's gcc, you get both Cygwin's 270gcc and MinGW's gcc). So, a user can: 271 272. Build native binaries by using MinGW or by getting Cygwin and using 273 -mno-cygwin. 274 275. Build binaries that depend on cygwin1.dll by using Cygwin with the normal 276 compiler flags. 277 278The test files that are supplied with PCRE are in Unix format, with LF 279characters as line terminators. It may be necessary to change the line 280terminators in order to get some of the tests to work. 281 282 283BUILDING PCRE ON WINDOWS WITH CMAKE 284 285CMake is an alternative configuration facility that can be used instead of the 286traditional Unix "configure". CMake creates project files (make files, solution 287files, etc.) tailored to numerous development environments, including Visual 288Studio, Borland, Msys, MinGW, NMake, and Unix. The following instructions 289were contributed by a PCRE user. 290 2911. Install the latest CMake version available from http://www.cmake.org/, and 292 ensure that cmake\bin is on your path. 293 2942. Unzip (retaining folder structure) the PCRE source tree into a source 295 directory such as C:\pcre. 296 2973. Create a new, empty build directory, for example C:\pcre\build\ 298 2994. Run cmake-gui from the Shell envirornment of your build tool, for example, 300 Msys for Msys/MinGW or Visual Studio Command Prompt for VC/VC++. 301 3025. Enter C:\pcre\pcre-xx and C:\pcre\build for the source and build 303 directories, respectively. 304 3056. Hit the "Configure" button. 306 3077. Select the particular IDE / build tool that you are using (Visual 308 Studio, MSYS makefiles, MinGW makefiles, etc.) 309 3108. The GUI will then list several configuration options. This is where 311 you can enable UTF-8 support or other PCRE optional features. 312 3139. Hit "Configure" again. The adjacent "Generate" button should now be 314 active. 315 31610. Hit "Generate". 317 31811. The build directory should now contain a usable build system, be it a 319 solution file for Visual Studio, makefiles for MinGW, etc. Exit from 320 cmake-gui and use the generated build system with your compiler or IDE. 321 322 323USE OF RELATIVE PATHS WITH CMAKE ON WINDOWS 324 325A PCRE user comments as follows: 326 327I thought that others may want to know the current state of 328CMAKE_USE_RELATIVE_PATHS support on Windows. 329 330Here it is: 331-- AdditionalIncludeDirectories is only partially modified (only the 332first path - see below) 333-- Only some of the contained file paths are modified - shown below for 334pcre.vcproj 335-- It properly modifies 336 337I am sure CMake people can fix that if they want to. Until then one will 338need to replace existing absolute paths in project files with relative 339paths manually (e.g. from VS) - relative to project file location. I did 340just that before being told to try CMAKE_USE_RELATIVE_PATHS. Not a big 341deal. 342 343AdditionalIncludeDirectories="E:\builds\pcre\build;E:\builds\pcre\pcre-7.5;" 344AdditionalIncludeDirectories=".;E:\builds\pcre\pcre-7.5;" 345 346RelativePath="pcre.h"> 347RelativePath="pcre_chartables.c"> 348RelativePath="pcre_chartables.c.rule"> 349 350 351TESTING WITH RUNTEST.BAT 352 3531. Copy RunTest.bat into the directory where pcretest.exe has been created. 354 3552. Edit RunTest.bat and insert a line that indentifies the relative location of 356 the pcre source, e.g.: 357 358 set srcdir=..\pcre-7.4-RC3 359 3603. Run RunTest.bat from a command shell environment. Test outputs will 361 automatically be compared to expected results, and discrepancies will 362 identified in the console output. 363 3644. To test pcrecpp, run pcrecpp_unittest.exe, pcre_stringpiece_unittest.exe and 365 pcre_scanner_unittest.exe. 366 367 368BUILDING UNDER WINDOWS WITH BCC5.5 369 370Michael Roy sent these comments about building PCRE under Windows with BCC5.5: 371 372 Some of the core BCC libraries have a version of PCRE from 1998 built in, 373 which can lead to pcre_exec() giving an erroneous PCRE_ERROR_NULL from a 374 version mismatch. I'm including an easy workaround below, if you'd like to 375 include it in the non-unix instructions: 376 377 When linking a project with BCC5.5, pcre.lib must be included before any of 378 the libraries cw32.lib, cw32i.lib, cw32mt.lib, and cw32mti.lib on the command 379 line. 380 381 382BUILDING UNDER WINDOWS CE WITH VISUAL STUDIO 200x 383 384Vincent Richomme sent a zip archive of files to help with this process. They 385can be found in the file "pcre-vsbuild.zip" in the Contrib directory of the FTP 386site. 387 388 389BUILDING PCRE ON OPENVMS 390 391Dan Mooney sent the following comments about building PCRE on OpenVMS. They 392relate to an older version of PCRE that used fewer source files, so the exact 393commands will need changing. See the current list of source files above. 394 395"It was quite easy to compile and link the library. I don't have a formal 396make file but the attached file [reproduced below] contains the OpenVMS DCL 397commands I used to build the library. I had to add #define 398POSIX_MALLOC_THRESHOLD 10 to pcre.h since it was not defined anywhere. 399 400The library was built on: 401O/S: HP OpenVMS v7.3-1 402Compiler: Compaq C v6.5-001-48BCD 403Linker: vA13-01 404 405The test results did not match 100% due to the issues you mention in your 406documentation regarding isprint(), iscntrl(), isgraph() and ispunct(). I 407modified some of the character tables temporarily and was able to get the 408results to match. Tests using the fr locale did not match since I don't have 409that locale loaded. The study size was always reported to be 3 less than the 410value in the standard test output files." 411 412========================= 413$! This DCL procedure builds PCRE on OpenVMS 414$! 415$! I followed the instructions in the non-unix-use file in the distribution. 416$! 417$ COMPILE == "CC/LIST/NOMEMBER_ALIGNMENT/PREFIX_LIBRARY_ENTRIES=ALL_ENTRIES 418$ COMPILE DFTABLES.C 419$ LINK/EXE=DFTABLES.EXE DFTABLES.OBJ 420$ RUN DFTABLES.EXE/OUTPUT=CHARTABLES.C 421$ COMPILE MAKETABLES.C 422$ COMPILE GET.C 423$ COMPILE STUDY.C 424$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol 425$! did not seem to be defined anywhere. 426$! I edited pcre.h and added #DEFINE SUPPORT_UTF8 to enable UTF8 support. 427$ COMPILE PCRE.C 428$ LIB/CREATE PCRE MAKETABLES.OBJ, GET.OBJ, STUDY.OBJ, PCRE.OBJ 429$! I had to set POSIX_MALLOC_THRESHOLD to 10 in PCRE.H since the symbol 430$! did not seem to be defined anywhere. 431$ COMPILE PCREPOSIX.C 432$ LIB/CREATE PCREPOSIX PCREPOSIX.OBJ 433$ COMPILE PCRETEST.C 434$ LINK/EXE=PCRETEST.EXE PCRETEST.OBJ, PCRE/LIB, PCREPOSIX/LIB 435$! C programs that want access to command line arguments must be 436$! defined as a symbol 437$ PCRETEST :== "$ SYS$ROADSUSERS:[DMOONEY.REGEXP]PCRETEST.EXE" 438$! Arguments must be enclosed in quotes. 439$ PCRETEST "-C" 440$! Test results: 441$! 442$! The test results did not match 100%. The functions isprint(), iscntrl(), 443$! isgraph() and ispunct() on OpenVMS must not produce the same results 444$! as the system that built the test output files provided with the 445$! distribution. 446$! 447$! The study size did not match and was always 3 less on OpenVMS. 448$! 449$! Locale could not be set to fr 450$! 451========================= 452 453 454BUILDING PCRE ON STRATUS OPENVOS 455 456These notes on the port of PCRE to VOS (lightly edited) were supplied by 457Ashutosh Warikoo, whose email address has the local part awarikoo and the 458domain nse.co.in. The port was for version 7.9 in August 2009. 459 4601. Building PCRE 461 462I built pcre on OpenVOS Release 17.0.1at using GNU Tools 3.4a without any 463problems. I used the following packages to build PCRE: 464 465 ftp://ftp.stratus.com/pub/vos/posix/ga/posix.save.evf.gz 466 467Please read and follow the instructions that come with these packages. To start 468the build of pcre, from the root of the package type: 469 470 ./build.sh 471 4722. Installing PCRE 473 474Once you have successfully built PCRE, login to the SysAdmin group, switch to 475the root user, and type 476 477 [ !create_dir (master_disk)>usr --if needed ] 478 [ !create_dir (master_disk)>usr>local --if needed ] 479 !gmake install 480 481This installs PCRE and its man pages into /usr/local. You can add 482(master_disk)>usr>local>bin to your command search paths, or if you are in 483BASH, add /usr/local/bin to the PATH environment variable. 484 4854. Restrictions 486 487This port requires readline library optionally. However during the build I 488faced some yet unexplored errors while linking with readline. As it was an 489optional component I chose to disable it. 490 4915. Known Problems 492 493I ran a the test suite, but you will have to be your own judge of whether this 494command, and this port, suits your purposes. If you find any problems that 495appear to be related to the port itself, please let me know. Please see the 496build.log file in the root of the package also. 497 498 499========================= 500Last Updated: 26 May 2010 501**** 502