2 # TRD : -fno-strict-aliasing is needed because GCC has messed up type punning and __may_alias__ does absolutely nothing
3 # -Wno-unused-but-set-variable and -Wno-uninitialized are needed because GCC seems confused by the atomic intrinsics
4 # the code base for release has been compiled with those warnings enabled, to show any valid errors
11 INSINCDIR := /usr/local/include/
12 INSLIBDIR := /usr/local/lib/
15 QUIETLY := 1>/dev/null 2>/dev/null
20 ##### sources, objects and libraries #####
22 ARFILENAME := $(BINNAME).a
23 ARPATHNAME := $(BINDIR)/$(ARFILENAME)
24 SOBASENAME := $(BINNAME).so
25 SONAME := $(SOBASENAME).$(VERSION_NUMBER)
26 SOFILENAME := $(SONAME).$(MINOR_NUMBER).$(RELEASE_NUMBER)
27 SOPATHNAME := $(BINDIR)/$(SOFILENAME)
28 INCNAME := $(INCDIR)/$(BINNAME).h
29 SRCDIRS := lfds710_btree_addonly_unbalanced lfds710_freelist lfds710_hash_addonly lfds710_list_addonly_singlylinked_ordered lfds710_list_addonly_singlylinked_unordered lfds710_misc lfds710_prng lfds710_queue_bounded_manyproducer_manyconsumer lfds710_queue_bounded_singleproducer_singleconsumer lfds710_queue_unbounded_manyproducer_manyconsumer lfds710_ringbuffer lfds710_stack
30 SOURCES := lfds710_hash_addonly_cleanup.c lfds710_hash_addonly_get.c lfds710_hash_addonly_init.c lfds710_hash_addonly_insert.c lfds710_hash_addonly_iterate.c lfds710_hash_addonly_query.c \
31 lfds710_list_addonly_singlylinked_ordered_cleanup.c lfds710_list_addonly_singlylinked_ordered_get.c lfds710_list_addonly_singlylinked_ordered_init.c lfds710_list_addonly_singlylinked_ordered_insert.c lfds710_list_addonly_singlylinked_ordered_query.c \
32 lfds710_list_addonly_singlylinked_unordered_cleanup.c lfds710_list_addonly_singlylinked_unordered_get.c lfds710_list_addonly_singlylinked_unordered_init.c lfds710_list_addonly_singlylinked_unordered_insert.c lfds710_list_addonly_singlylinked_unordered_query.c \
33 lfds710_btree_addonly_unbalanced_cleanup.c lfds710_btree_addonly_unbalanced_get.c lfds710_btree_addonly_unbalanced_init.c lfds710_btree_addonly_unbalanced_insert.c lfds710_btree_addonly_unbalanced_query.c \
34 lfds710_freelist_cleanup.c lfds710_freelist_init.c lfds710_freelist_pop.c lfds710_freelist_push.c lfds710_freelist_query.c \
35 lfds710_misc_internal_backoff_init.c lfds710_misc_globals.c lfds710_misc_query.c \
37 lfds710_queue_bounded_manyproducer_manyconsumer_cleanup.c lfds710_queue_bounded_manyproducer_manyconsumer_dequeue.c lfds710_queue_bounded_manyproducer_manyconsumer_enqueue.c lfds710_queue_bounded_manyproducer_manyconsumer_init.c lfds710_queue_bounded_manyproducer_manyconsumer_query.c \
38 lfds710_queue_bounded_singleproducer_singleconsumer_cleanup.c lfds710_queue_bounded_singleproducer_singleconsumer_dequeue.c lfds710_queue_bounded_singleproducer_singleconsumer_enqueue.c lfds710_queue_bounded_singleproducer_singleconsumer_init.c lfds710_queue_bounded_singleproducer_singleconsumer_query.c \
39 lfds710_queue_unbounded_manyproducer_manyconsumer_cleanup.c lfds710_queue_unbounded_manyproducer_manyconsumer_dequeue.c lfds710_queue_unbounded_manyproducer_manyconsumer_enqueue.c lfds710_queue_unbounded_manyproducer_manyconsumer_init.c lfds710_queue_unbounded_manyproducer_manyconsumer_query.c \
40 lfds710_ringbuffer_cleanup.c lfds710_ringbuffer_init.c lfds710_ringbuffer_query.c lfds710_ringbuffer_read.c lfds710_ringbuffer_write.c \
41 lfds710_stack_cleanup.c lfds710_stack_init.c lfds710_stack_pop.c lfds710_stack_push.c lfds710_stack_query.c
42 OBJECTS := $(patsubst %.c,$(OBJDIR)/%.o,$(notdir $(SOURCES)))
47 DGFLAGS_MANDATORY := -MM
48 DGFLAGS_OPTIONAL := -std=gnu89
51 CFLAGS_MANDATORY := -c -fno-strict-aliasing
52 CFLAGS_OPTIONAL := -ffreestanding -nostdinc -std=gnu89 -Wall -Werror -Wno-unknown-pragmas -Wno-unused-but-set-variable -Wno-uninitialized
53 CFLAGS_MANDATORY_COV := -O0 -ggdb -DCOVERAGE -fprofile-arcs -ftest-coverage
54 CFLAGS_MANDATORY_DBG := -O0 -ggdb -D_DEBUG
55 CFLAGS_MANDATORY_PROF := -O0 -ggdb -DPROF -pg
56 CFLAGS_MANDATORY_REL := -O2 -DNDEBUG
57 CFLAGS_MANDATORY_TSAN := -O0 -ggdb -DTSAN -fsanitize=thread -fPIC
61 ARFLAGS_MANDATORY := rcs
65 LDFLAGS_MANDATORY := -shared -Wl,-soname,$(SONAME) -o $(SOPATHNAME)
66 LDFLAGS_OPTIONAL := -nodefaultlibs -nostdlib -std=gnu89 -Wall -Werror
67 LDFLAGS_MANDATORY_COV := -O0 -fprofile-arcs -ftest-coverage
68 LDFLAGS_MANDATORY_DBG := -O0 -ggdb
69 LDFLAGS_MANDATORY_PROF := -O0 -pg
70 LDFLAGS_MANDATORY_REL := -O2 -s
71 LDFLAGS_MANDATORY_TSAN := -O0 -fsanitize=thread -fPIC
73 ##### build variants #####
74 ifeq ($(findstring so,$(MAKECMDGOALS)),so)
75 CFLAGS_MANDATORY += -fPIC
78 # TRD : default to debug
79 ifeq ($(MAKECMDGOALS),)
80 CFLAGS_MANDATORY += $(CFLAGS_MANDATORY_DBG)
81 LDFLAGS_MANDATORY += $(LDFLAGS_MANDATORY_DBG)
84 ifeq ($(findstring cov,$(MAKECMDGOALS)),cov)
85 CFLAGS_MANDATORY += $(CFLAGS_MANDATORY_COV)
86 LDFLAGS_MANDATORY += $(LDFLAGS_MANDATORY_COV)
90 ifeq ($(findstring dbg,$(MAKECMDGOALS)),dbg)
91 CFLAGS_MANDATORY += $(CFLAGS_MANDATORY_DBG)
92 LDFLAGS_MANDATORY += $(LDFLAGS_MANDATORY_DBG)
95 ifeq ($(findstring prof,$(MAKECMDGOALS)),prof)
96 CFLAGS_MANDATORY += $(CFLAGS_MANDATORY_PROF)
97 LDFLAGS_MANDATORY += $(LDFLAGS_MANDATORY_PROF)
100 ifeq ($(findstring rel,$(MAKECMDGOALS)),rel)
101 CFLAGS_MANDATORY += $(CFLAGS_MANDATORY_REL)
102 LDFLAGS_MANDATORY += $(LDFLAGS_MANDATORY_REL)
105 ifeq ($(findstring tsan,$(MAKECMDGOALS)),tsan)
106 CFLAGS_MANDATORY += $(CFLAGS_MANDATORY_TSAN)
107 LDFLAGS_MANDATORY += $(LDFLAGS_MANDATORY_TSAN)
110 ##### search paths #####
111 vpath %.c $(patsubst %,$(SRCDIR)/%:,$(SRCDIRS))
113 ##### implicit rules #####
115 $(DG) $(DGFLAGS_OPTIONAL) $(DGFLAGS) $(DGFLAGS_MANDATORY) $< >$(OBJDIR)/$*.d
116 $(CC) $(CFLAGS_OPTIONAL) $(CFLAGS) $(CFLAGS_MANDATORY) -o $@ $<
118 ##### explicit rules #####
119 $(ARPATHNAME) : $(OBJECTS)
120 $(AR) $(ARFLAGS_OPTIONAL) $(ARFLAGS) $(ARFLAGS_MANDATORY) $(ARPATHNAME) $(OBJECTS)
122 $(SOPATHNAME) : $(OBJECTS)
123 $(LD) $(LDFLAGS_OPTIONAL) $(LDFLAGS) $(LDFLAGS_MANDATORY) $(OBJECTS) -lgcov -lgcc -o $(SOPATHNAME)
124 @ln -fs $(SOFILENAME) $(BINDIR)/$(SONAME)
125 @ln -fs $(SOFILENAME) $(BINDIR)/$(SOBASENAME)
128 .PHONY : clean ar_cov ar_dbg ar_prof ar_rel ar_tsan ar_vanilla ar_install ar_uninstall so_dbg so_prof so_rel so_tsan so_vanilla so_install so_uninstall
131 @rm -f $(BINDIR)/* $(OBJDIR)/*
133 ar_cov : $(ARPATHNAME) # archive (.a), coverage
134 ar_dbg : $(ARPATHNAME) # archive (.a), debug
135 ar_prof : $(ARPATHNAME) # archive (.a), profiling
136 ar_rel : $(ARPATHNAME) # archive (.a), release
137 ar_tsan : $(ARPATHNAME) # archive (.a), thread sanitizer
138 ar_vanilla : $(ARPATHNAME) # archive (.a), no specific-build arguments
140 # TRD : leading backslash to use command rather than alias
141 # as many Linux distros have a built-in alias to force
142 # a prompt ("y/n?") on file overwrite - silent and
143 # unexpected interference which breaks a makefile
144 @mkdir -p $(INSLIBDIR)
145 @\cp $(ARPATHNAME) $(INSLIBDIR)
146 @mkdir -p $(INSINCDIR)
147 @\cp -r $(INCDIR)/* $(INSINCDIR)
149 @rm $(INSLIBDIR)/$(ARFILENAME)
150 @rm -r $(INSINCDIR)/$(BINNAME)
151 @rm -r $(INSINCDIR)/$(BINNAME).h
153 # TRD : so_cov currently disabled as it cannot work with -nostdlib -nodefaultlibs
154 # so_cov : $(SOPATHNAME) # shared (.so), coverage
155 so_dbg : $(SOPATHNAME) # shared (.so), debug
156 so_prof : $(SOPATHNAME) # shared (.so), profiling
157 so_rel : $(SOPATHNAME) # shared (.so), release
158 so_tsan : $(SOPATHNAME) # shared (.so), thread sanitizer
159 so_vanilla : $(SOPATHNAME) # shared (.so), no specific-build arguments
161 @mkdir -p $(INSINCDIR)
162 @\cp $(SOPATHNAME) $(INSLIBDIR)
163 @ldconfig -vn $(INSLIBDIR)
164 @ln -s $(SONAME) $(INSLIBDIR)/$(SOBASENAME)
165 @mkdir -p $(INSLIBDIR)
166 @\cp -r $(INCDIR)/* $(INSINCDIR)
168 @rm -f $(INSLIBDIR)/$(SOFILENAME)
169 @rm -f $(INSLIBDIR)/$(SOBASENAME)
170 @rm -f $(INSLIBDIR)/$(SONAME)
171 @rm -r $(INSINCDIR)/$(BINNAME)
172 @rm -r $(INSINCDIR)/$(BINNAME).h
174 ##### dependencies #####