diff --git a/config.w32 b/config.w32 new file mode 100644 index 0000000..602ccaa --- /dev/null +++ b/config.w32 @@ -0,0 +1,59 @@ +// vim:ft=javascript + +ARG_WITH("geos", "geos support", "yes"); + +if (PHP_GEOS != "no") { + if (CHECK_LIB("geos_c.lib", "geos", PHP_PHP_BUILD + "\\lib") && + CHECK_HEADER_ADD_INCLUDE("geos_c.h", "CFLAGS_GEOS", PHP_PHP_BUILD + "\\include")) { + + CHECK_FUNC_IN_HEADER("geos_c.h", "initGEOS_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && !PHP_GEOS && WARNING("Unable to build the GEOS: a newer libgeos is required"); + + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSClipByRect_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_CLIP_BY_RECT', 1, 'Whether we have GEOSClipByRect_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSCoveredBy_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_COVERED_BY', 1, 'Whether we have GEOSCoveredBy_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSCovers_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_COVERS', 1, 'Whether we have GEOSCovers_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSDelaunayTriangulation_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_DELAUNAY_TRIANGULATION', 1, 'Whether we have GEOSDelaunayTriangulation_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSGeomGetEndPoint_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_GEOM_GET_END_POINT', 1, 'Whether we have GEOSGeomGetEndPoint_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSGeomGetNumPoints_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_GEOM_GET_NUM_POINTS', 1, 'Whether we have GEOSGeomGetNumPoints_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSGeomGetPointN_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_GEOM_GET_POINT_N', 1, 'Whether we have GEOSGeomGetPointN_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSGeomGetStartPoint_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_GEOM_GET_START_POINT', 1, 'Whether we have GEOSGeomGetStartPoint_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSGeomGetX_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_GEOM_GET_X', 1, 'Whether we have GEOSGeomGetX_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSGeomGetY_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_GEOM_GET_Y', 1, 'Whether we have GEOSGeomGetY_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSGeom_extractUniquePoints_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_GEOM_EXTRACT_UNIQUE_POINTS', 1, 'Whether we have GEOSGeom_extractUniquePoints_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSGeom_getCoordinateDimension_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_GEOM_GET_COORDINATE_DIMENSION', 1, 'Whether we have GEOSGeom_getCoordinateDimension_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSNode_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_NODE', 1, 'Whether we have GEOSNode_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSOffsetCurve_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_OFFSET_CURVE', 1, 'Whether we have GEOSOffsetCurve_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSPolygonize_full_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_POLYGONIZE_FULL', 1, 'Whether we have GEOSPolygonize_full_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSRelateBoundaryNodeRule_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_RELATE_BOUNDARY_NODE_RULE', 1, 'Whether we have GEOSRelateBoundaryNodeRule_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSRelatePatternMatch_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_RELATE_PATTERN_MATCH', 1, 'Whether we have GEOSRelatePatternMatch_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSSharedPaths_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_SHARED_PATHS', 1, 'Whether we have GEOSSharedPaths_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSSnap_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_SNAP', 1, 'Whether we have GEOSSnap_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSUnaryUnion_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_UNARY_UNION', 1, 'Whether we have GEOSUnaryUnion_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSVoronoiDiagram_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_VORONOI_DIAGRAM', 1, 'Whether we have GEOSVoronoiDiagram_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSisClosed_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_IS_CLOSED', 1, 'Whether we have GEOSisClosed_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSisValidDetail_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_IS_VALID_DETAIL', 1, 'Whether we have GEOSisValidDetail_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSGeom_setPrecision_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_GEOM_SET_PRECISION', 1, 'Whether we have GEOSGeom_setPrecision_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSGeom_getPrecision_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_GEOM_GET_PRECISION', 1, 'Whether we have GEOSGeom_getPrecision_r'); + + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSWKTWriter_setTrim_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_WKT_WRITER_SET_TRIM', 1, 'Whether we have GEOSWKTWriter_setTrim_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSWKTWriter_setRoundingPrecision_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_WKT_WRITER_SET_ROUNDING_PRECISION', 1, 'Whether we have GEOSWKTWriter_setRoundingPrecision_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSWKTWriter_setOutputDimension_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_WKT_WRITER_SET_OUTPUT_DIMENSION', 1, 'Whether we have GEOSWKTWriter_setOutputDimension_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSWKTWriter_getOutputDimension_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_WKT_WRITER_GET_OUTPUT_DIMENSION', 1, 'Whether we have GEOSWKTWriter_getOutputDimension_r'); + CHECK_FUNC_IN_HEADER("geos_c.h", "GEOSWKTWriter_setOld3D_r", PHP_PHP_BUILD + "\\include", "CFLAGS_GEOS") && AC_DEFINE('HAVE_GEOS_WKT_WRITER_SET_OLD_3D', 1, 'Whether we have GEOSWKTWriter_setOld3D_r'); + + // https://juliahub.com/docs/LibGEOS/we91k/0.6.5/autodocs/ + // setPrecision: GEOS_PREC_NO_TOPO -- do not attempt at preserving the topology -- geos.c l. 3379 + // setPrecision: GEOS_PREC_KEEP_COLLAPSED -- retain collapsed elements -- geos.c l. 3384 + // We can't run TRY_COMPILE tests on Windows ?? force HAVE_GEOS_PREC_NO_TOPO & HAVE_GEOS_PREC_KEEP_COLLAPSED + // AC_TRY_COMPILE(geos_c.h, GEOS_PREC_NO_TOPO, AC_DEFINE(HAVE_GEOS_PREC_NO_TOPO,1,[Whether we have GEOS_PREC_NO_TOPO])) -- do not attempt at preserving the topology + // AC_TRY_COMPILE(geos_c.h, GEOS_PREC_KEEP_COLLAPSED, AC_DEFINE(HAVE_GEOS_PREC_KEEP_COLLAPSED,1,[Whether we have GEOS_PREC_KEEP_COLLAPSED])) -- retain collapsed elements + AC_DEFINE('HAVE_GEOS_PREC_NO_TOPO',1,'Whether we have GEOS_PREC_NO_TOPO'); + AC_DEFINE('HAVE_GEOS_PREC_KEEP_COLLAPSED',1,'Whether we have GEOS_PREC_KEEP_COLLAPSED'); + + EXTENSION("geos", "geos.c", 1); + + } else { + WARNING("geos support can't be enabled, libraries or headers are missing") + PHP_GEOS = "no"; + } + +} diff --git a/README.md b/README.md index 72c5222..c929556 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ of functionalities of the [GEOS library] (http://geos.osgeo.org). The bindings are linked to the C-API, for betters stability. -# Building +# Building (UNIX) ## Requirements @@ -29,6 +29,52 @@ You need: ./autogen.sh ./configure make # generates modules/geos.so +# Building (Windows) + +## Requirements + +- PHP source files: download [zip](http://windows.php.net/download/) or clone from [github](https://github.com/php/php-src) +- PHP SDK ( https://github.com/Microsoft/php-sdk-binary-tools ) +- Visual C++: + * Visual C++ 14.0 (Visual Studio 2015) for PHP 7.0 or PHP 7.1. + * Visual C++ 15.0 (Visual Studio 2017) for PHP 7.2, PHP 7.3 or PHP 7.4. + * Visual C++ 16.0 (Visual Studio 2019) for master. +- GEOS Windows binaries (binary dll, includes and lib): + * As part of [OSGeo4W](http://osgeo4w.osgeo.org/) as part of the geos package. + * As part of [MS4W](https://ms4w.com/) + +## Configure + +Official instructions for compiling PHP extensions: https://wiki.php.net/internals/windows/stepbystepbuild_sdk_2 + +1. Install OSGeo4w in `C:\OSGeo4W64` and PHP-SDK in `C:/php-sdk.` +2. Invoke the starter script, for example for Visual Studio 2015 64-bit build, invoke phpsdk-vc15-x64.bat +3. Run the phpsdk_buildtree batch script which will create the desired directory structure: + + phpsdk_buildtree phpdev + + The phpsdk_buildtree script will create the path according to the currently VC++ version used and switch into the newly created directory +4. Extract the PHP source code to `C:\php-sdk\phpdev\vX##\x##`, where: + + vX## is the compiler version you are using (eq vc15 or vs16) + x## is your architecture (x86 or x64) + For example: `C:\php-sdk\phpdev\vc15\x64\php-7.4.11-src` + In the same directory where you extracted the PHP source there is a deps directory. + For example: `C:\php-sdk\phpdev\vc15\x64\deps` + +5. Copy GEOS binaries from `C:\OSGeo4W64` (`bin`, `include` and `lib` subdir) to `C:\php-sdk\phpdev\vc15\x64\deps\` +6. Copy (clone) code from this repository to `C:\php-sdk\phpdev\vc15\x64\php-7.4.11-src\ext\geos` + + +## Compile + +Run next commands to compile ([see official php instruction](https://wiki.php.net/internals/windows/stepbystepbuild_sdk_2)): + + c:\php-sdk\phpsdk-vc15-x64.bat + cd C:\php-sdk\phpdev\vc15\x64\php-7.4.11-src + buildconf + configure --disable-all --enable-cli --with-geos + nmake # Testing @@ -40,12 +86,16 @@ You'll need phpunit installed for this to work. To install: # Installing +## Unix + As root (or owner with write access to the directory returned by php-config --extension-dir), run: make install -# Using +## Window + +Copy php_geos.dll to extension directory and enable it in php.ini ... TODO ... (reference some automatically built doc?) diff --git a/package.xml b/package.xml index 604ae3c..57626fc 100644 --- a/package.xml +++ b/package.xml @@ -36,6 +36,7 @@ http://pear.php.net/dtd/package-2.0.xsd"> +