oracle / odpi

ODPI-C: Oracle Database Programming Interface for Drivers and Applications
https://oracle.github.io/odpi/
Other
268 stars 78 forks source link

Separate LDFLAGS in Makefile #1

Closed kubo closed 7 years ago

kubo commented 7 years ago

Could you separate LDFLAGS in Makefile to LDFLAGS and LIBS and use $LIBS at the last position of the link command as follows? Conventionally LDFLAGS doesn't include dependent libraries and they are set to LIBS.

from

    LDFLAGS=-L$(OCI_LIB_DIR) -lclntsh -shared
   ... skip ...
$(LIB_DIR)/$(LIB_NAME): $(OBJS)
    $(LD) $(LDFLAGS) $(LIB_OUT_OPTS) $(OBJS)

to

    LDFLAGS=-shared
    LIBS=-L$(OCI_LIB_DIR) -lclntsh
   ... skip ...
$(LIB_DIR)/$(LIB_NAME): $(OBJS)
    $(LD) $(LDFLAGS) $(LIB_OUT_OPTS) $(OBJS) $(LIBS)

When odpi is compiled on Linux without the above changes, the -L$(OCI_LIB_DIR) -lcltnsh options is set just after gcc. But it takes no effect as follows.

$ make
mkdir build
mkdir lib
gcc -c -Iinclude -I/opt/instantclient/sdk/include -O2 -g -Wall -fPIC  src/dpiConn.c -obuild/dpiConn.o
gcc -c -Iinclude -I/opt/instantclient/sdk/include -O2 -g -Wall -fPIC  src/dpiContext.c -obuild/dpiContext.o
   ... skip ...
gcc -c -Iinclude -I/opt/instantclient/sdk/include -O2 -g -Wall -fPIC  src/dpiMsgProps.c -obuild/dpiMsgProps.o
gcc -c -Iinclude -I/opt/instantclient/sdk/include -O2 -g -Wall -fPIC  src/dpiRowid.c -obuild/dpiRowid.o
gcc -L/opt/instantclient -lclntsh -shared -o lib/libodpic.so build/dpiConn.o build/dpiContext.o build/dpiData.o build/dpiEnv.o build/dpiError.o build/dpiGen.o build/dpiGlobal.o build/dpiLob.o build/dpiObject.o build/dpiObjectAttr.o build/dpiObjectType.o build/dpiPool.o build/dpiStmt.o build/dpiUtils.o build/dpiVar.o build/dpiOracleType.o build/dpiSubscr.o build/dpiDeqOptions.o build/dpiEnqOptions.o build/dpiMsgProps.o build/dpiRowid.o
$ ldd lib/libodpic.so 
    linux-vdso.so.1 =>  (0x00007ffd581f0000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f788b44d000)
    /lib64/ld-linux-x86-64.so.2 (0x00005572bb26f000)

libodpic.so doesn't depend on libclntsh.so.

If -L/opt/instantclient -lclntsh is set at last. libodpic.so depends on libclntsh.so.

$ gcc -shared -o lib/libodpic.so build/dpiConn.o build/dpiContext.o build/dpiData.o build/dpiEnv.o build/dpiError.o build/dpiGen.o build/dpiGlobal.o build/dpiLob.o build/dpiObject.o build/dpiObjectAttr.o build/dpiObjectType.o build/dpiPool.o build/dpiStmt.o build/dpiUtils.o build/dpiVar.o build/dpiOracleType.o build/dpiSubscr.o build/dpiDeqOptions.o build/dpiEnqOptions.o build/dpiMsgProps.o build/dpiRowid.o -L/opt/instantclient -lclntsh
$ ldd lib/libodpic.so 
    linux-vdso.so.1 =>  (0x00007ffdeb6bd000)
    libclntsh.so.12.1 => /opt/instantclient/libclntsh.so.12.1 (0x00007f0b285c5000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0b281d8000)
    libmql1.so => /opt/instantclient/libmql1.so (0x00007f0b27f61000)
    libipc1.so => /opt/instantclient/libipc1.so (0x00007f0b27be3000)
    libnnz12.so => /opt/instantclient/libnnz12.so (0x00007f0b274d9000)
    libons.so => /opt/instantclient/libons.so (0x00007f0b27293000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f0b2708f000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0b26d86000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f0b26b68000)
    libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007f0b2694f000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f0b26747000)
    /lib64/ld-linux-x86-64.so.2 (0x0000562a4e5cf000)
    libaio.so.1 => /lib/x86_64-linux-gnu/libaio.so.1 (0x00007f0b26544000)
    libclntshcore.so.12.1 => /opt/instantclient/libclntshcore.so.12.1 (0x00007f0b25fd2000)

Off-topic: When I write Makefile, I won't use EXTRA_CFLAGS. I'll use CFLAGS += -DDPI_TRACE_REFS instead.

anthony-tuininga commented 7 years ago

@kubo I didn't notice the difference in dependencies that you saw but I agree that the changes you suggested are an improvement in any case. Thanks.