Uploaded image for project: 'C Driver'
  1. C Driver
  2. CDRIVER-141

C driver building problems

    • Type: Icon: Bug Bug
    • Resolution: Done
    • Priority: Icon: Major - P3 Major - P3
    • 0.6
    • Affects Version/s: 0.5.2, 0.6
    • Component/s: None
    • Labels:
      None
    • Environment:
      Oracle Linux 6, x64, standard packages only

      There seems to be a bit of a mess with SConstruct and Makefile.

      I'm gonna bundle all of my observations together, sorry, I don't know how to quite sort them out.

      1) Building with Makefile is broken. See, the produced .so file(s) have no actual exported symbols in them.

      [vps@druid]~/ws/EF/mongo-c-driver$ make
      cc -o src/bson.o -c -std=c99 -pedantic  -O3 -Wall -ggdb  -D_POSIX_SOURCE -DMONGO_HAVE_STDINT src/bson.c
      cc -o src/encoding.o -c -std=c99 -pedantic  -O3 -Wall -ggdb  -D_POSIX_SOURCE -DMONGO_HAVE_STDINT src/encoding.c
      cc -o src/gridfs.o -c -std=c99 -pedantic  -O3 -Wall -ggdb  -D_POSIX_SOURCE -DMONGO_HAVE_STDINT src/gridfs.c
      cc -o src/md5.o -c -std=c99 -pedantic  -O3 -Wall -ggdb  -D_POSIX_SOURCE -DMONGO_HAVE_STDINT src/md5.c
      cc -o src/mongo.o -c -std=c99 -pedantic  -O3 -Wall -ggdb  -D_POSIX_SOURCE -DMONGO_HAVE_STDINT src/mongo.c
      cc -o src/numbers.o -c -std=c99 -pedantic  -O3 -Wall -ggdb  -D_POSIX_SOURCE -DMONGO_HAVE_STDINT src/numbers.c
      cc -o src/env_posix.o -c -std=c99 -pedantic  -O3 -Wall -ggdb  -D_POSIX_SOURCE -DMONGO_HAVE_STDINT src/env_posix.c
      cc -shared -Wl,-soname,libmongoc.so.0.5 -o libmongoc.so 
      cc -shared -Wl,-soname,libbson.so.0.5 -o libbson.so 
      ar -rs libmongoc.a src/bson.o src/encoding.o src/gridfs.o src/md5.o src/mongo.o src/numbers.o src/env_posix.o
      ar: creating libmongoc.a
      ar -rs libbson.a src/bson.o src/numbers.o src/encoding.o
      ar: creating libbson.a
      [vps@druid]~/ws/EF/mongo-c-driver$ nm libmongoc.so | grep mongo
      [vps@druid]~/ws/EF/mongo-c-driver$ 
      

      That's because (a) the object files are not listed in the linkage command, and (b), object files are not compile with relocatable symbols.

      This diff should take care of that problem:

      diff --git a/Makefile b/Makefile
      index 99c9dd8..c7bdfda 100644
      --- a/Makefile
      +++ b/Makefile
      @@ -136,14 +136,17 @@ md5.o: src/md5.c src/md5.h
       mongo.o: src/mongo.c src/mongo.h src/bson.h src/md5.h src/env.h
       numbers.o: src/numbers.c
       
      -$(MONGO_DYLIBNAME): $(MONGO_OBJECTS)
      -       $(MONGO_DYLIB_MAKE_CMD)
      +DYN_MONGO_OBJECTS=$(foreach i,$(MONGO_OBJECTS),$(i)s)
      +DYN_BSON_OBJECTS=$(foreach i,$(MONGO_OBJECTS),$(i)s)
      +
      +$(MONGO_DYLIBNAME): $(DYN_MONGO_OBJECTS)
      +       $(MONGO_DYLIB_MAKE_CMD) $^
       
       $(MONGO_STLIBNAME): $(MONGO_OBJECTS)
              $(AR) -rs $@ $(MONGO_OBJECTS)
       
      -$(BSON_DYLIBNAME): $(BSON_OBJECTS)
      -       $(BSON_DYLIB_MAKE_CMD)
      +$(BSON_DYLIBNAME): $(DYN_BSON_OBJECTS)
      +       $(BSON_DYLIB_MAKE_CMD) $^
       
       $(BSON_STLIBNAME): $(BSON_OBJECTS)
              $(AR) -rs $@ $(BSON_OBJECTS)
      @@ -170,7 +173,7 @@ docs:
              python docs/buildscripts/docs.py
       
       clean:
      -       rm -rf $(MONGO_DYLIBNAME) $(MONGO_STLIBNAME) $(BSON_DYLIBNAME) $(BSON_STLIBNAME) src/*.o test/*_test
      +       rm -rf $(MONGO_DYLIBNAME) $(MONGO_STLIBNAME) $(BSON_DYLIBNAME) $(BSON_STLIBNAME) src/*.o src/*.os test/*_test
       
       deps:
              $(CC) -MM -DMONGO_HAVE_STDINT src/*.c
      @@ -184,4 +187,10 @@ deps:
       %.o: %.c
              $(CC) -o $@ -c $(ALL_CFLAGS) $<
       
      +
      +%.os: %.c
      +       $(CC) -o $@ -c $(ALL_CFLAGS) $(DYN_FLAGS) $<
      +
      +%.os: DYN_FLAGS :=  -fPIC -DMONGO_DLL_BUILD
      +
       .PHONY: clean docs
      

      Ok, now, though Makefile doesn't build right, SCons doesn't install right.
      I never had any dealings with SCons before this project, so I don't know how to quite address this, but the two things to address are:

      (1) Creating shared library - installing .so is not enough, because soname is set to libsome-so.ver, the dynamic linker will insist on looking for that exact file during execution. The links must be installed properly.
      (2) Specifying where to install:

      for installing via Makefile, you can at least do:

      sudo INSTALL_INCLUDE_PATH=/usr/local/mongo-0.6/include INSTALL_LIBRARY_PATH=/usr/local/mongo-0.6/lib make install
      

      but with SCons, there is no indication on how to specify where the installation should be done.

      Thanks, Pawel.

            Assignee:
            kbanker Kyle Banker
            Reporter:
            pawel Pawel
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: