Package: release.debian.org Severity: normal User: release.debian....@packages.debian.org Usertags: unblock X-Debbugs-Cc: cc...@packages.debian.org Control: affects -1 + src:cctbx
Please unblock package cctbx [ Reason ] Fixed numpy2 compatibility by backporting the upstream patch; this makes the autopkgtest testsuite pass again. Also includes one policy compliance fix (using DEB_BUILD_OPTION_PARALLEL instead of nproc). [ Impact ] A few reverse depends in the crystallography field. [ Tests ] Full autopkgtest testsuite. [ Risks ] Low, since the patch has been reviewed upstream in an MR then merged. It's also part of the new upstream release (which I'll keep for after the Trixie release). [ Checklist ] [x] all changes are documented in the d/changelog [x] I reviewed all changes and I approve them [x] attach debdiff against the package in testing unblock cctbx/2024.10+ds2+~3.22.1+ds1-5
diff -Nru cctbx-2024.10+ds2+~3.22.1+ds1/debian/changelog cctbx-2024.10+ds2+~3.22.1+ds1/debian/changelog --- cctbx-2024.10+ds2+~3.22.1+ds1/debian/changelog 2024-11-20 15:50:35.000000000 +0100 +++ cctbx-2024.10+ds2+~3.22.1+ds1/debian/changelog 2025-05-29 18:19:06.000000000 +0200 @@ -1,3 +1,17 @@ +cctbx (2024.10+ds2+~3.22.1+ds1-5) unstable; urgency=medium + + [ Michael R. Crusoe ] + * Team upload. + * d/rules: use DEB_BUILD_OPTION_PARALLEL instead of nproc to respect + Debian Policy 4.9.1. + + [ Roland Mas ] + * Backport upstream patch to fix: "autopkgtest regression in testing", + thanks to Graham Inggs (Closes: #1101031). + * Fix pip invocation to help with autopkgtests. + + -- Roland Mas <lola...@debian.org> Thu, 29 May 2025 18:19:06 +0200 + cctbx (2024.10+ds2+~3.22.1+ds1-4) unstable; urgency=medium * Bug fix: "removal of Python standard libraries in Python 3.13", thanks diff -Nru cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0027-Numpy-2-compat-from-upstream.patch cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0027-Numpy-2-compat-from-upstream.patch --- cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0027-Numpy-2-compat-from-upstream.patch 1970-01-01 01:00:00.000000000 +0100 +++ cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0027-Numpy-2-compat-from-upstream.patch 2025-05-29 17:53:19.000000000 +0200 @@ -0,0 +1,447 @@ +From: Roland Mas <lola...@debian.org> +Date: Thu, 29 May 2025 16:53:52 +0200 +Subject: Numpy 2 compat from upstream + +--- + dxtbx/dependencies.yaml | 5 +-- + dxtbx/src/dxtbx/boost_python/flumpy.cc | 2 +- + .../src/dxtbx/format/FormatHDF5EigerNearlyNexus.py | 48 +++++++++++----------- + dxtbx/src/dxtbx/format/FormatNexusJungfrauHack.py | 10 ++--- + dxtbx/src/dxtbx/format/FormatSER.py | 4 +- + dxtbx/src/dxtbx/format/nexus.py | 18 ++++---- + dxtbx/src/dxtbx/format/nxmx_writer.py | 4 +- + dxtbx/src/dxtbx/nexus/__init__.py | 2 +- + dxtbx/src/dxtbx/util/rotate_and_average.py | 2 +- + dxtbx/tests/conftest.py | 4 +- + dxtbx/tests/format/test_FormatNXmxDLS16M.py | 20 ++++----- + dxtbx/tests/nexus/test_build_dxtbx_models.py | 2 +- + dxtbx/tests/test_flumpy.py | 2 +- + 13 files changed, 59 insertions(+), 64 deletions(-) + +diff --git a/dxtbx/dependencies.yaml b/dxtbx/dependencies.yaml +index ba2e954..b2460f8 100644 +--- a/dxtbx/dependencies.yaml ++++ b/dxtbx/dependencies.yaml +@@ -54,12 +54,11 @@ build: + + host: + - cctbx-base # [prebuilt_cctbx and bootstrap] +- - cctbx-base >=2024 # [not bootstrap] ++ - cctbx-base >=2025 # [not bootstrap] + - hdf5 + - libboost-devel + - libboost-python-devel +- - numpy >=1.21.5,<2 #[bootstrap] +- - numpy # [not bootstrap] ++ - numpy + - pip + - pybind11 + - python +diff --git a/dxtbx/src/dxtbx/boost_python/flumpy.cc b/dxtbx/src/dxtbx/boost_python/flumpy.cc +index d7ce34b..e8cb4ea 100644 +--- a/dxtbx/src/dxtbx/boost_python/flumpy.cc ++++ b/dxtbx/src/dxtbx/boost_python/flumpy.cc +@@ -587,7 +587,7 @@ py::object miller_index_from_numpy(py::array np_array) { + if (accepted_types.find(dtype) == std::string::npos) { + throw std::invalid_argument( + std::string("miller_index only supports int32 or intc types - cannot convert '") +- + std::to_string(dtype) + "'"); ++ + dtype + "'"); + } + return vec_from_numpy<cctbx::miller::index>(np_array); + } +diff --git a/dxtbx/src/dxtbx/format/FormatHDF5EigerNearlyNexus.py b/dxtbx/src/dxtbx/format/FormatHDF5EigerNearlyNexus.py +index 25d7a4c..4721c38 100644 +--- a/dxtbx/src/dxtbx/format/FormatHDF5EigerNearlyNexus.py ++++ b/dxtbx/src/dxtbx/format/FormatHDF5EigerNearlyNexus.py +@@ -32,7 +32,7 @@ def find_entries(nx_file): + if "entry" in nx_file: + entry = nx_file["entry"] + if "NX_class" in entry.attrs: +- if entry.attrs["NX_class"] == np.string_("NXentry"): ++ if entry.attrs["NX_class"] == np.bytes_("NXentry"): + if "definition" not in entry: + return entry + return None +@@ -49,7 +49,7 @@ def is_eiger_nearly_nexus_file(filename): + if entry is not None: + try: + return ( +- np.string_("dectris eiger") ++ np.bytes_("dectris eiger") + in entry["instrument"]["detector"]["description"][()].lower() + ) + except KeyError: +@@ -76,7 +76,7 @@ class EigerNXmxFixer: + dataset[()] = value + + # Add NXmx definition +- create_scalar(handle["entry"], "definition", "S4", np.string_("NXmx")) ++ create_scalar(handle["entry"], "definition", "S4", np.bytes_("NXmx")) + + # Add saturation value + try: +@@ -100,7 +100,7 @@ class EigerNXmxFixer: + + # Add detector type + create_scalar( +- handle["entry/instrument/detector"], "type", "S5", np.string_("PIXEL") ++ handle["entry/instrument/detector"], "type", "S5", np.bytes_("PIXEL") + ) + + # Move the beam +@@ -111,7 +111,7 @@ class EigerNXmxFixer: + module_path = "/entry/instrument/detector/module" + # print "Creating detector module %s" % (module_path) + group = handle.create_group(module_path) +- group.attrs["NX_class"] = np.string_("NXdetector_module") ++ group.attrs["NX_class"] = np.bytes_("NXdetector_module") + + # Add a module index + create_scalar(group, "module_index", "int64", 0) +@@ -174,13 +174,13 @@ class EigerNXmxFixer: + "float32", + handle["/entry/instrument/detector/x_pixel_size"][()], + ) +- group["fast_pixel_direction"].attrs["transformation_type"] = np.string_( ++ group["fast_pixel_direction"].attrs["transformation_type"] = np.bytes_( + "translation" + ) + group["fast_pixel_direction"].attrs["vector"] = fast_axis + group["fast_pixel_direction"].attrs["offset"] = (0, 0, 0) +- group["fast_pixel_direction"].attrs["units"] = np.string_("m") +- group["fast_pixel_direction"].attrs["depends_on"] = np.string_(depends_on) ++ group["fast_pixel_direction"].attrs["units"] = np.bytes_("m") ++ group["fast_pixel_direction"].attrs["depends_on"] = np.bytes_(depends_on) + + # Add slow_pixel_size dataset + create_scalar( +@@ -189,29 +189,29 @@ class EigerNXmxFixer: + "float32", + handle["/entry/instrument/detector/y_pixel_size"][()], + ) +- group["slow_pixel_direction"].attrs["transformation_type"] = np.string_( ++ group["slow_pixel_direction"].attrs["transformation_type"] = np.bytes_( + "translation" + ) + group["slow_pixel_direction"].attrs["vector"] = slow_axis + group["slow_pixel_direction"].attrs["offset"] = (0, 0, 0) +- group["slow_pixel_direction"].attrs["units"] = np.string_("m") +- group["slow_pixel_direction"].attrs["depends_on"] = np.string_(depends_on) ++ group["slow_pixel_direction"].attrs["units"] = np.bytes_("m") ++ group["slow_pixel_direction"].attrs["depends_on"] = np.bytes_(depends_on) + + # Add module offset dataset + # print "Set module offset to be zero relative to detector" + create_scalar(group, "module_offset", "float32", 0) +- group["module_offset"].attrs["transformation_type"] = np.string_("translation") ++ group["module_offset"].attrs["transformation_type"] = np.bytes_("translation") + group["module_offset"].attrs["vector"] = (0, 0, 0) + group["module_offset"].attrs["offset"] = (0, 0, 0) +- group["module_offset"].attrs["units"] = np.string_("m") +- group["module_offset"].attrs["depends_on"] = np.string_(depends_on) ++ group["module_offset"].attrs["units"] = np.bytes_("m") ++ group["module_offset"].attrs["depends_on"] = np.bytes_(depends_on) + + # Create detector depends_on + create_scalar( + handle["/entry/instrument/detector"], + "depends_on", + "S%d" % len(depends_on), +- np.string_(depends_on), ++ np.bytes_(depends_on), + ) + + # Add detector position +@@ -228,22 +228,22 @@ class EigerNXmxFixer: + ) + ) + group = handle.create_group("/entry/instrument/detector/transformations") +- group.attrs["NX_class"] = np.string_("NXtransformations") ++ group.attrs["NX_class"] = np.bytes_("NXtransformations") + create_scalar(group, "translation", "float32", detector_offset_vector.length()) +- group["translation"].attrs["transformation_type"] = np.string_("translation") ++ group["translation"].attrs["transformation_type"] = np.bytes_("translation") + if detector_offset_vector.length() > 0: + group["translation"].attrs["vector"] = detector_offset_vector.normalize() + else: + group["translation"].attrs["vector"] = detector_offset_vector + group["translation"].attrs["offset"] = 0 +- group["translation"].attrs["units"] = np.string_("m") +- group["translation"].attrs["depends_on"] = np.string_(".") ++ group["translation"].attrs["units"] = np.bytes_("m") ++ group["translation"].attrs["depends_on"] = np.bytes_(".") + + # Create goniometer transformations if not found + if "/entry/sample/transformations" not in handle: + # print "Creating group /entry/sample/transformation" + group = handle.create_group("/entry/sample/transformations") +- group.attrs["NX_class"] = np.string_("NXtransformations") ++ group.attrs["NX_class"] = np.bytes_("NXtransformations") + else: + group = handle["/entry/sample/transformations"] + +@@ -274,11 +274,11 @@ class EigerNXmxFixer: + for name in sorted(handle["/entry/data"]): + num_images += handle_orig_entry_properties[name]["length"] + dataset = group.create_dataset("omega", (num_images,), dtype="float32") +- dataset.attrs["units"] = np.string_("degree") +- dataset.attrs["transformation_type"] = np.string_("rotation") ++ dataset.attrs["units"] = np.bytes_("degree") ++ dataset.attrs["transformation_type"] = np.bytes_("rotation") + dataset.attrs["vector"] = default_axis + dataset.attrs["offset"] = 0 +- dataset.attrs["depends_on"] = np.string_(".") ++ dataset.attrs["depends_on"] = np.bytes_(".") + omega_range_average = handle[ + "/entry/sample/goniometer/omega_range_average" + ][()] +@@ -295,7 +295,7 @@ class EigerNXmxFixer: + handle["/entry/sample"], + "depends_on", + "S%d" % len(dataset.name), +- np.string_(dataset.name), ++ np.bytes_(dataset.name), + ) + + # Change relative paths to absolute paths +diff --git a/dxtbx/src/dxtbx/format/FormatNexusJungfrauHack.py b/dxtbx/src/dxtbx/format/FormatNexusJungfrauHack.py +index e43892c..8a9198c 100644 +--- a/dxtbx/src/dxtbx/format/FormatNexusJungfrauHack.py ++++ b/dxtbx/src/dxtbx/format/FormatNexusJungfrauHack.py +@@ -106,11 +106,11 @@ class FormatNexusJungfrauHack(FormatNexus): + detector_material = clean_string(str(material)) + material = { + "Si": "Si", +- np.string_("Si"): "Si", +- np.string_("Silicon"): "Si", +- np.string_("Sillicon"): "Si", +- np.string_("CdTe"): "CdTe", +- np.string_("GaAs"): "GaAs", ++ np.bytes_("Si"): "Si", ++ np.bytes_("Silicon"): "Si", ++ np.bytes_("Sillicon"): "Si", ++ np.bytes_("CdTe"): "CdTe", ++ np.bytes_("GaAs"): "GaAs", + }.get(detector_material) + if not material: + raise RuntimeError("Unknown material: %s" % detector_material) +diff --git a/dxtbx/src/dxtbx/format/FormatSER.py b/dxtbx/src/dxtbx/format/FormatSER.py +index acf5ccc..0fd3031 100644 +--- a/dxtbx/src/dxtbx/format/FormatSER.py ++++ b/dxtbx/src/dxtbx/format/FormatSER.py +@@ -142,7 +142,7 @@ def read_emi(filename): + + + def _parseEntry_emi(value): +- """Auxiliary function to parse string entry to int, float or np.string_(). ++ """Auxiliary function to parse string entry to int, float or np.bytes_(). + Parameters + ---------- + value : str +@@ -162,7 +162,7 @@ def _parseEntry_emi(value): + p = float(value) + except ValueError: + # if neither int nor float, stay with string +- p = np.string_(str(value)) ++ p = np.bytes_(str(value)) + + return p + +diff --git a/dxtbx/src/dxtbx/format/nexus.py b/dxtbx/src/dxtbx/format/nexus.py +index 35dfefa..a7fc1c6 100644 +--- a/dxtbx/src/dxtbx/format/nexus.py ++++ b/dxtbx/src/dxtbx/format/nexus.py +@@ -48,15 +48,15 @@ except ImportError: + NXNode = Union[h5py.File, h5py.Group] + + +-def h5str(h5_value: str | numpy.string_ | bytes) -> str: ++def h5str(h5_value: str | numpy.bytes_ | bytes) -> str: + """ + Convert a value returned an h5py attribute to str. + +- h5py can return either a bytes-like (numpy.string_) or str object ++ h5py can return either a bytes-like (numpy.bytes_) or str object + for attribute values depending on whether the value was written as + fixed or variable length. This function collapses the two to str. + """ +- if isinstance(h5_value, (numpy.string_, bytes)): ++ if isinstance(h5_value, (numpy.bytes_, bytes)): + return h5_value.decode("utf-8") + return h5_value + +@@ -68,7 +68,7 @@ def dataset_as_flex(dataset, selection): + assert numpy.issubdtype(dataset.dtype, numpy.floating) + double_types = [ + numpy.double, +- numpy.longfloat, ++ numpy.longdouble, + numpy.float64, + ] + if hasattr(numpy, "float96"): +@@ -78,7 +78,7 @@ def dataset_as_flex(dataset, selection): + if dataset.dtype in [ + numpy.half, + numpy.single, +- numpy.float_, ++ numpy.float64, + numpy.float16, + numpy.float32, + ]: +@@ -1095,7 +1095,7 @@ class DetectorFactory: + # mu_at_angstrom returns cm^-1, but need mu in mm^-1 + table = attenuation_coefficient.get_table(material) + wavelength = beam.get_wavelength() +- mu = table.mu_at_angstrom(wavelength) / 10.0 ++ mu = float(table.mu_at_angstrom(wavelength)) / 10.0 + + # Construct the detector model + pixel_size = (fast_pixel_direction_value, slow_pixel_direction_value) +@@ -1112,9 +1112,9 @@ class DetectorFactory: + Panel( + detector_type, + detector_name, +- tuple(fast_axis), +- tuple(slow_axis), +- tuple(origin), ++ tuple(float(x) for x in fast_axis), ++ tuple(float(x) for x in slow_axis), ++ tuple(float(x) for x in origin), + pixel_size, + image_size, + trusted_range, +diff --git a/dxtbx/src/dxtbx/format/nxmx_writer.py b/dxtbx/src/dxtbx/format/nxmx_writer.py +index 57cfce0..7161654 100644 +--- a/dxtbx/src/dxtbx/format/nxmx_writer.py ++++ b/dxtbx/src/dxtbx/format/nxmx_writer.py +@@ -171,7 +171,7 @@ class NXmxWriter: + entry["end_time_estimated"] = self.params.nexus_details.end_time_estimated + + # --> definition +- self._create_scalar(entry, "definition", "S4", np.string_("NXmx")) ++ self._create_scalar(entry, "definition", "S4", np.bytes_("NXmx")) + + # --> sample + sample = self.handle["entry"].create_group("sample") +@@ -354,7 +354,7 @@ class NXmxWriter: + det_group.attrs["NX_class"] = "NXdetector_group" + + det_group.create_dataset("group_index", data=list(range(1, 3)), dtype="i") +- data = [np.string_("detector"), np.string_("detector")] ++ data = [np.bytes_("detector"), np.bytes_("detector")] + det_group.create_dataset("group_names", (2,), data=data, dtype="S12") + det_group.create_dataset("group_parent", (2,), data=[-1, 1], dtype="i") + det_group.create_dataset("group_type", (2,), data=[1, 2], dtype="i") +diff --git a/dxtbx/src/dxtbx/nexus/__init__.py b/dxtbx/src/dxtbx/nexus/__init__.py +index e506e3a..b1df642 100644 +--- a/dxtbx/src/dxtbx/nexus/__init__.py ++++ b/dxtbx/src/dxtbx/nexus/__init__.py +@@ -440,7 +440,7 @@ def get_dxtbx_detector( + material = KNOWN_SENSOR_MATERIALS.get(nxdetector.sensor_material) + if not material: + raise ValueError(f"Unknown material: {nxdetector.sensor_material}") +- thickness = nxdetector.sensor_thickness.to("mm").magnitude ++ thickness = float(nxdetector.sensor_thickness.to("mm").magnitude) + table = eltbx.attenuation_coefficient.get_table(material) + mu = table.mu_at_angstrom(wavelength) / 10.0 + px_mm = dxtbx.model.ParallaxCorrectedPxMmStrategy(mu, thickness) +diff --git a/dxtbx/src/dxtbx/util/rotate_and_average.py b/dxtbx/src/dxtbx/util/rotate_and_average.py +index 61012ea..02fb53e 100644 +--- a/dxtbx/src/dxtbx/util/rotate_and_average.py ++++ b/dxtbx/src/dxtbx/util/rotate_and_average.py +@@ -16,7 +16,7 @@ def rotate_and_average(data, angle, deg=False, mask=None): + ny, nx = np.shape(data) + + xx, yy = np.meshgrid(np.arange(nx), np.arange(ny)) +- xx_yy = np.row_stack((xx.ravel(), yy.ravel())) ++ xx_yy = np.vstack((xx.ravel(), yy.ravel())) + R = np.array(((np.cos(angle), -np.sin(angle)), (np.sin(angle), np.cos(angle)))) + xx_yy_rotated = np.matmul(R, xx_yy) + xx_rotated = xx_yy_rotated[0, :].reshape((ny, nx)) +diff --git a/dxtbx/tests/conftest.py b/dxtbx/tests/conftest.py +index cc1761f..effe2e6 100644 +--- a/dxtbx/tests/conftest.py ++++ b/dxtbx/tests/conftest.py +@@ -27,9 +27,7 @@ def nxmx_example(): + + instrument = entry.create_group("instrument") + instrument.attrs["NX_class"] = "NXinstrument" +- name = instrument.create_dataset( +- "name", data=np.string_("DIAMOND BEAMLINE I03") +- ) ++ name = instrument.create_dataset("name", data=np.bytes_("DIAMOND BEAMLINE I03")) + name.attrs["short_name"] = "I03" + + beam = instrument.create_group("beam") +diff --git a/dxtbx/tests/format/test_FormatNXmxDLS16M.py b/dxtbx/tests/format/test_FormatNXmxDLS16M.py +index 56ecc14..a9ba1d2 100644 +--- a/dxtbx/tests/format/test_FormatNXmxDLS16M.py ++++ b/dxtbx/tests/format/test_FormatNXmxDLS16M.py +@@ -200,11 +200,11 @@ def test_understand(beamline, tmp_path): + with h5py.File(nxs, mode="w") as fh: + entry = fh.create_group("entry") + instrument = entry.create_group("instrument") +- instrument.attrs["short_name"] = np.string_(f"DLS {beamline}") ++ instrument.attrs["short_name"] = np.bytes_(f"DLS {beamline}") + name = instrument.create_dataset( +- "name", data=np.string_(f"DIAMOND BEAMLINE {beamline}") ++ "name", data=np.bytes_(f"DIAMOND BEAMLINE {beamline}") + ) +- name.attrs["short_name"] = np.string_(f"DLS {beamline}") ++ name.attrs["short_name"] = np.bytes_(f"DLS {beamline}") + assert FormatNXmxDLS16M.understand(nxs) + assert FormatNXmxDLS.understand(nxs) + +@@ -216,9 +216,9 @@ def test_understand_legacy(beamline, tmp_path): + with h5py.File(nxs, mode="w") as fh: + entry = fh.create_group("entry") + instrument = entry.create_group("instrument") +- instrument.attrs["short_name"] = np.string_(f"{beamline}") +- name = instrument.create_dataset("name", data=np.string_(f"{beamline}")) +- name.attrs["short_name"] = np.string_(f"{beamline}") ++ instrument.attrs["short_name"] = np.bytes_(f"{beamline}") ++ name = instrument.create_dataset("name", data=np.bytes_(f"{beamline}")) ++ name.attrs["short_name"] = np.bytes_(f"{beamline}") + assert FormatNXmxDLS16M.understand(nxs) + assert FormatNXmxDLS.understand(nxs) + +@@ -236,9 +236,7 @@ def test_do_not_understand_i24(tmp_path): + with h5py.File(nxs, mode="w") as fh: + entry = fh.create_group("entry") + instrument = entry.create_group("instrument") +- instrument.attrs["short_name"] = np.string_("DLS I24") +- name = instrument.create_dataset( +- "name", data=np.string_("DIAMOND BEAMLINE I24") +- ) +- name.attrs["short_name"] = np.string_("DLS I24") ++ instrument.attrs["short_name"] = np.bytes_("DLS I24") ++ name = instrument.create_dataset("name", data=np.bytes_("DIAMOND BEAMLINE I24")) ++ name.attrs["short_name"] = np.bytes_("DLS I24") + assert not FormatNXmxDLS16M.understand(nxs) +diff --git a/dxtbx/tests/nexus/test_build_dxtbx_models.py b/dxtbx/tests/nexus/test_build_dxtbx_models.py +index 4f4591c..26fc12b 100644 +--- a/dxtbx/tests/nexus/test_build_dxtbx_models.py ++++ b/dxtbx/tests/nexus/test_build_dxtbx_models.py +@@ -805,7 +805,7 @@ def test_dataset_as_flex_float(): + def test_dataset_as_flex_double(): + slices = () + np_double_types = ( +- np.float_, ++ np.float64, + np.double, + np.float64, + ) +diff --git a/dxtbx/tests/test_flumpy.py b/dxtbx/tests/test_flumpy.py +index a8d9965..5fc2f2e 100644 +--- a/dxtbx/tests/test_flumpy.py ++++ b/dxtbx/tests/test_flumpy.py +@@ -217,7 +217,7 @@ def test_reverse_vec3_dtype(dtype): + @pytest.mark.parametrize("dtype", [np.int32, np.intc, int]) + def test_reverse_miller_index(dtype): + hkl = np.array([(1, 0, 0), (0, 1, 0), (0, 0, 1)], dtype=dtype) +- if dtype is int and np.dtype("l").itemsize != np.dtype("i").itemsize: ++ if np.dtype(dtype).itemsize != np.dtype(np.intc).itemsize: + with pytest.raises(ValueError): + flumpy.miller_index_from_numpy(hkl) + else: diff -Nru cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0028-Fix-pip-invocation.patch cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0028-Fix-pip-invocation.patch --- cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0028-Fix-pip-invocation.patch 1970-01-01 01:00:00.000000000 +0100 +++ cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/0028-Fix-pip-invocation.patch 2025-05-29 17:53:19.000000000 +0200 @@ -0,0 +1,20 @@ +From: Roland Mas <lola...@debian.org> +Date: Thu, 29 May 2025 17:28:46 +0200 +Subject: Fix pip invocation + +--- + dxtbx/libtbx_refresh.py | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/dxtbx/libtbx_refresh.py b/dxtbx/libtbx_refresh.py +index eef867e..9981234 100644 +--- a/dxtbx/libtbx_refresh.py ++++ b/dxtbx/libtbx_refresh.py +@@ -42,6 +42,7 @@ def _install_setup_readonly_fallback(package_name: str): + build_path, + "--no-build-isolation", + "--no-deps", ++ "--ignore-installed", + "-e", + root_path, + ], diff -Nru cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/series cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/series --- cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/series 2024-11-20 15:50:35.000000000 +0100 +++ cctbx-2024.10+ds2+~3.22.1+ds1/debian/patches/series 2025-05-29 17:53:19.000000000 +0200 @@ -24,3 +24,5 @@ 0031-Add-missing-ctdint-header.patch 0032-no-future.patch 0027-Replace-unmaintained-orderedset-with-ordered_set.patch +0027-Numpy-2-compat-from-upstream.patch +0028-Fix-pip-invocation.patch diff -Nru cctbx-2024.10+ds2+~3.22.1+ds1/debian/rules cctbx-2024.10+ds2+~3.22.1+ds1/debian/rules --- cctbx-2024.10+ds2+~3.22.1+ds1/debian/rules 2024-11-20 15:50:35.000000000 +0100 +++ cctbx-2024.10+ds2+~3.22.1+ds1/debian/rules 2025-05-29 15:20:57.000000000 +0200 @@ -8,15 +8,11 @@ export DH_OPTIONS DPKG_EXPORT_BUILDFLAGS = 1 -include /usr/share/dpkg/buildflags.mk +include /usr/share/dpkg/default.mk export DEB_CXXFLAGS_MAINT_APPEND := $(shell pkg-config --cflags hdf5-serial) -DBOOST_TIMER_ENABLE_DEPRECATED=1 export DEB_LDFLAGS_MAINT_APPEND=$(shell pkg-config --libs hdf5-serial) -# parallel support -#NPROC ?= $(shell dh_assistant which-build-system| jq .parallel) -NPROC ?= $(shell nproc) # for backport - MODULES = annlib_adaptbx boost_adaptbx cbflib_adaptbx ccp4io_adaptbx cctbx cma_es crys3d dxtbx fable gltbx iotbx libtbx mmtbx omptbx rstbx scitbx serialtbx smtbx spotfinder tbxx wxtbx #MODULES_TODO = gltbx MODULES_FAKE = annlib ccp4io @@ -68,7 +64,7 @@ dh_auto_build --sourcedirectory=dxtbx # build the cctbx extensions and libraries - dh_auto_build -- -s custom --build-args="cd {build_dir}_ && ./bin/libtbx.scons -j $(NPROC)" + dh_auto_build -- -s custom --build-args="cd {build_dir}_ && ./bin/libtbx.scons $(DEB_BUILD_OPTION_PARALLEL:%=-j %)" iconv -f ISO-8859-1 -t UTF-8 cctbx/eltbx/covalent_radii.h > covalent_radii.h mv covalent_radii.h cctbx/eltbx/covalent_radii.h