Skip to content

Commit

Permalink
TST: fix test and reorganize
Browse files Browse the repository at this point in the history
Rework the dependencies between the Python extension module and the
package libraries so that they can be loaded with a single additional
RPATH entry for each. The previous dependencies required two RPATH
entries to be added to the extension module to find the two libraries
installed in two different paths, however setting two RPATH entries is
not possible via install_rpath.  Meson version 1.6.0 or later is
required for insrall_rpath to be present in meson introspection data.

Reorganizes the test package to a flatter layout that helps
visualizing all the parts involved in the test.
  • Loading branch information
dnicolodi committed Feb 15, 2025
1 parent 237f633 commit 496404e
Show file tree
Hide file tree
Showing 12 changed files with 78 additions and 62 deletions.
2 changes: 1 addition & 1 deletion tests/packages/link-against-local-lib/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ if meson.get_compiler('c').get_id() in ['msvc', 'clang-cl', 'intel-cl']
link_args = ['-DEXAMPLE_DLL_IMPORTS']
else
lib_compile_args = []
link_args = ['-Wl,-rpath,custom-rpath-wrong-way']
link_args = ['-Wl,-rpath,rpath-from-linker-arguments']
endif

subdir('lib')
Expand Down
4 changes: 2 additions & 2 deletions tests/packages/sharedlib-in-package/mypkg/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ def _append_to_sharedlib_load_path():
# end-literalinclude


from ._example import example_prod, example_sum #noqa: E402
from ._example import prodsum # noqa: E402


__all__ = ['example_prod', 'example_sum']
__all__ = ['prodsum']
25 changes: 6 additions & 19 deletions tests/packages/sharedlib-in-package/mypkg/_examplemod.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,23 @@

#include <Python.h>

#include "examplelib.h"
#include "examplelib2.h"
#include "lib.h"

static PyObject* example_sum(PyObject* self, PyObject *args)
static PyObject* example_prodsum(PyObject* self, PyObject *args)
{
int a, b;
if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
return NULL;
}
int a, b, x;

long result = sum(a, b);

return PyLong_FromLong(result);
}

static PyObject* example_prod(PyObject* self, PyObject *args)
{
int a, b;
if (!PyArg_ParseTuple(args, "ii", &a, &b)) {
if (!PyArg_ParseTuple(args, "iii", &a, &b, &x)) {
return NULL;
}

long result = prod(a, b);
long result = prodsum(a, b, x);

return PyLong_FromLong(result);
}

static PyMethodDef methods[] = {
{"example_prod", (PyCFunction)example_prod, METH_VARARGS, NULL},
{"example_sum", (PyCFunction)example_sum, METH_VARARGS, NULL},
{"prodsum", (PyCFunction)example_prodsum, METH_VARARGS, NULL},
{NULL, NULL, 0, NULL},
};

Expand Down
9 changes: 0 additions & 9 deletions tests/packages/sharedlib-in-package/mypkg/examplelib.c

This file was deleted.

7 changes: 0 additions & 7 deletions tests/packages/sharedlib-in-package/mypkg/examplelib.h

This file was deleted.

10 changes: 10 additions & 0 deletions tests/packages/sharedlib-in-package/mypkg/lib.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
// SPDX-FileCopyrightText: 2022 The meson-python developers
//
// SPDX-License-Identifier: MIT

#include "lib.h"
#include "sublib.h"

int prodsum(int a, int b, int x) {
return prod(a, x) + b;
}
13 changes: 13 additions & 0 deletions tests/packages/sharedlib-in-package/mypkg/lib.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// SPDX-FileCopyrightText: 2022 The meson-python developers
//
// SPDX-License-Identifier: MIT

#if defined(MYPKG_DLL_EXPORTS)
#define EXPORT __declspec(dllexport)
#elif defined(MYPKG_DLL_IMPORTS)
#define EXPORT __declspec(dllimport)
#else
#define EXPORT
#endif

EXPORT int prodsum(int a, int b, int x);
31 changes: 22 additions & 9 deletions tests/packages/sharedlib-in-package/mypkg/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -10,29 +10,42 @@ else
import_dll_args = []
endif

example_lib = shared_library(
'examplelib',
'examplelib.c',
sublib = shared_library(
'sublib',
'sublib.c',
c_args: export_dll_args,
install: true,
install_dir: py.get_install_dir() / 'mypkg',
install_dir: py.get_install_dir() / 'mypkg/sub',
)

example_lib_dep = declare_dependency(
sublib_dep = declare_dependency(
compile_args: import_dll_args,
link_with: example_lib,
link_with: sublib,
)

lib = shared_library(
'lib',
'lib.c',
dependencies: sublib_dep,
c_args: export_dll_args,
install_rpath: '$ORIGIN/sub',
install: true,
install_dir: py.get_install_dir() / 'mypkg',
)

subdir('sub')
lib_dep = declare_dependency(
compile_args: import_dll_args,
link_with: lib,
)

py.extension_module(
'_example',
'_examplemod.c',
dependencies: [example_lib_dep, example_lib2_dep],
dependencies: lib_dep,
include_directories: 'sub',
install: true,
subdir: 'mypkg',
install_rpath: '$ORIGIN',
install_rpath: build_machine.system() == 'darwin' ? '@loader_path' : '$ORIGIN',
)

py.install_sources(
Expand Down
7 changes: 0 additions & 7 deletions tests/packages/sharedlib-in-package/mypkg/sub/examplelib2.h

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
//
// SPDX-License-Identifier: MIT

#include "mypkg_dll.h"
#include "sublib.h"

MYPKG_DLL int prod(int a, int b) {
int prod(int a, int b) {
return a * b;
}
13 changes: 13 additions & 0 deletions tests/packages/sharedlib-in-package/mypkg/sublib.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// SPDX-FileCopyrightText: 2022 The meson-python developers
//
// SPDX-License-Identifier: MIT

#if defined(MYPKG_DLL_EXPORTS)
#define EXPORT __declspec(dllexport)
#elif defined(MYPKG_DLL_IMPORTS)
#define EXPORT __declspec(dllimport)
#else
#define EXPORT
#endif

EXPORT int prod(int a, int b);
15 changes: 9 additions & 6 deletions tests/test_wheel.py
Original file line number Diff line number Diff line change
Expand Up @@ -178,15 +178,14 @@ def test_local_lib(venv, wheel_link_against_local_lib):
assert int(output) == 3


@pytest.mark.skipif(MESON_VERSION < (1, 6, 0), reason='meson too old')
def test_sharedlib_in_package(venv, wheel_sharedlib_in_package):
venv.pip('install', wheel_sharedlib_in_package)
output = venv.python('-c', 'import mypkg; print(mypkg.example_sum(2, 5))')
assert int(output) == 7
output = venv.python('-c', 'import mypkg; print(mypkg.example_prod(6, 7))')
assert int(output) == 42
output = venv.python('-c', 'import mypkg; print(mypkg.prodsum(2, 3, 4))')
assert int(output) == 11


@pytest.mark.skipif(MESON_VERSION < (1, 3, 0), reason='Meson version too old')
@pytest.mark.skipif(MESON_VERSION < (1, 3, 0), reason='meson too old')
def test_link_library_in_subproject(venv, wheel_link_library_in_subproject):
venv.pip('install', wheel_link_library_in_subproject)
output = venv.python('-c', 'import foo; print(foo.example_sum(3, 6))')
Expand All @@ -199,7 +198,11 @@ def test_rpath(wheel_link_against_local_lib, tmp_path):
artifact.extractall(tmp_path)

origin = '@loader_path' if sys.platform == 'darwin' else '$ORIGIN'
expected = {f'{origin}/../.link_against_local_lib.mesonpy.libs', 'custom-rpath',}
expected = {f'{origin}/../.link_against_local_lib.mesonpy.libs', 'rpath-from-linker-arguments',}

# ``install_rpath`` is supported starting with meson 1.6.0
if MESON_VERSION >= (1, 6, 0):
expected.add('custom-rpath')

rpath = set(mesonpy._rpath._get_rpath(tmp_path / 'example' / f'_example{EXT_SUFFIX}'))
# Verify that rpath is a superset of the expected one: linking to
Expand Down

0 comments on commit 496404e

Please sign in to comment.