瀏覽代碼

Makefile: Redo with library versioning

And remove special handling of SunOs
Max Bruckner 8 年之前
父節點
當前提交
778bcd1a62
共有 1 個文件被更改,包括 120 次插入39 次删除
  1. 120 39
      Makefile

+ 120 - 39
Makefile

@@ -1,6 +1,15 @@
-OBJ = cJSON.o
-LIBNAME = libcjson
-TESTS = test
+CJSON_OBJ = cJSON.o
+UTILS_OBJ = cJSON_Utils.o
+CJSON_LIBNAME = libcjson
+UTILS_LIBNAME = libcjson_utils
+CJSON_TEST = cJSON_test
+UTILS_TEST = cJSON_test_utils
+
+LDLIBS = -lm
+
+LIBVERSION = 1.0.0
+CJSON_SOVERSION = 1
+UTILS_SOVERSION = 1
 
 PREFIX ?= /usr/local
 INCLUDE_PATH ?= include/cjson
@@ -11,54 +20,126 @@ INSTALL_LIBRARY_PATH = $(DESTDIR)$(PREFIX)/$(LIBRARY_PATH)
 
 INSTALL ?= cp -a
 
-R_CFLAGS = -fpic $(CFLAGS) -Wall -Werror -Wstrict-prototypes -Wwrite-strings -D_POSIX_C_SOURCE=200112L
+R_CFLAGS = -fPIC -ansi -pedantic -Wall -Werror -Wstrict-prototypes -Wwrite-strings $(CFLAGS)
 
-uname_S := $(shell sh -c 'uname -s 2>/dev/null || echo false')
+uname := $(shell sh -c 'uname -s 2>/dev/null || echo false')
 
-## shared lib
-DYLIBNAME = $(LIBNAME).so 
-DYLIBCMD = $(CC) -shared -o $(DYLIBNAME)
+#library file extensions
+SHARED = so
+STATIC = a
 
 ## create dynamic (shared) library on Darwin (base OS for MacOSX and IOS)
-ifeq (Darwin, $(uname_S))
-  DYLIBNAME = $(LIBNAME).dylib
-## create dyanmic (shared) library on SunOS
-else ifeq (SunOS, $(uname_S))
-  DYLIBCMD = $(CC) -G -o $(DYLIBNAME)
-  INSTALL = cp -r
+ifeq (Darwin, $(uname))
+	SHARED = dylib
 endif
 
-## static lib
-STLIBNAME = $(LIBNAME).a
+#cJSON library names
+CJSON_SHARED = $(CJSON_LIBNAME).$(SHARED)
+CJSON_SHARED_VERSION = $(CJSON_LIBNAME).$(SHARED).$(LIBVERSION)
+CJSON_SHARED_SO = $(CJSON_LIBNAME).$(SHARED).$(CJSON_SOVERSION)
+CJSON_STATIC = $(CJSON_LIBNAME).$(STATIC)
 
-.PHONY: all clean install
+#cJSON_Utils library names
+UTILS_SHARED = $(UTILS_LIBNAME).$(SHARED)
+UTILS_SHARED_VERSION = $(UTILS_LIBNAME).$(SHARED).$(LIBVERSION)
+UTILS_SHARED_SO = $(UTILS_LIBNAME).$(SHARED).$(UTILS_SOVERSION)
+UTILS_STATIC = $(UTILS_LIBNAME).$(STATIC)
 
-all: $(DYLIBNAME) $(STLIBNAME) $(TESTS)
+SHARED_CMD = $(CC) -shared -o
 
-$(DYLIBNAME): $(OBJ)
-		$(DYLIBCMD) $< $(LDFLAGS)
-	
-$(STLIBNAME): $(OBJ)
-		$(AR) rcs $@ $<
+.PHONY: all shared static tests clean install
 
-$(OBJ): cJSON.c cJSON.h 
+all: shared static tests
 
-.c.o:
-		$(CC) -ansi -pedantic -c $(R_CFLAGS) $<
+shared: $(CJSON_SHARED) $(UTILS_SHARED)
 
-$(TESTS): cJSON.c cJSON.h test.c
-		$(CC)  cJSON.c test.c -o test -lm -I.
+static: $(CJSON_STATIC) $(UTILS_STATIC)
 
-install: $(DYLIBNAME) $(STLIBNAME)
-		mkdir -p $(INSTALL_LIBRARY_PATH) $(INSTALL_INCLUDE_PATH)
-		$(INSTALL) cJSON.h $(INSTALL_INCLUDE_PATH)
-		$(INSTALL) $(DYLIBNAME) $(INSTALL_LIBRARY_PATH)
-		$(INSTALL) $(STLIBNAME) $(INSTALL_LIBRARY_PATH)
+tests: $(CJSON_TEST) $(UTILS_TEST)
 
-uninstall:
-		rm -rf $(INSTALL_LIBRARY_PATH)/$(DYLIBNAME)
-		rm -rf $(INSTALL_LIBRARY_PATH)/$(STLIBNAME)
-		rm -rf $(INSTALL_INCLUDE_PATH)/cJSON.h
+test: tests
+	./$(CJSON_TEST)
+	./$(UTILS_TEST)
 
-clean: 
-		rm -rf $(DYLIBNAME) $(STLIBNAME) $(TESTS) *.o
+.c.o:
+	$(CC) -ansi -pedantic -c $(R_CFLAGS) $<
+
+#tests
+#cJSON
+$(CJSON_TEST): cJSON.c cJSON.h test.c
+	$(CC) $^ -o $@ $(LDLIBS) -I.
+#cJSON_Utils
+$(UTILS_TEST): cJSON.c cJSON.h test.c
+	$(CC) $^ -o $@ $(LDLIBS) -I.
+
+#static libraries
+#cJSON
+$(CJSON_STATIC): $(CJSON_OBJ)
+	$(AR) rcs $@ $<
+#cJSON_Utils
+$(UTILS_STATIC): $(UTILS_OBJ)
+	$(AR) rcs $@ $<
+
+#shared libraries .so.1.0.0
+#cJSON
+$(CJSON_SHARED_VERSION): $(CJSON_OBJ)
+	$(CC) -shared -o $@ $< $(LDFLAGS)
+#cJSON_Utils
+$(UTILS_SHARED_VERSION): $(UTILS_OBJ)
+	$(CC) -shared -o $@ $< $(LDFLAGS)
+
+#objects
+#cJSON
+$(CJSON_OBJ): cJSON.c cJSON.h
+#cJSON_Utils
+$(UTILS_OBJ): cJSON_Utils.c cJSON_Utils.h
+
+
+#links .so -> .so.1 -> .so.1.0.0
+#cJSON
+$(CJSON_SHARED_SO): $(CJSON_SHARED_VERSION)
+	ln -s $(CJSON_SHARED_VERSION) $(CJSON_SHARED_SO)
+$(CJSON_SHARED): $(CJSON_SHARED_SO)
+	ln -s $(CJSON_SHARED_SO) $(CJSON_SHARED)
+#cJSON_Utils
+$(UTILS_SHARED_SO): $(UTILS_SHARED_VERSION)
+	ln -s $(UTILS_SHARED_VERSION) $(UTILS_SHARED_SO)
+$(UTILS_SHARED): $(UTILS_SHARED_SO)
+	ln -s $(UTILS_SHARED_SO) $(UTILS_SHARED)
+
+#install
+#cJSON
+install-cjson:
+	mkdir -p $(INSTALL_LIBRARY_PATH) $(INSTALL_INCLUDE_PATH)
+	$(INSTALL) cJSON.h $(INSTALL_INCLUDE_PATH)
+	$(INSTALL) $(CJSON_SHARED) $(CJSON_SHARED_SO) $(CJSON_SHARED_VERSION) $(INSTALL_LIBRARY_PATH)
+#cJSON_Utils
+install-utils: install-cjson
+	$(INSTALL) cJSON_Utils.h $(INSTALL_INCLUDE_PATH)
+	$(INSTALL) $(UTILS_SHARED) $(UTILS_SHARED_SO) $(UTILS_SHARED_VERSION) $(INSTALL_LIBRARY_PATH)
+
+install: install-cjson install-utils
+
+#uninstall
+#cJSON
+uninstall-cjson: uninstall-utils
+	$(RM) $(INSTALL_LIBRARY_PATH)/$(CJSON_SHARED)
+	$(RM) $(INSTALL_LIBRARY_PATH)/$(CJSON_SHARED_VERSION)
+	$(RM) $(INSTALL_LIBRARY_PATH)/$(CJSON_SHARED_SO)
+	rmdir $(INSTALL_LIBRARY_PATH)
+	$(RM) $(INSTALL_INCLUDE_PATH)/cJSON.h
+	rmdir $(INSTALL_INCLUDE_PATH)
+#cJSON_Utils
+uninstall-utils:
+	$(RM) $(INSTALL_LIBRARY_PATH)/$(UTILS_SHARED)
+	$(RM) $(INSTALL_LIBRARY_PATH)/$(UTILS_SHARED_VERSION)
+	$(RM) $(INSTALL_LIBRARY_PATH)/$(UTILS_SHARED_SO)
+	$(RM) $(INSTALL_INCLUDE_PATH)/cJSON_Utils.h
+
+uninstall: uninstall-utils uninstall-cjson
+
+clean:
+	$(RM) $(CJSON_OBJ) $(UTILS_OBJ) #delete object files
+	$(RM) $(CJSON_SHARED) $(CJSON_SHARED_VERSION) $(CJSON_SHARED_SO) $(CJSON_STATIC) #delete cJSON
+	$(RM) $(UTILS_SHARED) $(UTILS_SHARED_VERSION) $(UTILS_SHARED_SO) $(UTILS_STATIC) #delete cJSON_Utils
+	$(RM) $(CJSON_TEST) $(UTILS_TEST) #delete tests