1 Compiling PCRE on non-Unix systems 2 ---------------------------------- 3 4 This 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 21 GENERAL 22 23 I (Philip Hazel) have no experience of Windows or VMS sytems and how their 24 libraries work. The items in the PCRE distribution and Makefile that relate to 25 anything other than Unix-like systems are untested by me. 26 27 There are some other comments and files (including some documentation in CHM 28 format) in the Contrib directory on the FTP site: 29 30 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib 31 32 If you want to compile PCRE for a non-Unix system (especially for a system that 33 does not support "configure" and "make" files), note that the basic PCRE 34 library consists entirely of code written in Standard C, and so should compile 35 successfully on any system that has a Standard C compiler and library. The C++ 36 wrapper functions are a separate issue (see below). 37 38 The PCRE distribution includes a "configure" file for use by the Configure/Make 39 build system, as found in many Unix-like environments. There is also support 40 support for CMake, which some users prefer, especially in Windows environments. 41 There 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 43 Unix-like systems. 44 45 46 GENERIC INSTRUCTIONS FOR THE PCRE C LIBRARY 47 48 The 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 154 THE C++ WRAPPER FUNCTIONS 155 156 The PCRE distribution also contains some C++ wrapper functions and tests, 157 contributed by Google Inc. On a system that can use "configure" and "make", 158 the functions are automatically built into a library called pcrecpp. It should 159 be straightforward to compile the .cc files manually on other systems. The 160 files called xxx_unittest.cc are test programs for each of the corresponding 161 xxx.cc files. 162 163 164 BUILDING FOR VIRTUAL PASCAL 165 166 A script for building PCRE using Borland's C++ compiler for use with VPASCAL 167 was contributed by Alexander Tokarev. Stefan Weber updated the script and added 168 additional files. The following files in the distribution are for building PCRE 169 for use with VP/Borland: makevp_c.txt, makevp_l.txt, makevp.bat, pcregexp.pas. 170 171 172 STACK SIZE IN WINDOWS ENVIRONMENTS 173 174 The default processor stack size of 1Mb in some Windows environments is too 175 small for matching patterns that need much recursion. In particular, test 2 may 176 fail because of this. Normally, running out of stack causes a crash, but there 177 have been cases where the test program has just died silently. See your linker 178 documentation for how to increase stack size if you experience problems. The 179 Linux default of 8Mb is a reasonable choice for the stack, though even that can 180 be too small for some pattern/subject combinations. 181 182 PCRE has a compile configuration option to disable the use of stack for 183 recursion so that heap is used instead. However, pattern matching is 184 significantly slower when this is done. There is more about stack usage in the 185 "pcrestack" documentation. 186 187 188 LINKING PROGRAMS IN WINDOWS ENVIRONMENTS 189 190 If you want to statically link a program against a PCRE library in the form of 191 a non-dll .a file, you must define PCRE_STATIC before including pcre.h or 192 pcrecpp.h, otherwise the pcre_malloc() and pcre_free() exported functions will 193 be declared __declspec(dllimport), with unwanted results. 194 195 196 CALLING CONVENTIONS IN WINDOWS ENVIRONMENTS 197 198 It is possible to compile programs to use different calling conventions using 199 MSVC. Search the web for "calling conventions" for more information. To make it 200 easier to change the calling convention for the exported functions in the 201 PCRE library, the macro PCRE_CALL_CONVENTION is present in all the external 202 definitions. It can be set externally when compiling (e.g. in CFLAGS). If it is 203 not set, it defaults to empty; the default calling convention is then used 204 (which is what is wanted most of the time). 205 206 207 COMMENTS ABOUT WIN32 BUILDS (see also "BUILDING PCRE WITH CMAKE" below) 208 209 There are two ways of building PCRE using the "configure, make, make install" 210 paradigm on Windows systems: using MinGW or using Cygwin. These are not at all 211 the same thing; they are completely different from each other. There is also 212 support for building using CMake, which some users find a more straightforward 213 way of building PCRE under Windows. However, the tests are not run 214 automatically when CMake is used. 215 216 The 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 223 The 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 235 On both MinGW and Cygwin, PCRE should build correctly using: 236 237 ./configure && make && make install 238 239 This should create two libraries called libpcre and libpcreposix, and, if you 240 have enabled building the C++ wrapper, a third one called libpcrecpp. These are 241 independent libraries: when you like with libpcreposix or libpcrecpp you must 242 also link with libpcre, which contains the basic functions. (Some earlier 243 releases of PCRE included the basic libpcre functions in libpcreposix. This no 244 longer happens.) 245 246 A 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" 248 as a special target. If you use this target, no other files are built, and in 249 particular, the pcretest and pcregrep programs are not built. An example of how 250 this might be used is: 251 252 ./configure --enable-utf --disable-cpp CFLAGS="-03 -s"; make pcre.dll 253 254 Using Cygwin's compiler generates libraries and executables that depend on 255 cygwin1.dll. If a library that is generated this way is distributed, 256 cygwin1.dll has to be distributed as well. Since cygwin1.dll is under the GPL 257 licence, this forces not only PCRE to be under the GPL, but also the entire 258 application. A distributor who wants to keep their own code proprietary must 259 purchase an appropriate Cygwin licence. 260 261 MinGW has no such restrictions. The MinGW compiler generates a library or 262 executable that can run standalone on Windows without any third party dll or 263 licensing issues. 264 265 But there is more complication: 266 267 If a Cygwin user uses the -mno-cygwin Cygwin gcc flag, what that really does is 268 to tell Cygwin's gcc to use the MinGW gcc. Cygwin's gcc is only acting as a 269 front end to MinGW's gcc (if you install Cygwin's gcc, you get both Cygwin's 270 gcc 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 278 The test files that are supplied with PCRE are in Unix format, with LF 279 characters as line terminators. It may be necessary to change the line 280 terminators in order to get some of the tests to work. 281 282 283 BUILDING PCRE ON WINDOWS WITH CMAKE 284 285 CMake is an alternative configuration facility that can be used instead of the 286 traditional Unix "configure". CMake creates project files (make files, solution 287 files, etc.) tailored to numerous development environments, including Visual 288 Studio, Borland, Msys, MinGW, NMake, and Unix. The following instructions 289 were contributed by a PCRE user. 290 291 1. Install the latest CMake version available from http://www.cmake.org/, and 292 ensure that cmake\bin is on your path. 293 294 2. Unzip (retaining folder structure) the PCRE source tree into a source 295 directory such as C:\pcre. 296 297 3. Create a new, empty build directory, for example C:\pcre\build\ 298 299 4. 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 302 5. Enter C:\pcre\pcre-xx and C:\pcre\build for the source and build 303 directories, respectively. 304 305 6. Hit the "Configure" button. 306 307 7. Select the particular IDE / build tool that you are using (Visual 308 Studio, MSYS makefiles, MinGW makefiles, etc.) 309 310 8. The GUI will then list several configuration options. This is where 311 you can enable UTF-8 support or other PCRE optional features. 312 313 9. Hit "Configure" again. The adjacent "Generate" button should now be 314 active. 315 316 10. Hit "Generate". 317 318 11. 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 323 USE OF RELATIVE PATHS WITH CMAKE ON WINDOWS 324 325 A PCRE user comments as follows: 326 327 I thought that others may want to know the current state of 328 CMAKE_USE_RELATIVE_PATHS support on Windows. 329 330 Here it is: 331 -- AdditionalIncludeDirectories is only partially modified (only the 332 first path - see below) 333 -- Only some of the contained file paths are modified - shown below for 334 pcre.vcproj 335 -- It properly modifies 336 337 I am sure CMake people can fix that if they want to. Until then one will 338 need to replace existing absolute paths in project files with relative 339 paths manually (e.g. from VS) - relative to project file location. I did 340 just that before being told to try CMAKE_USE_RELATIVE_PATHS. Not a big 341 deal. 342 343 AdditionalIncludeDirectories="E:\builds\pcre\build;E:\builds\pcre\pcre-7.5;" 344 AdditionalIncludeDirectories=".;E:\builds\pcre\pcre-7.5;" 345 346 RelativePath="pcre.h"> 347 RelativePath="pcre_chartables.c"> 348 RelativePath="pcre_chartables.c.rule"> 349 350 351 TESTING WITH RUNTEST.BAT 352 353 1. Copy RunTest.bat into the directory where pcretest.exe has been created. 354 355 2. 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 360 3. 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 364 4. To test pcrecpp, run pcrecpp_unittest.exe, pcre_stringpiece_unittest.exe and 365 pcre_scanner_unittest.exe. 366 367 368 BUILDING UNDER WINDOWS WITH BCC5.5 369 370 Michael 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 382 BUILDING UNDER WINDOWS CE WITH VISUAL STUDIO 200x 383 384 Vincent Richomme sent a zip archive of files to help with this process. They 385 can be found in the file "pcre-vsbuild.zip" in the Contrib directory of the FTP 386 site. 387 388 389 BUILDING PCRE ON OPENVMS 390 391 Dan Mooney sent the following comments about building PCRE on OpenVMS. They 392 relate to an older version of PCRE that used fewer source files, so the exact 393 commands 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 396 make file but the attached file [reproduced below] contains the OpenVMS DCL 397 commands I used to build the library. I had to add #define 398 POSIX_MALLOC_THRESHOLD 10 to pcre.h since it was not defined anywhere. 399 400 The library was built on: 401 O/S: HP OpenVMS v7.3-1 402 Compiler: Compaq C v6.5-001-48BCD 403 Linker: vA13-01 404 405 The test results did not match 100% due to the issues you mention in your 406 documentation regarding isprint(), iscntrl(), isgraph() and ispunct(). I 407 modified some of the character tables temporarily and was able to get the 408 results to match. Tests using the fr locale did not match since I don't have 409 that locale loaded. The study size was always reported to be 3 less than the 410 value 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 454 BUILDING PCRE ON STRATUS OPENVOS 455 456 These notes on the port of PCRE to VOS (lightly edited) were supplied by 457 Ashutosh Warikoo, whose email address has the local part awarikoo and the 458 domain nse.co.in. The port was for version 7.9 in August 2009. 459 460 1. Building PCRE 461 462 I built pcre on OpenVOS Release 17.0.1at using GNU Tools 3.4a without any 463 problems. I used the following packages to build PCRE: 464 465 ftp://ftp.stratus.com/pub/vos/posix/ga/posix.save.evf.gz 466 467 Please read and follow the instructions that come with these packages. To start 468 the build of pcre, from the root of the package type: 469 470 ./build.sh 471 472 2. Installing PCRE 473 474 Once you have successfully built PCRE, login to the SysAdmin group, switch to 475 the 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 481 This 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 483 BASH, add /usr/local/bin to the PATH environment variable. 484 485 4. Restrictions 486 487 This port requires readline library optionally. However during the build I 488 faced some yet unexplored errors while linking with readline. As it was an 489 optional component I chose to disable it. 490 491 5. Known Problems 492 493 I ran a the test suite, but you will have to be your own judge of whether this 494 command, and this port, suits your purposes. If you find any problems that 495 appear to be related to the port itself, please let me know. Please see the 496 build.log file in the root of the package also. 497 498 499 ========================= 500 Last Updated: 26 May 2010 501 **** 502