The biglink script basically creates a single library from everything it finds in build/objects/*so.o
But the zope objects are sometimes defining the same symbols, for example this is the implementation of _IFBTree.c:
/* IFBTree - int key, float value BTree
Implements a collection using int type keys
and float type values
*/
/* Setup template macros */
#define PERSISTENT
#define MOD_NAME_PREFIX "IF"
#define DEFAULT_MAX_BUCKET_SIZE 120
#define DEFAULT_MAX_BTREE_SIZE 500
#include "_compat.h"
#include "intkeymacros.h"
#include "floatvaluemacros.h"
#ifdef PY3K
#define INITMODULE PyInit__IFBTree
#else
#define INITMODULE init_IFBTree
#endif
#include "BTreeModuleTemplate.c"
And _IIBTree.c:
/* IIBTree - int key, int value BTree
Implements a collection using int type keys
and int type values
*/
/* Setup template macros */
#define PERSISTENT
#define MOD_NAME_PREFIX "II"
#define DEFAULT_MAX_BUCKET_SIZE 120
#define DEFAULT_MAX_BTREE_SIZE 500
#include "_compat.h"
#include "intkeymacros.h"
#include "intvaluemacros.h"
#ifdef PY3K
#define INITMODULE PyInit__IIBTree
#else
#define INITMODULE init_IIBTree
#endif
#include "BTreeModuleTemplate.c"
As you see, both include BTreeModuleTemplate.c, therefore name clashes between functions are unavoidable if the resulting .o files are merged together.
In your case, you can exclude the conflicting objects from the resulting library:
diff --git a/src/tools/biglink b/src/tools/biglink
index 1f82d18..7b05fb5 100755
--- a/src/tools/biglink
+++ b/src/tools/biglink
@@ -7,9 +7,24 @@ import subprocess
sofiles = [ ]
+blacklist = [
+ '_LOBTree.so', '_LLBTree.so', 'cPersistence.so', '_zope_', 'cPickleCache.so',
+ '_LFBTree.so', '_OOBTree.so', '_IIBTree.so', '_OLBTree.so', '_IFBTree.so',
+ '_IOBTree.so', '_fsBTree.so',
+]
+
+def is_blacklisted(fn):
+ for name in blacklist:
+ if fn.startswith(name):
+ return True
+ return False
+
+
for directory in sys.argv[2:]:
for fn in os.listdir(directory):
+ if is_blacklisted(fn):
+ continue
fn = os.path.join(directory, fn)
if not fn.endswith(".so.o"):