Package: duperemove
Version: 0.11~beta4-1
Severity: important
Tags: sid + patch
Justification: FTBFS
User: debian-m...@lists.debian.org
Usertags: mips-patch

Hello,

Package duperemove_0.11~beta4-1 FTBFS on mips and mipsel with following error:

>  file_scan.o: In function `csum_whole_file_init':
>  ./file_scan.c:663: undefined reference to `__sync_add_and_fetch_8'
>  ./file_scan.c:663: undefined reference to `__sync_add_and_fetch_8'
>  run_dedupe.o: In function `dedupe_worker':
>  ./run_dedupe.c:676: undefined reference to `__sync_add_and_fetch_8'
>  run_dedupe.o: In function `extent_dedupe_worker':
>  ./run_dedupe.c:479: undefined reference to `__sync_add_and_fetch_8'
>  run_dedupe.o: In function `block_dedupe_worker':
>  ./run_dedupe.c:656: undefined reference to `__sync_add_and_fetch_8'
>  run_dedupe.o:./run_dedupe.c:801: more undefined references to 
> `__sync_add_and_fetch_8' follow
>  collect2: error: ld returned 1 exit status
>  Makefile:82: recipe for target 'duperemove' failed
>  make[1]: *** [duperemove] Error 1

Mips platform does not support 64-bit __sync_* operations, 
instead we need to use corresponding __atomic_* operations.
Linking with latomic is also necessary for mips32 arches.

Patch use-atomic-instead-sync.patch replaces __sync_add_and_fetch with 
corresponding __atomic_fetch_add functions.
Patch linking-with-latomic-as-needed.patch adds linking with latomic library as 
needed.

With these patches, package builds successfully on mips, mipsel, mips64el and 
i386.

Regards,
Radovan
--- duperemove-0.11~beta4.orig/Makefile
+++ duperemove-0.11~beta4/Makefile
@@ -53,6 +53,7 @@ endif
 override CFLAGS += -D_FILE_OFFSET_BITS=64 -DVERSTRING=\"$(RELEASE)\" \
 	$(hash_CFLAGS) $(glib_CFLAGS) $(sqlite_CFLAGS) -rdynamic $(DEBUG_FLAGS)
 LIBRARY_FLAGS += $(hash_LIBS) $(glib_LIBS) $(sqlite_LIBS) -lm
+LIBRARY_FLAGS += -Wl,--as-needed -latomic
 
 # make C=1 to enable sparse
 ifdef C
--- duperemove-0.11~beta4.orig/file_scan.c
+++ duperemove-0.11~beta4/file_scan.c
@@ -660,7 +660,7 @@ static void csum_whole_file_init(GMutex
 	unsigned long long cur_scan_files;
 	*mutex = g_dataset_get_data(location, "mutex");
 
-	cur_scan_files = __sync_add_and_fetch(&_cur_scan_files, 1);
+	cur_scan_files = __atomic_fetch_add(&_cur_scan_files, 1, __ATOMIC_SEQ_CST);
 
 	printf("[%0*llu/%llu] (%05.2f%%) csum: %s\n",
 	       leading_spaces, cur_scan_files, files_to_scan,
--- duperemove-0.11~beta4.orig/run_dedupe.c
+++ duperemove-0.11~beta4/run_dedupe.c
@@ -476,7 +476,7 @@ static int extent_dedupe_worker(struct d
 				uint64_t *fiemap_bytes, uint64_t *kern_bytes)
 {
 	int ret;
-	unsigned long long passno = __sync_add_and_fetch(&curr_dedupe_pass, 1);
+	unsigned long long passno = __atomic_fetch_add(&curr_dedupe_pass, 1, __ATOMIC_SEQ_CST);
 
 	ret = dedupe_extent_list(dext, fiemap_bytes, kern_bytes, passno);
 	if (ret) {
@@ -653,7 +653,7 @@ static int block_dedupe_worker(struct bl
 {
 	int ret;
 	struct results_tree res;
-	unsigned long long passno = __sync_add_and_fetch(&curr_dedupe_pass, 1);
+	unsigned long long passno =  __atomic_fetch_add(&curr_dedupe_pass, 1, __ATOMIC_SEQ_CST);
 
 	init_results_tree(&res);
 
@@ -798,8 +798,8 @@ static int __push_blocks(struct hash_tre
 						goto out;
 					bdl = NULL;
 
-					__sync_add_and_fetch(
-						&total_dedupe_passes, 1);
+					 __atomic_fetch_add(
+						&total_dedupe_passes, 1, __ATOMIC_SEQ_CST);
 					break;
 				}
 			}

Reply via email to