app-office/gnucash: don't use installed copy of gnucash for build or tests

Per https://www.gnu.org/software/guile/manual/html_node/Foreign-Libraries.html,
newer guile (>= 3.0.6) will respect GUILE_EXTENSIONS_PATH when looking up paths for
`dlopen` for `load-extension` -> `load-foreign-library`. Older guiles will use
`LTDL_LIBRARY_PATH` instead.

Without this set, the system paths are checked instead (maybe falling back
to another variable if not found on the system, unclear), and we end up
with build failures when we try to mix system and just-built gnucash (this
is also obviously a problem for testing as well).

For tests, we additionally have to do a "fake install" in ${BUILD_DIR}/whatever
and we set the path to that in the ebuild with GENTOO_TEMPORARY_TEST_INSTALLDIR.

https://www.gnu.org/software/guile/manual/html_node/Load-Paths.html and
https://www.gnu.org/software/guile/manual/html_node/Environment-Variables.html were
also a lot of help.

(When testing w/ guile-2.2 briefly, it didn't seem that we needed
to set LTDL_LIBRARY_PATH, but someone can add that if it turns out to be
needed, or I may later.)

(With regard to GUILE_AUTO_COMPILE=0, dropped that as it doesn't seem
necessary. Plan is to also add GUILE_AUTO_COMPILE=fresh to the eclass,
am discussing it w/ Arsen.)

Bug: https://bugs.gnucash.org/show_bug.cgi?id=799159
Bug: https://bugs.gentoo.org/359033
Bug: https://bugs.gentoo.org/371264
Bug: https://bugs.gentoo.org/734286
Bug: https://bugs.gentoo.org/946927
Closes: https://bugs.gentoo.org/941426
Signed-off-by: Sam James <sam@gentoo.org>
This commit is contained in:
Sam James
2024-12-26 09:41:40 +00:00
parent c94f85bf2b
commit 72dbf2ec40
2 changed files with 120 additions and 9 deletions

View File

@@ -0,0 +1,96 @@
From 59c0a848aeab5a600f40962b359395e4dca57537 Mon Sep 17 00:00:00 2001
From: Sam James <sam@gentoo.org>
Date: Thu, 26 Dec 2024 09:55:15 +0000
Subject: [PATCH] Don't use installed copy of gnucash for build or tests
Per https://www.gnu.org/software/guile/manual/html_node/Foreign-Libraries.html,
newer guile (>= 3.0.6) will respect GUILE_EXTENSIONS_PATH when looking up paths for
`dlopen` for `load-extension` -> `load-foreign-library`. Older guiles will use
`LTDL_LIBRARY_PATH` instead.
Without this set, the system paths are checked instead (maybe falling back
to another variable if not found on the system, unclear), and we end up
with build failures when we try to mix system and just-built gnucash (this
is also obviously a problem for testing as well).
For tests, we additionally have to do a "fake install" in ${BUILD_DIR}/whatever
and we set the path to that in the ebuild with GENTOO_TEMPORARY_TEST_INSTALLDIR.
https://www.gnu.org/software/guile/manual/html_node/Load-Paths.html and
https://www.gnu.org/software/guile/manual/html_node/Environment-Variables.html were
also a lot of help.
(When testing w/ guile-2.2 briefly, it didn't seem that we needed
to set LTDL_LIBRARY_PATH, but someone can add that if it turns out to be
needed, or I may later.)
(With regard to GUILE_AUTO_COMPILE=0, dropped that as it doesn't seem
necessary. Plan is to also add GUILE_AUTO_COMPILE=fresh to the eclass,
am discussing it w/ Arsen.)
Bug: https://bugs.gnucash.org/show_bug.cgi?id=799159
Bug: https://bugs.gentoo.org/359033
Bug: https://bugs.gentoo.org/371264
Bug: https://bugs.gentoo.org/734286
Bug: https://bugs.gentoo.org/946927
Closes: https://bugs.gentoo.org/941426
Signed-off-by: Sam James <sam@gentoo.org>
---
common/cmake_modules/GncAddSchemeTargets.cmake | 2 ++
common/cmake_modules/GncAddTest.cmake | 6 ++++++
2 files changed, 8 insertions(+)
diff --git a/common/cmake_modules/GncAddSchemeTargets.cmake b/common/cmake_modules/GncAddSchemeTargets.cmake
index 9a038de..bab89bf 100644
--- a/common/cmake_modules/GncAddSchemeTargets.cmake
+++ b/common/cmake_modules/GncAddSchemeTargets.cmake
@@ -253,6 +253,7 @@ function(gnc_add_scheme_targets _TARGET)
make_win32_path_list(LIBRARY_PATH)
else()
set (LIBRARY_PATH "LD_LIBRARY_PATH=${LIBDIR_BUILD}:${LIBDIR_BUILD}/gnucash:$ENV{LD_LIBRARY_PATH}")
+ set (GUILE_EXTENSIONS_PATH "GUILE_EXTENSIONS_PATH=${LIBDIR_BUILD}:${LIBDIR_BUILD}/gnucash:$ENV{GUILE_EXTENSIONS_PATH}")
endif()
if (APPLE)
set (LIBRARY_PATH "DYLD_LIBRARY_PATH=${LIBDIR_BUILD}:${LIBDIR_BUILD}/gnucash:$ENV{DYLD_LIBRARY_PATH}")
@@ -281,6 +282,7 @@ function(gnc_add_scheme_targets _TARGET)
#We quote the arguments to stop CMake stripping the path separators.
set (GUILE_ENV
"${LIBRARY_PATH}"
+ "${GUILE_EXTENSIONS_PATH}"
"GNC_UNINSTALLED=YES"
"GNC_BUILDDIR=${CMAKE_BINARY_DIR}"
"GUILE_LOAD_PATH=${_GUILE_LOAD_PATH}"
diff --git a/common/cmake_modules/GncAddTest.cmake b/common/cmake_modules/GncAddTest.cmake
index ce12e8b..9ab2cc2 100644
--- a/common/cmake_modules/GncAddTest.cmake
+++ b/common/cmake_modules/GncAddTest.cmake
@@ -13,6 +13,7 @@ function(get_guile_env)
endif()
if (UNIX)
list(APPEND env "LD_LIBRARY_PATH=${_GNC_MODULE_PATH}:$ENV{LD_LIBRARY_PATH}")
+ list(APPEND env "GUILE_EXTENSIONS_PATH=${LIBDIR_BUILD}:${LIBDIR_BUILD}/gnucash:$ENV{GUILE_EXTENSIONS_PATH}")
endif()
if (MINGW64)
set(fpath "")
@@ -32,6 +33,8 @@ function(get_guile_env)
list(APPEND env "GUILE=${GUILE_EXECUTABLE}")
set(guile_load_paths "")
+ list(APPEND guile_load_paths "$ENV{GENTOO_TEMPORARY_TEST_INSTALLDIR}/${GUILE_REL_SITEDIR}")
+ list(APPEND guile_load_paths "$ENV{GENTOO_TEMPORARY_TEST_INSTALLDIR}/${GUILE_REL_SITEDIR}/gnucash/deprecated") # Path to gnucash' deprecated modules
list(APPEND guile_load_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITEDIR}")
list(APPEND guile_load_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITEDIR}/gnucash/deprecated") # Path to gnucash' deprecated modules
if (GUILE_COVERAGE)
@@ -46,6 +49,9 @@ function(get_guile_env)
set(guile_load_path "${guile_load_paths}")
set(guile_load_compiled_paths "")
+ list(APPEND guile_load_compiled_paths "$ENV{GENTOO_TEMPORARY_TEST_INSTALLDIR}/${GUILE_REL_SITECCACHEDIR}")
+ list(APPEND guile_load_compiled_paths "$ENV{GENTOO_TEMPORARY_TEST_INSTALLDIR}/${GUILE_REL_SITECCACHEDIR}/gnucash/deprecated")
+ list(APPEND guile_load_compiled_paths "$ENV{GENTOO_TEMPORARY_TEST_INSTALLDIR}/${GUILE_REL_SITECCACHEDIR}/tests")
list(APPEND guile_load_compiled_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITECCACHEDIR}")
list(APPEND guile_load_compiled_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITECCACHEDIR}/gnucash/deprecated")
list(APPEND guile_load_compiled_paths "${CMAKE_BINARY_DIR}/${GUILE_REL_SITECCACHEDIR}/tests")
--
2.47.1

View File

@@ -18,12 +18,11 @@ LICENSE="GPL-2+"
SLOT="0"
KEYWORDS="~amd64 ~arm64 ~ppc ~ppc64 ~riscv ~x86"
IUSE="aqbanking debug doc examples gnome-keyring +gui mysql nls ofx postgres python quotes smartcard sqlite test"
# Currently restricting due to the following:
# https://bugs.gnucash.org/show_bug.cgi?id=799159#c1
#
# Tests can be run but must first unmerge any existing GnuCash installation.
RESTRICT="test"
# Tests were previously restricted because guile would try to use installed,
# not just-built modules. See https://bugs.gnucash.org/show_bug.cgi?id=799159#c1.
# TODO: as of 5.10, the ebuild should handle this OK. If no issues come up,
# need to forward those findings (and tidy up the patch for) upstream.
RESTRICT="!test? ( test )"
# Examples doesn't build unless GUI is also built
REQUIRED_USE="
@@ -119,6 +118,7 @@ PATCHES=(
# https://bugs.gentoo.org/893676
"${FILESDIR}/${PN}-5.0-webkit2gtk-4.1.patch"
"${FILESDIR}/${P}-import-qif.patch"
"${FILESDIR}/${PN}-5.10-guile-load-path.patch"
)
pkg_setup() {
@@ -149,13 +149,16 @@ src_prepare() {
libgnucash/backend/dbi/test/test-backend-dbi-basic.cpp
libgnucash/backend/xml/test/test-xml-pricedb.cpp
)
local x
for x in "${fixtestfiles[@]}"; do
sed -i -e "s|\"/tmp/|\"${T}/|g" "${S}/${x}" || die "sed of ${S}/${x} failed"
done
}
src_configure() {
export GUILE_AUTO_COMPILE=0
# Used in src_test but the value has to be available at `cmake`
# generation time.
export GENTOO_TEMPORARY_TEST_INSTALLDIR="${BUILD_DIR}/test_install"
local sql_on_off="OFF"
if use mysql || use postgres || use sqlite ; then
@@ -197,8 +200,20 @@ src_test() {
fi
cd "${BUILD_DIR}" || die "Failed to enter ${BUILD_DIR}"
XDG_DATA_HOME="${T}/$(whoami)" eninja check
cmake_src_test
# We need e.g. `options.scm` to be available for loading by tests
# and the compiled `options.go` isn't enough. Do a temporary install
# for the benefit of the testsuite.
DESTDIR="${GENTOO_TEMPORARY_TEST_INSTALLDIR}" cmake_build install
# This is needed for `load-path` to be correct, as it lacks `/usr` in there.
local dir
for dir in bin include "$(get_libdir)" share ; do
ln -s "${GENTOO_TEMPORARY_TEST_INSTALLDIR}/usr/${dir}" "${GENTOO_TEMPORARY_TEST_INSTALLDIR}/${dir}" || die
done
# Avoid cmake_src_test as we don't get the test binaries built first
# and get various failures as a result. Copy what upstream do in CI.
eninja check
}
src_install() {