1
2# Build environment can be configured the following
3# environment variables:
4#   CC : Specify the C compiler to use
5#   CFLAGS : Specify compiler options to use
6#   LDFLAGS : Specify linker options to use
7#   CPPFLAGS : Specify c-preprocessor options to use
8
9# Extract version from libmseed.h, expected line should include LIBMSEED_VERSION "#.#.#"
10MAJOR_VER = $(shell grep LIBMSEED_VERSION libmseed.h | grep -Eo '[0-9]+.[0-9]+.[0-9]+' | cut -d . -f 1)
11FULL_VER = $(shell grep LIBMSEED_VERSION libmseed.h | grep -Eo '[0-9]+.[0-9]+.[0-9]+')
12COMPAT_VER = $(MAJOR_VER).0.0
13
14# Default settings for install target
15PREFIX ?= /usr/local
16EXEC_PREFIX ?= $(PREFIX)
17LIBDIR ?= $(EXEC_PREFIX)/lib
18INCLUDEDIR ?= $(PREFIX)/include
19DATAROOTDIR ?= $(PREFIX)/share
20DOCDIR ?= $(DATAROOTDIR)/doc/libmseed
21MANDIR ?= $(DATAROOTDIR)/man
22MAN3DIR ?= $(MANDIR)/man3
23
24LIB_SRCS = fileutils.c genutils.c gswap.c lmplatform.c lookup.c \
25           msrutils.c pack.c packdata.c traceutils.c tracelist.c \
26           parseutils.c unpack.c unpackdata.c selection.c logging.c
27
28LIB_OBJS = $(LIB_SRCS:.c=.o)
29LIB_DOBJS = $(LIB_SRCS:.c=.lo)
30
31LIB_A = libmseed.a
32LIB_SO_BASE = libmseed.so
33LIB_SO_NAME = $(LIB_SO_BASE).$(MAJOR_VER)
34LIB_SO = $(LIB_SO_BASE).$(FULL_VER)
35LIB_DYN_NAME = libmseed.dylib
36LIB_DYN = libmseed.$(FULL_VER).dylib
37LIB_FILES = Blarg
38
39all: static
40
41static: $(LIB_A)
42
43# Build dynamic (.dylib) on macOS/Darwin, otherwise shared (.so)
44shared dynamic:
45ifeq ($(shell uname -s),Darwin)
46	$(MAKE) $(LIB_DYN)
47else
48	$(MAKE) $(LIB_SO)
49endif
50
51# Build static library
52$(LIB_A): $(LIB_OBJS)
53	@echo "Building static library $(LIB_A)"
54	$(RM) -f $(LIB_A)
55	$(AR) -crs $(LIB_A) $(LIB_OBJS)
56
57# Build shared library using GCC-style options
58$(LIB_SO): $(LIB_DOBJS)
59	@echo "Building shared library $(LIB_SO)"
60	$(RM) -f $(LIB_SO) $(LIB_SONAME) $(LIB_SO_BASE)
61	$(CC) $(CFLAGS) $(LDFLAGS) -shared -Wl,--version-script=libmseed.map -Wl,-soname,$(LIB_SO_NAME) -o $(LIB_SO) $(LIB_DOBJS)
62	ln -s $(LIB_SO) $(LIB_SO_BASE)
63	ln -s $(LIB_SO) $(LIB_SO_NAME)
64
65# Build dynamic library (usually for macOS)
66$(LIB_DYN): $(LIB_DOBJS)
67	@echo "Building dynamic library $(LIB_DYN)"
68	$(RM) -f $(LIB_DYN) $(LIB_DYN_NAME)
69	$(CC) $(CFLAGS) -dynamiclib -compatibility_version $(COMPAT_VER) -current_version $(FULL_VER) -install_name $(LIB_DYN_NAME) -o $(LIB_DYN) $(LIB_DOBJS)
70	ln -sf $(LIB_DYN) $(LIB_DYN_NAME)
71
72test check: static FORCE
73	@$(MAKE) -C test test
74
75clean:
76	@$(RM) -f $(LIB_OBJS) $(LIB_DOBJS) $(LIB_A) $(LIB_SO) $(LIB_SO_NAME) $(LIB_SO_BASE) $(LIB_DYN) $(LIB_DYN_NAME)
77	@$(MAKE) -C test clean
78	@echo "All clean."
79
80install: shared
81	@echo "Installing into $(PREFIX)"
82	@mkdir -p $(DESTDIR)$(PREFIX)/include
83	@cp libmseed.h $(DESTDIR)$(PREFIX)/include
84	@mkdir -p $(DESTDIR)$(LIBDIR)/pkgconfig
85ifneq ("$(wildcard $(LIB_SO))","")
86	@cp -a $(LIB_SO_BASE) $(LIB_SO_NAME) $(LIB_SO) $(DESTDIR)$(LIBDIR)
87endif
88ifneq ("$(wildcard $(LIB_DYN))","")
89	@cp -a $(LIB_DYN_NAME) $(LIB_DYN) $(DESTDIR)$(LIBDIR)
90endif
91	@sed -e 's|@prefix@|$(PREFIX)|g' \
92	     -e 's|@exec_prefix@|$(EXEC_PREFIX)|g' \
93	     -e 's|@libdir@|$(LIBDIR)|g' \
94	     -e 's|@includedir@|$(PREFIX)/include|g' \
95	     -e 's|@PACKAGE_NAME@|libmseed|g' \
96	     -e 's|@PACKAGE_URL@|http://ds.iris.edu/ds/nodes/dmc/software/downloads/libmseed/|g' \
97	     -e 's|@VERSION@|$(FULL_VER)|g' \
98	     mseed.pc.in > $(DESTDIR)$(LIBDIR)/pkgconfig/mseed.pc
99	@mkdir -p $(DESTDIR)$(DOCDIR)/example
100	@cp -r example $(DESTDIR)$(DOCDIR)/
101	@cp doc/libmseed-UsersGuide $(DESTDIR)$(DOCDIR)/
102	@mkdir -p $(DESTDIR)$(MAN3DIR)
103	@cp -a doc/ms*.3 $(DESTDIR)$(MAN3DIR)/
104
105.SUFFIXES: .c .o .lo
106
107# Standard object building
108.c.o:
109	$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
110
111# Standard object building for dynamic library components using -fPIC
112.c.lo:
113	$(CC) $(CPPFLAGS) $(CFLAGS) -fPIC -c $< -o $@
114
115FORCE:
116