8 QUIETLY := 1>/dev/null 2>/dev/null
13 ##### sources, objects and libraries #####
15 ARFILENAME := $(BINNAME).a
16 ARPATHNAME := $(BINDIR)/$(ARFILENAME)
17 SOBASENAME := $(BINNAME).so
18 SONAME := $(SOBASENAME).$(VERSION_NUMBER)
19 SOFILENAME := $(SONAME).$(MINOR_NUMBER).$(RELEASE_NUMBER)
20 SOPATHNAME := $(BINDIR)/$(SOFILENAME)
21 INCNAME := $(INCDIR)/$(BINNAME).h
22 SRCDIRS := lfds700_btree_addonly_unbalanced lfds700_freelist lfds700_hash_addonly lfds700_list_addonly_ordered_singlylinked lfds700_list_addonly_singlylinked_unordered lfds700_misc lfds700_queue lfds700_queue_bounded_singleconsumer_singleproducer lfds700_ringbuffer lfds700_stack
23 SOURCES := lfds700_hash_addonly_cleanup.c lfds700_hash_addonly_get.c lfds700_hash_addonly_init.c lfds700_hash_addonly_insert.c lfds700_hash_addonly_iterate.c lfds700_hash_addonly_query.c \
24 lfds700_list_addonly_ordered_singlylinked_cleanup.c lfds700_list_addonly_ordered_singlylinked_get.c lfds700_list_addonly_ordered_singlylinked_init.c lfds700_list_addonly_ordered_singlylinked_insert.c lfds700_list_addonly_ordered_singlylinked_query.c \
25 lfds700_list_addonly_singlylinked_unordered_cleanup.c lfds700_list_addonly_singlylinked_unordered_get.c lfds700_list_addonly_singlylinked_unordered_init.c lfds700_list_addonly_singlylinked_unordered_insert.c lfds700_list_addonly_singlylinked_unordered_query.c \
26 lfds700_btree_addonly_unbalanced_cleanup.c lfds700_btree_addonly_unbalanced_get.c lfds700_btree_addonly_unbalanced_init.c lfds700_btree_addonly_unbalanced_insert.c lfds700_btree_addonly_unbalanced_query.c \
27 lfds700_freelist_cleanup.c lfds700_freelist_init.c lfds700_freelist_pop.c lfds700_freelist_push.c lfds700_freelist_query.c \
28 lfds700_misc_cleanup.c lfds700_misc_globals.c lfds700_misc_init.c lfds700_misc_prng.c lfds700_misc_query.c \
29 lfds700_queue_cleanup.c lfds700_queue_dequeue.c lfds700_queue_enqueue.c lfds700_queue_init.c lfds700_queue_query.c \
30 lfds700_queue_bounded_singleconsumer_singleproducer_cleanup.c lfds700_queue_bounded_singleconsumer_singleproducer_dequeue.c lfds700_queue_bounded_singleconsumer_singleproducer_enqueue.c lfds700_queue_bounded_singleconsumer_singleproducer_init.c lfds700_queue_bounded_singleconsumer_singleproducer_query.c \
31 lfds700_ringbuffer_cleanup.c lfds700_ringbuffer_init.c lfds700_ringbuffer_query.c lfds700_ringbuffer_read.c lfds700_ringbuffer_write.c \
32 lfds700_stack_cleanup.c lfds700_stack_init.c lfds700_stack_pop.c lfds700_stack_push.c lfds700_stack_query.c
33 OBJECTS := $(patsubst %.c,$(OBJDIR)/%.o,$(notdir $(SOURCES)))
36 ##### default paths fix up #####
37 CPATH := $(subst : ,:,$(SRCDIR):$(INCDIR))
44 DGFLAGS := -MM -std=gnu89
47 CFBASE := -c -fno-strict-aliasing -std=gnu89 -Wall -Werror -Wno-unknown-pragmas -Wno-unused-but-set-variable -Wno-unused-variable
48 CFCOV := -O0 -ggdb -DCOVERAGE -fprofile-arcs -ftest-coverage
49 CFDBG := -O0 -ggdb -D_DEBUG
50 CFPROF := -O0 -ggdb -DPROF -pg
51 CFREL := -O2 -DNDEBUG -finline-functions
52 CFTSAN := -O0 -ggdb -DTSAN -fsanitize=thread -fPIC
53 CFBARE := -ffreestanding -nodefaultlibs -nostdinc -nostdlib
59 LFBASE := -pthread -shared -std=gnu89 -Wl,-soname,$(SONAME) -o $(SOPATHNAME) -Wall -Werror
60 LFCOV := -O0 -fprofile-arcs -ftest-coverage
63 LFREL := -O2 -s -finline-functions
64 LFTSAN := -O0 -fsanitize=thread -fPIC
65 LFBARE := -ffreestanding -nodefaultlibs -nostdinc -nostdlib
67 ##### CPU variants #####
69 CFBASE += -march=$(GCCARCH)
71 ##### build variants #####
72 ifeq ($(findstring so,$(MAKECMDGOALS)),so)
79 ifeq ($(MAKECMDGOALS),)
84 ifeq ($(findstring cov,$(MAKECMDGOALS)),cov)
90 ifeq ($(findstring dbg,$(MAKECMDGOALS)),dbg)
95 ifeq ($(findstring prof,$(MAKECMDGOALS)),prof)
100 ifeq ($(findstring rel,$(MAKECMDGOALS)),rel)
105 ifeq ($(findstring tsan,$(MAKECMDGOALS)),tsan)
110 ifeq ($(findstring b_,$(MAKECMDGOALS)),b_)
115 ##### search paths #####
116 vpath %.c $(patsubst %,$(SRCDIR)/%:,$(SRCDIRS))
118 ##### implicit rules #####
120 $(DG) $(DGFLAGS) $< >$(OBJDIR)/$*.d
121 $(CC) $(CFLAGS) -o $@ $<
123 ##### explicit rules #####
124 $(ARPATHNAME) : $(OBJECTS)
125 $(AR) $(AFLAGS) $(ARPATHNAME) $(OBJECTS)
127 $(SOPATHNAME) : $(OBJECTS)
128 $(LD) $(LFLAGS) $(OBJECTS) -o $(SOPATHNAME)
129 @ln -fs $(SOFILENAME) $(BINDIR)/$(SONAME)
130 @ln -fs $(SOFILENAME) $(BINDIR)/$(SOBASENAME)
133 .PHONY : clean bare_ar_cov bare_ar_dbg bare_ar_prof bare_ar_rel bare_ar_tsan bare_so_cov bare_so_dbg bare_so_prof bare_so_rel bare_so_tsan hosted_ar_cov hosted_ar_dbg hosted_ar_prof hosted_ar_rel hosted_ar_tsan hosted_so_cov hosted_so_dbg hosted_so_prof hosted_so_rel hosted_so_tsan
136 @rm -f $(BINDIR)/* $(OBJDIR)/*
138 bare_ar_cov : $(ARPATHNAME) # bare, archive (.a), coverage
139 bare_ar_dbg : $(ARPATHNAME) # bare, archive (.a), debug
140 bare_ar_prof : $(ARPATHNAME) # bare, archive (.a), profiling
141 bare_ar_rel : $(ARPATHNAME) # bare, archive (.a), release
142 bare_ar_tsan : $(ARPATHNAME) # bare, archive (.a), thread sanitizer
144 bare_so_cov : $(SOPATHNAME) # bare, shared (.so), coverage
145 bare_so_dbg : $(SOPATHNAME) # bare, shared (.so), debug
146 bare_so_prof : $(SOPATHNAME) # bare, shared (.so), profiling
147 bare_so_rel : $(SOPATHNAME) # bare, shared (.so), release
148 bare_so_tsan : $(SOPATHNAME) # bare, shared (.so), thread sanitizer
150 hosted_ar_cov : $(ARPATHNAME) # hosted implementation, archive (.a), coverage
151 hosted_ar_dbg : $(ARPATHNAME) # hosted implementation, archive (.a), debug
152 hosted_ar_prof : $(ARPATHNAME) # hosted implementation, archive (.a), profiling
153 hosted_ar_rel : $(ARPATHNAME) # hosted implementation, archive (.a), release
154 hosted_ar_tsan : $(ARPATHNAME) # hosted implementation, archive (.a), thread sanitizer
156 hosted_so_cov : $(SOPATHNAME) # hosted implementation, shared (.so), coverage
157 hosted_so_dbg : $(SOPATHNAME) # hosted implementation, shared (.so), debug
158 hosted_so_prof : $(SOPATHNAME) # hosted implementation, shared (.so), profiling
159 hosted_so_rel : $(SOPATHNAME) # hosted implementation, shared (.so), release
160 hosted_so_tsan : $(SOPATHNAME) # hosted implementation, shared (.so), thread sanitizer
162 ##### dependencies #####
166 # TRD : we use -std=gnu89 for C++ style comments
167 # hosted implementation differs from bare simply in that <assert.h> ends up being included