@@ -113,6 +113,16 @@ def _loaded_dl(abs_path: str, *, found_via: str = "CUDA_PATH") -> LoadedDL:
113113 )
114114
115115
116+ def _patch_dynamic_lib_loader (monkeypatch , ** loaded_by_libname : LoadedDL ) -> None :
117+ def fake_load_nvidia_dynamic_lib (libname : str ) -> LoadedDL :
118+ loaded = loaded_by_libname .get (libname )
119+ if loaded is None :
120+ raise AssertionError (f"Unexpected libname: { libname !r} " )
121+ return loaded
122+
123+ monkeypatch .setattr (compatibility_module , "_load_nvidia_dynamic_lib" , fake_load_nvidia_dynamic_lib )
124+
125+
116126def _located_static_lib (name : str , abs_path : str ) -> LocatedStaticLib :
117127 return LocatedStaticLib (
118128 name = name ,
@@ -492,53 +502,6 @@ def test_public_apis_share_process_wide_guard_rails_state(monkeypatch, tmp_path)
492502 pathfinder .find_nvidia_header_directory ("nvrtc" )
493503
494504
495- def test_load_dynamic_lib_then_find_headers_same_ctk_version (monkeypatch , tmp_path ):
496- ctk_root = tmp_path / "cuda-12.9"
497- _write_cuda_h (ctk_root , "12.9.20250531" )
498- lib_path = _touch (ctk_root / "targets" / "x86_64-linux" / "lib" / "libnvrtc.so.12" )
499- hdr_dir = ctk_root / "targets" / "x86_64-linux" / "include"
500- _touch (hdr_dir / "nvrtc.h" )
501-
502- monkeypatch .setattr (compatibility_module , "_load_nvidia_dynamic_lib" , lambda _libname : _loaded_dl (lib_path ))
503- monkeypatch .setattr (
504- compatibility_module ,
505- "_locate_nvidia_header_directory" ,
506- lambda _libname : LocatedHeaderDir (abs_path = str (hdr_dir ), found_via = "CUDA_PATH" ),
507- )
508-
509- guard_rails = CompatibilityGuardRails (driver_cuda_version = _driver_cuda_version (13000 ))
510-
511- loaded = guard_rails .load_nvidia_dynamic_lib ("nvrtc" )
512- hdr_path = guard_rails .find_nvidia_header_directory ("nvrtc" )
513-
514- assert loaded .abs_path == lib_path
515- assert hdr_path == str (hdr_dir )
516-
517-
518- def test_same_api_companions_require_exact_ctk_major_minor_match (monkeypatch , tmp_path ):
519- lib_root = tmp_path / "cuda-12.8"
520- hdr_root = tmp_path / "cuda-12.9"
521- _write_cuda_h (lib_root , "12.8.20250303" )
522- _write_cuda_h (hdr_root , "12.9.20250531" )
523-
524- lib_path = _touch (lib_root / "targets" / "x86_64-linux" / "lib" / "libnvrtc.so.12" )
525- hdr_dir = hdr_root / "targets" / "x86_64-linux" / "include"
526- _touch (hdr_dir / "nvrtc.h" )
527-
528- monkeypatch .setattr (compatibility_module , "_load_nvidia_dynamic_lib" , lambda _libname : _loaded_dl (lib_path ))
529- monkeypatch .setattr (
530- compatibility_module ,
531- "_locate_nvidia_header_directory" ,
532- lambda _libname : LocatedHeaderDir (abs_path = str (hdr_dir ), found_via = "CUDA_PATH" ),
533- )
534-
535- guard_rails = CompatibilityGuardRails (driver_cuda_version = _driver_cuda_version (13000 ))
536- guard_rails .load_nvidia_dynamic_lib ("nvrtc" )
537-
538- with pytest .raises (CompatibilityCheckError , match = r"companion tag 'api_nvrtc'" ):
539- guard_rails .find_nvidia_header_directory ("nvrtc" )
540-
541-
542505def test_same_dynamic_link_component_requires_exact_ctk_major_minor_match (monkeypatch , tmp_path ):
543506 cublas_root = tmp_path / "cuda-12.8"
544507 cusolver_root = tmp_path / "cuda-12.9"
@@ -548,14 +511,11 @@ def test_same_dynamic_link_component_requires_exact_ctk_major_minor_match(monkey
548511 cublas_path = _touch (cublas_root / "targets" / "x86_64-linux" / "lib" / "libcublas.so.12" )
549512 cusolver_path = _touch (cusolver_root / "targets" / "x86_64-linux" / "lib" / "libcusolver.so.12" )
550513
551- def fake_load_nvidia_dynamic_lib (libname : str ) -> LoadedDL :
552- if libname == "cublas" :
553- return _loaded_dl (cublas_path )
554- if libname == "cusolver" :
555- return _loaded_dl (cusolver_path )
556- raise AssertionError (f"Unexpected libname: { libname !r} " )
557-
558- monkeypatch .setattr (compatibility_module , "_load_nvidia_dynamic_lib" , fake_load_nvidia_dynamic_lib )
514+ _patch_dynamic_lib_loader (
515+ monkeypatch ,
516+ cublas = _loaded_dl (cublas_path ),
517+ cusolver = _loaded_dl (cusolver_path ),
518+ )
559519
560520 guard_rails = CompatibilityGuardRails (driver_cuda_version = _driver_cuda_version (13000 ))
561521 guard_rails .load_nvidia_dynamic_lib ("cublas" )
@@ -576,14 +536,11 @@ def test_independent_dynamic_libs_may_resolve_to_different_ctk_minors(monkeypatc
576536 nvrtc_path = _touch (nvrtc_root / "targets" / "x86_64-linux" / "lib" / "libnvrtc.so.12" )
577537 nvjitlink_path = _touch (nvjitlink_root / "targets" / "x86_64-linux" / "lib" / "libnvJitLink.so.12" )
578538
579- def fake_load_nvidia_dynamic_lib (libname : str ) -> LoadedDL :
580- if libname == "nvrtc" :
581- return _loaded_dl (nvrtc_path )
582- if libname == "nvJitLink" :
583- return _loaded_dl (nvjitlink_path )
584- raise AssertionError (f"Unexpected libname: { libname !r} " )
585-
586- monkeypatch .setattr (compatibility_module , "_load_nvidia_dynamic_lib" , fake_load_nvidia_dynamic_lib )
539+ _patch_dynamic_lib_loader (
540+ monkeypatch ,
541+ nvrtc = _loaded_dl (nvrtc_path ),
542+ nvJitLink = _loaded_dl (nvjitlink_path ),
543+ )
587544
588545 guard_rails = CompatibilityGuardRails (driver_cuda_version = _driver_cuda_version (13000 ))
589546
@@ -594,36 +551,6 @@ def fake_load_nvidia_dynamic_lib(libname: str) -> LoadedDL:
594551 assert loaded_nvjitlink .abs_path == nvjitlink_path
595552
596553
597- def test_public_apis_allow_independent_dynamic_libs_to_differ_by_minor (monkeypatch , tmp_path ):
598- nvrtc_root = tmp_path / "cuda-12.8"
599- nvjitlink_root = tmp_path / "cuda-12.9"
600- _write_cuda_h (nvrtc_root , "12.8.20250303" )
601- _write_cuda_h (nvjitlink_root , "12.9.20250531" )
602-
603- nvrtc_path = _touch (nvrtc_root / "targets" / "x86_64-linux" / "lib" / "libnvrtc.so.12" )
604- nvjitlink_path = _touch (nvjitlink_root / "targets" / "x86_64-linux" / "lib" / "libnvJitLink.so.12" )
605-
606- def fake_load_nvidia_dynamic_lib (libname : str ) -> LoadedDL :
607- if libname == "nvrtc" :
608- return _loaded_dl (nvrtc_path )
609- if libname == "nvJitLink" :
610- return _loaded_dl (nvjitlink_path )
611- raise AssertionError (f"Unexpected libname: { libname !r} " )
612-
613- monkeypatch .setattr (compatibility_module , "_load_nvidia_dynamic_lib" , fake_load_nvidia_dynamic_lib )
614- monkeypatch .setattr (
615- pathfinder ,
616- "process_wide_compatibility_guard_rails" ,
617- CompatibilityGuardRails (driver_cuda_version = _driver_cuda_version (13000 )),
618- )
619-
620- loaded_nvrtc = pathfinder .load_nvidia_dynamic_lib ("nvrtc" )
621- loaded_nvjitlink = pathfinder .load_nvidia_dynamic_lib ("nvJitLink" )
622-
623- assert loaded_nvrtc .abs_path == nvrtc_path
624- assert loaded_nvjitlink .abs_path == nvjitlink_path
625-
626-
627554def test_toolchain_companions_require_exact_ctk_major_minor_match (monkeypatch , tmp_path ):
628555 static_root = tmp_path / "cuda-12.8"
629556 binary_root = tmp_path / "cuda-12.9"
@@ -663,14 +590,11 @@ def test_declared_ltoir_pipeline_requires_nvjitlink_not_older_than_nvrtc(monkeyp
663590 nvrtc_path = _touch (nvrtc_root / "targets" / "x86_64-linux" / "lib" / "libnvrtc.so.12" )
664591 nvjitlink_path = _touch (nvjitlink_root / "targets" / "x86_64-linux" / "lib" / "libnvJitLink.so.12" )
665592
666- def fake_load_nvidia_dynamic_lib (libname : str ) -> LoadedDL :
667- if libname == "nvrtc" :
668- return _loaded_dl (nvrtc_path )
669- if libname == "nvJitLink" :
670- return _loaded_dl (nvjitlink_path )
671- raise AssertionError (f"Unexpected libname: { libname !r} " )
672-
673- monkeypatch .setattr (compatibility_module , "_load_nvidia_dynamic_lib" , fake_load_nvidia_dynamic_lib )
593+ _patch_dynamic_lib_loader (
594+ monkeypatch ,
595+ nvrtc = _loaded_dl (nvrtc_path ),
596+ nvJitLink = _loaded_dl (nvjitlink_path ),
597+ )
674598
675599 guard_rails = CompatibilityGuardRails (driver_cuda_version = _driver_cuda_version (13000 ))
676600 guard_rails .load_nvidia_dynamic_lib ("nvrtc" )
@@ -693,14 +617,11 @@ def test_declared_ltoir_pipeline_allows_same_major_newer_nvjitlink(monkeypatch,
693617 nvrtc_path = _touch (nvrtc_root / "targets" / "x86_64-linux" / "lib" / "libnvrtc.so.12" )
694618 nvjitlink_path = _touch (nvjitlink_root / "targets" / "x86_64-linux" / "lib" / "libnvJitLink.so.12" )
695619
696- def fake_load_nvidia_dynamic_lib (libname : str ) -> LoadedDL :
697- if libname == "nvrtc" :
698- return _loaded_dl (nvrtc_path )
699- if libname == "nvJitLink" :
700- return _loaded_dl (nvjitlink_path )
701- raise AssertionError (f"Unexpected libname: { libname !r} " )
702-
703- monkeypatch .setattr (compatibility_module , "_load_nvidia_dynamic_lib" , fake_load_nvidia_dynamic_lib )
620+ _patch_dynamic_lib_loader (
621+ monkeypatch ,
622+ nvrtc = _loaded_dl (nvrtc_path ),
623+ nvJitLink = _loaded_dl (nvjitlink_path ),
624+ )
704625
705626 guard_rails = CompatibilityGuardRails (driver_cuda_version = _driver_cuda_version (13000 ))
706627 loaded_nvrtc = guard_rails .load_nvidia_dynamic_lib ("nvrtc" )
@@ -715,7 +636,8 @@ def fake_load_nvidia_dynamic_lib(libname: str) -> LoadedDL:
715636 assert loaded_nvjitlink .abs_path == nvjitlink_path
716637
717638
718- def test_declared_ptx_pipeline_allows_cross_major_nvrtc_to_nvjitlink (monkeypatch , tmp_path ):
639+ @pytest .mark .parametrize ("artifact_kind" , ("ptx" , "elf" , "cubin" ))
640+ def test_declared_non_lto_pipeline_allows_cross_major_nvrtc_to_nvjitlink (monkeypatch , tmp_path , artifact_kind ):
719641 nvrtc_root = tmp_path / "cuda-12.8"
720642 nvjitlink_root = tmp_path / "cuda-13.0"
721643 _write_cuda_h (nvrtc_root , "12.8.20250303" )
@@ -724,22 +646,19 @@ def test_declared_ptx_pipeline_allows_cross_major_nvrtc_to_nvjitlink(monkeypatch
724646 nvrtc_path = _touch (nvrtc_root / "targets" / "x86_64-linux" / "lib" / "libnvrtc.so.12" )
725647 nvjitlink_path = _touch (nvjitlink_root / "targets" / "x86_64-linux" / "lib" / "libnvJitLink.so.13" )
726648
727- def fake_load_nvidia_dynamic_lib (libname : str ) -> LoadedDL :
728- if libname == "nvrtc" :
729- return _loaded_dl (nvrtc_path )
730- if libname == "nvJitLink" :
731- return _loaded_dl (nvjitlink_path )
732- raise AssertionError (f"Unexpected libname: { libname !r} " )
733-
734- monkeypatch .setattr (compatibility_module , "_load_nvidia_dynamic_lib" , fake_load_nvidia_dynamic_lib )
649+ _patch_dynamic_lib_loader (
650+ monkeypatch ,
651+ nvrtc = _loaded_dl (nvrtc_path ),
652+ nvJitLink = _loaded_dl (nvjitlink_path ),
653+ )
735654
736655 guard_rails = CompatibilityGuardRails (driver_cuda_version = _driver_cuda_version (13000 ))
737656 loaded_nvrtc = guard_rails .load_nvidia_dynamic_lib ("nvrtc" )
738657 loaded_nvjitlink = guard_rails .load_nvidia_dynamic_lib ("nvJitLink" )
739658 guard_rails ._declare_dynamic_lib_pipeline (
740659 producer_libname = "nvrtc" ,
741660 consumer_libname = "nvJitLink" ,
742- artifact_kind = "ptx" ,
661+ artifact_kind = artifact_kind ,
743662 )
744663
745664 assert loaded_nvrtc .abs_path == nvrtc_path
@@ -755,14 +674,11 @@ def test_declared_nvvm_pipeline_remains_conservative(monkeypatch, tmp_path):
755674 nvvm_path = _touch (nvvm_root / "nvvm" / "lib64" / "libnvvm.so.4" )
756675 nvjitlink_path = _touch (nvjitlink_root / "targets" / "x86_64-linux" / "lib" / "libnvJitLink.so.12" )
757676
758- def fake_load_nvidia_dynamic_lib (libname : str ) -> LoadedDL :
759- if libname == "nvvm" :
760- return _loaded_dl (nvvm_path )
761- if libname == "nvJitLink" :
762- return _loaded_dl (nvjitlink_path )
763- raise AssertionError (f"Unexpected libname: { libname !r} " )
764-
765- monkeypatch .setattr (compatibility_module , "_load_nvidia_dynamic_lib" , fake_load_nvidia_dynamic_lib )
677+ _patch_dynamic_lib_loader (
678+ monkeypatch ,
679+ nvvm = _loaded_dl (nvvm_path ),
680+ nvJitLink = _loaded_dl (nvjitlink_path ),
681+ )
766682
767683 guard_rails = CompatibilityGuardRails (driver_cuda_version = _driver_cuda_version (13000 ))
768684 guard_rails .load_nvidia_dynamic_lib ("nvvm" )
@@ -849,14 +765,11 @@ def test_driver_libs_do_not_lock_ctk_anchor(monkeypatch, tmp_path):
849765 _write_cuda_h (ctk_root , "12.9.20250531" )
850766 ctk_lib_path = _touch (ctk_root / "targets" / "x86_64-linux" / "lib" / "libnvrtc.so.12" )
851767
852- def fake_load_nvidia_dynamic_lib (libname : str ) -> LoadedDL :
853- if libname == "nvml" :
854- return _loaded_dl (driver_lib_path , found_via = "system-search" )
855- if libname == "nvrtc" :
856- return _loaded_dl (ctk_lib_path )
857- raise AssertionError (f"Unexpected libname: { libname !r} " )
858-
859- monkeypatch .setattr (compatibility_module , "_load_nvidia_dynamic_lib" , fake_load_nvidia_dynamic_lib )
768+ _patch_dynamic_lib_loader (
769+ monkeypatch ,
770+ nvml = _loaded_dl (driver_lib_path , found_via = "system-search" ),
771+ nvrtc = _loaded_dl (ctk_lib_path ),
772+ )
860773
861774 guard_rails = CompatibilityGuardRails (driver_cuda_version = _driver_cuda_version (13000 ))
862775
@@ -878,14 +791,11 @@ def test_driver_libs_do_not_mask_later_ctk_mismatch(monkeypatch, tmp_path):
878791 hdr_dir = hdr_root / "targets" / "x86_64-linux" / "include"
879792 _touch (hdr_dir / "nvrtc.h" )
880793
881- def fake_load_nvidia_dynamic_lib (libname : str ) -> LoadedDL :
882- if libname == "nvml" :
883- return _loaded_dl (driver_lib_path , found_via = "system-search" )
884- if libname == "nvrtc" :
885- return _loaded_dl (lib_path )
886- raise AssertionError (f"Unexpected libname: { libname !r} " )
887-
888- monkeypatch .setattr (compatibility_module , "_load_nvidia_dynamic_lib" , fake_load_nvidia_dynamic_lib )
794+ _patch_dynamic_lib_loader (
795+ monkeypatch ,
796+ nvml = _loaded_dl (driver_lib_path , found_via = "system-search" ),
797+ nvrtc = _loaded_dl (lib_path ),
798+ )
889799 monkeypatch .setattr (
890800 compatibility_module ,
891801 "_locate_nvidia_header_directory" ,
0 commit comments