PLplot Release 5.14.0 This is a release of the PLplot plotting package. It represents the ongoing best efforts (roughly 150 commits since the last release) of the PLplot development community to improve this package, and it is the only version of PLplot that we attempt to support. Releases in the 5.x.y series should be available roughly two times per year. Note that PLplot has been continuously developed since 1986 so it has accumulated a lot of cruft since that time. Therefore, we are now slowing removing that cruft to improve the lot of both new users and new members of the development team. As a result virtually every PLplot release has some backwards incompatibilities introduced to help clean it up so please pay careful attention to the OFFICIAL NOTICES FOR USERS below (and also in the various sections of README.cumulated_release if you need backward incompatibility information for several recent releases) where we document such incompatibilities to make life easier for those who have prior experience with older PLplot releases. If you encounter a problem with this release that is not already documented on our bug tracker, then please send bug reports to PLplot developers via our mailing lists (preferred for initial discussion of issues) at <http://sourceforge.net/p/plplot/mailman/>. If it turns out no quick resolution is possible via mailing-list discussion, then the issue should be placed on our bug tracker at <http://sourceforge.net/p/plplot/bugs/>. This software is primarily distributed under the LGPL. See the Copyright file for all licensing details. ________________________________________________________________ CONTENTS 1. OFFICIAL NOTICES FOR USERS 1.1 CMake version compatibility 1.2 Remove Fortran cruft 1.3 Remove Tcl/Tk cruft 1.4 Remove plmap cruft 1.5 Remove Perl/PDL examples 1.6 Remove all previously deprecated functions 1.7 Official deprecation of plshade1 1.8 Official deprecation of C++ cruft 1.9 plplot.org and www.plplot.org are now our official domains 1.10 We have removed the "sys" subdirectory from our source tree 1.11 Imported PLplot targets now must use the "PLPLOT::" prefix for the target name 1.12 Drop -single_module linking option that was previously forced for Mac OS X 1.13 Changed color interpolation for plscmap1l and plscmap1la 2. Improvements relative to the previous release 2.1 Bug fixes 2.2 Update control of Python version 2.3 Rewrite the build-system logic for determining PYQT_SIP_DIR and PYQT_SIP_FLAGS 2.4 Implement plStatic2dGrid 2.5 Replace use of the deprecated WIN32 and __WIN32__ macros by the _WIN32 macro 2.6 Difference report default device changed from psc to svg 2.7 Resolve the remaining difference report issues 2.8 Improve command-line parsing 2.9 Cleanup of plmap 2.10 wxwidgets development status 2.11 First step toward using best CMake-3 practices for our build system 2.12 Update PLplot to be consistent with modern free software 2.13 Rewrite documentation of PLplot testing 2.14 Configure the ps and psttf device drivers just like all other device drivers 3. PLplot testing ________________________________________________________________ 1. OFFICIAL NOTICES FOR USERS 1.1 CMake version compatibility Our build system is implemented using CMake. The minimum version of CMake we allow is 3.7.2 on all platforms. This particular PLplot release has been comprehensively tested for CMake versions 3.7.2 through 3.13.1 on a variety of platforms (see <http://sourceforge.net/p/plplot/wiki/Testing_Reports> for details of recent tests on all platforms). Therefore, if your CMake version is <= 3.13.1 and satisfies the above minimum CMake version requirement there is an excellent chance that our build system will work well. Furthermore, if you try later CMake versions as they are released during the life of this PLplot release, our build system will likely continue to work well because CMake has an excellent reputation for preserving backwards compatibility. But if you get build-system trouble for versions of CMake greater than 3.13.1, the first thing you should try is CMake-3.13.1 which has been well-tested by us. 1.2 Remove Fortran cruft As of PLplot-5.12.0, a new Fortran binding was implemented using the powerful capabilities of the Fortran 2003 iso_c_binding module which was the replacement for the old binding that was implemented using a combination of Fortran and C code. The new binding is much simpler, more consistent, and more standards-compliant than the old binding and has some powerful new features (e.g., both single and double precision Fortran floating-point arguments are accepted). Therefore, the new binding is necessarily backwards incompatible with the old binding. For PLplot-5.12.0 we implemented the CMake option -DPL_DEPRECATED_fortran=ON to provide temporary deprecated access to the old Fortran binding, and that form of backwards compatibility continued to be provided for the PLplot-5.13.0 release. However, it appears our users are generally satisfied with the new binding, and we no longer want to maintain or test that old binding. So for this release the old Fortran binding (and an old set of Fortran standard examples that depended on it) has been completely removed from our source tree. 1.3 Remove Tcl/Tk cruft As of PLplot-5.12.0, a new Tcl binding was implemented that used the "redacted" PLplot API where all dimension arguments for arrays are dropped from argument lists since those data are redundant (already supplied by the arrays themselves). As a result of this change, Tcl calls to the PLplot API in the old binding such as $w cmd plline $nsize x y now have to be replaced in the new binding by $w cmd plline x y and similarly for all other Tcl calls to the PLplot API that involve array (tclmatrix) arguments. The advantages of this new binding are it is cleaner, it is safer (i.e., automatically self-consistent with regard to array dimensions), and it makes our Tcl binding compatible with the rest of our bindings. (The only exception to this is our C++ binding which currently still uses simple C-style arrays and therefore must use the non-redacted form of the PLplot API, but that may also change in the future.) However, the disadvantage of this change is our new binding is obviously backwards-incompatible with the old binding. Therefore, for PLplot-5.12.0 we implemented the CMake option -DUSE_NON_REDACTED_TCL_TK=ON to provide temporary deprecated access to the old Tcl binding, and that form of backwards compatibility continued to be provided for the PLplot-5.13.0 release. However, it appears our users are generally satisfied with the new binding, and we no longer want to maintain or test that old binding. So for this release the old Tcl binding (and old versions of the Tcl standard examples and Tk source code that depended on it) have been completely removed from our source tree. 1.4 Remove plmap cruft As of PLplot-5.9.10, a new version of plmap was implemented that used shapefile format (accessed via shapelib) for maps. In addition other powerful map API (see the last page of standard example 19) that depended on shapelib map data was implemented as well. However, we still made the old plmap implementation that depended on the (undocumented) binary format of our *.map files available when the user specified -DPL_DEPRECATED=ON, and this arrangement continued through PLplot-5.13.0. However, it appears our users are generally satisfied with the new shapefile-based plmap functionality and we no longer want to maintain or test that old plmap functionality based on the *.map format. So for this release that old plmap functionality and associated *.map files have been completely removed from our source tree. 1.5 Remove Perl/PDL examples By historical accident and for just a limited time we actively developed a set of standard examples written in Perl/PDL to help test Doug Hunt's external PDL::Graphics::PLplot project. But we have now removed those examples from our project since we have long since stopped testing PDL::Graphics::PLplot with those examples, and, in any case, such examples should be part of the PDL::Graphics::PLplot package rather than PLplot. 1.6 Remove all previously deprecated functions We removed plParseInternalOpts, plSetInternalOpt, plclr, plpage, plcol, plcontf, plP_gvpd, plP_gvpw, plotsh3d, plSetOpt, plrgb, plrgb1, plhls, and plwid. These functions were officially deprecated (i.e., only accessible if the user specified the -DPL_DEPRECATED=ON cmake option) as of the PLplot-5.9.10 release (and in some cases even before that release) so it is long past the time to remove them. We edited the source tree files to remove all mentions of these functions (as well as plParseOpts, plHLS_RGB, plRGB_HLS, and plarrows that had been previously removed). As a result find . -type f |grep -v .git |xargs grep -E 'plParseInternalOpts|plSetInternalOpt|plclr|plpage|plcol|plcontf|plP_gvpd|plP_gvpw|plotsh3d|plSetOpt|plrgb|plrgb1|plhls|plwid' |grep -vE 'plcol0|plcol1|plcolorbar' |less and find . -type f |grep -v .git |xargs grep -E 'plParseOpts|plHLS_RGB|plRGB_HLS|plarrows' |less now only find non-relevant hits or else hits for historical references (e.g., change logs and release notes) to these functions. 1.7 Official deprecation of plshade1 The implementation of plStatic2dGrid (see 2.4) has made the C routine plshade1 and its C++ wrapper pls->shade1 redundant. Therefore, plshade1 and its C++ wrapper have now been officially deprecated, i.e., only available if the CMake option -DPL_DEPRECATED=ON is used. 1.8 Official deprecation of C++ cruft The following C++ methods have been unofficially deprecated (via comments in the code and lack of use in our C++ examples) for a long time: // Previous function was inadvertently named plcol in old versions of // plplot - this is maintained for backwards compatibility, but is best // avoided in new code. Use col1 method instead. void col( PLFLT c ); // Deprecated versions of methods which use PLINT instead of bool for logical arguments. void svect( const PLFLT *arrow_x, const PLFLT *arrow_y, PLINT npts, PLINT fill ); void cpstrm( plstream &pls, PLINT flags ); void plot3d( const PLFLT *x, const PLFLT *y, const PLFLT * const *z, PLINT nx, PLINT ny, PLINT opt, PLINT side ); void poly3( PLINT n, const PLFLT *x, const PLFLT *y, const PLFLT *z, const PLINT *draw, PLINT ifcc ); void scmap1l( PLINT itype, PLINT npts, const PLFLT *intensity, const PLFLT *coord1, const PLFLT *coord2, const PLFLT *coord3, const PLINT *alt_hue_path ); void shade( const PLFLT * const *a, PLINT nx, PLINT ny, PLDEFINED_callback defined, PLFLT left, PLFLT right, PLFLT bottom, PLFLT top, PLFLT shade_min, PLFLT shade_max, PLINT sh_cmap, PLFLT sh_color, PLFLT sh_width, PLINT min_color, PLFLT min_width, PLINT max_color, PLFLT max_width, PLFILL_callback fill, PLINT rectangular, PLTRANSFORM_callback pltr, PLPointer pltr_data ); void shades( const PLFLT * const *a, PLINT nx, PLINT ny, PLDEFINED_callback defined, PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax, const PLFLT * clevel, PLINT nlevel, PLFLT fill_width, PLINT cont_color, PLFLT cont_width, PLFILL_callback fill, PLINT rectangular, PLTRANSFORM_callback pltr, PLPointer pltr_data ); void shade( Contourable_Data& d, PLFLT xmin, PLFLT xmax, PLFLT ymin, PLFLT ymax, PLFLT shade_min, PLFLT shade_max, PLINT sh_cmap, PLFLT sh_color, PLFLT sh_width, PLINT min_color, PLFLT min_width, PLINT max_color, PLFLT max_width, PLINT rectangular, Coord_Xformer *pcxf ); void fshade( PLFLT ( *f2eval )( PLINT, PLINT, PLPointer ), PLPointer f2eval_data, PLFLT ( *c2eval )( PLINT, PLINT, PLPointer ), PLPointer c2eval_data, PLINT nx, PLINT ny, PLFLT left, PLFLT right, PLFLT bottom, PLFLT top, PLFLT shade_min, PLFLT shade_max, PLINT sh_cmap, PLFLT sh_color, PLFLT sh_width, PLINT min_color, PLFLT min_width, PLINT max_color, PLFLT max_width, PLFILL_callback fill, PLINT rectangular, PLTRANSFORM_callback pltr, PLPointer pltr_data ); void spause( PLINT pause ); void stripc( PLINT *id, const char *xspec, const char *yspec, PLFLT xmin, PLFLT xmax, PLFLT xjump, PLFLT ymin, PLFLT ymax, PLFLT xlpos, PLFLT ylpos, PLINT y_ascl, PLINT acc, PLINT colbox, PLINT collab, const PLINT colline[], const PLINT styline[], const char *legline[], const char *labx, const char *laby, const char *labtop ); void xormod( PLINT mode, PLINT *status ); The above methods have now been officially deprecated, i.e., they will only be accessible if a user sets -DPL_DEPRECATED=ON. 1.9 plplot.org and www.plplot.org are now our official domains We have gone through the 3 steps in <https://sourceforge.net/p/forge/documentation/Custom%20VHOSTs/> so that plplot.org and www.plplot.org are now our official domains. We have also gone through our source tree and replaced all instances of plplot.sf.net and plplot.sourceforge.net with plplot.org. As a result the website that is generated and uploaded by this release will use the official plplot.org domain for all internal references. And we have changed our official domain at sf.net/projects/plplot to plplot.org as well. We encourage all PLplot users to use that official PLplot domain as well. 1.10 We have removed the "sys" subdirectory from our source tree This used to contain special build systems for special ports of PLplot to various platforms, but over the years our CMake-based build system turned out to be a better build system than these specials or else for the given platform the special build system had been unmaintained for many years and was therefore essentially worthless. The result has been subdirectory after subdirectory has been removed from sys over the years, and for this release the last such subdirectory (for the so-called win-tk platform whose build system had not been maintained for more than a decade) was removed from sys which allowed us to remove sys as well. 1.11 Imported PLplot targets now must use the "PLPLOT::" prefix for the target name This change is to conform to best CMake-3 practice. See further details in 2.11 below. 1.12 Drop -single_module linking option that was previously forced for Mac OS X We imposed this Mac OS X linking option to address a linking issue that occurred for CMake on that platform 12 (!) years ago. We are virtually positive from our google searches this linking issue no longer exists so we have removed this option so that from now on PLplot libraries and executables will be linked in a more standard way on this platform. 1.13 Changed color interpolation for plscmap1l and plscmap1la Previously these routines took control points for interpolating a new colour map, but even if RGB coordinates were passed in, they were converted to HLS coordinates and interpolated in HLS space. The new behaviour of these routines is to interpolate in whichever space the coordinates are passed in with. In addition to this change in semantics, there was a backwards-incompatible change in the names of the members of the PLControlPt C struct in plplot.h. So those users whose code refers to this C struct will need to modify their code appropriately. ________________________________________________________________ 2. Improvements relative to the previous release 2.1 Bug fixes The bug fixes in this release are noted in the roughly 150 commit messages collected in ChangeLog.release. 2.2 Update control of Python version The build system now takes the following steps to search for a suitable Python version. * The build system searches for the PLPLOT_PYTHON_EXACT_VERSION version of Python where PLPLOT_PYTHON_EXACT_VERSION is specified by the user. If this string is not specified by the user it defaults to "", and this exact search therefore always fails in this case. * If that first exact search is a failure and the option FORCE_PYTHON2 is not ON, the build system searches for PYTHON 3. * If neither of the above two searches is a success, then the build system searches for Python 2. 2.3 Rewrite the build-system logic for determining PYQT_SIP_DIR and PYQT_SIP_FLAGS For pyqt4 the pyqtconfig module useful for determining PYQT_SIP_DIR and PYQT_SIP_FLAGS has been deprecated and has therefore already completely disappeared from some software platforms (e.g., MinGW-w64/MSYS2). Therefore, in this release we have replaced that approach with an approach very similar to what we currently use for pyqt5 (where the pyqtconfig module has never been available). For both the pyqt4 and pyqt5 cases, PYQT_SIP_FLAGS is straightforward to determine but determination of PYQT_SIP_DIR, the location where the PyQT sip files are located, is not completely straightforward. For Linux, Cygwin, and MinGW-w64/MSYS2, we feel we have the correct HINTS in place to find this directory for either the pyqt4 or pyqt5 cases, but for other platforms users can specify the correct PYQT_SIP_DIR directly and are invited to communicate that information to us so we can update our HINTS appropriately. 2.4 Implement plStatic2dGrid The 2D matrix arguments of plshade, plshades, plcont, plimage, plvect, etc., for our C API and corresponding C++ API must currently be organized as Iliffe column vectors (see <https://en.wikipedia.org/wiki/Iliffe_vector>) containing pointers to PLFLT row vectors. And these matrices are normally in the C case dynamically allocated with plAlloc2dGrid and freed with plFree2dGrid, and in the C++ case the same thing is done with C++ wrappers for plAlloc2dGrid and plFree2dGrid. However, that dynamically allocated approach does not allow our C and C++ users to call plshade, etc., with statically allocated 2D matrices. Historically we have partially addressed that issue by implementing a plshade1 variant of plshade that could be called with a statically allocated 2D matrix. Expanding that approach with plshades1, plcont1, etc., variants is possible, but does considerably clutter our C and C++ API. So instead for this release we have implemented the plStatic2dGrid C function and associated C++ wrapper which allows C and C++ users to determine the Iliffe column vector corresponding to a 2D statically allocated array. The examples/c/x15c.c and examples/c++/x15.cc standard examples demonstrate how to use this new approach to call plshade using 2D data that have been statically allocated, and although none of our examples illustrate these additional possibilities, this same approach could also be used to call plshades, etc., with 2D data that have been statically allocated. And since this new approach completely supersedes plshade1, we have officially deprecated that function and its C++ wrapper, see 1.7. 2.5 Replace use of the deprecated WIN32 and __WIN32__ macros by the _WIN32 macro In our C and C++ source code we now detect non-Cygwin Windows platforms using the recommended _WIN32 macro (supported by all modern versions of compilers that work on Windows platforms) rather than the deprecated WIN32 and __WIN32__ macros. 2.6 Difference report default device changed from psc to svg We have made extensive changes to our three (CMake-based, CTest-based, and legacy) test systems (see <https://sourceforge.net/p/plplot/wiki/Testing_PLplot> for extensive documentation of those test systems) to provide the user the freedom (if they specify -DPLPLOT_TEST_DEVICE=<some test device name> to choose any suitable PLplot device they like for the difference report that is used to compare standard example results written for each computer language that is supported by our bindings with the corresponding C results. Of course, many such devices are not suitable for such difference tests because of a number of factors, but in the past we used -dev psc for this purpose, but recently we also found -dev svg was suitable. Of course, both the svg and psc devices share the advantage of having no external library dependencies and thus they are available on all platforms. However, the svg device has two notable advantages over the psc device for the purposes of difference reports. * The SVG XML format of the plot file output by the svg device file is fundamentally easier for humans to learn than PostScript (at least in this author's opinion) which makes it easier to debug rendering errors. * The svg device is a modern PLplot device that implements alpha-channel transparency and gradients and which gives access to virtually all (unicode-accessible) glyphs installed on a platform while the psc device is an ancient PLplot device that because of the limitations of PostScript is missing the alpha-channel and gradient capabilities and which only gives access to an extremely limited number of glyphs. Thus, when the svg device is used for comparisons, test_diff.sh compares one *good* plot file (with the exception of example 3 which is consistently missing some of its graphical elements for some reason which we will investigate later) result with another for all examples. However, when the psc device is used for comparisons the difference test compares one garbage plot file with missing or incorrect elements with another for many of our standard examples. This means the svg choice supplies a much stronger constraint on our language PLplot API consistency than the psc choice. For these reasons we have adopted -DPLPLOT_TEST_DEVICE=svg as the default value, and it turns out for that much more powerful test of PLplot we are currently getting perfect difference report results (see 2.7). 2.7 Resolve the remaining difference report issues For PLplot-5.13.0 the difference report (for the psc comparison device used for that report) was perfect except for the following long-standing OCaml issues: ocaml Missing examples : Differing graphical output : 16 19 33 Missing stdout : Differing stdout Those OCaml inconsistencies with the other languages have now been fixed by the following steps: * Implement the plmap* API for our OCaml binding and implement the "Exmoor" page for examples/ocaml/x19.ml using that new API to achieve consistency for this example. * In examples/ocaml/x16.xml replace use of the high-level colorbar function (which set and restored color which interfered with consistency with the other languages) with plcolorbar to achieve consistency for this example. * In examples/ocaml/x33.ml implement all pages concerning demonstrating the plcolorbar capability (page 5 onward) to achieve consistency for this example. This change removed all differences for the -dev psc test device but since this change we have also moved from that device to -dev svg and we find we get a clean difference report in that more powerful test case as well. In sum, because of the OCaml binding and examples improvements we obtained a perfect PostScript difference report for the first time in 7 years, i.e., ocaml Missing examples : Differing graphical output : Missing stdout : Differing stdout and similarly for all the other computer languages we support. And these perfect results have now been also demonstrated for the much stronger test when using the svg device for the comparison. Long may this perfection continue! 2.8 Improve command-line parsing 2.8.1 Implement C demonstration of PL_PARSE_SKIP mode The PL_PARSE_SKIP mode of plparsopts has been implemented for a long time now in our core C library. What this mode does is parse the PLplot-relevant command-line options, skip those which it does not recognize and return a revised argument list containing the skipped command-line options that is suitable for further specialized (non-PLplot) parsing. To demonstrate this capability we have implemented a -pl_parse_skip example option for examples/c/x01c.c such that we get the following result illustrating the PL_PARSE_SKIP capability: software@raven> examples/c/x01c -pl_parse_skip xxx -dev psc yyy -o testc.psc zzz argv prior to call of plparseopts(..., PL_PARSE_SKIP) i = 0, argument = examples/c/x01c i = 1, argument = -pl_parse_skip i = 2, argument = xxx i = 3, argument = -dev i = 4, argument = psc i = 5, argument = yyy i = 6, argument = -o i = 7, argument = testc.psc i = 8, argument = zzz argv after call to plparseopts(..., PL_PARSE_SKIP) i = 0, argument = examples/c/x01c i = 1, argument = xxx i = 2, argument = yyy i = 3, argument = zzz PLplot library version: 5.13.0 Note that the valgrind results for the above command and also a more typical execution of this example, software@raven> examples/c/x01c -dev psc -o test1c.psc PLplot library version: 5.13.0 are perfect (i.e., 0 errors, no leaks are possible) with no PostScript differences between the above two commands other than the date stamp. 2.8.2 Fortran improvement in parsing the command line Previously the Fortran parsing API consisted of just function plparseopts(mode) integer :: plparseopts_brief !function type integer, intent(in) :: mode .... end function plparseopts which allowed parsing of just PLplot-related command-line options with no direct access to the command-line options. We have now added the following experimental parsing API to the above: * dynamic length and size function plget_arguments( argv ) integer :: plget_arguments character(len=:), dimension(:), allocatable, intent(out) :: argv .... end function plget_arguments function plparseopts(argv, mode) integer :: plparseopts character(len=:), intent(inout), dimension(:), allocatable :: argv integer, intent(in) :: mode .... end function plparseopts * static length and dynamic size function plget_arguments( argv, disambiguate ) integer :: plget_arguments character(len=*), dimension(:), allocatable, intent(out) :: argv integer :: disambiguate .... end function plget_arguments function plparseopts(argv, mode, disambiguate) integer :: plparseopts_full !function type character(len=*), dimension(:), allocatable, intent(inout) :: argv integer, intent(in) :: mode integer :: disambiguate .... end function plparseopts * static length and size function plget_arguments( nargv, argv ) integer :: plget_arguments_impl !function type integer, intent(out) :: nargv character(len=*), dimension(0:), intent(out) :: argv .... end function plget_arguments function plparseopts(nargv, argv, mode) integer :: plparseopts_full !function type integer, intent(out) :: nargv character(len=*), dimension(0:), intent(inout) :: argv integer, intent(in) :: mode .... end function plparseopts The disambiguate variable of the static length and dynamic size variants is required to distinguish between those variants and the corresponding dynamic length and size variants. The static length and dynamic size and static length and size variants are deprecated, but we include them for now because certain Fortran compilers (see below) might have trouble with the dynamic length and size variant of the API even though that is part of the Fortran 2003 (!) standard. plget_arguments is a convenience function that exercises the rather complex Fortran API for determining command-line arguments and returns all the the command-line components in argv. The three new variants of plparseopts operate in a similar way to the C version of plparseopts returning a modified form of argv that depends on which mode is specified. We tested these additions to the Fortran parsing API with examples/x01f.f90, and Debian Testing gfortran version "Debian 8.2.0-9" * If that source code is locally modified to change the pl_parse_dynamic parameter from .false. to .true., and the x01f target rebuilt then the following good results are obtained: software@merlin> examples/fortran/x01f xxx -dev svg yyy -o testf.svg zzz pl_parse_dynamic = T argv before call to plparseopts(..., PL_PARSE_SKIP) i = 0, argument = examples/fortran/x01f i = 1, argument = xxx i = 2, argument = -dev i = 3, argument = svg i = 4, argument = yyy i = 5, argument = -o i = 6, argument = testf.svg i = 7, argument = zzz argv after call to plparseopts(..., PL_PARSE_SKIP) i = 0, argument = examples/fortran/x01f i = 1, argument = xxx i = 2, argument = yyy i = 3, argument = zzz PLplot library version: 5.13.0 * If that source code is locally modified to drop the above change and set the pl_parse_static_length parameter from .false. to .true., and the x01f target rebuilt then the following good results are obtained: software@raven> examples/fortran/x01f xxx -dev svg yyy -o testf.svg zzz pl_parse_static_length = T argv before call to plparseopts(..., PL_PARSE_SKIP) i = 0, argument = examples/fortran/x01f i = 1, argument = xxx i = 2, argument = -dev i = 3, argument = psc i = 4, argument = yyy i = 5, argument = -o i = 6, argument = testf.psc i = 7, argument = zzz argv after call to plparseopts(..., PL_PARSE_SKIP) i = 0, argument = examples/fortran/x01f i = 1, argument = xxx i = 2, argument = yyy i = 3, argument = zzz PLplot library version: 5.13.0 * If that source code is locally modified to drop the previous local change and change the pl_parse_static parameter from .false. to .true., and the x01f target rebuilt then the good results above (except for the difference pl_parse_static_length = T ==> pl_parse_static = T ) continue to be obtained. In all three test cases above, valgrind showed perfect results (0 errors with no leaks possible). Note that when I tried these tests before with Debian Jessie (with gfortran-4.9.2) the first test errored out with "Fortran runtime error: Integer overflow when calculating the amount of memory to allocate" We ascribe this error to a bug in gfortran-4.9.2 for the case of character arrays that have both the length and size allocated. So we recommend that old version of gfortran should be avoided, and it appears more modern gfortran, e.g., gfortran 8.2.0 tested above, will not have issues if we drop the deprecated forms of plget_arguments and plparseopts in favour of the first method where an array of character strings of both dynamic length and size is allocated. And that would clear the way for following up by moving to uniform fortran arrays of character strings that are dynamic in both length and size for our entire Fortran API. That follow up would be terrific since it moves our Fortran API and corresponding examples out of the Fortran character array dark ages. However, there are other fortran compilers (e.g., ifort, nagfor, absoft) we urgently need to test in the same way with example 1 before we can go ahead and drop the above deprecated functionality and do the suggested follow up. 2.9 Cleanup of plmap We have removed old plmap functionality (see description of this change in "1.4 Remove plmap cruft" above). In addition as part of fixing a wrap bug we substantially simplified the code. And some unused functions were also removed. 2.10 wxwidgets development status This is a status report as of the release of PLplot-5.14.0 for the "new" wxwidgets components (e.g., -dev wxwidgets, wxPLViewer application, the wxwidgets binding, and wxPLplotDemo example application that links to that binding) of PLplot. Many bugs in the "new" wxwidgets components for this release (see the ChangeLog for details) have been fixed. However, despite this excellent development progress at least two serious issues for -dev wxwidgets still remain. * wxPLViewer only displays the end result of each page plotted. Instead, it should immediately render that plot buffer as it is actively filled with PLplot commands. That important change will supply the required interactivity for example 17 (rather than just plotting the end results for that one-page example) and make the -np (no pause) option work correctly (where you can see all plot pages as they are being plotted rather than just having a blank screen 99.99% of the time followed by a "flash" of the final page result at the end of each page that is so short it is rarely visible). Note, example 17 (without the -np option) and all examples including 17 with the -np option do render correctly for the interactive xwin, tk, xcairo, and qtwidget devices so there should be no fundamental reason for this functionality to work incorrectly for -dev wxwidgets. * AWI (Alan W. Irwin) and PR (Phil Rosenberg) have not yet decided on which of the -DPL_WXWIDGETS_IPC3=OFF or ON methods should be used to handle IPC (interprocess communication) between -dev wxwidgets and the wxPLViewer application. The -DPL_WXWIDGETS_IPC3=OFF case (developed by PR right when he started developing the "new" wxwidgets code) uses a relatively large circular buffer located in shared memory to efficiently transfer data from one process to the other with transfer progress checked periodically by a timed wait. The majority of this code is a subset of code in an event-handling routine on the wxPLViewer side of transfers so it is not (yet) organized as a dedicated set of two routines (one to send one to receive) you call to transfer data as in the -DPL_WXWIDGETS_IPC3=ON case discussed below. This method works well for all noninteractive examples for both Linux and Windows. And in older tests (before the above fixes) for -locate mode of example 1 (that mode turns that normally noninteractive example into an interactive example) PR found this method succeeded on Windows while AWI found this method failed on Linux. AWI has recently found for the latest version of the "new" wxwidgets code (i.e., after all the above fixes were done) that interactive example still has problems, i.e., the display did not come on immediately so he had to mouse click on a particular part of the blank screen (over one of the hidden viewports) for a while to get the example to display properly on Linux for the -DPL_WXWIDGETS_IPC3=OFF case. The -DPL_WXWIDGETS_IPC3=ON case (developed by AWI long after PR had initiated the work on his "new" wxwidgets code) uses a 3-semaphore approach to transfer an arbitrarily large block bytes in an efficient way from one process to the other using a relatively small shared memory buffer with no timed waits. This complete transfer is handled by just two function calls (transmitBytes on the transmitting side and receiveBytes on the receiving side). Those two routines use two semaphores to control the transfer in the way described by the "Unnamed Semaphores Example" on page 73 and following of <http://man7.org/conf/lca2013/IPC_Overview-LCA-2013-printable.pdf>. In addition, transmitBytes acquires a third semaphore before this flow process starts and releases it after all bytes have been transmitted to make sure that if other threads call transmitBytes, they will just wait to acquire that third semaphore before proceeding with its data transfer. So ordinarily there is absolutely no interference between data transfers that occur in different threads. However, there is at least one case (one thread transmitting bytes, a second thread waiting to transmit bytes, but with the first thread unable to regain process control for some reason (e.g., some screw up in handling wxwidgets events) where the first thread will be unable to complete its transfer ==> deadlock. For -DPL_WXWIDGETS_IPC3=ON no such deadlocks have been observed on any platform for noninteractive examples, but PR discovered such deadlocks occurred on Windows when attempting to run the -locate mode of example 1, and AWI also had trouble for this case on Linux. But both these tests were done before all the recent wxwidgets fixes (which apparently had nothing to do with IPC), and AWI has recently discovered that interactive example now works well for the first time ever! So an additional -DPL_WXWIDGETS_IPC3=ON test on Windows platforms for this interactive case should be done to see if whatever fixed -DPL_WXWIDGETS_IPC3=ON for the Linux case also fixes the Windows case. In sum, for noninteractive examples we should be fine on all platforms with either -DPL_WXWIDGETS_IPC3=ON or OFF. And for the latest version of "new" wxwidgets we are also fine on Linux with -DPL_WXWIDGETS_IPC3=ON and the -locate mode of example 1. But that interactive examples fails to work properly on Linux for -DPL_WXWIDGETS_IPC3=OFF. And as far as I (AWI) am aware -DPL_WXWIDGETS_IPC3=OFF and ON have not been tested for the latest version of "new" wxwidgets on Windows. Given this uncertain testing situation for the latest "new" wxwidgets code on Windows platform, I (AWI) have adopted -DPL_WXWIDGETS_IPC3=ON as the default on the assumption that the good noninteractive and interactive results in the Linux case for -DPL_WXWIDGETS_IPC3=ON will carry over to the Windows case when the latest version of the code is tested on that platform. However, if a user runs into any trouble with this default choice on any platform, please also try -DPL_WXWIDGETS_IPC3=OFF and report back those two results to the plplot-general mailing list so we have a chance to replicate the issue and fix it. Furthermore if either of these serious issues with "new" wxwidgets affect you in a way you cannot work around, you should also try -DOLD_WXWIDGETS=ON to see if that gives a better result (although that old wxwidgets code is in deep maintenance mode so we are unlikely to change any part of it going forward in case issues with it are discovered). By the way, we have tried -DOLD_WXWIDGETS=ON, on Linux (Debian Testing), and the following good results were obtained: (i) The -np option does work properly (all example plots seen as they are plotted out rather than just the final page result) if you test it by building the test_c_wxwidgets target, (ii) example 17 does plot "interactively" (rather than plotting final results at the end of the page) if you try "examples/c/x17c -dev wxwidgets", and (iii) "examples/c/x01c -locate -dev wxwidgets" works properly, i.e., the display and cursor position show *before* you make a choice of where to click the mouse button. However, for these ultra-modern (version 3.0.4) Debian Testing wxWidgets libraries (this -DOLD_WXWIDGETS=ON problem did not show up for the old wxWidgets libraries I tested for Debian Jessie = Oldstable) you have to randomly move the mouse to get long plots such as "examples/c/x08c -dev wxwidgets" and "examples/c/x17c -dev wxwidgets" results completely plotted. So it appears that our "old" code has exposed a bug in the Debian Testing wxwidgets libraries, but that bug may not appear for other distributions so -DOLD_WXWIDGETS=ON is certainly worth trying as a stop gap if there is some aspect of the "new" wxwidgets PLplot code that is failing. 2.11 First step toward using best CMake-3 practices for our build system Our CMake-based build system was originally designed more than a decade ago for CMake-2 by a number of different PLplot developers, and since then while maintaining this system I have taken full advantage of CMake-3 backwards compatibility with CMake-2. The result works well for cmake-3.7.2 (our minimum allowed cmake version) through cmake-3.13.1 (the latest version of CMake that has been released). However, our build system does not follow best CMake-3 practices as outlined in [this inspiring article](https://pabloariasal.github.io/2018/02/19/its-time-to-do-cmake-right/). Motivated by that article as well as by comments on the CMake mailing list, I have now taken the first step toward such best practices which is to always use prefixed target names (with a prefix of "PLPLOT::") for read-only use of targets that are installed by the core build and which are correspondingly imported by the build of the installed examples. Of course, those imported targets are not available to the core build (since it builds these special targets before installing/exporting them) so the only way to implement the same "PLPLOT::" prefix for these special targets in the core build is to implement ALIASed versions of all these targets in the core build whose names all have the "PLPLOT::" prefix. Both imported targets and ALIASed targets can only be used by CMake commands which only read information about the target. So for the sake of consistency, I changed all read-only references to these special targets in the core build by always using the "PLPLOT::" prefix for that case. In addition for CMake commands which write information to targets I used the prefix ${WRITEABLE_TARGET} for the target name. As a result of these changes all special targets for both build systems had a prefixed target name where the prefix was "PLPLOT::" in the read-only case and ${WRITEABLE_TARGET} otherwise. For normal use ${WRITEABLE_TARGET} must be empty since otherwise it changes the actual installed library and executable names which completely messes up any non-trivial use of the installed PLplot such as the installed examples build system. However, the configure_library_build and configure_executable_build functions (the functions that are used in the core build to uniformly configure builds of all special targets) have also been updated so that a non-empty ${WRITEABLE_TARGET} changes the special library and executable names while the original PLPLOT::<original target name> remains the same and is aliased to refer to those changed writeable targets and corresponding changed names for executables and libraries. Thus, the net result is the core build and corresponding tests of that build work when ${WRITEABLE_TARGET} is non-empty. Normally nobody would be particularly interested in prefixing the name of all special PLplot libraries and executables in a way that only works in the build tree. However, there is one special case where this capability is quite useful for developers, and that is when they do a comprehensive test constrained just to the core-build configurations with -DUSE_WRITEABLE_TARGET_TEST_PREFIX=ON (which is the only case where a non-empty ${WRITEABLE_TARGET} is created). If that comprehensive test is a success (which proved to be the case in this release cycle after a fair number of iterations), then the developer knows that there are no unprefixed special targets left in our build system (since they would refer to library or executable names that don't exist) with the caveat that only CMake code that is actually exercised by the above comprehensive test is checked this way by this test. N.B. The second and third big steps toward best CMake-3 practices are in the initial planning stages. Those steps which with luck will be ready for the next release are the following: * Replace all use of the completely unfocused include_directories command (that effects builds of all targets in that directory and below) with the the target_include_directories command which allows us to define *and export* header file locations for one focused target. * Replace a grab-bag of ways to specify compile flags (some compiler options some specific -D definitions) and another grab bag of ways to specify compile definitions by calls to target_compile_options and target_compile_definitions that not only make these data available for the core target build but also the subset of these data that are typically needed for building against the corresponding imported targets. In sum, we have made a good start toward updating our build system to best CMake-3 practice for this release, and we plan to update it much further in that regard for the next release. The net result of all these intrusive changes should be that our build system will be subject to fewer subtle bugs. And it should also be much easier to maintain (e.g., during the coming expected advent of CMake-4 where several deprecated CMake-2 commands such as the include_directories command that we use now are likely to be dropped). 2.12 Update PLplot to be consistent with modern free software This important series of changes occurred because the primary testing platform for PLplot was changed from Debian Jessie (Debian 8) which was more than 3 years out of date), to Debian Testing (currently Debian Buster = Debian 10) which is a rolling release that keeps up to date with modern free software development. As a result of these changes, the PLplot core libraries, bindings, and device drivers have now proven [via comprehensive tests](<https://sourceforge.net/p/plplot/wiki/Testing_Reports) to be compatible with the following modern versions of free software packages: * CMake-3.13.1 (core, bindings, and device drivers) * gcc 8.2.0 (core) * qhull 2015.2 (optional core interpolation functionality) * shapelib 1.4.1 (optional core map functionality) * swig 3.0.12 (java, lua, octave, and python bindings) * gnatmake/gdc/gfortran 8.2.0 (ada, d, and fortran bindings) * g++ 8.2.0 (c++ binding and psttf and wxwidgets device drivers) * pango 1.42.3, cairo 1.16.0 (cairo device driver) * openjdk 11.0.1 (java binding) * lua 5.3.5 (lua binding) * camlidl 1.05, ocaml 4.05 (ocaml binding) * octave 4.4.1 (octave binding) * python 3.6.7 (python binding) * Qt 5.11.2 (qt binding and qt device driver) * Tcl/Tk 8.6.8 (tcl/tk binding and tk device driver) * libx11 2:1.6.7 (tk and xwin device drivers) * wxWidgets 3.0.4 (wxwidgets binding and device driver) Notes for this table: * The Debian Testing package for swig 3.0.12 contains a swig fix that should be generally released for swig-4 that allows PLplot to build an Octave-4.4 binding. If your swig-3 version does not have this fix, you should use Octave-4.2 until swig-4 is released. * The Debian Testing package for lua 5.3.3 currently perpetuates [a serious bug](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=902238) for that particular upstream version. The above good results for lua 5.3.5 were generated with a locally built version of upstream 5.3.5. 2.13 Rewrite documentation of PLplot testing We have completely rewritten <https://sourceforge.net/p/plplot/wiki/Testing_Reports> which documents how PLplot is tested. 2.14 Configure the ps and psttf device drivers just like all other device drivers Previous to this change our build system configured the devices (i.e., the ps and psc devices) of the ps device driver together (i.e., the CMake option DPLD_ps controlled both devices) but now it does that individually (where DPLD_ps and DPLD_psc control the ps and psc devices separately). And similarly for the psttf and psttfc devices of the psttf device driver. Previous to this change, all other device drivers configured their devices individually and now that the ps and psttf device drivers are no longer anomalous in that regard, it has allowed us to simplify our build system logic substantially for anything having to do with the ps or psttf device drivers. ________________________________________________________________ 3. PLplot testing Comprehensive tests of this release are documented in <https://sourceforge.net/p/plplot/wiki/Testing_Reports>. In addition, developers and users who have used the git master tip version for all their plotting needs during this release cycle have provided additional important testing of this release of PLplot. ________________________________________________________________