Skip to content

Commit 8ed0ee5

Browse files
Update Makefile for shared library build option and install headers in include/gslib subdirectory to prevent conflicts
1 parent dbab7c6 commit 8ed0ee5

File tree

1 file changed

+91
-61
lines changed

1 file changed

+91
-61
lines changed

Makefile

Lines changed: 91 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -2,127 +2,157 @@ MPI ?= 1
22
ADDUS ?= 1
33
USREXIT ?= 0
44
NBC ?= 0
5-
LIBNAME ?= gs
65
BLAS ?= 0
7-
DEBUG ?= 0
6+
87
CFLAGS ?= -O2
98
FFLAGS ?= -O2
9+
ARFLAGS ?= cr
10+
11+
LIBNAME ?= gs
1012
CPREFIX ?= gslib_
1113
FPREFIX ?= fgslib_
1214

13-
SRCROOT=.
14-
TESTDIR=$(SRCROOT)/tests
15-
FTESTDIR=$(TESTDIR)/fortran
16-
SRCDIR=$(SRCROOT)/src
17-
INCDIR=$(SRCROOT)/src
18-
LIBDIR=$(SRCROOT)/lib
15+
STATIC ?= 1
16+
SHARED ?= 0
17+
18+
SRCROOT = .
19+
TESTDIR = $(SRCROOT)/tests
20+
FTESTDIR = $(TESTDIR)/fortran
21+
SRCDIR = $(SRCROOT)/src
22+
INCDIR = $(SRCROOT)/src
23+
LIBDIR = $(SRCROOT)/lib
24+
25+
DARWIN := $(filter Darwin,$(shell uname -s))
26+
SO_EXT := $(if $(DARWIN),dylib,so)
1927

2028
ifneq (,$(strip $(DESTDIR)))
21-
INSTALL_ROOT = $(DESTDIR)
29+
INSTALL_ROOT = $(DESTDIR)
2230
else
23-
INSTALL_ROOT = $(SRCROOT)/build
31+
INSTALL_ROOT = $(SRCROOT)/build
32+
endif
33+
34+
ifneq (0,$(SHARED))
35+
ifneq (0,$(STATIC))
36+
$(warning Cannot build with both STATIC=1 and SHARED=1, setting SHARED=0)
37+
override SHARED = 0
38+
endif
39+
endif
40+
41+
ifneq (0,$(SHARED))
42+
ifeq ($(filter -fPIC,$(CFLAGS)),)
43+
override CFLAGS += -fPIC
44+
endif
45+
ifneq ($(DARWIN),)
46+
override LDFLAGS += -install_name @rpath/lib$(LIBNAME).$(SO_EXT)
47+
endif
2448
endif
2549

2650
$(shell >config.h)
2751
ifneq (0,$(MPI))
28-
SN=GSLIB_USE_MPI
29-
G:=$(G) -D$(SN)
52+
SN = GSLIB_USE_MPI
53+
G := $(G) -D$(SN)
54+
$(shell printf "#ifndef ${SN}\n#define ${SN}\n#endif\n" >>config.h)
3055
ifeq ($(origin CC),default)
3156
CC = mpicc
3257
endif
3358
ifeq ($(origin FC),default)
3459
FC = mpif77
3560
endif
36-
$(shell printf "#ifndef ${SN}\n#define ${SN}\n#endif\n" >>config.h)
3761
endif
3862

3963
ifneq (0,$(ADDUS))
40-
SN=UNDERSCORE
41-
G:=$(G) -D$(SN)
64+
SN = UNDERSCORE
65+
G := $(G) -D$(SN)
4266
$(shell printf "#ifndef ${SN}\n#define ${SN}\n#endif\n" >>config.h)
4367
endif
4468

45-
SN=GLOBAL_LONG_LONG
46-
G:=$(G) -D$(SN)
47-
$(shell printf "#ifndef ${SN}\n#define ${SN}\n#endif\n" >>config.h)
48-
49-
SN=PREFIX
50-
G:=$(G) -D$(SN)=$(CPREFIX)
69+
SN = PREFIX
70+
G := $(G) -D$(SN)=$(CPREFIX)
5171
$(shell printf "#ifndef ${SN}\n#define ${SN} ${CPREFIX}\n#endif\n" >>config.h)
5272

53-
SN=FPREFIX
54-
G:=$(G) -D$(SN)=$(FPREFIX)
73+
SN = FPREFIX
74+
G := $(G) -D$(SN)=$(FPREFIX)
5575
$(shell printf "#ifndef ${SN}\n#define ${SN} ${FPREFIX}\n#endif\n" >>config.h)
5676

77+
SN = GLOBAL_LONG_LONG
78+
G := $(G) -D$(SN)
79+
$(shell printf "#ifndef ${SN}\n#define ${SN}\n#endif\n" >>config.h)
80+
5781
ifneq (0,$(USREXIT))
58-
G+=-DUSE_USR_EXIT
82+
G += -DUSE_USR_EXIT
5983
endif
6084

6185
ifneq (0,$(NBC))
62-
G+=-DUSE_NBC
86+
G += -DUSE_NBC
6387
endif
6488

6589
ifeq (0,$(BLAS))
66-
SN=USE_NAIVE_BLAS
67-
G:=$(G) -D$(SN)
90+
SN = USE_NAIVE_BLAS
91+
G := $(G) -D$(SN)
6892
$(shell printf "#ifndef ${SN}\n#define ${SN}\n#endif\n" >>config.h)
6993
endif
7094

7195
ifeq (1,$(BLAS))
72-
G+=-DUSE_CBLAS
96+
SN = USE_CBLAS
97+
G := $(G) -D$(SN)
98+
$(shell printf "#ifndef ${SN}\n#define ${SN}\n#endif\n" >>config.h)
7399
endif
74100

75-
ifneq (0,$(DEBUG))
76-
G+=-DGSLIB_DEBUG
77-
CFLAGS+=-g
78-
endif
101+
CCCMD = $(CC) $(CFLAGS) -I$(INCDIR) $(G)
102+
FCCMD = $(FC) $(FFLAGS) -I$(INCDIR) $(G)
79103

80-
CCCMD=$(CC) $(CFLAGS) -I$(INCDIR) $(G)
81-
FCCMD=$(FC) $(FFLAGS) -I$(INCDIR) $(G)
104+
TESTS = $(TESTDIR)/sort_test $(TESTDIR)/sort_test2 $(TESTDIR)/sarray_sort_test \
105+
$(TESTDIR)/comm_test $(TESTDIR)/crystal_test \
106+
$(TESTDIR)/sarray_transfer_test $(TESTDIR)/gs_test \
107+
$(TESTDIR)/gs_test_gop_blocking $(TESTDIR)/gs_test_gop_nonblocking \
108+
$(TESTDIR)/gs_unique_test \
109+
$(TESTDIR)/findpts_el_2_test \
110+
$(TESTDIR)/findpts_el_2_test2 $(TESTDIR)/findpts_el_3_test \
111+
$(TESTDIR)/findpts_el_3_test2 $(TESTDIR)/findpts_local_test \
112+
$(TESTDIR)/findpts_test $(TESTDIR)/findpts_test_ms $(TESTDIR)/poly_test \
113+
$(TESTDIR)/lob_bnd_test $(TESTDIR)/obbox_test
82114

83-
TESTS=$(TESTDIR)/sort_test $(TESTDIR)/sort_test2 $(TESTDIR)/sarray_sort_test \
84-
$(TESTDIR)/comm_test $(TESTDIR)/crystal_test \
85-
$(TESTDIR)/sarray_transfer_test $(TESTDIR)/gs_test \
86-
$(TESTDIR)/gs_test_gop_blocking $(TESTDIR)/gs_test_gop_nonblocking \
87-
$(TESTDIR)/gs_unique_test \
88-
$(TESTDIR)/findpts_el_2_test \
89-
$(TESTDIR)/findpts_el_2_test2 $(TESTDIR)/findpts_el_3_test \
90-
$(TESTDIR)/findpts_el_3_test2 $(TESTDIR)/findpts_local_test \
91-
$(TESTDIR)/findpts_test $(TESTDIR)/findpts_test_ms $(TESTDIR)/poly_test \
92-
$(TESTDIR)/lob_bnd_test $(TESTDIR)/obbox_test
115+
FTESTS = $(FTESTDIR)/f-igs
93116

94-
FTESTS=$(FTESTDIR)/f-igs
117+
GS = $(SRCDIR)/gs.o $(SRCDIR)/sort.o $(SRCDIR)/sarray_transfer.o \
118+
$(SRCDIR)/sarray_sort.o $(SRCDIR)/gs_local.o $(SRCDIR)/fail.o \
119+
$(SRCDIR)/crystal.o $(SRCDIR)/comm.o $(SRCDIR)/tensor.o
95120

96-
GS=$(SRCDIR)/gs.o $(SRCDIR)/sort.o $(SRCDIR)/sarray_transfer.o \
97-
$(SRCDIR)/sarray_sort.o $(SRCDIR)/gs_local.o $(SRCDIR)/fail.o \
98-
$(SRCDIR)/crystal.o $(SRCDIR)/comm.o $(SRCDIR)/tensor.o
121+
FWRAPPER = $(SRCDIR)/fcrystal.o $(SRCDIR)/findpts.o
99122

100-
FWRAPPER=$(SRCDIR)/fcrystal.o $(SRCDIR)/findpts.o
101-
INTP=$(SRCDIR)/findpts_local.o $(SRCDIR)/obbox.o $(SRCDIR)/poly.o \
102-
$(SRCDIR)/lob_bnd.o $(SRCDIR)/findpts_el_3.o $(SRCDIR)/findpts_el_2.o
123+
INTP = $(SRCDIR)/findpts_local.o $(SRCDIR)/obbox.o $(SRCDIR)/poly.o \
124+
$(SRCDIR)/lob_bnd.o $(SRCDIR)/findpts_el_3.o $(SRCDIR)/findpts_el_2.o
103125

104126
.PHONY: all lib install tests clean objects
105127

106128
all : lib install
107129

108-
lib: $(GS) $(FWRAPPER) $(INTP)
109-
@$(AR) cr $(SRCDIR)/lib$(LIBNAME).a $?
110-
@ranlib $(SRCDIR)/lib$(LIBNAME).a
130+
lib: $(if $(filter-out 0,$(STATIC)),$(SRCDIR)/lib$(LIBNAME).a) $(if $(filter-out 0,$(SHARED)),$(SRCDIR)/lib$(LIBNAME).$(SO_EXT))
131+
132+
$(SRCDIR)/lib$(LIBNAME).a: $(GS) $(FWRAPPER) $(INTP)
133+
$(AR) $(ARFLAGS) $@ $^
134+
ranlib $@
135+
136+
$(SRCDIR)/lib$(LIBNAME).$(SO_EXT): $(GS) $(FWRAPPER) $(INTP)
137+
$(CC) $(CFLAGS) -shared -o $@ $^ $(LDFLAGS)
111138

112139
install: lib
113140
@mkdir -p $(INSTALL_ROOT)/lib 2>/dev/null
114-
@cp -v $(SRCDIR)/lib$(LIBNAME).a $(INSTALL_ROOT)/lib 2>/dev/null
115-
@mkdir -p $(INSTALL_ROOT)/include 2>/dev/null
116-
@cp $(SRCDIR)/*.h $(INSTALL_ROOT)/include 2>/dev/null
117-
@cp $(SRCDIR)/*.h $(INSTALL_ROOT)/include 2>/dev/null
118-
@mv config.h $(INSTALL_ROOT)/include 2>/dev/null
141+
$(if $(filter-out 0,$(STATIC)),cp $(SRCDIR)/lib$(LIBNAME).a $(INSTALL_ROOT)/lib)
142+
$(if $(filter-out 0,$(SHARED)),cp $(SRCDIR)/lib$(LIBNAME).$(SO_EXT) $(INSTALL_ROOT)/lib)
143+
@mkdir -p $(INSTALL_ROOT)/include/gslib 2>/dev/null
144+
cp $(SRCDIR)/*.h $(INSTALL_ROOT)/include/gslib
145+
mv config.h $(INSTALL_ROOT)/include/gslib
146+
@printf '// Automatically generated file\n#include "gslib/gslib.h"\n' \
147+
> $(INSTALL_ROOT)/include/gslib.h && chmod 644 $(INSTALL_ROOT)/include/gslib.h
119148

120149
tests: $(TESTS)
121150

122-
clean: ; @$(RM) config.h $(SRCDIR)/*.o $(SRCDIR)/*.s $(SRCDIR)/*.a $(TESTDIR)/*.o $(FTESTDIR)/*.o $(TESTS)
151+
clean:
152+
$(RM) config.h $(SRCDIR)/*.o $(SRCDIR)/*.s $(SRCDIR)/*.a $(SRCDIR)/*.$(SO_EXT) $(TESTDIR)/*.o $(FTESTDIR)/*.o $(TESTS)
123153

124154
$(TESTS): % : %.c | lib install
125-
$(CC) $(CFLAGS) -I$(INSTALL_ROOT)/include $< -o $@ -L$(INSTALL_ROOT)/lib -l$(LIBNAME) -lm $(LDFLAGS)
155+
$(CC) $(CFLAGS) -I$(INSTALL_ROOT)/include $< -o $@ -L$(INSTALL_ROOT)/lib -l$(LIBNAME) -lm $(LDFLAGS)
126156

127157
$(FTESTS): % : %.o | lib install
128158
$(FCCMD) $^ -o $@ -L$(SRCDIR) -l$(LIBNAME)

0 commit comments

Comments
 (0)