You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
9.4 KiB
167 lines
9.4 KiB
commit 6b215267e7baeae83906bec8dab72a549aeda6c8
|
|
Author: Alan W. Irwin <airwin@users.sourceforge.net>
|
|
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 <airwin@users.sourceforge.net> 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
|