commit 6b215267e7baeae83906bec8dab72a549aeda6c8 Author: Alan W. Irwin Date: Mon Sep 23 17:39:31 2019 -0700 Build system: Fix ocaml examples core build for -DUSE_RPATH=OFF case Thanks to Orion Poplawski for reporting this issue which is that the *core build_tree* rpath manipulations for the ocaml examples were being (incorrectly) skipped for the -DUSE_RPATH=OFF case. The fix for this issue required non-trivial CMake logic changes so was extensively tested (see below). Tested by: Alan W. Irwin on Linux (Debian Buster = Stable) with the following steps: # Choose these prefixes to assure that the source, build, and install # trees have blanks in their pathnames (to test those cases during # this comprehensive test) COMPREHENSIVE_TEST_PREFIX="/home/software/plplot/HEAD/comprehensive_test_disposeable blank" SOURCE_PREFIX="/home/software/plplot/HEAD/plplot blank .git" # Set CMAKE_PREFIX_PATH to access local versions of lua and libLASi to # avoid important bugs in the Debian Testing versions of those # packages. Also access a local version of libqhull to test that # additional rpath possibility. # Put a local build of CMake-3.15.20190829-g3ec986c first on the PATH to thoroughly # test our build system for a locally built CMake version that includes an # essential fix so that D language support works properly for the ldc2 and dmd compilers. # For this particular test use the gdc D compiler if D enabled (which it was not, see below). # Use the -DUSE_INCRTCL_VERSION_4=ON option to help CMake find Tcl/Tk # components. (This step will not be necessary as soon as the PLplot # build system is modified to make Tcl/Tk/Itcl/Itk/Iwidgets finding # more robust.) # Use -DSWIG_EXECUTABLE=/home/software/swig/install/bin/swig to test # swig-4.0.0 that I built for myself. # To save time, constrain the test to just the ocaml binding and svg device. # To save a lot of babysitting of this test, constrain the test by dropping # the interactive component. time (nice -19 env CMAKE_PREFIX_PATH=/home/software/lua/install-5.3.5:/home/software/lasi_svn/install:/home/software/qhull/install PATH=/home/software/cmake/install-3ec986ce8e/bin:"$PATH" DC=gdc "$SOURCE_PREFIX"/scripts/comprehensive_test.sh --prefix "$COMPREHENSIVE_TEST_PREFIX" --cmake_added_options "-DUSE_INCRTCL_VERSION_4=ON -DSWIG_EXECUTABLE=/home/software/swig/install/bin/swig -DDEFAULT_NO_BINDINGS=ON -DENABLE_ocaml=ON -DDEFAULT_NO_DEVICES=ON -DPLD_svg=ON " --build_command "make -j18" --ctest_command "ctest -j18" --do_test_interactive no) The time result on my Ryzen 7 1700 system with 16 hardware threads was real 4m12.625s user 4m22.128s sys 0m58.076s The above test was repeated with the following changes: # Specify LD_LIBRARY_PATH to workaround the lack of special rpath # support for external local versions of software # Use the -DUSE_RPATH=OFF cmake option to drop all install-tree # rpath support (and to ignore any special rpath support for # external local versions of software). # Further constrain the test to be performed just for the core build tree # since -DUSE_RPATH=OFF will obviously give bad results for the install # tree for this non-standard installation location. time (nice -19 env CMAKE_PREFIX_PATH=/home/software/lua/install-5.3.5:/home/software/lasi_svn/install:/home/software/qhull/install PATH=/home/software/cmake/install-3ec986ce8e/bin:"$PATH" DC=gdc LD_LIBRARY_PATH=/home/software/lasi_svn/install/lib:/home/software/qhull/install/lib "$SOURCE_PREFIX"/scripts/comprehensive_test.sh --prefix "$COMPREHENSIVE_TEST_PREFIX" --cmake_added_options "-DUSE_INCRTCL_VERSION_4=ON -DSWIG_EXECUTABLE=/home/software/swig/install/bin/swig -DDEFAULT_NO_BINDINGS=ON -DENABLE_ocaml=ON -DDEFAULT_NO_DEVICES=ON -DPLD_svg=ON -DUSE_RPATH=OFF" --build_command "make -j18" --ctest_command "ctest -j18" --do_test_interactive no --do_test_install_tree no --do_test_traditional_install_tree no) The time result on my Ryzen 7 1700 system with 16 hardware threads was real 1m57.888s user 1m42.156s sys 0m26.478s Both these comprehensive tests (one which tests that the default -DUSE_RPATH=ON still works for the ocaml case and one similar to Orion's test case which tests that -DUSER_RPATH=OFF works for the ocaml case in the core build tree) ran without issues (e.g., there were no hangs or other obvious errors) and was followed up by the evaluation procedure documented in doc/wiki_source/Testing_PLplot. Those evaluations showed no configure, build, or obvious run-time errors (i.e., no non-zero return codes for any of the steps in these comprehensive tests), and the difference test results (done with the default svg device) were perfect as well. diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 93cb01b..5bcbceb 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -343,27 +343,24 @@ if(CORE_BUILD) # Extra layer of -Wl indirection required for the nagfor compiler string(REPLACE "-Wl," "-Wl,-Wl,," install_tree_fortran_RPATHCMD ${install_tree_fortran_RPATHCMD}) endif(install_tree_fortran_RPATHCMD AND CMAKE_Fortran_COMPILER MATCHES "nagfor") + endif(USE_RPATH AND NOT WIN32_OR_CYGWIN) + + # ocaml is a special case not handled by the above logic for other languages + # because the (unofficial) CMake language support is + # implemented with low-level add_custom commands/targets so that rpath + # must be specified for 3 cases (the traditional build of the installed + # examples, and the CMake-based build of the build-tree and install-tree examples). + # Furthermore, the rpath syntax is different for ocaml. + if(ENABLE_ocaml) + set(language ocaml) - # ocaml is a special case because the (unofficial) CMake language support is - # implemented with low-level add_custom commands/targets so that rpath - # must be specified for 3 cases (the traditional build of the installed - # examples, and the CMake-based build of the build-tree and install-tree examples). - # Furthermore, the rpath syntax is different for ocaml. - if(ENABLE_ocaml) - set(language ocaml) + if(USE_RPATH AND NOT WIN32_OR_CYGWIN) # Each of the installed examples that are built depend on a library installed in ${LIB_DIR}. set(install_tree_${language}_RPATH ${LIB_DIR}) - # The ocaml examples depend on the plplot library + # The ocaml examples depend on the plplot library so use INSTALL_RPATH + # property of that library target. set(tll_arguments PLPLOT::plplot) process_rpath(install_tree_${language}_RPATH "${tll_arguments}") - - # Special case of the ocaml build-tree examples. - # Must be done before ${install_tree_${language}_RPATH gets transformed - # from official CMake list to colon-separated form. - set(build_tree_${language}_RPATH ${install_tree_${language}_RPATH}) - list(REMOVE_ITEM build_tree_${language}_RPATH ${LIB_DIR}) - list(APPEND build_tree_${language}_RPATH ${CMAKE_BINARY_DIR}/src) - # Transform from semicolon- to colon-separated list. (Quotes # for last argument required to process whole argument as string # containing semicolons rather than as the concatanated elements @@ -372,19 +369,30 @@ if(CORE_BUILD) # install- and build-tree versions of CMake-based build of ocaml # examples string(REGEX REPLACE ";" ":" install_tree_${language}_RPATH "${install_tree_${language}_RPATH}") - string(REGEX REPLACE ";" ":" build_tree_${language}_RPATH "${build_tree_${language}_RPATH}") string(REPLACE " " "\\ " install_tree_${language}_RPATH_ESCAPED "${install_tree_${language}_RPATH}") - string(REPLACE " " "\\ " build_tree_${language}_RPATH_ESCAPED "${build_tree_${language}_RPATH}") - # install_tree_ocaml_RPATHCMD needed in configured traditional # Makefile for the ocaml subdirectory. # Ocaml compiler requires -ccopt in front of every -Wl option: set(install_tree_${language}_RPATHCMD "-ccopt -Wl,-rpath -ccopt -Wl,\"${install_tree_${language}_RPATH_ESCAPED}\"") + endif(USE_RPATH AND NOT WIN32_OR_CYGWIN) - endif(ENABLE_ocaml) + # Special case of the ocaml build-tree examples. + # Follow above process_rpath logic but with some changes + # appropriate for the core build of the ocaml examples. + set(build_tree_${language}_RPATH ${CMAKE_BINARY_DIR}/src) + set(tll_arguments PLPLOT::plplot) + process_rpath(build_tree_${language}_RPATH "${tll_arguments}") + # Get rid of any mention of ${LIB_DIR} for the core build version + # of the examples. + # Must be done before ${build_tree_${language}_RPATH gets transformed + # from official CMake list to colon-separated form. + list(REMOVE_ITEM build_tree_${language}_RPATH ${LIB_DIR}) - endif(USE_RPATH AND NOT WIN32_OR_CYGWIN) + string(REGEX REPLACE ";" ":" build_tree_${language}_RPATH "${build_tree_${language}_RPATH}") + string(REPLACE " " "\\ " build_tree_${language}_RPATH_ESCAPED "${build_tree_${language}_RPATH}") + + endif(ENABLE_ocaml) # Install Chloe.pgm in installed examples directory so that all implementations # of example 20 in the various examples subdirectories can conveniently