From b0441df0643b140fbffef4f67296d4bbd5e47698 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Tue, 11 Nov 2014 01:50:54 +0100 Subject: [PATCH] Implemented library versioning on MacOS X (needs more work) --- src/makefile.c | 51 +++++++++++++++++++++++++++-------- tests/library/Makefile.Darwin | 10 +++---- 2 files changed, 45 insertions(+), 16 deletions(-) diff --git a/src/makefile.c b/src/makefile.c index 0b81fc9..bbad6c8 100644 --- a/src/makefile.c +++ b/src/makefile.c @@ -335,12 +335,21 @@ static int _variables_targets_library(Configure * configure, FILE * fp, soext = configure_get_soext(configure); if((p = config_get(configure->config, target, "soname")) != NULL) soname = string_new(p); + else if(configure->os == HO_MACOSX) + /* versioning is different on MacOS X */ + soname = string_new_append(target, ".0.0", soext, NULL); else soname = string_new_append(target, soext, ".0", NULL); if(soname == NULL) return 1; - fprintf(fp, " %s%s%s%s%s%s%s%s%s", "$(OBJDIR)", target, ".a $(OBJDIR)", - soname, ".0 ", soname, " ", target, soext); + if(configure->os == HO_MACOSX) + fprintf(fp, " %s%s%s%s%s%s%s%s%s%s%s", "$(OBJDIR)", target, + ".a $(OBJDIR)", soname, " ", target, ".0", + soext, " ", target, soext); + else + fprintf(fp, " %s%s%s%s%s%s%s%s%s", "$(OBJDIR)", target, + ".a $(OBJDIR)", soname, ".0 ", soname, " ", + target, soext); string_delete(soname); return 0; } @@ -1136,22 +1145,32 @@ static int _target_library(Configure * configure, FILE * fp, fprintf(fp, "%s%s%s", "\t$(RANLIB) $(OBJDIR)", target, ".a\n"); if((p = config_get(configure->config, target, "soname")) != NULL) soname = string_new(p); + else if(configure->os == HO_MACOSX) + /* versioning is different on MacOS X */ + soname = string_new_append(target, ".0.0", soext, NULL); else soname = string_new_append(target, soext, ".0", NULL); if(soname == NULL) return 1; - fprintf(fp, "\n%s%s%s%s%s%s%s%s%s%s", "$(OBJDIR)", soname, ".0 ", - soname, " ", target, soext, ": $(", target, "_OBJS)"); + if(configure->os != HO_MACOSX) + fprintf(fp, "\n%s%s%s%s%s%s%s%s%s%s", "$(OBJDIR)", soname, + ".0 ", soname, " ", target, soext, ": $(", + target, "_OBJS)"); + else + fprintf(fp, "\n%s%s%s%s%s%s%s%s%s%s%s%s", "$(OBJDIR)", soname, + " ", target, ".0", soext, " ", target, soext, + ": $(", target, "_OBJS)"); if((p = config_get(configure->config, target, "depends")) != NULL) fprintf(fp, " %s", p); fputc('\n', fp); - fprintf(fp, "%s%s%s", "\t$(CCSHARED) -o $(OBJDIR)", soname, ".0"); + fprintf(fp, "%s%s%s", "\t$(CCSHARED) -o ", soname, + (configure->os != HO_MACOSX) ? ".0" : ""); /* soname is not available on MacOS X */ if(configure->os != HO_MACOSX) fprintf(fp, "%s%s", " -Wl,-soname,", soname); else if((p = config_get(configure->config, target, "install")) != NULL) - fprintf(fp, "%s%s%s%s%s", " -install_name ", p, "/", target, - soext); + fprintf(fp, "%s%s%s%s%s%s", " -install_name ", p, "/", target, + ".0", soext); fprintf(fp, "%s%s%s%s%s", " $(", target, "_OBJS) $(", target, "_LDFLAGS)"); if(q != NULL) @@ -1162,10 +1181,20 @@ static int _target_library(Configure * configure, FILE * fp, free(q); } fputc('\n', fp); - fprintf(fp, "%s%s%s%s%s", "\t$(LN) -s -- ", soname, ".0 $(OBJDIR)", - soname, "\n"); - fprintf(fp, "%s%s%s%s%s%s", "\t$(LN) -s -- ", soname, ".0 $(OBJDIR)", - target, soext, "\n"); + if(configure->os != HO_MACOSX) + { + fprintf(fp, "%s%s%s%s%s", "\t$(LN) -s -- ", soname, + ".0 $(OBJDIR)", soname, "\n"); + fprintf(fp, "%s%s%s%s%s%s", "\t$(LN) -s -- ", soname, + ".0 $(OBJDIR)", target, soext, "\n"); + } + else + { + fprintf(fp, "%s%s%s%s%s", "\t$(LN) -s -- ", soname, + ".0 $(OBJDIR)", soname, "\n"); + fprintf(fp, "%s%s%s%s%s%s", "\t$(LN) -s -- ", soname, + ".0 $(OBJDIR)", target, soext, "\n"); + } string_delete(soname); return 0; } diff --git a/tests/library/Makefile.Darwin b/tests/library/Makefile.Darwin index 8c987b4..9ff6dcb 100644 --- a/tests/library/Makefile.Darwin +++ b/tests/library/Makefile.Darwin @@ -1,4 +1,4 @@ -TARGETS = libtest.a libtest.dylib.0.0 libtest.dylib.0 libtest.dylib +TARGETS = libtest.a libtest.0.0.dylib libtest.0.dylib libtest.dylib PREFIX = /usr/local DESTDIR = LIBDIR = $(PREFIX)/lib @@ -21,10 +21,10 @@ libtest.a: $(libtest_OBJS) $(AR) -rc libtest.a $(libtest_OBJS) $(RANLIB) libtest.a -libtest.dylib.0.0 libtest.dylib.0 libtest.dylib: $(libtest_OBJS) - $(CCSHARED) -o libtest.dylib.0.0 $(libtest_OBJS) $(libtest_LDFLAGS) - $(LN) -s -- libtest.dylib.0.0 libtest.dylib.0 - $(LN) -s -- libtest.dylib.0.0 libtest.dylib +libtest.0.0.dylib libtest.0.dylib libtest.dylib: $(libtest_OBJS) + $(CCSHARED) -o libtest.0.0.dylib $(libtest_OBJS) $(libtest_LDFLAGS) + $(LN) -s -- libtest.0.0.dylib libtest.0.dylib + $(LN) -s -- libtest.0.0.dylib libtest.dylib test.o: test.c $(CC) $(libtest_CFLAGS) -c test.c