1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
Author: Andreas Tille <tille@debian.org>
Last-Update: 2019-07-10
Description: Take over changes in Build.PL from commit 83c9327 to make sure htslib will be found
--- a/Build.PL
+++ b/Build.PL
@@ -1,6 +1,6 @@
#!/usr/bin/perl
-# Copyright [2015-2018] EMBL-European Bioinformatics Institute
+# Copyright [2015-2019] EMBL-European Bioinformatics Institute
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -75,7 +75,15 @@ sub find_hts {
# If either of these are set, we expect to find the htslib files there:
# (They're explicitly set by the user, so we shouldn't fall back to
# finding another copy somewhere else.)
- if (my $dir = $self->args('htslib')) {
+ my $incdir = $self->args('htslib-includedir');
+ my $libdir = $self->args('htslib-libdir');
+ if ($incdir && $libdir) {
+ return 1 if $self->find_hts_in_split_install_dirs($incdir, $libdir);
+ $self->die_hts_not_found(
+ "--htslib-includedir '$incdir' or --htslib-libdir '$libdir' command line parameters do not contain expected files\n"
+ );
+ }
+ elsif (my $dir = $self->args('htslib')) {
return 1 if $self->find_hts_in_build_dir($dir);
return 1 if $self->find_hts_in_install_dir($dir);
$self->die_hts_not_found(
@@ -105,6 +113,9 @@ sub find_hts {
}
return 1 if $found;
+ # Try pkgconfig again but this time trust whatever it returns, without extra verification
+ return 1 if $self->find_hts_with_pkgconfig();
+
$self->die_hts_not_found();
}
@@ -114,12 +125,14 @@ sub set_include_and_compiler_flags {
my $hts_include = $self->config_data('hts_include');
my $hts_lib = $self->config_data('hts_lib');
my $static = $self->args('static');
- $self->include_dirs([$hts_include]);
- if($static){
- $self->extra_linker_flags("-L$hts_lib", '-lhts', '-lpthread', '-lz');
- }else{
- $self->extra_linker_flags("-L$hts_lib", "-Wl,-rpath,$hts_lib", '-lhts', '-lpthread', '-lz');
+
+ $self->include_dirs([$hts_include]) if $hts_include;
+
+ my @linker_dirflags;
+ if ($hts_lib) {
+ push @linker_dirflags, "-L$hts_lib";
}
+ $self->extra_linker_flags(@linker_dirflags, '-lhts', '-lpthread', '-lz');
}
sub hts_dev_files_exist {
@@ -165,6 +178,48 @@ sub find_hts_in_install_dir {
}
}
+sub find_hts_in_split_install_dirs {
+ my ($self, $hts_include, $hts_lib) = @_;
+
+ chomp($hts_lib);
+ chomp($hts_include);
+ $hts_include =~ s{include/htslib$}{include};
+
+ if (hts_dev_files_exist($hts_lib, $hts_include)) {
+ $self->config_data('hts_lib' => $hts_lib);
+ $self->config_data('hts_include' => $hts_include);
+ return 1;
+ }
+ else {
+ return 0;
+ }
+}
+
+sub find_hts_with_pkgconfig {
+ my ($self) = @_;
+
+ return 0 unless can_load(
+ modules => { 'ExtUtils::PkgConfig' => undef }
+ );
+ my $pkg_name = 'htslib';
+ return 0 unless ExtUtils::PkgConfig->exists($pkg_name);
+
+ if (my $libs_only_L = ExtUtils::PkgConfig->libs_only_L($pkg_name)) {
+ # For compatibility with other htslib search methods. Note that this
+ # assumes there will be at most one each of -I/-L directories, which
+ # is true as of htslib-1.5 but might change in the future.
+ $libs_only_L =~ s{^-L}{};
+ $self->config_data('hts_lib' => $libs_only_L);
+ }
+ if (my $cflags_only_I = ExtUtils::PkgConfig->cflags_only_I($pkg_name)) {
+ # See above
+ $cflags_only_I =~ s{^-I}{};
+ $self->config_data('hts_include' => $cflags_only_I);
+ }
+
+ return 1;
+}
+
sub die_hts_not_found {
my ($self, $msg) = @_;
@@ -177,12 +232,17 @@ Install it if you have not done so alrea
This script will attempt to locate HTSlib by looking for htslib/hts.h
and libhts.a / libhts.so in:
- 1. --htslib command line argument
- 2. HTSLIB_DIR environment variable
- 3. --prefix command line argument (which also sets installation location)
- 4. Alien::HTSlib dependency resolver
- 5. pkg-config (extra directories can be set in PKG_CONFIG_PATH environment variable)
- 6. common library locations: /usr /usr/local, /usr/share, /opt/local
+ 1. --htslib-includedir and --htslib-libdir command line arguments
+ 2. --htslib command line argument
+ 3. HTSLIB_DIR environment variable
+ 4. --prefix command line argument (which also sets installation location)
+ 5. Alien::HTSlib dependency resolver
+ 6. pkg-config (extra directories can be set in PKG_CONFIG_PATH environment variable)
+ 7. common library locations: /usr /usr/local, /usr/share, /opt/local
+
+If none of the above succeeds but htslib is registered with pkg-config, the script
+will try using pkg-config paths (via ExtUtils::PkgConfig) without checking if header
+and library files exist.
END
|