From d3db4fd3fd73799dece6efbf03a4b021bb0570f0 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 4 Feb 2020 00:27:14 +1100 Subject: [PATCH 01/75] Pull 1.10.2 submodule. Initial pass on i32->i64 type conversion, will eventually fix issue #183 --- .gitignore | 1 + hts-sys/htslib | 2 +- src/bam/buffer.rs | 4 ++-- src/bam/ext.rs | 44 ++++++++++++++++++++++---------------------- src/bam/mod.rs | 17 +++++++++-------- src/bam/record.rs | 18 +++++++++--------- src/bcf/header.rs | 2 +- src/bcf/mod.rs | 6 +++--- src/bcf/record.rs | 2 +- src/tbx/mod.rs | 8 ++++---- 10 files changed, 53 insertions(+), 51 deletions(-) diff --git a/.gitignore b/.gitignore index 87e91fd70..e3a43dca2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .vscode/ +.idea *~ target Cargo.lock diff --git a/hts-sys/htslib b/hts-sys/htslib index d2c86b33b..a2239d334 160000 --- a/hts-sys/htslib +++ b/hts-sys/htslib @@ -1 +1 @@ -Subproject commit d2c86b33b45ae8d43841ef1d137532c7be0f1a84 +Subproject commit a2239d33428c64368d1a34f094d740e73cdb6c82 diff --git a/src/bam/buffer.rs b/src/bam/buffer.rs index 61d1e145e..f6ca6cd45 100644 --- a/src/bam/buffer.rs +++ b/src/bam/buffer.rs @@ -86,7 +86,7 @@ impl RecordBuffer { let to_remove = self .inner .iter() - .take_while(|rec| rec.pos() < window_start as i32) + .take_while(|rec| rec.pos() < window_start as i64) .count(); for _ in 0..to_remove { self.inner.pop_front(); @@ -111,7 +111,7 @@ impl RecordBuffer { record.cache_cigar(); } - if pos >= end as i32 { + if pos >= end as i64 { self.overflow = Some(record); break; } else { diff --git a/src/bam/ext.rs b/src/bam/ext.rs index 82919f7c2..e95f2e729 100644 --- a/src/bam/ext.rs +++ b/src/bam/ext.rs @@ -91,34 +91,34 @@ pub trait BamRecordExtensions { } impl BamRecordExtensions for bam::Record { - fn aligned_blocks(&self) -> Vec<[i32; 2]> { + fn aligned_blocks(&self) -> Vec<[i64; 2]> { let mut result = Vec::new(); let mut pos = self.pos(); for entry in self.cigar().iter() { match entry { Cigar::Match(len) => { - result.push([pos, pos + *len as i32]); - pos += *len as i32; + result.push([pos, pos + *len as i64]); + pos += *len as i64; } - Cigar::Del(len) => pos += *len as i32, - Cigar::RefSkip(len) => pos += *len as i32, + Cigar::Del(len) => pos += *len as i64, + Cigar::RefSkip(len) => pos += *len as i64, _ => (), } } result } - fn introns(&self) -> Vec<[i32; 2]> { + fn introns(&self) -> Vec<[i64; 2]> { let mut base_position = self.pos(); let mut result = Vec::new(); for entry in self.cigar().iter() { match entry { Cigar::Match(len) | Cigar::Del(len) | Cigar::Equal(len) | Cigar::Diff(len) => { - base_position += *len as i32 + base_position += *len as i64 } Cigar::RefSkip(len) => { let junc_start = base_position; - base_position += *len as i32; + base_position += *len as i64; result.push([junc_start, base_position]); } _ => {} @@ -127,25 +127,25 @@ impl BamRecordExtensions for bam::Record { result } - fn aligned_pairs(&self) -> Vec<[i32; 2]> { + fn aligned_pairs(&self) -> Vec<[i64; 2]> { let mut result = Vec::new(); - let mut pos: i32 = self.pos(); - let mut qpos: i32 = 0; + let mut pos: i64 = self.pos(); + let mut qpos: i64 = 0; for entry in self.cigar().iter() { match entry { Cigar::Match(len) | Cigar::Equal(len) | Cigar::Diff(len) => { - for i in pos..(pos + *len as i32) { + for i in pos..(pos + *len as i64) { result.push([qpos, i]); qpos += 1; } - pos += *len as i32; + pos += *len as i64; } Cigar::Ins(len) | Cigar::SoftClip(len) => { - qpos += *len as i32; + qpos += *len as i64; } Cigar::Del(len) | Cigar::RefSkip(len) => { - pos += *len as i32; + pos += *len as i64; } Cigar::HardClip(_) => {} // no advance Cigar::Pad(_) => panic!("Padding (Cigar::Pad) is not supported."), //padding is only used for multiple sequence alignment @@ -154,11 +154,11 @@ impl BamRecordExtensions for bam::Record { result } - fn aligned_pairs_full(&self) -> Vec<[Option; 2]> { + fn aligned_pairs_full(&self) -> Vec<[Option; 2]> { let mut result = Vec::new(); - let mut pos: i32 = self.pos(); - let mut qpos: i32 = 0; + let mut pos: i64 = self.pos(); + let mut qpos: i64 = 0; for entry in self.cigar().iter() { match entry { Cigar::Match(len) | Cigar::Equal(len) | Cigar::Diff(len) => { @@ -244,21 +244,21 @@ impl BamRecordExtensions for bam::Record { result } - fn reference_positions(&self) -> Vec { + fn reference_positions(&self) -> Vec { self.aligned_pairs().iter().map(|x| x[1]).collect() } - fn reference_positions_full(&self) -> Vec> { + fn reference_positions_full(&self) -> Vec> { self.aligned_pairs_full() .iter() .filter(|x| x[0].is_some()) .map(|x| x[1]) .collect() } - fn reference_start(&self) -> i32 { + fn reference_start(&self) -> i64 { self.pos() } - fn reference_end(&self) -> i32 { + fn reference_end(&self) -> i64 { unsafe { htslib::bam_endpos(self.inner_ptr()) } } diff --git a/src/bam/mod.rs b/src/bam/mod.rs index 00863e901..cb449bf49 100644 --- a/src/bam/mod.rs +++ b/src/bam/mod.rs @@ -29,6 +29,7 @@ pub use crate::bam::buffer::RecordBuffer; pub use crate::bam::errors::{Error, Result}; pub use crate::bam::header::Header; pub use crate::bam::record::Record; +use std::convert::TryInto; /// Implementation for `Read::set_threads` and `Writer::set_threads`. pub unsafe fn set_threads(htsfile: *mut htslib::htsFile, n_threads: usize) -> Result<()> { @@ -391,7 +392,7 @@ impl IndexedReader { if let Some(itr) = self.itr { unsafe { htslib::hts_itr_destroy(itr) } } - let itr = unsafe { htslib::sam_itr_queryi(self.idx, tid as i32, beg as i32, end as i32) }; + let itr = unsafe { htslib::sam_itr_queryi(self.idx, tid as i32, beg as i64, end as i64) }; if itr.is_null() { self.itr = None; Err(Error::Fetch) @@ -579,10 +580,10 @@ impl Writer { ); //println!("{}", str::from_utf8(&header_string).unwrap()); - let rec = htslib::sam_hdr_parse((l_text + 1) as i32, text as *const i8); + let rec = htslib::sam_hdr_parse(((l_text + 1) as usize).try_into().unwrap(), text as *const i8); (*rec).text = text as *mut i8; - (*rec).l_text = l_text as u32; + (*rec).l_text = l_text as usize; rec }; @@ -804,9 +805,9 @@ impl HeaderView { header_string.len(), ); - let rec = htslib::sam_hdr_parse((l_text + 1) as i32, text as *const i8); + let rec = htslib::sam_hdr_parse((l_text + 1) as usize, text as *const i8); (*rec).text = text as *mut i8; - (*rec).l_text = l_text as u32; + (*rec).l_text = l_text as usize; rec }; @@ -820,7 +821,7 @@ impl HeaderView { #[inline] pub fn inner(&self) -> htslib::bam_hdr_t { - unsafe { (*self.inner) } + unsafe { *self.inner } } #[inline] @@ -1325,7 +1326,7 @@ CCCCCCCCCCCCCCCCCCC"[..], let idx = i % names.len(); rec.set(names[idx], Some(&cigars[idx]), seqs[idx], quals[idx]); rec.push_aux(b"NM", &Aux::Integer(15)); - rec.set_pos(i as i32); + rec.set_pos(i as i64); bam.write(&mut rec).expect("Failed to write record."); } @@ -1341,7 +1342,7 @@ CCCCCCCCCCCCCCCCCCC"[..], let rec = _rec.expect("Failed to read record."); - assert_eq!(rec.pos(), i as i32); + assert_eq!(rec.pos(), i as i64); assert_eq!(rec.qname(), names[idx]); assert_eq!(*rec.cigar(), cigars[idx]); assert_eq!(rec.seq().as_bytes(), seqs[idx]); diff --git a/src/bam/record.rs b/src/bam/record.rs index 44a0ef54f..54e975d00 100644 --- a/src/bam/record.rs +++ b/src/bam/record.rs @@ -196,12 +196,12 @@ impl Record { } /// Get position (0-based). - pub fn pos(&self) -> i32 { + pub fn pos(&self) -> i64 { self.inner().core.pos } /// Set position (0-based). - pub fn set_pos(&mut self, pos: i32) { + pub fn set_pos(&mut self, pos: i64) { self.inner_mut().core.pos = pos; } @@ -249,22 +249,22 @@ impl Record { } /// Get mate position. - pub fn mpos(&self) -> i32 { + pub fn mpos(&self) -> i64 { self.inner().core.mpos } /// Set mate position. - pub fn set_mpos(&mut self, mpos: i32) { + pub fn set_mpos(&mut self, mpos: i64) { self.inner_mut().core.mpos = mpos; } /// Get insert size. - pub fn insert_size(&self) -> i32 { + pub fn insert_size(&self) -> i64 { self.inner().core.isize } /// Set insert size. - pub fn set_insert_size(&mut self, insert_size: i32) { + pub fn set_insert_size(&mut self, insert_size: i64) { self.inner_mut().core.isize = insert_size; } @@ -343,7 +343,7 @@ impl Record { data[qname.len() + i] = b'\0'; } let mut i = q_len + extranul; - self.inner_mut().core.l_qname = i as u8; + self.inner_mut().core.l_qname = i as u16; self.inner_mut().core.l_extranul = extranul as u8; // cigar @@ -428,7 +428,7 @@ impl Record { for i in 0..=extranul { data[new_q_len - i - 1] = b'\0'; } - self.inner_mut().core.l_qname = new_q_len as u8; + self.inner_mut().core.l_qname = new_q_len as u16; self.inner_mut().core.l_extranul = extranul as u8; } @@ -1060,7 +1060,7 @@ impl fmt::Display for CigarString { #[derive(Eq, PartialEq, Clone, Debug)] pub struct CigarStringView { inner: CigarString, - pos: i32, + pos: i64, } impl CigarStringView { diff --git a/src/bcf/header.rs b/src/bcf/header.rs index aeacb562a..ce8ddaa9d 100644 --- a/src/bcf/header.rs +++ b/src/bcf/header.rs @@ -243,7 +243,7 @@ impl HeaderView { #[inline] fn inner(&self) -> htslib::bcf_hdr_t { - unsafe { (*self.inner) } + unsafe { *self.inner } } /// Get the number of samples defined in the header. diff --git a/src/bcf/mod.rs b/src/bcf/mod.rs index baca5a6f6..eeca1fc55 100644 --- a/src/bcf/mod.rs +++ b/src/bcf/mod.rs @@ -228,7 +228,7 @@ impl IndexedReader { pub fn fetch(&mut self, rid: u32, start: u32, end: u32) -> Result<()> { let contig = self.header.rid2name(rid).unwrap(); let contig = ffi::CString::new(contig).unwrap(); - if unsafe { htslib::bcf_sr_seek(self.inner, contig.as_ptr(), start as i32) } != 0 { + if unsafe { htslib::bcf_sr_seek(self.inner, contig.as_ptr(), start as i64) } != 0 { Err(Error::Seek { contig: contig.to_str().unwrap().to_owned(), start, @@ -443,7 +443,7 @@ pub mod synced { let record = *(*(*self.inner).readers.offset(idx as isize)) .buffer .offset(0); - if (*record).rid != (rid as i32) || (*record).pos >= (end as i32) { + if (*record).rid != (rid as i64) || (*record).pos >= (end as i64) { return Ok(0); } } @@ -505,7 +505,7 @@ pub mod synced { let contig = self.header(0).rid2name(rid).unwrap(); //.clone(); ffi::CString::new(contig).unwrap() }; - if unsafe { htslib::bcf_sr_seek(self.inner, contig.as_ptr(), start as i32) } != 0 { + if unsafe { htslib::bcf_sr_seek(self.inner, contig.as_ptr(), start as i64) } != 0 { Err(Error::Seek { contig: contig.to_str().unwrap().to_owned(), start, diff --git a/src/bcf/record.rs b/src/bcf/record.rs index 52bcb6368..622d45521 100644 --- a/src/bcf/record.rs +++ b/src/bcf/record.rs @@ -165,7 +165,7 @@ impl Record { } /// Set 0-based position. - pub fn set_pos(&mut self, pos: i32) { + pub fn set_pos(&mut self, pos: i64) { self.inner_mut().pos = pos; } diff --git a/src/tbx/mod.rs b/src/tbx/mod.rs index 1adda1cc7..567f5ea40 100644 --- a/src/tbx/mod.rs +++ b/src/tbx/mod.rs @@ -223,8 +223,8 @@ impl Reader { htslib::hts_itr_query( (*self.tbx).idx, tid as i32, - start as i32, - end as i32, + start as i64, + end as i64, Some(htslib::tbx_readrec), ) }; @@ -293,7 +293,7 @@ impl Read for Reader { htslib::hts_get_bgzfp(self.hts_file), itr, //mem::transmute(&mut self.buf), - &mut self.buf as *mut htslib::__kstring_t as *mut libc::c_void, + &mut self.buf as *mut htslib::kstring_t as *mut libc::c_void, //mem::transmute(self.tbx), self.tbx as *mut libc::c_void, ) @@ -310,7 +310,7 @@ impl Read for Reader { // returns `< 0`). let (tid, start, end) = unsafe { ((*itr).curr_tid, (*itr).curr_beg, (*itr).curr_end) }; - if overlap(self.tid, self.start, self.end, tid, start, end) { + if overlap(self.tid, self.start, self.end, tid,start,end) { *record = unsafe { Vec::from(ffi::CStr::from_ptr(self.buf.s).to_str().unwrap()) }; return Ok(true); From bb346382d20cc2a9b576c08163a6ad90f2406c90 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 4 Feb 2020 00:49:09 +1100 Subject: [PATCH 02/75] Fixes issue #109 while I'm at it, long hanging fruit fix --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 66b0d38c9..68054651b 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,11 @@ If you only want to use the library, there is no need to clone the repository. G ## Requirements -To compile this crate you need the development headers of zlib, bzip2 and xz. +To compile this crate you need the development headers of zlib, bzip2 and xz. For instance, in Debian systems one needs the following dependencies: + +```shell +$ sudo apt-get install zlib1g-dev libbz2-dev liblzma-dev clang +``` ## Usage From 1636ef5fe853dde02989f4c53c233257452e2199 Mon Sep 17 00:00:00 2001 From: Julian Gehring Date: Mon, 3 Feb 2020 21:00:49 +0000 Subject: [PATCH 03/75] Fix compression levels --- src/bam/mod.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/bam/mod.rs b/src/bam/mod.rs index cb449bf49..3307746e6 100644 --- a/src/bam/mod.rs +++ b/src/bam/mod.rs @@ -580,7 +580,10 @@ impl Writer { ); //println!("{}", str::from_utf8(&header_string).unwrap()); - let rec = htslib::sam_hdr_parse(((l_text + 1) as usize).try_into().unwrap(), text as *const i8); + let rec = htslib::sam_hdr_parse( + ((l_text + 1) as usize).try_into().unwrap(), + text as *const i8, + ); (*rec).text = text as *mut i8; (*rec).l_text = l_text as usize; @@ -672,12 +675,10 @@ impl CompressionLevel { // Convert and check the variants of the `CompressionLevel` enum to a numeric level fn convert(self) -> Result { match self { - CompressionLevel::Uncompressed => Ok(htslib::Z_NO_COMPRESSION), - CompressionLevel::Fastest => Ok(htslib::Z_BEST_SPEED), - CompressionLevel::Maximum => Ok(htslib::Z_BEST_COMPRESSION), - CompressionLevel::Level(i @ htslib::Z_NO_COMPRESSION..=htslib::Z_BEST_COMPRESSION) => { - Ok(i) - } + CompressionLevel::Uncompressed => Ok(0), + CompressionLevel::Fastest => Ok(1), + CompressionLevel::Maximum => Ok(9), + CompressionLevel::Level(i @ 0..=9) => Ok(i), CompressionLevel::Level(i) => Err(Error::InvalidCompressionLevel { level: i }), } } From 9c2a6d686746b152ae91c699b74b81955f704597 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 4 Feb 2020 12:16:44 +1100 Subject: [PATCH 04/75] Going through https://github.com/samtools/htslib/blob/develop/README.large_positions.md to spot 64 bit reference position changes and sam_* function renaming. Only 4 errors left, but need to closely check types afterwards very carefully. Specially for the binary formats where this change does not apply and (sub)fields that do not necessarily require big representations --- src/bam/ext.rs | 36 ++++++++++++++++++------------------ src/bam/mod.rs | 6 +++--- src/bam/record.rs | 8 ++++---- src/bcf/mod.rs | 2 +- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/bam/ext.rs b/src/bam/ext.rs index e95f2e729..5b9eb1e4b 100644 --- a/src/bam/ext.rs +++ b/src/bam/ext.rs @@ -21,7 +21,7 @@ pub trait BamRecordExtensions { /// this happens on insertions. /// /// pysam: blocks - fn aligned_blocks(&self) -> Vec<[i32; 2]>; + fn aligned_blocks(&self) -> Vec<[i64; 2]>; /// find intron positions (start, stop) /// @@ -29,14 +29,14 @@ pub trait BamRecordExtensions { /// and reports their positions. /// /// pysam: get_introns - fn introns(&self) -> Vec<[i32; 2]>; + fn introns(&self) -> Vec<[i64; 2]>; /// a list of aligned read and reference positions /// /// No entry for insertions, deletions or skipped pairs /// /// pysam: get_aligned_pairs(matches_only = True) - fn aligned_pairs(&self) -> Vec<[i32; 2]>; + fn aligned_pairs(&self) -> Vec<[i64; 2]>; /// a list of aligned read and reference positions /// @@ -44,7 +44,7 @@ pub trait BamRecordExtensions { /// for insertions, deletions or skipped pairs /// /// pysam: aligned_pairs(matches_only = False) - fn aligned_pairs_full(&self) -> Vec<[Option; 2]>; + fn aligned_pairs_full(&self) -> Vec<[Option; 2]>; /// the number of nucleotides covered by each Cigar:: possibility /// @@ -67,19 +67,19 @@ pub trait BamRecordExtensions { /// or unaligned positions within the read /// /// pysam: get_reference_positions(full_length=False) - fn reference_positions(&self) -> Vec; + fn reference_positions(&self) -> Vec; /// /// a Vec of reference positions that this read aligns to /// /// include soft-clipped or skipped positions as None /// /// pysam: get_reference_positions(full_length=True) - fn reference_positions_full(&self) -> Vec>; + fn reference_positions_full(&self) -> Vec>; /// left most aligned reference position of the read on the reference genome. - fn reference_start(&self) -> i32; + fn reference_start(&self) -> i64; /// right most aligned reference position of the read on the reference genome. - fn reference_end(&self) -> i32; + fn reference_end(&self) -> i64; /// infer the query length from the cigar string, optionally include hard clipped bases /// @@ -162,23 +162,23 @@ impl BamRecordExtensions for bam::Record { for entry in self.cigar().iter() { match entry { Cigar::Match(len) | Cigar::Equal(len) | Cigar::Diff(len) => { - for i in pos..(pos + *len as i32) { + for i in pos..(pos + *len as i64) { result.push([Some(qpos), Some(i)]); qpos += 1; } - pos += *len as i32; + pos += *len as i64; } Cigar::Ins(len) | Cigar::SoftClip(len) => { - for i in qpos..(qpos + *len as i32) { + for i in qpos..(qpos + *len as i64) { result.push([Some(i), None]); } - qpos += *len as i32; + qpos += *len as i64; } Cigar::Del(len) | Cigar::RefSkip(len) => { - for i in pos..(pos + *len as i32) { + for i in pos..(pos + *len as i64) { result.push([None, Some(i)]); } - pos += *len as i32; + pos += *len as i64; } Cigar::HardClip(_) => {} // no advance Cigar::Pad(_) => panic!("Padding (Cigar::Pad) is not supported."), //padding is only used for multiple sequence alignment @@ -4304,11 +4304,11 @@ mod tests { // //for the rest, we just verify that they have the expected amount of None in each position - fn some_count(pairs: &Vec<[Option; 2]>, pos: usize) -> i32 { - pairs.iter().filter(|x| x[pos].is_some()).count() as i32 + fn some_count(pairs: &Vec<[Option; 2]>, pos: usize) -> i64 { + pairs.iter().filter(|x| x[pos].is_some()).count() as i64 } - fn none_count(pairs: &Vec<[Option; 2]>, pos: usize) -> i32 { - pairs.iter().filter(|x| x[pos].is_none()).count() as i32 + fn none_count(pairs: &Vec<[Option; 2]>, pos: usize) -> i64 { + pairs.iter().filter(|x| x[pos].is_none()).count() as i64 } let pairs = it.next().unwrap().unwrap().aligned_pairs_full(); diff --git a/src/bam/mod.rs b/src/bam/mod.rs index 3307746e6..4a06ab202 100644 --- a/src/bam/mod.rs +++ b/src/bam/mod.rs @@ -839,7 +839,7 @@ impl HeaderView { pub fn tid(&self, name: &[u8]) -> Option { let c_str = ffi::CString::new(name).expect("Expected valid name."); - let tid = unsafe { htslib::bam_name2id(self.inner, c_str.as_ptr()) }; + let tid = unsafe { htslib::sam_hdr_name2tid(self.inner, c_str.as_ptr()) }; if tid < 0 { None } else { @@ -881,7 +881,7 @@ impl HeaderView { impl Clone for HeaderView { fn clone(&self) -> Self { HeaderView { - inner: unsafe { htslib::bam_hdr_dup(self.inner) }, + inner: unsafe { htslib::sam_hdr_dup(self.inner) }, owned: true, } } @@ -891,7 +891,7 @@ impl Drop for HeaderView { fn drop(&mut self) { if self.owned { unsafe { - htslib::bam_hdr_destroy(self.inner); + htslib::sam_hdr_destroy(self.inner); } } } diff --git a/src/bam/record.rs b/src/bam/record.rs index 54e975d00..88ea059bd 100644 --- a/src/bam/record.rs +++ b/src/bam/record.rs @@ -914,7 +914,7 @@ custom_derive! { impl CigarString { /// Create a `CigarStringView` from this CigarString at position `pos` - pub fn into_view(self, pos: i32) -> CigarStringView { + pub fn into_view(self, pos: i64) -> CigarStringView { CigarStringView::new(self, pos) } @@ -1065,12 +1065,12 @@ pub struct CigarStringView { impl CigarStringView { /// Construct a new CigarStringView from a CigarString at a position - pub fn new(c: CigarString, pos: i32) -> CigarStringView { + pub fn new(c: CigarString, pos: i64) -> CigarStringView { CigarStringView { inner: c, pos } } /// Get (exclusive) end position of alignment. - pub fn end_pos(&self) -> i32 { + pub fn end_pos(&self) -> i64 { let mut pos = self.pos; for c in self { match c { @@ -1078,7 +1078,7 @@ impl CigarStringView { | Cigar::RefSkip(l) | Cigar::Del(l) | Cigar::Equal(l) - | Cigar::Diff(l) => pos += *l as i32, + | Cigar::Diff(l) => pos += *l as i64, // these don't add to end_pos on reference Cigar::Ins(_) | Cigar::SoftClip(_) | Cigar::HardClip(_) | Cigar::Pad(_) => (), } diff --git a/src/bcf/mod.rs b/src/bcf/mod.rs index eeca1fc55..2ca34b8ec 100644 --- a/src/bcf/mod.rs +++ b/src/bcf/mod.rs @@ -443,7 +443,7 @@ pub mod synced { let record = *(*(*self.inner).readers.offset(idx as isize)) .buffer .offset(0); - if (*record).rid != (rid as i64) || (*record).pos >= (end as i64) { + if (*record).rid != (rid as i32) || (*record).pos >= (end as i32) { return Ok(0); } } From 115c634cc2b43f3bf17ae4aa895d46d44b982690 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 4 Feb 2020 14:09:38 +1100 Subject: [PATCH 05/75] Repoint submodule to upstream release tag --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index d749293d0..2a109d59d 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "htslib"] path = hts-sys/htslib - url = https://github.com/rust-bio/htslib.git + url = https://github.com/samtools/htslib.git From 6bf1760021d401f0201aa45c8aed250aa4f0e641 Mon Sep 17 00:00:00 2001 From: brainstorm Date: Tue, 4 Feb 2020 14:36:57 +1100 Subject: [PATCH 06/75] Switch from rust-bio hosted htslib to upstream's samtools htslib. --- hts-sys/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hts-sys/Cargo.toml b/hts-sys/Cargo.toml index e44854427..886c0abb3 100644 --- a/hts-sys/Cargo.toml +++ b/hts-sys/Cargo.toml @@ -8,7 +8,7 @@ description = "This library provides HTSlib bindings." readme = "README.md" keywords = ["htslib", "bam", "bioinformatics", "pileup", "sequencing"] license = "MIT" -repository = "https://github.com/rust-bio/rust-htslib.git" +repository = "https://github.com/samtools/rust-htslib.git" documentation = "https://docs.rs/rust-htslib" edition = "2018" From 83c0656ad7039b0ea1163e310b5d4efc21fb0df7 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 4 Feb 2020 14:46:18 +1100 Subject: [PATCH 07/75] Try to amend submodule --- hts-sys/htslib | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hts-sys/htslib b/hts-sys/htslib index a2239d334..fd0f89554 160000 --- a/hts-sys/htslib +++ b/hts-sys/htslib @@ -1 +1 @@ -Subproject commit a2239d33428c64368d1a34f094d740e73cdb6c82 +Subproject commit fd0f89554459b78c07303e2c8a42acacd6851b46 From 2173a9e913f9fb279999d851ffecaa9780fc077b Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 4 Feb 2020 14:49:16 +1100 Subject: [PATCH 08/75] Handle submodules manually on TravisCI, since it is failing now: https://travis-ci.org/rust-bio/rust-htslib/builds/645772614 --- .travis.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.travis.yml b/.travis.yml index de8ecea84..994b0884f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,14 @@ cache: before_cache: - rm -rf /home/travis/.cargo/registry +# Manually handle git submodules +git: + submodules: false + +before_install: + - sed -i 's/git@github.com:/https:\/\/github.com\//' .gitmodules + - git submodule update --init --recursive + addons: apt: packages: From d7c5355a1966b56ed79d73e36c7ac463855467ec Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 4 Feb 2020 15:29:09 +1100 Subject: [PATCH 09/75] Odd balls that would need review marked with XXX. New htslib seems to require libcurl --- src/bcf/header.rs | 3 ++- src/bcf/mod.rs | 2 +- src/tbx/mod.rs | 19 ++++++++++--------- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/bcf/header.rs b/src/bcf/header.rs index ce8ddaa9d..087e7424e 100644 --- a/src/bcf/header.rs +++ b/src/bcf/header.rs @@ -333,7 +333,8 @@ impl HeaderView { _ => return Err(Error::UnexpectedType { tag: tag_desc() }), }; let length = match length as ::libc::c_uint { - htslib::BCF_VL_FIXED => TagLength::Fixed(num_values), + // XXX: Hacky "as u32" cast. Trace back through unsafe{} towards BCF struct and rollback to proper type + htslib::BCF_VL_FIXED => TagLength::Fixed(num_values as u32), htslib::BCF_VL_VAR => TagLength::Variable, htslib::BCF_VL_A => TagLength::AltAlleles, htslib::BCF_VL_R => TagLength::Alleles, diff --git a/src/bcf/mod.rs b/src/bcf/mod.rs index 2ca34b8ec..28bab8f6c 100644 --- a/src/bcf/mod.rs +++ b/src/bcf/mod.rs @@ -443,7 +443,7 @@ pub mod synced { let record = *(*(*self.inner).readers.offset(idx as isize)) .buffer .offset(0); - if (*record).rid != (rid as i32) || (*record).pos >= (end as i32) { + if (*record).rid != (rid as i32) || (*record).pos >= (end as i64) { return Ok(0); } } diff --git a/src/tbx/mod.rs b/src/tbx/mod.rs index 567f5ea40..7687c5e73 100644 --- a/src/tbx/mod.rs +++ b/src/tbx/mod.rs @@ -117,11 +117,11 @@ pub struct Reader { itr: Option<*mut htslib::hts_itr_t>, /// The currently fetch region's tid. - tid: i32, + tid: i64, /// The currently fetch region's 0-based begin pos. - start: i32, + start: i64, /// The currently fetch region's 0-based end pos. - end: i32, + end: i64, } unsafe impl Send for Reader {} @@ -209,10 +209,10 @@ impl Reader { } /// Fetch region given by numeric sequence number and 0-based begin and end position. - pub fn fetch(&mut self, tid: u32, start: u32, end: u32) -> Result<()> { - self.tid = tid as i32; - self.start = start as i32; - self.end = end as i32; + pub fn fetch(&mut self, tid: u32, start: u64, end: u64) -> Result<()> { + self.tid = tid as i64; + self.start = start as i64; + self.end = end as i64; if let Some(itr) = self.itr { unsafe { @@ -278,7 +278,7 @@ impl Reader { } /// Return whether the two given genomic intervals overlap. -fn overlap(tid1: i32, begin1: i32, end1: i32, tid2: i32, begin2: i32, end2: i32) -> bool { +fn overlap(tid1: i64, begin1: i64, end1: i64, tid2: i64, begin2: i64, end2: i64) -> bool { (tid1 == tid2) && (begin1 < end2) && (begin2 < end1) } @@ -310,7 +310,8 @@ impl Read for Reader { // returns `< 0`). let (tid, start, end) = unsafe { ((*itr).curr_tid, (*itr).curr_beg, (*itr).curr_end) }; - if overlap(self.tid, self.start, self.end, tid,start,end) { + // XXX: Careful with this tid conversion!!! + if overlap(self.tid, self.start, self.end, tid as i64,start,end) { *record = unsafe { Vec::from(ffi::CStr::from_ptr(self.buf.s).to_str().unwrap()) }; return Ok(true); From dac8565ac8afb2f4e1eb57a5ce155c92f8f29654 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 4 Feb 2020 15:51:04 +1100 Subject: [PATCH 10/75] Add curl-sys crate for hplugin_curl, aws s3 et al --- Cargo.toml | 3 ++- hts-sys/Cargo.toml | 2 ++ hts-sys/build.rs | 3 +++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 4bd43c0d8..7aa2856dd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -33,9 +33,10 @@ snafu = ">= 0.5.0, <= 0.6.0" hts-sys = { version = "^1.9", path = "hts-sys" } [features] -default = ["bzip2", "lzma"] +default = ["bzip2", "lzma", "curl"] bzip2 = ["hts-sys/bzip2"] lzma = ["hts-sys/lzma"] +curl = ["hts-sys/curl"] serde = ["serde_base", "serde_bytes"] [dev-dependencies] diff --git a/hts-sys/Cargo.toml b/hts-sys/Cargo.toml index 886c0abb3..52f8c8d8e 100644 --- a/hts-sys/Cargo.toml +++ b/hts-sys/Cargo.toml @@ -21,11 +21,13 @@ libc = "0.2" libz-sys = "1.0" bzip2-sys = { version = "0.1", optional = true } lzma-sys = { version = "0.1", optional = true } +curl-sys = { version = "0.4.25", optional = true } [features] default = ["bzip2", "lzma"] bzip2 = ["bzip2-sys"] lzma = ["lzma-sys"] +curl = ["curl-sys"] [build-dependencies] fs-utils = "1.1" diff --git a/hts-sys/build.rs b/hts-sys/build.rs index 52f659d68..735538641 100644 --- a/hts-sys/build.rs +++ b/hts-sys/build.rs @@ -63,6 +63,9 @@ fn main() { cfg.include(inc); } + // libcurl is (always?) needed + let _use_curl = env::var("CARGO_FEATURE_CURL").is_ok(); + let tool = cfg.get_compiler(); let (cc_path, cflags_env) = (tool.path(), tool.cflags_env()); let cc_cflags = cflags_env.to_string_lossy().replace("-O0", ""); From 5678f70a9e0b5d6ea1b026c1b2149ec998e67217 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 4 Feb 2020 16:08:01 +1100 Subject: [PATCH 11/75] Add conditional libcurl compilation flags --- hts-sys/build.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/hts-sys/build.rs b/hts-sys/build.rs index 735538641..7a9b725ad 100644 --- a/hts-sys/build.rs +++ b/hts-sys/build.rs @@ -63,8 +63,13 @@ fn main() { cfg.include(inc); } - // libcurl is (always?) needed - let _use_curl = env::var("CARGO_FEATURE_CURL").is_ok(); + let use_curl = env::var("CARGO_FEATURE_CURL").is_ok(); + if !use_curl { + let curl_patterns = vec!["s/ -lcurl//", "/#define HAVE_LIBCURL/d"]; + sed_htslib_makefile(&out, &curl_patterns, "curl"); + } else if let Ok(inc) = env::var("DEP_CURL_INCLUDE").map(PathBuf::from) { + cfg.include(inc); + } let tool = cfg.get_compiler(); let (cc_path, cflags_env) = (tool.path(), tool.cflags_env()); From bad400b53da79b68dd2e30d4758f645df2429014 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 4 Feb 2020 16:12:19 +1100 Subject: [PATCH 12/75] Be nice with cargo fmt [ci skip] --- src/tbx/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tbx/mod.rs b/src/tbx/mod.rs index 7687c5e73..6be43f561 100644 --- a/src/tbx/mod.rs +++ b/src/tbx/mod.rs @@ -311,7 +311,7 @@ impl Read for Reader { let (tid, start, end) = unsafe { ((*itr).curr_tid, (*itr).curr_beg, (*itr).curr_end) }; // XXX: Careful with this tid conversion!!! - if overlap(self.tid, self.start, self.end, tid as i64,start,end) { + if overlap(self.tid, self.start, self.end, tid as i64, start, end) { *record = unsafe { Vec::from(ffi::CStr::from_ptr(self.buf.s).to_str().unwrap()) }; return Ok(true); From 9e1a315ef9cb1da273734d7ab5f9db473f64afee Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 4 Feb 2020 17:45:35 +1100 Subject: [PATCH 13/75] Try installing libcurl meta-package instead of the openssl dependent one?: https://travis-ci.org/rust-bio/rust-htslib/builds/645790138#L1529 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 994b0884f..352cc10cd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,7 +20,7 @@ before_install: addons: apt: packages: - - libcurl4-openssl-dev + - libcurl-dev - libelf-dev - libdw-dev - libbz2-dev From 4c9fddf2842762a8ad477f5f2dd62a346602e440 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 4 Feb 2020 17:58:26 +1100 Subject: [PATCH 14/75] Does not work with libcurl-dev metapackage: https://travis-ci.org/rust-bio/rust-htslib/jobs/645812050#L166, rollback and try with bionic ubuntu distro. It does compile locally on OSX --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 352cc10cd..d580b26b6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,4 @@ +dist: bionic language: rust rust: @@ -20,7 +21,7 @@ before_install: addons: apt: packages: - - libcurl-dev + - libcurl4-openssl-dev - libelf-dev - libdw-dev - libbz2-dev From 417b672bc4173eb09afa66b6e0e06af264bfc621 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 4 Feb 2020 18:00:16 +1100 Subject: [PATCH 15/75] Add matrix compile support for TravisCI, I would like to know why it compiles fine in OSX and fails on Linux now... --- .travis.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.travis.yml b/.travis.yml index d580b26b6..41141dd63 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,21 @@ language: rust rust: - stable + - nightly + +os: + - linux + - osx + +matrix: + fast_finish: true + allow_failures: + - rust: nightly + include: + - os: linux + dist: bionic + - os: osx + osx_image: xcode11 cache: directories: From 22fae28ad59b1c4c532bf51cbfbf49cd82b2ebe1 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 4 Feb 2020 18:07:11 +1100 Subject: [PATCH 16/75] PPA source no longer needed for ubuntu bionic? [ci skip] --- .travis.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 41141dd63..70786e23d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -46,8 +46,6 @@ addons: - musl - musl-dev - musl-tools - sources: - - kalakris-cmake before_script: - export PATH=$HOME/.cargo/bin:$PATH From 1a19c69f07913489b23cc1fe454eab5e6bfb0150 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 4 Feb 2020 18:21:37 +1100 Subject: [PATCH 17/75] Bionic packages htslib with gnutls instead of openssl: https://packages.ubuntu.com/source/disco/htslib ... and it even comes with pre-shipped libcurl4-gnutls-dev, so no need to install it explicitly?: https://travis-ci.org/rust-bio/rust-htslib/jobs/645816116#L160 --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 70786e23d..955c89ee4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,7 +36,6 @@ before_install: addons: apt: packages: - - libcurl4-openssl-dev - libelf-dev - libdw-dev - libbz2-dev From 6eb623a49d0f523cc495e3a4110730e56adecaf2 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 4 Feb 2020 18:31:28 +1100 Subject: [PATCH 18/75] sed is not gsed on OSX... not entirely sure this substitution is 100% needed --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 955c89ee4..24db7a172 100644 --- a/.travis.yml +++ b/.travis.yml @@ -30,7 +30,6 @@ git: submodules: false before_install: - - sed -i 's/git@github.com:/https:\/\/github.com\//' .gitmodules - git submodule update --init --recursive addons: From 5c31eb8e649ffcdc99d6e4a09d07775c04a6f459 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 4 Feb 2020 21:56:18 +1100 Subject: [PATCH 19/75] Add libssl-dev to the mix for the openssl-sys: https://travis-ci.org/rust-bio/rust-htslib/jobs/645825022#L1000. Testsuite seems to run partially now: https://travis-ci.org/rust-bio/rust-htslib/jobs/645825022#L623 --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 24db7a172..27bb0fdfb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,6 +35,7 @@ before_install: addons: apt: packages: + - libssl-dev - libelf-dev - libdw-dev - libbz2-dev From d3eba713540adebd9b988f045e59a370df88b12b Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 4 Feb 2020 22:31:27 +1100 Subject: [PATCH 20/75] Add build-essential in hopes to fix libcurl issue, incorporate https://github.com/rust-bio/rust-htslib/pull/185, fix one testsuite warning --- .travis.yml | 1 + Cargo.toml | 2 +- src/bcf/mod.rs | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 27bb0fdfb..0c0c40e1a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,6 +35,7 @@ before_install: addons: apt: packages: + - build-essential - libssl-dev - libelf-dev - libdw-dev diff --git a/Cargo.toml b/Cargo.toml index 7aa2856dd..1f28a8c0d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,7 +30,7 @@ serde_base = { version = "^1", optional = true, package = "serde" } serde_bytes = { version = "0.11", optional = true } bio-types = ">=0.5.1" snafu = ">= 0.5.0, <= 0.6.0" -hts-sys = { version = "^1.9", path = "hts-sys" } +hts-sys = { version = "^1.9", path = "hts-sys", default-features = false } [features] default = ["bzip2", "lzma", "curl"] diff --git a/src/bcf/mod.rs b/src/bcf/mod.rs index 28bab8f6c..1d1f6bcfa 100644 --- a/src/bcf/mod.rs +++ b/src/bcf/mod.rs @@ -953,7 +953,7 @@ mod tests { .ok() .expect("Error opening file."); let expected = ["./1", "1|1", "0/1", "0|1", "1|.", "1/1"]; - for (rec, exp_gt) in vcf.records().zip(expected.into_iter()) { + for (rec, exp_gt) in vcf.records().zip(expected.iter()) { let mut rec = rec.expect("Error reading record."); let genotypes = rec.genotypes().expect("Error reading genotypes"); assert_eq!(&format!("{}", genotypes.get(0)), exp_gt); From eb2ae949275d661068959a3a48507d6b7a708046 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 4 Feb 2020 22:36:44 +1100 Subject: [PATCH 21/75] Add curl on default features for hts-sys --- hts-sys/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hts-sys/Cargo.toml b/hts-sys/Cargo.toml index 52f8c8d8e..aeb0ecc9a 100644 --- a/hts-sys/Cargo.toml +++ b/hts-sys/Cargo.toml @@ -24,7 +24,7 @@ lzma-sys = { version = "0.1", optional = true } curl-sys = { version = "0.4.25", optional = true } [features] -default = ["bzip2", "lzma"] +default = ["bzip2", "lzma", "curl"] bzip2 = ["bzip2-sys"] lzma = ["lzma-sys"] curl = ["curl-sys"] From 92df7997c3be668ef33d691a87397131efa7ef13 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Thu, 6 Feb 2020 10:01:45 +1100 Subject: [PATCH 22/75] Point to the right htslib upstream repo, thanks @dlaehnemann [skip ci] --- hts-sys/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hts-sys/Cargo.toml b/hts-sys/Cargo.toml index aeb0ecc9a..abbdf20e8 100644 --- a/hts-sys/Cargo.toml +++ b/hts-sys/Cargo.toml @@ -8,7 +8,7 @@ description = "This library provides HTSlib bindings." readme = "README.md" keywords = ["htslib", "bam", "bioinformatics", "pileup", "sequencing"] license = "MIT" -repository = "https://github.com/samtools/rust-htslib.git" +repository = "https://github.com/samtools/htslib.git" documentation = "https://docs.rs/rust-htslib" edition = "2018" From 4389e3f2109ef8d02f9ff7524e310ef03e3b6a83 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Sat, 8 Feb 2020 21:02:14 +1100 Subject: [PATCH 23/75] Appease OSX musl-cross toolchain requirements: https://travis-ci.org/rust-bio/rust-htslib/jobs/645907695#L1222 --- .travis.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.travis.yml b/.travis.yml index 0c0c40e1a..233fe544f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -46,6 +46,10 @@ addons: - musl - musl-dev - musl-tools + homebrew: + taps: filosottile/musl-cross + packages: + - musl-cross before_script: - export PATH=$HOME/.cargo/bin:$PATH @@ -54,6 +58,8 @@ before_script: - cargo install-update -a - rustup component add rustfmt - rustup target add x86_64-unknown-linux-musl + - mkdir .cargo && echo '[target.x86_64-unknown-linux-musl]' >> .cargo/config + - echo 'linker = "x86_64-linux-musl-gcc"' >> .cargo/config script: - cargo fmt --version From 4f64d6923d2a6db3835c7b64e9e61f2913a16647 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Sat, 8 Feb 2020 21:31:14 +1100 Subject: [PATCH 24/75] TravisCI timesout installing brew deps: https://travis-ci.org/rust-bio/rust-htslib/jobs/647667984#L212 ... Not sure if travis_wait will work with homebrew addons?: https://docs.travis-ci.com/user/common-build-problems/#build-times-out-because-no-output-was-received... trying --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 233fe544f..c4607218e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -49,7 +49,7 @@ addons: homebrew: taps: filosottile/musl-cross packages: - - musl-cross + - travis_wait musl-cross before_script: - export PATH=$HOME/.cargo/bin:$PATH From 39010b17a9794b22e525fb8981eae1fd976860c0 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Sat, 8 Feb 2020 22:33:24 +1100 Subject: [PATCH 25/75] Try workaround for https://twitter.com/braincode/status/1226103002550849542 --- .travis.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index c4607218e..c2a471239 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,8 +48,9 @@ addons: - musl-tools homebrew: taps: filosottile/musl-cross - packages: - - travis_wait musl-cross +# packages: +# - travis_wait musl-cross + before_script: - export PATH=$HOME/.cargo/bin:$PATH @@ -58,6 +59,7 @@ before_script: - cargo install-update -a - rustup component add rustfmt - rustup target add x86_64-unknown-linux-musl + - if [ $TRAVIS_OS_NAME = osx ]; then travis_wait brew install musl-cross; fi - mkdir .cargo && echo '[target.x86_64-unknown-linux-musl]' >> .cargo/config - echo 'linker = "x86_64-linux-musl-gcc"' >> .cargo/config From 9fe358bba5dc2052d94a675b84f15dc431d81cdb Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Sat, 8 Feb 2020 23:16:45 +1100 Subject: [PATCH 26/75] Do not update homebrew (time intensive), switch from travis_wait to verbose to keep the build output being generated, hopefully --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index c2a471239..7c49374b8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -48,6 +48,7 @@ addons: - musl-tools homebrew: taps: filosottile/musl-cross + update: false # packages: # - travis_wait musl-cross @@ -59,7 +60,8 @@ before_script: - cargo install-update -a - rustup component add rustfmt - rustup target add x86_64-unknown-linux-musl - - if [ $TRAVIS_OS_NAME = osx ]; then travis_wait brew install musl-cross; fi +# - if [ $TRAVIS_OS_NAME = osx ]; then travis_wait 40 brew install musl-cross; fi + - if [ $TRAVIS_OS_NAME = osx ]; then brew install --verbose musl-cross; fi - mkdir .cargo && echo '[target.x86_64-unknown-linux-musl]' >> .cargo/config - echo 'linker = "x86_64-linux-musl-gcc"' >> .cargo/config From 9d2f38196aea6407898f444a8964c196ea291229 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Sat, 8 Feb 2020 23:47:42 +1100 Subject: [PATCH 27/75] brew install --verbose is not verbose enough for travis, reverting travis_wait and bumping to 40min for brew deps install and musl-cross --- .travis.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7c49374b8..b10fcc4fd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -60,8 +60,7 @@ before_script: - cargo install-update -a - rustup component add rustfmt - rustup target add x86_64-unknown-linux-musl -# - if [ $TRAVIS_OS_NAME = osx ]; then travis_wait 40 brew install musl-cross; fi - - if [ $TRAVIS_OS_NAME = osx ]; then brew install --verbose musl-cross; fi + - if [ $TRAVIS_OS_NAME = osx ]; then travis_wait 40 brew install musl-cross; fi - mkdir .cargo && echo '[target.x86_64-unknown-linux-musl]' >> .cargo/config - echo 'linker = "x86_64-linux-musl-gcc"' >> .cargo/config From 949499fb6cc8ce489b61ec1dd2fb1ccff2a640f0 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Sun, 9 Feb 2020 00:05:09 +1100 Subject: [PATCH 28/75] Explicitly install system libcurl on linux and osx --- .travis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index b10fcc4fd..6df9e9657 100644 --- a/.travis.yml +++ b/.travis.yml @@ -36,6 +36,7 @@ addons: apt: packages: - build-essential + - libcurl4-gnutls-dev - libssl-dev - libelf-dev - libdw-dev @@ -60,7 +61,7 @@ before_script: - cargo install-update -a - rustup component add rustfmt - rustup target add x86_64-unknown-linux-musl - - if [ $TRAVIS_OS_NAME = osx ]; then travis_wait 40 brew install musl-cross; fi + - if [ $TRAVIS_OS_NAME = osx ]; then travis_wait 40 brew install musl-cross curl; fi - mkdir .cargo && echo '[target.x86_64-unknown-linux-musl]' >> .cargo/config - echo 'linker = "x86_64-linux-musl-gcc"' >> .cargo/config From 850011ea388acebede2e6f6e892b6cfc91e5935b Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Sun, 9 Feb 2020 00:19:03 +1100 Subject: [PATCH 29/75] This .cargo/config makes it test right locally: https://github.com/rust-lang/rust/issues/60149#issuecomment-485253621, only 5 tests failing now and no linking errors from libcurl (on OSX, at least) :) --- .cargo/config | 8 ++++++++ .travis.yml | 2 -- 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 .cargo/config diff --git a/.cargo/config b/.cargo/config new file mode 100644 index 000000000..51e893863 --- /dev/null +++ b/.cargo/config @@ -0,0 +1,8 @@ +[target.x86_64-apple-darwin] +rustflags = [ + "-C", "link-arg=-undefined", + "-C", "link-arg=dynamic_lookup", +] + +[target.x86_64-unknown-linux-musl] +linker = "x86_64-linux-musl-gcc diff --git a/.travis.yml b/.travis.yml index 6df9e9657..6185cb760 100644 --- a/.travis.yml +++ b/.travis.yml @@ -62,8 +62,6 @@ before_script: - rustup component add rustfmt - rustup target add x86_64-unknown-linux-musl - if [ $TRAVIS_OS_NAME = osx ]; then travis_wait 40 brew install musl-cross curl; fi - - mkdir .cargo && echo '[target.x86_64-unknown-linux-musl]' >> .cargo/config - - echo 'linker = "x86_64-linux-musl-gcc"' >> .cargo/config script: - cargo fmt --version From db4210496ff549cde4f06ece8fd66d741258e685 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Sun, 9 Feb 2020 00:22:44 +1100 Subject: [PATCH 30/75] Cargo.toml missing quote misshap --- .cargo/config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cargo/config b/.cargo/config index 51e893863..50cb2b661 100644 --- a/.cargo/config +++ b/.cargo/config @@ -5,4 +5,4 @@ rustflags = [ ] [target.x86_64-unknown-linux-musl] -linker = "x86_64-linux-musl-gcc +linker = "x86_64-linux-musl-gcc" From 89608c65445577f2fd79968abcdfa5f5add7920d Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Sun, 9 Feb 2020 01:34:10 +1100 Subject: [PATCH 31/75] Same linker flags should apply for Linux builds? build-essential not necessary --- .cargo/config | 6 +++++- .travis.yml | 1 - 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.cargo/config b/.cargo/config index 50cb2b661..f04323123 100644 --- a/.cargo/config +++ b/.cargo/config @@ -5,4 +5,8 @@ rustflags = [ ] [target.x86_64-unknown-linux-musl] -linker = "x86_64-linux-musl-gcc" +rustflags = [ + "-C", "link-arg=-undefined", + "-C", "link-arg=dynamic_lookup", +] +linker = "x86_64-linux-musl-gcc" \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 6185cb760..fc28c3de9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,7 +35,6 @@ before_install: addons: apt: packages: - - build-essential - libcurl4-gnutls-dev - libssl-dev - libelf-dev From e534df63162af41f5b2055744f63bf51af7088c1 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Sun, 9 Feb 2020 18:51:47 +1100 Subject: [PATCH 32/75] tid is i64 now, CRAM vs BAM test l_data is off by 3 and m_data is off too --- src/bam/mod.rs | 12 +++++++++++- src/bcf/mod.rs | 4 ++-- src/tbx/mod.rs | 6 +++--- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/bam/mod.rs b/src/bam/mod.rs index 4a06ab202..80536d797 100644 --- a/src/bam/mod.rs +++ b/src/bam/mod.rs @@ -1507,9 +1507,19 @@ CCCCCCCCCCCCCCCCCCC"[..], let mut bam_reader = Reader::from_path(bam_path).unwrap(); let bam_records: Vec = bam_reader.records().map(|v| v.unwrap()).collect(); + // Compare l_data and m_data fields from BAM and CRAM + for (c1, b1) in cram_records.iter().zip(bam_records.iter()) { + dbg!(c1.inner().l_data, b1.inner().l_data); + // XXX: Why is CRAM l_data off by 3 ? + assert_eq!(c1.inner().l_data + 3, b1.inner().l_data); + + dbg!(c1.inner().m_data, b1.inner().m_data); + assert_eq!(c1.inner().m_data, b1.inner().m_data); + } + // Compare CRAM records to BAM records for (c1, b1) in cram_records.iter().zip(bam_records.iter()) { - assert!(c1 == b1); + assert_eq!(c1, b1); } } diff --git a/src/bcf/mod.rs b/src/bcf/mod.rs index 1d1f6bcfa..04f3d9739 100644 --- a/src/bcf/mod.rs +++ b/src/bcf/mod.rs @@ -1327,7 +1327,7 @@ mod tests { fn test_multi_string_info_tag() { let mut reader = Reader::from_path("test/test-info-multi-string.vcf").unwrap(); let mut rec = reader.empty_record(); - reader.read(&mut rec); + reader.read(&mut rec).unwrap(); assert_eq!(rec.info(b"ANN").string().unwrap().unwrap().len(), 14); } @@ -1336,7 +1336,7 @@ mod tests { fn test_multi_string_info_tag_number_a() { let mut reader = Reader::from_path("test/test-info-multi-string-number=A.vcf").unwrap(); let mut rec = reader.empty_record(); - reader.read(&mut rec); + reader.read(&mut rec).unwrap(); assert_eq!(rec.info(b"X").string().unwrap().unwrap().len(), 2); } diff --git a/src/tbx/mod.rs b/src/tbx/mod.rs index 6be43f561..1ea2b740a 100644 --- a/src/tbx/mod.rs +++ b/src/tbx/mod.rs @@ -196,7 +196,7 @@ impl Reader { } /// Get sequence/target ID from sequence name. - pub fn tid(&self, name: &str) -> Result { + pub fn tid(&self, name: &str) -> Result { let name_cstr = ffi::CString::new(name.as_bytes()).unwrap(); let res = unsafe { htslib::tbx_name2id(self.tbx, name_cstr.as_ptr()) }; if res < 0 { @@ -204,12 +204,12 @@ impl Reader { sequence: name.to_owned(), }) } else { - Ok(res as u32) + Ok(res as u64) } } /// Fetch region given by numeric sequence number and 0-based begin and end position. - pub fn fetch(&mut self, tid: u32, start: u64, end: u64) -> Result<()> { + pub fn fetch(&mut self, tid: u64, start: u64, end: u64) -> Result<()> { self.tid = tid as i64; self.start = start as i64; self.end = end as i64; From bbe490f222dabe2cf69431c8d27b293ed1524ecf Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Mon, 10 Feb 2020 18:28:21 +1100 Subject: [PATCH 33/75] There should be no need for travis_wait with -v --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fc28c3de9..3f7138670 100644 --- a/.travis.yml +++ b/.travis.yml @@ -60,7 +60,7 @@ before_script: - cargo install-update -a - rustup component add rustfmt - rustup target add x86_64-unknown-linux-musl - - if [ $TRAVIS_OS_NAME = osx ]; then travis_wait 40 brew install musl-cross curl; fi + - if [ $TRAVIS_OS_NAME = osx ]; then brew install -v wget curl musl-cross; fi script: - cargo fmt --version From a741700ad25261cf505505667c846e14d638dfe9 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Thu, 20 Feb 2020 16:16:05 +1100 Subject: [PATCH 34/75] Debugging htslib structs with @jkbonfield guidance... --- src/bam/mod.rs | 36 +++++++++++++++++++++++++++--------- src/bam/record.rs | 4 ++-- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/bam/mod.rs b/src/bam/mod.rs index 80536d797..5f4f2be75 100644 --- a/src/bam/mod.rs +++ b/src/bam/mod.rs @@ -1508,18 +1508,36 @@ CCCCCCCCCCCCCCCCCCC"[..], let bam_records: Vec = bam_reader.records().map(|v| v.unwrap()).collect(); // Compare l_data and m_data fields from BAM and CRAM - for (c1, b1) in cram_records.iter().zip(bam_records.iter()) { - dbg!(c1.inner().l_data, b1.inner().l_data); - // XXX: Why is CRAM l_data off by 3 ? - assert_eq!(c1.inner().l_data + 3, b1.inner().l_data); + // for (c1, b1) in cram_records.iter().zip(bam_records.iter()) { + // dbg!(c1.inner().l_data, b1.inner().l_data); + // // XXX: Why is CRAM l_data off by 3 ? Possible via padding and reorg introduced on https://github.com/samtools/htslib/commit/3108bee1d1b782994bdf354f95533e9e132d259b + // assert_eq!(c1.inner().l_data + 3, b1.inner().l_data); + // //dbg!(c1.cigar(), b1.cigar()); - dbg!(c1.inner().m_data, b1.inner().m_data); - assert_eq!(c1.inner().m_data, b1.inner().m_data); - } + // //dbg!(c1.inner().m_data, b1.inner().m_data); + // //assert_eq!(c1.inner().m_data, b1.inner().m_data); + // } - // Compare CRAM records to BAM records + //Compare CRAM records to BAM records for (c1, b1) in cram_records.iter().zip(bam_records.iter()) { - assert_eq!(c1, b1); + // Compare core struct + print!("{:?}", b1.inner().core); + println!(); + print!("{:?}", c1.inner().core); + println!(); + println!(); + + // Compare cigars + print!("{:?}", b1.cigar()); + println!(); + print!("{:?}", c1.cigar()); + println!(); + println!(); + + // l_data is the only one changing... + dbg!(b1.inner().l_data, c1.inner().l_data); + println!(); + //assert_eq!(c1, b1); } } diff --git a/src/bam/record.rs b/src/bam/record.rs index 88ea059bd..72017f7d2 100644 --- a/src/bam/record.rs +++ b/src/bam/record.rs @@ -26,7 +26,7 @@ use bio_types::sequence::SequenceRead; /// A macro creating methods for flag access. macro_rules! flag { - ($get:ident, $set:ident, $unset:ident, $bit:expr) => ( + ($get:ident, $set:ident, $unset:ident, $bit:expr) => { pub fn $get(&self) -> bool { self.inner().core.flag & $bit != 0 } @@ -38,7 +38,7 @@ macro_rules! flag { pub fn $unset(&mut self) { self.inner_mut().core.flag &= !$bit; } - ) + }; } /// A BAM record. From 29747e5069876d18f05cbe99c51c2ffc38fd23b4 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Fri, 21 Feb 2020 13:58:43 +1100 Subject: [PATCH 35/75] Disable osx and musl-cross homebrew on the TravisCI matrix since it times out anyway, start looking into l_extranul and alignment issues for CRAM/BAM. Add curl_sys crate in hts-sys/src/lib.rs. --- .travis.yml | 13 ++++++------- hts-sys/src/lib.rs | 2 ++ src/bam/mod.rs | 26 +++++++++++++++++--------- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3f7138670..d5f2b7dec 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ rust: os: - linux - - osx +# - osx matrix: fast_finish: true @@ -16,8 +16,8 @@ matrix: include: - os: linux dist: bionic - - os: osx - osx_image: xcode11 + # - os: osx + # osx_image: xcode11 cache: directories: @@ -49,9 +49,6 @@ addons: homebrew: taps: filosottile/musl-cross update: false -# packages: -# - travis_wait musl-cross - before_script: - export PATH=$HOME/.cargo/bin:$PATH @@ -60,7 +57,9 @@ before_script: - cargo install-update -a - rustup component add rustfmt - rustup target add x86_64-unknown-linux-musl - - if [ $TRAVIS_OS_NAME = osx ]; then brew install -v wget curl musl-cross; fi + # XXX: times out, might make sense to repackage https://github.com/FiloSottile/homebrew-musl-cross to reduce build times + # upstream or build DockCross images instead: https://github.com/dockcross/dockcross + #- if [ $TRAVIS_OS_NAME = osx ]; then brew install -v wget curl musl-cross; fi script: - cargo fmt --version diff --git a/hts-sys/src/lib.rs b/hts-sys/src/lib.rs index 5e614ee4f..de6108884 100644 --- a/hts-sys/src/lib.rs +++ b/hts-sys/src/lib.rs @@ -11,6 +11,8 @@ extern crate libz_sys; extern crate bzip2_sys; #[cfg(feature = "lzma")] extern crate lzma_sys; +#[cfg(feature = "curl")] +extern crate curl_sys; // include on-the-fly generated bindings include!(concat!(env!("OUT_DIR"), "/bindings.rs")); diff --git a/src/bam/mod.rs b/src/bam/mod.rs index 5f4f2be75..b5276acb3 100644 --- a/src/bam/mod.rs +++ b/src/bam/mod.rs @@ -1521,22 +1521,30 @@ CCCCCCCCCCCCCCCCCCC"[..], //Compare CRAM records to BAM records for (c1, b1) in cram_records.iter().zip(bam_records.iter()) { // Compare core struct - print!("{:?}", b1.inner().core); - println!(); - print!("{:?}", c1.inner().core); - println!(); - println!(); + // print!("{:?}", b1.inner().core); + // println!(); + // print!("{:?}", c1.inner().core); + // println!(); + // println!(); // Compare cigars - print!("{:?}", b1.cigar()); + // print!("{:?}", b1.cigar()); + // println!(); + // print!("{:?}", c1.cigar()); + // println!(); + // println!(); + + // Compare extranuls + print!("{:?}", b1.inner().core.l_extranul); println!(); - print!("{:?}", c1.cigar()); + print!("{:?}", c1.inner().core.l_extranul); println!(); println!(); + // l_data is the only one changing... - dbg!(b1.inner().l_data, c1.inner().l_data); - println!(); + // dbg!(b1.inner().l_data, c1.inner().l_data); + // println!(); //assert_eq!(c1, b1); } } From 77d47653b5db35edf4f1ba3c25f1ec28d177c0d7 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Mon, 24 Feb 2020 11:43:26 +1100 Subject: [PATCH 36/75] Mystery solved for test_read_cram, testing some of the struct fields, explicitly state that l_data should differ according to https://github.com/rust-bio/rust-htslib/pull/184#issuecomment-590133544 --- src/bam/mod.rs | 54 ++++++++++++++++---------------------------------- 1 file changed, 17 insertions(+), 37 deletions(-) diff --git a/src/bam/mod.rs b/src/bam/mod.rs index b5276acb3..9ea213333 100644 --- a/src/bam/mod.rs +++ b/src/bam/mod.rs @@ -1508,44 +1508,24 @@ CCCCCCCCCCCCCCCCCCC"[..], let bam_records: Vec = bam_reader.records().map(|v| v.unwrap()).collect(); // Compare l_data and m_data fields from BAM and CRAM - // for (c1, b1) in cram_records.iter().zip(bam_records.iter()) { - // dbg!(c1.inner().l_data, b1.inner().l_data); - // // XXX: Why is CRAM l_data off by 3 ? Possible via padding and reorg introduced on https://github.com/samtools/htslib/commit/3108bee1d1b782994bdf354f95533e9e132d259b - // assert_eq!(c1.inner().l_data + 3, b1.inner().l_data); - // //dbg!(c1.cigar(), b1.cigar()); - - // //dbg!(c1.inner().m_data, b1.inner().m_data); - // //assert_eq!(c1.inner().m_data, b1.inner().m_data); - // } - - //Compare CRAM records to BAM records for (c1, b1) in cram_records.iter().zip(bam_records.iter()) { - // Compare core struct - // print!("{:?}", b1.inner().core); - // println!(); - // print!("{:?}", c1.inner().core); - // println!(); - // println!(); - - // Compare cigars - // print!("{:?}", b1.cigar()); - // println!(); - // print!("{:?}", c1.cigar()); - // println!(); - // println!(); - - // Compare extranuls - print!("{:?}", b1.inner().core.l_extranul); - println!(); - print!("{:?}", c1.inner().core.l_extranul); - println!(); - println!(); - - - // l_data is the only one changing... - // dbg!(b1.inner().l_data, c1.inner().l_data); - // println!(); - //assert_eq!(c1, b1); + // CRAM vs BAM l_data is off by 3, see: https://github.com/rust-bio/rust-htslib/pull/184#issuecomment-590133544 + assert_ne!(c1.inner().l_data, b1.inner().l_data); + // The rest of the fields should be identical: + assert_eq!(c1.cigar(), b1.cigar()); + assert_eq!(c1.inner().core.pos, b1.inner().core.pos); + assert_eq!(c1.inner().core.mpos, b1.inner().core.mpos); + assert_eq!(c1.inner().core.mtid, b1.inner().core.mtid); + assert_eq!(c1.inner().core.tid, b1.inner().core.tid); + assert_eq!(c1.inner().core.bin, b1.inner().core.bin); + assert_eq!(c1.inner().core.qual, b1.inner().core.qual); + assert_eq!(c1.inner().core.l_extranul, b1.inner().core.l_extranul); + assert_eq!(c1.inner().core.flag, b1.inner().core.flag); + assert_eq!(c1.inner().core.l_qname, b1.inner().core.l_qname); + assert_eq!(c1.inner().core.n_cigar, b1.inner().core.n_cigar); + assert_eq!(c1.inner().core.l_qseq, b1.inner().core.l_qseq); + assert_eq!(c1.inner().core.isize, b1.inner().core.isize); + //... except m_data } } From 4f2c90c195ded54a496bae8c1b9aa9dac1f44af1 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Mon, 24 Feb 2020 11:54:01 +1100 Subject: [PATCH 37/75] Extract selective CRAM/BAM field comparison to test helper function --- src/bam/mod.rs | 49 ++++++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 23 deletions(-) diff --git a/src/bam/mod.rs b/src/bam/mod.rs index 9ea213333..851ffb809 100644 --- a/src/bam/mod.rs +++ b/src/bam/mod.rs @@ -963,6 +963,29 @@ CCCCCCCCCCCCCCCCCCC"[..], (names, flags, seqs, quals, cigars) } + fn compare_inner_bam_cram_records(cram_records: &Vec, bam_records: &Vec) { + // Selectively compares bam1_t struct fields from BAM and CRAM + for (c1, b1) in cram_records.iter().zip(bam_records.iter()) { + // CRAM vs BAM l_data is off by 3, see: https://github.com/rust-bio/rust-htslib/pull/184#issuecomment-590133544 + assert_ne!(c1.inner().l_data, b1.inner().l_data); + // The rest of the fields should be identical: + assert_eq!(c1.cigar(), b1.cigar()); + assert_eq!(c1.inner().core.pos, b1.inner().core.pos); + assert_eq!(c1.inner().core.mpos, b1.inner().core.mpos); + assert_eq!(c1.inner().core.mtid, b1.inner().core.mtid); + assert_eq!(c1.inner().core.tid, b1.inner().core.tid); + assert_eq!(c1.inner().core.bin, b1.inner().core.bin); + assert_eq!(c1.inner().core.qual, b1.inner().core.qual); + assert_eq!(c1.inner().core.l_extranul, b1.inner().core.l_extranul); + assert_eq!(c1.inner().core.flag, b1.inner().core.flag); + assert_eq!(c1.inner().core.l_qname, b1.inner().core.l_qname); + assert_eq!(c1.inner().core.n_cigar, b1.inner().core.n_cigar); + assert_eq!(c1.inner().core.l_qseq, b1.inner().core.l_qseq); + assert_eq!(c1.inner().core.isize, b1.inner().core.isize); + //... except m_data + } + } + #[test] fn test_read() { let (names, flags, seqs, quals, cigars) = gold(); @@ -1507,26 +1530,7 @@ CCCCCCCCCCCCCCCCCCC"[..], let mut bam_reader = Reader::from_path(bam_path).unwrap(); let bam_records: Vec = bam_reader.records().map(|v| v.unwrap()).collect(); - // Compare l_data and m_data fields from BAM and CRAM - for (c1, b1) in cram_records.iter().zip(bam_records.iter()) { - // CRAM vs BAM l_data is off by 3, see: https://github.com/rust-bio/rust-htslib/pull/184#issuecomment-590133544 - assert_ne!(c1.inner().l_data, b1.inner().l_data); - // The rest of the fields should be identical: - assert_eq!(c1.cigar(), b1.cigar()); - assert_eq!(c1.inner().core.pos, b1.inner().core.pos); - assert_eq!(c1.inner().core.mpos, b1.inner().core.mpos); - assert_eq!(c1.inner().core.mtid, b1.inner().core.mtid); - assert_eq!(c1.inner().core.tid, b1.inner().core.tid); - assert_eq!(c1.inner().core.bin, b1.inner().core.bin); - assert_eq!(c1.inner().core.qual, b1.inner().core.qual); - assert_eq!(c1.inner().core.l_extranul, b1.inner().core.l_extranul); - assert_eq!(c1.inner().core.flag, b1.inner().core.flag); - assert_eq!(c1.inner().core.l_qname, b1.inner().core.l_qname); - assert_eq!(c1.inner().core.n_cigar, b1.inner().core.n_cigar); - assert_eq!(c1.inner().core.l_qseq, b1.inner().core.l_qseq); - assert_eq!(c1.inner().core.isize, b1.inner().core.isize); - //... except m_data - } + compare_inner_bam_cram_records(&cram_records, &bam_records); } #[test] @@ -1595,9 +1599,8 @@ CCCCCCCCCCCCCCCCCCC"[..], let cram_records: Vec = cram_reader.records().map(|v| v.unwrap()).collect(); // Compare CRAM records to BAM records - for (c1, b1) in cram_records.iter().zip(bam_records.iter()) { - assert!(c1 == b1); - } + compare_inner_bam_cram_records(&cram_records, &bam_records); + } tmp.close().expect("Failed to delete temp dir"); From 6bd85e0794a4d8b5a02d1521e0177e91db5157a8 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Mon, 24 Feb 2020 13:22:36 +1100 Subject: [PATCH 38/75] Formatting --- src/bam/mod.rs | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/bam/mod.rs b/src/bam/mod.rs index 851ffb809..a91f0f864 100644 --- a/src/bam/mod.rs +++ b/src/bam/mod.rs @@ -964,26 +964,26 @@ CCCCCCCCCCCCCCCCCCC"[..], } fn compare_inner_bam_cram_records(cram_records: &Vec, bam_records: &Vec) { - // Selectively compares bam1_t struct fields from BAM and CRAM - for (c1, b1) in cram_records.iter().zip(bam_records.iter()) { - // CRAM vs BAM l_data is off by 3, see: https://github.com/rust-bio/rust-htslib/pull/184#issuecomment-590133544 - assert_ne!(c1.inner().l_data, b1.inner().l_data); - // The rest of the fields should be identical: - assert_eq!(c1.cigar(), b1.cigar()); - assert_eq!(c1.inner().core.pos, b1.inner().core.pos); - assert_eq!(c1.inner().core.mpos, b1.inner().core.mpos); - assert_eq!(c1.inner().core.mtid, b1.inner().core.mtid); - assert_eq!(c1.inner().core.tid, b1.inner().core.tid); - assert_eq!(c1.inner().core.bin, b1.inner().core.bin); - assert_eq!(c1.inner().core.qual, b1.inner().core.qual); - assert_eq!(c1.inner().core.l_extranul, b1.inner().core.l_extranul); - assert_eq!(c1.inner().core.flag, b1.inner().core.flag); - assert_eq!(c1.inner().core.l_qname, b1.inner().core.l_qname); - assert_eq!(c1.inner().core.n_cigar, b1.inner().core.n_cigar); - assert_eq!(c1.inner().core.l_qseq, b1.inner().core.l_qseq); - assert_eq!(c1.inner().core.isize, b1.inner().core.isize); - //... except m_data - } + // Selectively compares bam1_t struct fields from BAM and CRAM + for (c1, b1) in cram_records.iter().zip(bam_records.iter()) { + // CRAM vs BAM l_data is off by 3, see: https://github.com/rust-bio/rust-htslib/pull/184#issuecomment-590133544 + assert_ne!(c1.inner().l_data, b1.inner().l_data); + // The rest of the fields should be identical: + assert_eq!(c1.cigar(), b1.cigar()); + assert_eq!(c1.inner().core.pos, b1.inner().core.pos); + assert_eq!(c1.inner().core.mpos, b1.inner().core.mpos); + assert_eq!(c1.inner().core.mtid, b1.inner().core.mtid); + assert_eq!(c1.inner().core.tid, b1.inner().core.tid); + assert_eq!(c1.inner().core.bin, b1.inner().core.bin); + assert_eq!(c1.inner().core.qual, b1.inner().core.qual); + assert_eq!(c1.inner().core.l_extranul, b1.inner().core.l_extranul); + assert_eq!(c1.inner().core.flag, b1.inner().core.flag); + assert_eq!(c1.inner().core.l_qname, b1.inner().core.l_qname); + assert_eq!(c1.inner().core.n_cigar, b1.inner().core.n_cigar); + assert_eq!(c1.inner().core.l_qseq, b1.inner().core.l_qseq); + assert_eq!(c1.inner().core.isize, b1.inner().core.isize); + //... except m_data + } } #[test] @@ -1600,7 +1600,6 @@ CCCCCCCCCCCCCCCCCCC"[..], // Compare CRAM records to BAM records compare_inner_bam_cram_records(&cram_records, &bam_records); - } tmp.close().expect("Failed to delete temp dir"); From de3599146b619319d261976d0118f1acf340feb1 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Mon, 24 Feb 2020 13:33:30 +1100 Subject: [PATCH 39/75] Temporarily commenting the hfile format category detection makes .bed filetype tests pass but .BAI idx locator fails --- src/tbx/mod.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/tbx/mod.rs b/src/tbx/mod.rs index 1ea2b740a..e3ec5c86b 100644 --- a/src/tbx/mod.rs +++ b/src/tbx/mod.rs @@ -152,13 +152,16 @@ impl Reader { let path = ffi::CString::new(path).unwrap(); let c_str = ffi::CString::new("r").unwrap(); let hts_file = unsafe { htslib::hts_open(path.as_ptr(), c_str.as_ptr()) }; - unsafe { - if (*hts_file).format.category != htslib::htsFormatCategory_region_list - && (*hts_file).format.format != htslib::htsExactFormat_sam - { - return Err(Error::InvalidIndex); - } - } + // unsafe { + // println!("{:#?}", (*hts_file).format); + + // // XXX: Just wrong format detection? + // if (*hts_file).format.category != htslib::htsFormatCategory_region_list + // && (*hts_file).format.format != htslib::htsExactFormat_sam + // { + // return Err(Error::InvalidIndex); + // } + // } let hts_format = unsafe { (*htslib::hts_get_format(hts_file)).format }; let tbx = unsafe { htslib::tbx_index_load(path.as_ptr()) }; From d89c216d17fc5e12937893c05c8a5b6503dd8577 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 25 Feb 2020 20:01:46 +1100 Subject: [PATCH 40/75] Format detection seems to be broken upstream on htslib, see https://github.com/rust-bio/rust-htslib/pull/184#issuecomment-590166289 --- src/tbx/mod.rs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/tbx/mod.rs b/src/tbx/mod.rs index e3ec5c86b..3daedee6f 100644 --- a/src/tbx/mod.rs +++ b/src/tbx/mod.rs @@ -152,16 +152,19 @@ impl Reader { let path = ffi::CString::new(path).unwrap(); let c_str = ffi::CString::new("r").unwrap(); let hts_file = unsafe { htslib::hts_open(path.as_ptr(), c_str.as_ptr()) }; - // unsafe { - // println!("{:#?}", (*hts_file).format); - - // // XXX: Just wrong format detection? - // if (*hts_file).format.category != htslib::htsFormatCategory_region_list - // && (*hts_file).format.format != htslib::htsExactFormat_sam - // { - // return Err(Error::InvalidIndex); - // } - // } + unsafe { + println!("{:#?}", (*hts_file).format); + + // XXX: Format detection broken upstream on htslib (BED.gz files are + // incorrectly detected among other potential errors. + // + // see: https://github.com/rust-bio/rust-htslib/pull/184#issuecomment-590166289 + //if (*hts_file).format.category != htslib::htsFormatCategory_region_list + if (*hts_file).format.format != htslib::htsExactFormat_text_format + { + return Err(Error::InvalidIndex); + } + } let hts_format = unsafe { (*htslib::hts_get_format(hts_file)).format }; let tbx = unsafe { htslib::tbx_index_load(path.as_ptr()) }; From f6d367946c426fe32fb92a8a92b187beb945a419 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Tue, 25 Feb 2020 20:20:51 +1100 Subject: [PATCH 41/75] Revert to libcurl4-openssl-dev instead of gnutls. All TravisCI script targets compiling and passing tests otherwise --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d5f2b7dec..ca3107c3a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,7 +35,7 @@ before_install: addons: apt: packages: - - libcurl4-gnutls-dev + - libcurl4-openssl-dev - libssl-dev - libelf-dev - libdw-dev From 6e9215678d949b151ce576484311a4e8419d3c9d Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Wed, 26 Feb 2020 17:13:46 +1100 Subject: [PATCH 42/75] Bump up curl-sys version --- hts-sys/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hts-sys/Cargo.toml b/hts-sys/Cargo.toml index 62de06556..2aaff2743 100644 --- a/hts-sys/Cargo.toml +++ b/hts-sys/Cargo.toml @@ -21,7 +21,7 @@ libc = "0.2" libz-sys = "1.0" bzip2-sys = { version = "0.1", optional = true } lzma-sys = { version = "0.1", optional = true } -curl-sys = { version = "0.4.25", optional = true } +curl-sys = { version = "0.4.26", optional = true } [features] default = ["bzip2", "lzma", "curl"] From 6c9454bfcca392790aebc6cc212817e8a4efdd5b Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Wed, 26 Feb 2020 17:19:16 +1100 Subject: [PATCH 43/75] Experimenting musl cross-compilation with rustembedded cross. Ideally this would get rid of the homebrew musl-cross issue (too long compile times). /cc @nlhepler --- .travis.yml | 2 ++ Cross.toml | 2 ++ docker/Dockerfile | 4 ++++ hts-sys/build.rs | 2 +- 4 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 Cross.toml create mode 100644 docker/Dockerfile diff --git a/.travis.yml b/.travis.yml index ca3107c3a..b04b3d37d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -52,6 +52,7 @@ addons: before_script: - export PATH=$HOME/.cargo/bin:$PATH + - cargo install --version 0.1.16 cross # https://github.com/rust-embedded/cross - cargo install cargo-update || echo "cargo-update already installed" - cargo install cargo-travis || echo "cargo-travis already installed" - cargo install-update -a @@ -64,6 +65,7 @@ before_script: script: - cargo fmt --version - cargo fmt -- --check + - cross build --target x86_64-unknown-linux-musl --all-features - cargo build --all-features - cargo test --all-features - cargo build --no-default-features diff --git a/Cross.toml b/Cross.toml new file mode 100644 index 000000000..cef985c29 --- /dev/null +++ b/Cross.toml @@ -0,0 +1,2 @@ +[target.x86_64-unknown-linux-musl] +image = "brainstorm/cross-x86_64-unknown-linux-musl-0.1.16:libcurl-openssl" diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 000000000..0deb5c5c9 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,4 @@ +FROM rustembedded/cross:x86_64-unknown-linux-musl-0.1.16 + +RUN apt-get update && \ + apt-get install libcurl4-openssl-dev zlib1g-dev libbz2-dev diff --git a/hts-sys/build.rs b/hts-sys/build.rs index 7a9b725ad..a5c53a178 100644 --- a/hts-sys/build.rs +++ b/hts-sys/build.rs @@ -77,7 +77,7 @@ fn main() { if Command::new("make") .current_dir(out.join("htslib")) .arg(format!("CC={}", cc_path.display())) - .arg(format!("CFLAGS={}", cc_cflags)) + .arg(format!("CFLAGS=-std=c99 -pedantic -lm -I/usr/include -I/usr/include/x86_64-linux-gnu{}", cc_cflags)) .arg("lib-static") .arg("-B") .status() From 642ceba0534a7a925fa18d0e3c4179d04cbc4fc5 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Wed, 26 Feb 2020 23:10:21 +1100 Subject: [PATCH 44/75] Remove assert_ne since cannot guarantee that l_data is different on all bam/crams --- src/bam/mod.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/bam/mod.rs b/src/bam/mod.rs index 3e5bfb786..cd21b736e 100644 --- a/src/bam/mod.rs +++ b/src/bam/mod.rs @@ -983,7 +983,6 @@ CCCCCCCCCCCCCCCCCCC"[..], // Selectively compares bam1_t struct fields from BAM and CRAM for (c1, b1) in cram_records.iter().zip(bam_records.iter()) { // CRAM vs BAM l_data is off by 3, see: https://github.com/rust-bio/rust-htslib/pull/184#issuecomment-590133544 - assert_ne!(c1.inner().l_data, b1.inner().l_data); // The rest of the fields should be identical: assert_eq!(c1.cigar(), b1.cigar()); assert_eq!(c1.inner().core.pos, b1.inner().core.pos); From 7cf834fff17d58206c3ccaeea8e4cc6f09310eaa Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Wed, 26 Feb 2020 23:11:01 +1100 Subject: [PATCH 45/75] Add minimum deps needed for rustembedded cross docker container --- docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 0deb5c5c9..ff9c8b996 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ FROM rustembedded/cross:x86_64-unknown-linux-musl-0.1.16 RUN apt-get update && \ - apt-get install libcurl4-openssl-dev zlib1g-dev libbz2-dev + apt-get install -y libcurl4-openssl-dev zlib1g-dev libbz2-dev gcc-multilib From e6d01316dea12bc427ed11e1b7823635338f05b3 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Wed, 26 Feb 2020 23:52:53 +1100 Subject: [PATCH 46/75] Run docker in TravisCI, even if it is only supported on linux jobs :/ --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index b04b3d37d..5c819c6a6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,6 +9,9 @@ os: - linux # - osx +services: + - docker + matrix: fast_finish: true allow_failures: From c0dde9adb799e696be2ddd5f4d2f2bbee5f2557e Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Wed, 26 Feb 2020 23:54:09 +1100 Subject: [PATCH 47/75] Add CFLAGS suggested by @nlhepler --- hts-sys/build.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hts-sys/build.rs b/hts-sys/build.rs index a5c53a178..dee857744 100644 --- a/hts-sys/build.rs +++ b/hts-sys/build.rs @@ -77,7 +77,7 @@ fn main() { if Command::new("make") .current_dir(out.join("htslib")) .arg(format!("CC={}", cc_path.display())) - .arg(format!("CFLAGS=-std=c99 -pedantic -lm -I/usr/include -I/usr/include/x86_64-linux-gnu{}", cc_cflags)) + .arg(format!("CFLAGS=-D_XOPEN_SOURCE=600 -D_GNU_SOURCE -std=gnu99 -pedantic -lm -I/usr/include -I/usr/include/x86_64-linux-gnu{}", cc_cflags)) .arg("lib-static") .arg("-B") .status() From 571b457e6c99289e9a2288e64c988b792a2aa6c4 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Thu, 27 Feb 2020 16:45:21 +1100 Subject: [PATCH 48/75] Separate musl from GNU toolchains on Rust cross --- Cross.toml | 4 +++- docker/Dockerfile.gnu | 8 ++++++++ docker/Dockerfile.musl | 6 ++++++ 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 docker/Dockerfile.gnu create mode 100644 docker/Dockerfile.musl diff --git a/Cross.toml b/Cross.toml index cef985c29..ed31c93f4 100644 --- a/Cross.toml +++ b/Cross.toml @@ -1,2 +1,4 @@ [target.x86_64-unknown-linux-musl] -image = "brainstorm/cross-x86_64-unknown-linux-musl-0.1.16:libcurl-openssl" +image = "brainstorm/cross-x86_64-unknown-linux-musl:libcurl-openssl" +[target.x86_64-unknown-linux-gnu] +image = "brainstorm/cross-x86_64-unknown-linux-gnu-0.1.16:libcurl-openssl" diff --git a/docker/Dockerfile.gnu b/docker/Dockerfile.gnu new file mode 100644 index 000000000..4128a272b --- /dev/null +++ b/docker/Dockerfile.gnu @@ -0,0 +1,8 @@ +FROM rustembedded/cross:x86_64-unknown-linux-gnu-0.1.16 + +#ENV LIBCLANG_PATH /usr/lib/llvm-9/lib/clang/9.0.0/lib/linux/ +#ENV LLVM_CONFIG_PATH /usr/bin +RUN apt-get update && \ + apt-get install -y libcurl4-openssl-dev zlib1g-dev libbz2-dev libc6-dev-i386 +#gcc-multilib libclang-common-9-dev llvm-9 clang-9 clang libclang-dev libc6-dev && \ +# ln -sf /usr/bin/llvm-config-9 /usr/bin/llvm-config diff --git a/docker/Dockerfile.musl b/docker/Dockerfile.musl new file mode 100644 index 000000000..e0c821cd4 --- /dev/null +++ b/docker/Dockerfile.musl @@ -0,0 +1,6 @@ +FROM rustembedded/cross:x86_64-unknown-linux-musl +ENV PKG_CONFIG_ALLOW_CROSS 1 +ENV OPENSSL_LIB_DIR /usr/lib/x86_64-linux-gnu +ENV OPENSSL_INCLUDE_DIR /usr/include/openssl +RUN apt-get update && \ + apt-get install -y libssl-dev libcurl4-openssl-dev zlib1g-dev libbz2-dev liblzma-dev musl musl-dev musl-tools linux-libc-dev linux-headers-4.15.0-20-generic From b10c48f21408f1df44d90f288809be1b81467635 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Thu, 27 Feb 2020 16:47:15 +1100 Subject: [PATCH 49/75] Bump up bindgen, vendorize openssl, further experimentation with compile flags --- hts-sys/Cargo.toml | 3 ++- hts-sys/build.rs | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/hts-sys/Cargo.toml b/hts-sys/Cargo.toml index 2aaff2743..3cca29b0a 100644 --- a/hts-sys/Cargo.toml +++ b/hts-sys/Cargo.toml @@ -31,6 +31,7 @@ curl = ["curl-sys"] [build-dependencies] fs-utils = "1.1" -bindgen = { version = "0.52.0", default-features = false, features = ["runtime"] } +openssl = { version = "0.10.28", features = ["vendored"] } +bindgen = { version = "0.53.1", default-features = false, features = ["runtime"] } cc = "1.0" glob = "0.3.0" diff --git a/hts-sys/build.rs b/hts-sys/build.rs index dee857744..71652668c 100644 --- a/hts-sys/build.rs +++ b/hts-sys/build.rs @@ -76,8 +76,10 @@ fn main() { let cc_cflags = cflags_env.to_string_lossy().replace("-O0", ""); if Command::new("make") .current_dir(out.join("htslib")) - .arg(format!("CC={}", cc_path.display())) - .arg(format!("CFLAGS=-D_XOPEN_SOURCE=600 -D_GNU_SOURCE -std=gnu99 -pedantic -lm -I/usr/include -I/usr/include/x86_64-linux-gnu{}", cc_cflags)) + //.arg(format!("CC=/usr/bin/musl-gcc {}", cc_path.display())) + .arg("CC=musl-gcc") + //.arg(format!("CFLAGS=-D_XOPEN_SOURCE=600 -D_GNU_SOURCE -I/usr/include -I/usr/include/x86_64-linux-gnu -std=c99 {}", cc_cflags)) + .arg(format!("CFLAGS=-D_XOPEN_SOURCE=600 -D_GNU_SOURCE -I/usr/include/x86_64-linux-musl -std=c99 {}", cc_cflags)) .arg("lib-static") .arg("-B") .status() From 81ab53c1b1b90650c3f1cc8183d405ddf612742a Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Thu, 27 Feb 2020 16:52:53 +1100 Subject: [PATCH 50/75] Deprecate the mixed GNU/MUSL container --- docker/Dockerfile | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 docker/Dockerfile diff --git a/docker/Dockerfile b/docker/Dockerfile deleted file mode 100644 index ff9c8b996..000000000 --- a/docker/Dockerfile +++ /dev/null @@ -1,4 +0,0 @@ -FROM rustembedded/cross:x86_64-unknown-linux-musl-0.1.16 - -RUN apt-get update && \ - apt-get install -y libcurl4-openssl-dev zlib1g-dev libbz2-dev gcc-multilib From 7f87d97abb9643e49724d7e678dfa243634bb9a0 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Thu, 27 Feb 2020 17:15:58 +1100 Subject: [PATCH 51/75] Add minimal explanation on how to use the new docker files [ci skip] --- docker/README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 docker/README.md diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 000000000..db9327bbf --- /dev/null +++ b/docker/README.md @@ -0,0 +1,17 @@ +# cross rustembedded containers + +Allows to compile (rust-)htslib in a variety of environments and architectures via [rustembedded cross](https://github.com/rust-embedded/cross). + +## Quickstart + +```shell +$ cd docker +$ docker build -t brainstorm/cross-x86_64-unknown-linux-musl:libcurl-openssl . -f dockerfile.musl +$ docker build -t brainstorm/cross-x86_64-unknown-linux-gnu:libcurl-openssl . -f dockerfile.gnu +``` + +Then to build and test rust-htslib with the above containers, proceed as you would with `cargo`, using `cross` instead, i.e: + +```shell +$ cross build --target x86_64-unknown-linux-musl +``` From 20f6fb13aa38d63ef06c134961c248293d517f55 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Thu, 27 Feb 2020 17:32:21 +1100 Subject: [PATCH 52/75] cross 0.2.0 with openssl vendored. Progress but more htslib compile time issues remain still --- Cross.toml | 2 +- docker/Dockerfile.gnu | 11 +++++------ docker/README.md | 4 ++-- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/Cross.toml b/Cross.toml index ed31c93f4..40192e175 100644 --- a/Cross.toml +++ b/Cross.toml @@ -1,4 +1,4 @@ [target.x86_64-unknown-linux-musl] image = "brainstorm/cross-x86_64-unknown-linux-musl:libcurl-openssl" [target.x86_64-unknown-linux-gnu] -image = "brainstorm/cross-x86_64-unknown-linux-gnu-0.1.16:libcurl-openssl" +image = "brainstorm/cross-x86_64-unknown-linux-gnu:libcurl-openssl" diff --git a/docker/Dockerfile.gnu b/docker/Dockerfile.gnu index 4128a272b..755afab9e 100644 --- a/docker/Dockerfile.gnu +++ b/docker/Dockerfile.gnu @@ -1,8 +1,7 @@ -FROM rustembedded/cross:x86_64-unknown-linux-gnu-0.1.16 +FROM rustembedded/cross:x86_64-unknown-linux-gnu -#ENV LIBCLANG_PATH /usr/lib/llvm-9/lib/clang/9.0.0/lib/linux/ -#ENV LLVM_CONFIG_PATH /usr/bin +ENV LIBCLANG_PATH /usr/lib/llvm-9/lib/clang/9.0.0/lib/linux/ +ENV LLVM_CONFIG_PATH /usr/bin RUN apt-get update && \ - apt-get install -y libcurl4-openssl-dev zlib1g-dev libbz2-dev libc6-dev-i386 -#gcc-multilib libclang-common-9-dev llvm-9 clang-9 clang libclang-dev libc6-dev && \ -# ln -sf /usr/bin/llvm-config-9 /usr/bin/llvm-config + apt-get install -y libcurl4-openssl-dev zlib1g-dev libbz2-dev gcc-multilib libc6-dev clang && \ + ln -sf /usr/bin/llvm-config-9 /usr/bin/llvm-config diff --git a/docker/README.md b/docker/README.md index db9327bbf..349b54d58 100644 --- a/docker/README.md +++ b/docker/README.md @@ -6,8 +6,8 @@ Allows to compile (rust-)htslib in a variety of environments and architectures v ```shell $ cd docker -$ docker build -t brainstorm/cross-x86_64-unknown-linux-musl:libcurl-openssl . -f dockerfile.musl -$ docker build -t brainstorm/cross-x86_64-unknown-linux-gnu:libcurl-openssl . -f dockerfile.gnu +$ docker build -t brainstorm/cross-x86_64-unknown-linux-musl:libcurl-openssl . -f Dockerfile.musl +$ docker build -t brainstorm/cross-x86_64-unknown-linux-gnu:libcurl-openssl . -f Dockerfile.gnu ``` Then to build and test rust-htslib with the above containers, proceed as you would with `cargo`, using `cross` instead, i.e: From 77d06f9a60a28315d41410306ccb26e0a81ef409 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Thu, 27 Feb 2020 17:36:16 +1100 Subject: [PATCH 53/75] Make sure libzma is present in both containers [ci skip] --- docker/Dockerfile.gnu | 2 +- docker/Dockerfile.musl | 1 + src/tbx/mod.rs | 14 +++++--------- test/test_bed3.bed | 5 ----- test/test_bed3.bed.gz | Bin 90 -> 124 bytes test/test_bed3.bed.gz.tbi | Bin 126 -> 125 bytes 6 files changed, 7 insertions(+), 15 deletions(-) delete mode 100644 test/test_bed3.bed diff --git a/docker/Dockerfile.gnu b/docker/Dockerfile.gnu index 755afab9e..e15ec9e4c 100644 --- a/docker/Dockerfile.gnu +++ b/docker/Dockerfile.gnu @@ -3,5 +3,5 @@ FROM rustembedded/cross:x86_64-unknown-linux-gnu ENV LIBCLANG_PATH /usr/lib/llvm-9/lib/clang/9.0.0/lib/linux/ ENV LLVM_CONFIG_PATH /usr/bin RUN apt-get update && \ - apt-get install -y libcurl4-openssl-dev zlib1g-dev libbz2-dev gcc-multilib libc6-dev clang && \ + apt-get install -y libcurl4-openssl-dev zlib1g-dev libbz2-dev liblzma-dev gcc-multilib libc6-dev llvm-dev libclang-dev clang && \ ln -sf /usr/bin/llvm-config-9 /usr/bin/llvm-config diff --git a/docker/Dockerfile.musl b/docker/Dockerfile.musl index e0c821cd4..55b228447 100644 --- a/docker/Dockerfile.musl +++ b/docker/Dockerfile.musl @@ -1,4 +1,5 @@ FROM rustembedded/cross:x86_64-unknown-linux-musl + ENV PKG_CONFIG_ALLOW_CROSS 1 ENV OPENSSL_LIB_DIR /usr/lib/x86_64-linux-gnu ENV OPENSSL_INCLUDE_DIR /usr/include/openssl diff --git a/src/tbx/mod.rs b/src/tbx/mod.rs index 3daedee6f..ad87fefa7 100644 --- a/src/tbx/mod.rs +++ b/src/tbx/mod.rs @@ -153,14 +153,8 @@ impl Reader { let c_str = ffi::CString::new("r").unwrap(); let hts_file = unsafe { htslib::hts_open(path.as_ptr(), c_str.as_ptr()) }; unsafe { - println!("{:#?}", (*hts_file).format); - - // XXX: Format detection broken upstream on htslib (BED.gz files are - // incorrectly detected among other potential errors. - // - // see: https://github.com/rust-bio/rust-htslib/pull/184#issuecomment-590166289 - //if (*hts_file).format.category != htslib::htsFormatCategory_region_list - if (*hts_file).format.format != htslib::htsExactFormat_text_format + if (*hts_file).format.category != htslib::htsFormatCategory_region_list + && (*hts_file).format.format != htslib::htsExactFormat_sam { return Err(Error::InvalidIndex); } @@ -381,7 +375,9 @@ mod tests { // Check header lines. assert_eq!( reader.header, - vec![String::from("#foo"), String::from("#bar")] + vec![String::from( + "track name=\"Test Bed\" maxheightpixels=120:120" + )] ); // Check sequence name vector. diff --git a/test/test_bed3.bed b/test/test_bed3.bed deleted file mode 100644 index db7cb61ea..000000000 --- a/test/test_bed3.bed +++ /dev/null @@ -1,5 +0,0 @@ -#foo -#bar -chr1 1001 1002 -chr1 1004 1005 -chr2 1005 1006 diff --git a/test/test_bed3.bed.gz b/test/test_bed3.bed.gz index 125be6444ec6a4367e1dccf12de79c9b4c182238..7403bc16945cc9fe748e9d6ecd8bd24380d3e59f 100644 GIT binary patch literal 124 zcmb2|=3rp}f&Xj_PR>jW@eJCUUOwl-PI#a3-5Sc}sjC-Q;N=?_bi#Md36HZr=QT7> ztnoOjxy{tXXaiHyx+gtK&VJ6!%m#@p&u2Ao1Pff}IKw2E7Q;{xUjHK+XskS%`O*x` IVCz5x0AA!GOaK4? literal 90 zcmb2|=3rp}f&Xj_PR>jWwhY03r_VnR^7GPp6T_-1{($<06okUVgLXD diff --git a/test/test_bed3.bed.gz.tbi b/test/test_bed3.bed.gz.tbi index faf0054c6f30082e700abc2a3d368526576ccff1..4a833921478a2da2de68575de3ae4e11621c4265 100644 GIT binary patch delta 66 zcmb=c6_oGhU||4(|7;9S&P)sm69rY(6A!R^Rr@x*a1(bIYrfIUaN^m|1FpgWXPm{| Uukk Date: Fri, 28 Feb 2020 13:44:13 +1100 Subject: [PATCH 54/75] Focusing on LLVMv8 GNU cross build first, musl will come later on (if possible w/ htslib) --- docker/Dockerfile.gnu | 7 ++++--- hts-sys/build.rs | 6 +++--- src/bam/mod.rs | 4 ++-- src/bam/record.rs | 4 ++-- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/docker/Dockerfile.gnu b/docker/Dockerfile.gnu index e15ec9e4c..2ec9fafe8 100644 --- a/docker/Dockerfile.gnu +++ b/docker/Dockerfile.gnu @@ -1,7 +1,8 @@ FROM rustembedded/cross:x86_64-unknown-linux-gnu -ENV LIBCLANG_PATH /usr/lib/llvm-9/lib/clang/9.0.0/lib/linux/ +ENV LIBCLANG_PATH /usr/lib/x86_64-linux-gnu ENV LLVM_CONFIG_PATH /usr/bin RUN apt-get update && \ - apt-get install -y libcurl4-openssl-dev zlib1g-dev libbz2-dev liblzma-dev gcc-multilib libc6-dev llvm-dev libclang-dev clang && \ - ln -sf /usr/bin/llvm-config-9 /usr/bin/llvm-config + apt-get install -y libcurl4-openssl-dev zlib1g-dev libbz2-dev liblzma-dev clang-8 && \ + ln -sf /usr/bin/llvm-config-8 /usr/bin/llvm-config && \ + ln -sf /usr/lib/x86_64-linux-gnu/libclang-8.so.1 /usr/lib/x86_64-linux-gnu/libclang.so.1 diff --git a/hts-sys/build.rs b/hts-sys/build.rs index 71652668c..83d903bc3 100644 --- a/hts-sys/build.rs +++ b/hts-sys/build.rs @@ -76,10 +76,10 @@ fn main() { let cc_cflags = cflags_env.to_string_lossy().replace("-O0", ""); if Command::new("make") .current_dir(out.join("htslib")) - //.arg(format!("CC=/usr/bin/musl-gcc {}", cc_path.display())) - .arg("CC=musl-gcc") - //.arg(format!("CFLAGS=-D_XOPEN_SOURCE=600 -D_GNU_SOURCE -I/usr/include -I/usr/include/x86_64-linux-gnu -std=c99 {}", cc_cflags)) + //.arg("CC=musl-gcc") .arg(format!("CFLAGS=-D_XOPEN_SOURCE=600 -D_GNU_SOURCE -I/usr/include/x86_64-linux-musl -std=c99 {}", cc_cflags)) + .arg(format!("CC={}", cc_path.display())) + .arg(format!("CFLAGS=-D_XOPEN_SOURCE=600 -D_GNU_SOURCE -I/usr/include -I/usr/include/x86_64-linux-gnu -std=c99 {}", cc_cflags)) .arg("lib-static") .arg("-B") .status() diff --git a/src/bam/mod.rs b/src/bam/mod.rs index cd21b736e..15357ce2d 100644 --- a/src/bam/mod.rs +++ b/src/bam/mod.rs @@ -597,7 +597,7 @@ impl Writer { ); (*rec).text = text as *mut i8; - (*rec).l_text = l_text as usize; + (*rec).l_text = l_text as u64; rec }; @@ -817,7 +817,7 @@ impl HeaderView { header_string.len(), ); - let rec = htslib::sam_hdr_parse((l_text + 1) as usize, text as *const i8); + let rec = htslib::sam_hdr_parse((l_text + 1) as u64, text as *const i8); (*rec).text = text as *mut i8; (*rec).l_text = l_text as usize; rec diff --git a/src/bam/record.rs b/src/bam/record.rs index e0c6a3a22..2de49628b 100644 --- a/src/bam/record.rs +++ b/src/bam/record.rs @@ -140,8 +140,8 @@ impl Record { let mut sam_string = htslib::kstring_t { s: sam_copy.as_ptr() as *mut i8, - l: sam_copy.len() as usize, - m: sam_copy.len() as usize, + l: sam_copy.len() as u64, + m: sam_copy.len() as u64, }; let succ = unsafe { From 78c41d219035969bd05d4125e87333cb743d4049 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Fri, 28 Feb 2020 13:51:47 +1100 Subject: [PATCH 55/75] Two more usize that should be u64 --- src/bam/mod.rs | 2 +- src/bcf/record.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/bam/mod.rs b/src/bam/mod.rs index 15357ce2d..762c27cbb 100644 --- a/src/bam/mod.rs +++ b/src/bam/mod.rs @@ -819,7 +819,7 @@ impl HeaderView { let rec = htslib::sam_hdr_parse((l_text + 1) as u64, text as *const i8); (*rec).text = text as *mut i8; - (*rec).l_text = l_text as usize; + (*rec).l_text = l_text as u64; rec }; diff --git a/src/bcf/record.rs b/src/bcf/record.rs index 622d45521..edf7d46df 100644 --- a/src/bcf/record.rs +++ b/src/bcf/record.rs @@ -589,7 +589,7 @@ impl Record { } pub fn remove_alleles(&mut self, remove: &[bool]) -> Result<()> { - let rm_set = unsafe { htslib::kbs_init(remove.len()) }; + let rm_set = unsafe { htslib::kbs_init(remove.len() as u64) }; for (i, &r) in remove.iter().enumerate() { if r { From 6b79b7227047eca04bb4b71a740e9422f1dca5cc Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Fri, 28 Feb 2020 13:55:30 +1100 Subject: [PATCH 56/75] Amend and settle BED header debate --- src/tbx/mod.rs | 8 -------- test/test_bed3.bed.gz | Bin 124 -> 82 bytes test/test_bed3.bed.gz.tbi | Bin 125 -> 125 bytes 3 files changed, 8 deletions(-) diff --git a/src/tbx/mod.rs b/src/tbx/mod.rs index ad87fefa7..55af0d024 100644 --- a/src/tbx/mod.rs +++ b/src/tbx/mod.rs @@ -372,14 +372,6 @@ mod tests { .ok() .expect("Error opening file."); - // Check header lines. - assert_eq!( - reader.header, - vec![String::from( - "track name=\"Test Bed\" maxheightpixels=120:120" - )] - ); - // Check sequence name vector. assert_eq!( reader.seqnames(), diff --git a/test/test_bed3.bed.gz b/test/test_bed3.bed.gz index 7403bc16945cc9fe748e9d6ecd8bd24380d3e59f..5218b402dc54bdcf6859fc85ac71feb05e0a3461 100644 GIT binary patch literal 82 zcmb2|=3rp}f&Xj_PR>jWrVQTaG>o2@m>4h!yTzOgSjX96z*^XQKt~|)7%RiGjpb6h QK*jQCx}+JH!G?ec02Kugga7~l literal 124 zcmb2|=3rp}f&Xj_PR>jW@eJCUUOwl-PI#a3-5Sc}sjC-Q;N=?_bi#Md36HZr=QT7> ztnoOjxy{tXXaiHyx+gtK&VJ6!%m#@p&u2Ao1Pff}IKw2E7Q;{xUjHK+XskS%`O*x` IVCz5x0AA!GOaK4? diff --git a/test/test_bed3.bed.gz.tbi b/test/test_bed3.bed.gz.tbi index 4a833921478a2da2de68575de3ae4e11621c4265..f97aa149862ac102cb3f66913633d78b2c05e73d 100644 GIT binary patch delta 46 zcmV+}0MY+_eULXMKn_ZKO@in~7e^L@*n Date: Fri, 28 Feb 2020 13:57:46 +1100 Subject: [PATCH 57/75] Rename test name accordingly --- src/tbx/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tbx/mod.rs b/src/tbx/mod.rs index 55af0d024..ee2792b51 100644 --- a/src/tbx/mod.rs +++ b/src/tbx/mod.rs @@ -367,7 +367,7 @@ mod tests { use super::*; #[test] - fn bed_header() { + fn bed_basic() { let reader = Reader::from_path("test/test_bed3.bed.gz") .ok() .expect("Error opening file."); From f6f2f64195a29bb3fe5d431cb1abef36d50be3b8 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Fri, 28 Feb 2020 14:02:39 +1100 Subject: [PATCH 58/75] Transition to cross instead of cargo for builds and tests --- .travis.yml | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5c819c6a6..d0c4467e7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -55,28 +55,25 @@ addons: before_script: - export PATH=$HOME/.cargo/bin:$PATH - - cargo install --version 0.1.16 cross # https://github.com/rust-embedded/cross + - cargo install cross # https://github.com/rust-embedded/cross - cargo install cargo-update || echo "cargo-update already installed" - cargo install cargo-travis || echo "cargo-travis already installed" - cargo install-update -a - rustup component add rustfmt - rustup target add x86_64-unknown-linux-musl - # XXX: times out, might make sense to repackage https://github.com/FiloSottile/homebrew-musl-cross to reduce build times - # upstream or build DockCross images instead: https://github.com/dockcross/dockcross - #- if [ $TRAVIS_OS_NAME = osx ]; then brew install -v wget curl musl-cross; fi script: - cargo fmt --version - cargo fmt -- --check - cross build --target x86_64-unknown-linux-musl --all-features - - cargo build --all-features - - cargo test --all-features - - cargo build --no-default-features - - cargo test --no-default-features - - cargo build --target x86_64-unknown-linux-musl --all-features - - cargo test --target x86_64-unknown-linux-musl --all-features - - cargo build --target x86_64-unknown-linux-musl --no-default-features - - cargo test --target x86_64-unknown-linux-musl --no-default-features + - cross build --all-features + - cross test --all-features + - cross build --no-default-features + - cross test --no-default-features + - cross build --target x86_64-unknown-linux-musl --all-features + - cross test --target x86_64-unknown-linux-musl --all-features + - cross build --target x86_64-unknown-linux-musl --no-default-features + - cross test --target x86_64-unknown-linux-musl --no-default-features after_success: - cargo coveralls From 8127679c3c9879e2921651ab3c07813466dd8768 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Fri, 28 Feb 2020 14:11:11 +1100 Subject: [PATCH 59/75] All GNU/clang/llvm8 builds and tests seem to succeed, transitioning to musl testing now... --- hts-sys/build.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hts-sys/build.rs b/hts-sys/build.rs index 83d903bc3..901582d92 100644 --- a/hts-sys/build.rs +++ b/hts-sys/build.rs @@ -77,7 +77,7 @@ fn main() { if Command::new("make") .current_dir(out.join("htslib")) //.arg("CC=musl-gcc") - .arg(format!("CFLAGS=-D_XOPEN_SOURCE=600 -D_GNU_SOURCE -I/usr/include/x86_64-linux-musl -std=c99 {}", cc_cflags)) + //.arg(format!("CFLAGS=-D_XOPEN_SOURCE=600 -D_GNU_SOURCE -I/usr/include/x86_64-linux-musl -std=c99 {}", cc_cflags)) .arg(format!("CC={}", cc_path.display())) .arg(format!("CFLAGS=-D_XOPEN_SOURCE=600 -D_GNU_SOURCE -I/usr/include -I/usr/include/x86_64-linux-gnu -std=c99 {}", cc_cflags)) .arg("lib-static") From 2f14727029ebbd19c84f919f77592bd20ccf1a70 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Fri, 28 Feb 2020 14:12:21 +1100 Subject: [PATCH 60/75] Remove stray (repeated) musl build --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d0c4467e7..f5f10d737 100644 --- a/.travis.yml +++ b/.travis.yml @@ -65,7 +65,6 @@ before_script: script: - cargo fmt --version - cargo fmt -- --check - - cross build --target x86_64-unknown-linux-musl --all-features - cross build --all-features - cross test --all-features - cross build --no-default-features From 0ca9400212385b673a11e015a2d6ff01ffec549d Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Fri, 28 Feb 2020 14:37:58 +1100 Subject: [PATCH 61/75] Remove @filoSottile musl-cross homebrew formula since it takes too long to compile and timeouts CI, using clux/muslrust gets me a bit farther. Remove local rustup musl target... since htslib 1.10, the introduction of openssl complicated local compilation w/ musl greatly, unfortunately we have to resort to docker these days instead :/ --- .travis.yml | 13 +++++-------- Cross.toml | 2 +- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index f5f10d737..f5f375b9b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -49,9 +49,6 @@ addons: - musl - musl-dev - musl-tools - homebrew: - taps: filosottile/musl-cross - update: false before_script: - export PATH=$HOME/.cargo/bin:$PATH @@ -60,15 +57,15 @@ before_script: - cargo install cargo-travis || echo "cargo-travis already installed" - cargo install-update -a - rustup component add rustfmt - - rustup target add x86_64-unknown-linux-musl script: - cargo fmt --version - cargo fmt -- --check - - cross build --all-features - - cross test --all-features - - cross build --no-default-features - - cross test --no-default-features + - cargo build --all-features + - cargo test --all-features + - cargo build --no-default-features + - cargo test --no-default-features + # Cross compile to musl target (docker support not available on OSX) - cross build --target x86_64-unknown-linux-musl --all-features - cross test --target x86_64-unknown-linux-musl --all-features - cross build --target x86_64-unknown-linux-musl --no-default-features diff --git a/Cross.toml b/Cross.toml index 40192e175..4a36e0197 100644 --- a/Cross.toml +++ b/Cross.toml @@ -1,4 +1,4 @@ [target.x86_64-unknown-linux-musl] -image = "brainstorm/cross-x86_64-unknown-linux-musl:libcurl-openssl" +image = "clux/muslrust:stable" [target.x86_64-unknown-linux-gnu] image = "brainstorm/cross-x86_64-unknown-linux-gnu:libcurl-openssl" From d0837cf85a2c03bd6d8793d76b0d1b12d514e343 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Fri, 28 Feb 2020 15:32:19 +1100 Subject: [PATCH 62/75] Experiment with toolchain setup in https://gitlab.com/rust_musl_docker/image. Remove vendored openssl since it's shipped in cross containers. --- Cross.toml | 2 +- hts-sys/Cargo.toml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Cross.toml b/Cross.toml index 4a36e0197..c753b089b 100644 --- a/Cross.toml +++ b/Cross.toml @@ -1,4 +1,4 @@ [target.x86_64-unknown-linux-musl] -image = "clux/muslrust:stable" +image = "brainstorm/rust_musl_docker:stable-latest-libcurl" [target.x86_64-unknown-linux-gnu] image = "brainstorm/cross-x86_64-unknown-linux-gnu:libcurl-openssl" diff --git a/hts-sys/Cargo.toml b/hts-sys/Cargo.toml index 3cca29b0a..5638e9e14 100644 --- a/hts-sys/Cargo.toml +++ b/hts-sys/Cargo.toml @@ -31,7 +31,6 @@ curl = ["curl-sys"] [build-dependencies] fs-utils = "1.1" -openssl = { version = "0.10.28", features = ["vendored"] } bindgen = { version = "0.53.1", default-features = false, features = ["runtime"] } cc = "1.0" glob = "0.3.0" From d218b27ffb6d4e4d208584b6b558cf7b61d8f843 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Fri, 28 Feb 2020 16:02:59 +1100 Subject: [PATCH 63/75] Remove build.rs flags noise and different tests, containers should handle them transparently depending on the defined environment within, thanks @nlhepler --- hts-sys/build.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/hts-sys/build.rs b/hts-sys/build.rs index 901582d92..7a9b725ad 100644 --- a/hts-sys/build.rs +++ b/hts-sys/build.rs @@ -76,10 +76,8 @@ fn main() { let cc_cflags = cflags_env.to_string_lossy().replace("-O0", ""); if Command::new("make") .current_dir(out.join("htslib")) - //.arg("CC=musl-gcc") - //.arg(format!("CFLAGS=-D_XOPEN_SOURCE=600 -D_GNU_SOURCE -I/usr/include/x86_64-linux-musl -std=c99 {}", cc_cflags)) .arg(format!("CC={}", cc_path.display())) - .arg(format!("CFLAGS=-D_XOPEN_SOURCE=600 -D_GNU_SOURCE -I/usr/include -I/usr/include/x86_64-linux-gnu -std=c99 {}", cc_cflags)) + .arg(format!("CFLAGS={}", cc_cflags)) .arg("lib-static") .arg("-B") .status() From e293ad34f4fd9e6874805762f88424e6684be3c9 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Mon, 2 Mar 2020 10:56:39 +1100 Subject: [PATCH 64/75] Indicate dependencies and build flags required for OSX [ci skip]. --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index ef46334ee..a56645f9d 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,13 @@ To compile this crate you need the development headers of zlib, bzip2 and xz. Fo $ sudo apt-get install zlib1g-dev libbz2-dev liblzma-dev clang ``` +On OSX, this will take a significant amount of time due to musl cross compiling toolchain: + +```shell +$ brew install FiloSottile/musl-cross/musl-cross +$ brew install bzip2 zlib xz curl-openssl +``` + ## Usage Add this to your `Cargo.toml`: From ebd1d2ee28a5f5d59e88257842da1087393bcee1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20K=C3=B6ster?= Date: Tue, 10 Mar 2020 12:25:09 +0100 Subject: [PATCH 65/75] enable musl builds --- .github/workflows/rust.yml | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index e4b4ebb96..3fe1f9029 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -39,10 +39,6 @@ jobs: override: true components: clippy - - name: Install system dependencies - run: | - sudo apt-get install --yes zlib1g-dev libbz2-dev musl musl-dev musl-tools - - name: Lint with clippy uses: actions-rs/clippy-check@v1 with: @@ -79,3 +75,17 @@ jobs: with: github-token: ${{ secrets.GITHUB_TOKEN }} path-to-lcov: ./lcov.info + + - name: Test musl build without default features + uses: actions-rs/cargo@v1 + with: + use-cross: true + command: build + args: --target x86_64-unknown-linux-musl --no-default-features + + - name: Test musl build with all features + uses: actions-rs/cargo@v1 + with: + use-cross: true + command: build + args: --target x86_64-unknown-linux-musl --all-features From fcbbafc3370569ad0908f390c7d3573fb65242c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20K=C3=B6ster?= Date: Tue, 10 Mar 2020 13:00:38 +0100 Subject: [PATCH 66/75] add libclang --- .github/workflows/rust.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 3fe1f9029..da0393b80 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -63,7 +63,7 @@ jobs: - name: Install system dependencies run: | - sudo apt-get install --yes zlib1g-dev libbz2-dev musl musl-dev musl-tools + sudo apt-get install --yes zlib1g-dev libbz2-dev musl musl-dev musl-tools libclang1 - name: Run cargo-tarpaulin uses: actions-rs/tarpaulin@v0.1 From 6882797601c8b04bc3f7d8c64fbf639f5fdf09c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20K=C3=B6ster?= Date: Tue, 10 Mar 2020 13:22:11 +0100 Subject: [PATCH 67/75] minor --- .github/workflows/rust.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index da0393b80..bb595289f 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -63,7 +63,7 @@ jobs: - name: Install system dependencies run: | - sudo apt-get install --yes zlib1g-dev libbz2-dev musl musl-dev musl-tools libclang1 + sudo apt-get install --yes zlib1g-dev libbz2-dev musl musl-dev musl-tools libclang1 libclang-dev - name: Run cargo-tarpaulin uses: actions-rs/tarpaulin@v0.1 From e0d1edbfa821173e49c4b78d43341a31319bec57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20K=C3=B6ster?= Date: Tue, 10 Mar 2020 15:36:50 +0100 Subject: [PATCH 68/75] dbg --- .github/workflows/rust.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index bb595289f..999f084dc 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -63,7 +63,7 @@ jobs: - name: Install system dependencies run: | - sudo apt-get install --yes zlib1g-dev libbz2-dev musl musl-dev musl-tools libclang1 libclang-dev + sudo apt-get install --yes zlib1g-dev libbz2-dev musl musl-dev musl-tools libclang-dev - name: Run cargo-tarpaulin uses: actions-rs/tarpaulin@v0.1 From e97d47a27f1edf7f97d73a29df60309e8063330f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20K=C3=B6ster?= Date: Tue, 10 Mar 2020 15:53:29 +0100 Subject: [PATCH 69/75] revert --- .github/workflows/rust.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 999f084dc..da0393b80 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -63,7 +63,7 @@ jobs: - name: Install system dependencies run: | - sudo apt-get install --yes zlib1g-dev libbz2-dev musl musl-dev musl-tools libclang-dev + sudo apt-get install --yes zlib1g-dev libbz2-dev musl musl-dev musl-tools libclang1 - name: Run cargo-tarpaulin uses: actions-rs/tarpaulin@v0.1 From cecbd4a63fea55b70732571850500e776f1a8f9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20K=C3=B6ster?= Date: Tue, 10 Mar 2020 16:17:21 +0100 Subject: [PATCH 70/75] dbg --- .github/workflows/rust.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index da0393b80..514c54fa4 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -63,7 +63,7 @@ jobs: - name: Install system dependencies run: | - sudo apt-get install --yes zlib1g-dev libbz2-dev musl musl-dev musl-tools libclang1 + sudo apt-get install --yes zlib1g-dev libbz2-dev musl musl-dev musl-tools clang libclang-dev libc6-dev - name: Run cargo-tarpaulin uses: actions-rs/tarpaulin@v0.1 From e065263ad0bcaa44b55279673d300d114e6b085b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20K=C3=B6ster?= Date: Tue, 10 Mar 2020 17:23:28 +0100 Subject: [PATCH 71/75] dbg --- .github/workflows/rust.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 514c54fa4..588cf5a1a 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -63,7 +63,7 @@ jobs: - name: Install system dependencies run: | - sudo apt-get install --yes zlib1g-dev libbz2-dev musl musl-dev musl-tools clang libclang-dev libc6-dev + sudo apt-get install --yes zlib1g-dev libbz2-dev musl musl-dev musl-tools clang libc6-dev - name: Run cargo-tarpaulin uses: actions-rs/tarpaulin@v0.1 From 8505cfe9996e9720a168e25a277272f4b16e0b8c Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Wed, 11 Mar 2020 11:24:25 +1100 Subject: [PATCH 72/75] Revert cross/docker madness, bottled up musl-cross myself over here: https://github.com/brainstorm/homebrew-musl-cross/commit/9304bf9cd6bc2b784083948771977d502030815a, high sierra bottle coming up soon. Cargo build script draft --- .travis.yml | 15 +++++++++------ hts-sys/build.rs | 13 +++++++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index f5f375b9b..3d6e90271 100644 --- a/.travis.yml +++ b/.travis.yml @@ -49,14 +49,18 @@ addons: - musl - musl-dev - musl-tools + homebrew: + taps: brainstorm/musl-cross + update: false before_script: - export PATH=$HOME/.cargo/bin:$PATH - - cargo install cross # https://github.com/rust-embedded/cross +# - cargo install cross # https://github.com/rust-embedded/cross - cargo install cargo-update || echo "cargo-update already installed" - cargo install cargo-travis || echo "cargo-travis already installed" - cargo install-update -a - rustup component add rustfmt + - rustup target add x86_64-unknown-linux-musl script: - cargo fmt --version @@ -65,11 +69,10 @@ script: - cargo test --all-features - cargo build --no-default-features - cargo test --no-default-features - # Cross compile to musl target (docker support not available on OSX) - - cross build --target x86_64-unknown-linux-musl --all-features - - cross test --target x86_64-unknown-linux-musl --all-features - - cross build --target x86_64-unknown-linux-musl --no-default-features - - cross test --target x86_64-unknown-linux-musl --no-default-features + - cargo build --target x86_64-unknown-linux-musl --all-features + - cargo test --target x86_64-unknown-linux-musl --all-features + - cargo build --target x86_64-unknown-linux-musl --no-default-features + - cargo test --target x86_64-unknown-linux-musl --no-default-features after_success: - cargo coveralls diff --git a/hts-sys/build.rs b/hts-sys/build.rs index 7a9b725ad..7b0a4e0cf 100644 --- a/hts-sys/build.rs +++ b/hts-sys/build.rs @@ -31,7 +31,20 @@ fn sed_htslib_makefile(out: &PathBuf, patterns: &Vec<&str>, feature: &str) { } } +fn check_homebrew_osx() { + let htslib_deps = vec!("bzip2", "zlib", "xz", "curl-openssl"); + for dep in htslib_deps { + let cmd = Command::new("brew") + .arg("--prefix") + .arg(dep) + .output().expect("Uh-oh, you are not on OSX"); + + dbg!(cmd); + } +} + fn main() { + check_homebrew_osx(); let out = PathBuf::from(env::var("OUT_DIR").unwrap()); let mut cfg = cc::Build::new(); cfg.warnings(false).static_flag(true).pic(true); From 09aec34a20b2ac7f84f09c162a6f876b29f77934 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Fri, 13 Mar 2020 12:14:24 +1100 Subject: [PATCH 73/75] Add in openssl to hts-sys --- Cargo.toml | 1 + hts-sys/Cargo.toml | 2 ++ src/bam/mod.rs | 1 - 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 1f28a8c0d..1673387e3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,6 +37,7 @@ default = ["bzip2", "lzma", "curl"] bzip2 = ["hts-sys/bzip2"] lzma = ["hts-sys/lzma"] curl = ["hts-sys/curl"] +openssl = ["hts-sys/openssl"] serde = ["serde_base", "serde_bytes"] [dev-dependencies] diff --git a/hts-sys/Cargo.toml b/hts-sys/Cargo.toml index 5638e9e14..d3ff47d6d 100644 --- a/hts-sys/Cargo.toml +++ b/hts-sys/Cargo.toml @@ -22,11 +22,13 @@ libz-sys = "1.0" bzip2-sys = { version = "0.1", optional = true } lzma-sys = { version = "0.1", optional = true } curl-sys = { version = "0.4.26", optional = true } +openssl-sys = { version = "0.9.54", optional = true } [features] default = ["bzip2", "lzma", "curl"] bzip2 = ["bzip2-sys"] lzma = ["lzma-sys"] +openssl = ["openssl-sys"] curl = ["curl-sys"] [build-dependencies] diff --git a/src/bam/mod.rs b/src/bam/mod.rs index 762c27cbb..bd371c8f2 100644 --- a/src/bam/mod.rs +++ b/src/bam/mod.rs @@ -16,7 +16,6 @@ pub mod record; #[cfg(feature = "serde")] pub mod record_serde; -use libc; use std::ffi; use std::path::Path; use std::slice; From 6042c05e9e39a969bcba3f86b51484cf1455e485 Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Fri, 13 Mar 2020 12:33:57 +1100 Subject: [PATCH 74/75] Make clippy boolean logic happy --- hts-sys/build.rs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/hts-sys/build.rs b/hts-sys/build.rs index 7b0a4e0cf..c1b9ae834 100644 --- a/hts-sys/build.rs +++ b/hts-sys/build.rs @@ -15,7 +15,7 @@ use std::process::Command; fn sed_htslib_makefile(out: &PathBuf, patterns: &Vec<&str>, feature: &str) { for pattern in patterns { - if Command::new("sed") + if !Command::new("sed") .current_dir(out.join("htslib")) .arg("-i") .arg("-e") @@ -24,7 +24,6 @@ fn sed_htslib_makefile(out: &PathBuf, patterns: &Vec<&str>, feature: &str) { .status() .unwrap() .success() - != true { panic!("failed to strip {} support", feature); } @@ -87,7 +86,7 @@ fn main() { let tool = cfg.get_compiler(); let (cc_path, cflags_env) = (tool.path(), tool.cflags_env()); let cc_cflags = cflags_env.to_string_lossy().replace("-O0", ""); - if Command::new("make") + if !Command::new("make") .current_dir(out.join("htslib")) .arg(format!("CC={}", cc_path.display())) .arg(format!("CFLAGS={}", cc_cflags)) @@ -96,7 +95,6 @@ fn main() { .status() .unwrap() .success() - != true { panic!("failed to build htslib"); } From fc84cff02e7472f3bfc489d55b583b7326f3381e Mon Sep 17 00:00:00 2001 From: Roman Valls Guimera Date: Fri, 13 Mar 2020 12:41:37 +1100 Subject: [PATCH 75/75] Remove homebrew OSX check since we'll just use rustembedded cross --- hts-sys/build.rs | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/hts-sys/build.rs b/hts-sys/build.rs index c1b9ae834..3891084e1 100644 --- a/hts-sys/build.rs +++ b/hts-sys/build.rs @@ -13,7 +13,7 @@ use std::fs; use std::path::PathBuf; use std::process::Command; -fn sed_htslib_makefile(out: &PathBuf, patterns: &Vec<&str>, feature: &str) { +fn sed_htslib_makefile(out: &PathBuf, patterns: &[&str], feature: &str) { for pattern in patterns { if !Command::new("sed") .current_dir(out.join("htslib")) @@ -30,20 +30,7 @@ fn sed_htslib_makefile(out: &PathBuf, patterns: &Vec<&str>, feature: &str) { } } -fn check_homebrew_osx() { - let htslib_deps = vec!("bzip2", "zlib", "xz", "curl-openssl"); - for dep in htslib_deps { - let cmd = Command::new("brew") - .arg("--prefix") - .arg(dep) - .output().expect("Uh-oh, you are not on OSX"); - - dbg!(cmd); - } -} - fn main() { - check_homebrew_osx(); let out = PathBuf::from(env::var("OUT_DIR").unwrap()); let mut cfg = cc::Build::new(); cfg.warnings(false).static_flag(true).pic(true);