Package: python-pysam Version: 0.7.7-1 Tags: sid patch Severity: important Justification: FTBFS User: debian-mips-dev-disc...@lists.alioth.debian.org Usertags: mips-patch Control: block -1 by 753485
While trying to build python-pysam on mips/mipsel, build fails on testing. Build log for 'python-pysam' on mips: https://buildd.debian.org/status/fetch.php?pkg=python-pysam&arch=mips&ver=0.7.7-1&stamp=1397894446 Build log for 'python-pysam' on mipsel: https://buildd.debian.org/status/fetch.php?pkg=python-pysam&arch=mipsel&ver=0.7.7-1&stamp=1397887877 The cause of test failures are issues in both 'samtools' and 'python-pysam' packages. For python-pysam to work samtools has to be fixed first since output of samtools executable from samtools package is used as a reference during tests in python-pysam (its output is compared with output from pysam python module). python-pysam has unaligned memory access and system endianness related issues as well. I have attached patches that fix this. With samtools fixed (with solution proposed at https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=753485), and attached patches are applied to python-pysam, I have successfully built python-pysam on mips and mipsel. Could you consider including these patches? Best regards, Aleksandar Zlicic
Index: python-pysam-0.7.7/samtools/bam_import.c.pysam.c =================================================================== --- python-pysam-0.7.7.orig/samtools/bam_import.c.pysam.c +++ python-pysam-0.7.7/samtools/bam_import.c.pysam.c @@ -367,6 +367,9 @@ int sam_read1(tamFile fp, bam_header_t * if (dret != '\n' && dret != '\r') { // aux while (ks_getuntil(ks, KS_SEP_TAB, str, &dret) >= 0) { uint8_t *s, type, key[2]; + uint8_t tmpData[8]; + int j; + z += str->l + 1; if (str->l < 6 || str->s[2] != ':' || str->s[4] != ':') parse_error(fp->n_lines, "missing colon in auxiliary data"); @@ -412,15 +415,35 @@ int sam_read1(tamFile fp, bam_header_t * } } } else if (type == 'f') { +#ifdef ALLOW_UAC s = alloc_data(b, doff + 5) + doff; *s++ = 'f'; *(float*)s = (float)atof(str->s + 5); s += 4; doff += 5; +#else + float *ptmpData = (float*)&tmpData; + s = alloc_data(b, doff + 5) + doff; + *s++ = 'f'; + for(j=0;j<4;j++) tmpData[j]=s[j]; + *ptmpData = (float)atof(str->s + 5); + for(j=0;j<4;j++) s[j] = tmpData[j]; + s += 4; doff += 5; + #endif } else if (type == 'd') { +#ifdef ALLOW_UAC s = alloc_data(b, doff + 9) + doff; *s++ = 'd'; *(float*)s = (float)atof(str->s + 9); s += 8; doff += 9; +#else + float *ptmpData = (float*)&tmpData; + s = alloc_data(b, doff + 9) + doff; + *s++ = 'd'; + for(j=0;j<8;j++) tmpData[j]=s[j]; + *ptmpData = (float)atof(str->s + 9); + for(j=0;j<8;j++) s[j] = tmpData[j]; + s += 8; doff += 9; +#endif } else if (type == 'Z' || type == 'H') { int size = 1 + (str->l - 5) + 1; if (type == 'H') { // check whether the hex string is valid Index: python-pysam-0.7.7/samtools/bam.h =================================================================== --- python-pysam-0.7.7.orig/samtools/bam.h +++ python-pysam-0.7.7/samtools/bam.h @@ -70,6 +70,12 @@ typedef gzFile bamFile; /* no bam_write/bam_tell/bam_seek() here */ #endif +#if defined(__i386__) || defined(__i386) || defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(__i686__) || defined(__i686) +# define ALLOW_UAC +#else +# undef ALLOW_UAC +#endif + /*! @typedef @abstract Structure for the alignment header. @field n_targets number of reference sequences Index: python-pysam-0.7.7/samtools/bam_aux.c.pysam.c =================================================================== --- python-pysam-0.7.7.orig/samtools/bam_aux.c.pysam.c +++ python-pysam-0.7.7/samtools/bam_aux.c.pysam.c @@ -180,7 +180,18 @@ float bam_aux2f(const uint8_t *s) int type; type = *s++; if (s == 0) return 0.0; +#ifdef ALLOW_UAC if (type == 'f') return *(float*)s; +#else + if (type == 'f') + { + uint8_t tmpData[4]; + int j; + float *ptmpData = (float*)&tmpData; + for(j=0;j<4;j++) tmpData[j]=s[j]; + return *ptmpData; + } +#endif else return 0.0; } @@ -189,7 +200,19 @@ double bam_aux2d(const uint8_t *s) int type; type = *s++; if (s == 0) return 0.0; +#ifdef ALLOW_UAC if (type == 'd') return *(double*)s; +#else + if (type == 'd') + { + uint8_t tmpData[8]; + int j; + double *ptmpData = (double*)&tmpData; + for(j=0;j<8;j++) tmpData[j]=s[j]; + return *ptmpData; + + } +#endif else return 0.0; }
Index: python-pysam-0.7.7/pysam/csamtools.pyx =================================================================== --- python-pysam-0.7.7.orig/pysam/csamtools.pyx +++ python-pysam-0.7.7/pysam/csamtools.pyx @@ -2763,7 +2763,7 @@ cdef class AlignedRead: src = self._delegate - fmts, args = ["<"], [] + fmts, args = ["="], [] if tags != None: Index: python-pysam-0.7.7/samtools/bam.c.pysam.c =================================================================== --- python-pysam-0.7.7.orig/samtools/bam.c.pysam.c +++ python-pysam-0.7.7/samtools/bam.c.pysam.c @@ -159,7 +159,7 @@ int bam_header_write(bamFile fp, const b return 0; } -static void swap_endian_data(const bam1_core_t *c, int data_len, uint8_t *data) +static void swap_endian_data(const bam1_core_t *c, int data_len, uint8_t *data, int is_host) { uint8_t *s; uint32_t i, *cigar = (uint32_t*)(data + c->l_qname); @@ -176,17 +176,19 @@ static void swap_endian_data(const bam1_ else if (type == 'Z' || type == 'H') { while (*s) ++s; ++s; } else if (type == 'B') { int32_t n, Bsize = bam_aux_type2size(*s); + if(!is_host) bam_swap_endian_4p(s+1); memcpy(&n, s + 1, 4); if (1 == Bsize) { } else if (2 == Bsize) { - for (i = 0; i < n; i += 2) + for (i = 0; i < n*Bsize; i += 2) bam_swap_endian_2p(s + 5 + i); } else if (4 == Bsize) { - for (i = 0; i < n; i += 4) + for (i = 0; i < n*Bsize; i += 4) bam_swap_endian_4p(s + 5 + i); } - bam_swap_endian_4p(s+1); - } + if(is_host) bam_swap_endian_4p(s+1); + s += n * Bsize + 4; + } } } @@ -219,7 +221,7 @@ int bam_read1(bamFile fp, bam1_t *b) } if (bam_read(fp, b->data, b->data_len) != b->data_len) return -4; b->l_aux = b->data_len - c->n_cigar * 4 - c->l_qname - c->l_qseq - (c->l_qseq+1)/2; - if (bam_is_be) swap_endian_data(c, b->data_len, b->data); + if (bam_is_be) swap_endian_data(c, b->data_len, b->data, 0); if (bam_no_B) bam_remove_B(b); return 4 + block_len; } @@ -242,11 +244,11 @@ inline int bam_write1_core(bamFile fp, c for (i = 0; i < 8; ++i) bam_swap_endian_4p(x + i); y = block_len; bam_write(fp, bam_swap_endian_4p(&y), 4); - swap_endian_data(c, data_len, data); + swap_endian_data(c, data_len, data, 1); } else bam_write(fp, &block_len, 4); bam_write(fp, x, BAM_CORE_SIZE); bam_write(fp, data, data_len); - if (bam_is_be) swap_endian_data(c, data_len, data); + if (bam_is_be) swap_endian_data(c, data_len, data, 0); return 4 + block_len; }