8 QUIETLY := 1>/dev/null 2>/dev/null
13 ##### sources, objects and libraries #####
14 BINNAME := libbenchmark
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 := libbenchmark_benchmarkinstance libbenchmark_benchmarks_btree_au_readn_writen libbenchmark_benchmarks_freelist_push1_then_pop1 libbenchmark_benchmarks_queue_umm_enqueue1_then_dequeue1 libbenchmark_benchmarkset libbenchmark_benchmarksuite libbenchmark_datastructures_btree_au libbenchmark_datastructures_freelist libbenchmark_datastructures_queue_umm libbenchmark_misc libbenchmark_porting_abstraction_layer libbenchmark_results libbenchmark_threadset libbenchmark_topology libbenchmark_topology_node
23 SOURCES := libbenchmark_benchmarkinstance_cleanup.c libbenchmark_benchmarkinstance_init.c libbenchmark_benchmarkinstance_run.c \
24 libbenchmark_benchmarks_btree_au_gcc_spinlock_atomic_readn_writen.c libbenchmark_benchmarks_btree_au_gcc_spinlock_sync_readn_writen.c libbenchmark_benchmarks_btree_au_liblfds700_lockfree_readn_writen.c libbenchmark_benchmarks_btree_au_liblfds710_lockfree_readn_writen.c libbenchmark_benchmarks_btree_au_msvc_spinlock_readn_writen.c libbenchmark_benchmarks_btree_au_pthread_mutex_readn_writen.c libbenchmark_benchmarks_btree_au_pthread_rwlock_readn_writen.c libbenchmark_benchmarks_btree_au_pthread_spinlock_process_private_readn_writen.c libbenchmark_benchmarks_btree_au_pthread_spinlock_process_shared_readn_writen.c libbenchmark_benchmarks_btree_au_windows_critical_section_readn_writen.c libbenchmark_benchmarks_btree_au_windows_mutex_readn_writen.c \
25 libbenchmark_benchmarks_freelist_gcc_spinlock_atomic_push1_then_pop1.c libbenchmark_benchmarks_freelist_gcc_spinlock_sync_push1_then_pop1.c libbenchmark_benchmarks_freelist_liblfds700_lockfree_push1_then_pop1.c libbenchmark_benchmarks_freelist_liblfds710_lockfree_push1_then_pop1.c libbenchmark_benchmarks_freelist_msvc_spinlock_push1_then_pop1.c libbenchmark_benchmarks_freelist_pthread_mutex_push1_then_pop1.c libbenchmark_benchmarks_freelist_pthread_rwlock_push1_then_pop1.c libbenchmark_benchmarks_freelist_pthread_spinlock_process_private_push1_then_pop1.c libbenchmark_benchmarks_freelist_pthread_spinlock_process_shared_push1_then_pop1.c libbenchmark_benchmarks_freelist_windows_critical_section_push1_then_pop1.c libbenchmark_benchmarks_freelist_windows_mutex_push1_then_pop1.c \
26 libbenchmark_benchmarks_queue_umm_gcc_spinlock_atomic_enqueue1_dequeue1.c libbenchmark_benchmarks_queue_umm_gcc_spinlock_sync_enqueue1_dequeue1.c libbenchmark_benchmarks_queue_umm_liblfds700_lockfree_enqueue1_dequeue1.c libbenchmark_benchmarks_queue_umm_liblfds710_lockfree_enqueue1_dequeue1.c libbenchmark_benchmarks_queue_umm_msvc_spinlock_enqueue1_dequeue1.c libbenchmark_benchmarks_queue_umm_pthread_mutex_enqueue1_dequeue1.c libbenchmark_benchmarks_queue_umm_pthread_rwlock_enqueue1_dequeue1.c libbenchmark_benchmarks_queue_umm_pthread_spinlock_process_private_enqueue1_dequeue1.c libbenchmark_benchmarks_queue_umm_pthread_spinlock_process_shared_enqueue1_dequeue1.c libbenchmark_benchmarks_queue_umm_windows_critical_section_enqueue1_dequeue1.c libbenchmark_benchmarks_queue_umm_windows_mutex_enqueue1_dequeue1.c \
27 libbenchmark_benchmarkset_add.c libbenchmark_benchmarkset_cleanup.c libbenchmark_benchmarkset_gnuplot.c libbenchmark_benchmarkset_init.c libbenchmark_benchmarkset_run.c \
28 libbenchmark_benchmarksuite_add.c libbenchmark_benchmarksuite_cleanup.c libbenchmark_benchmarksuite_gnuplot.c libbenchmark_benchmarksuite_init.c libbenchmark_benchmarksuite_run.c \
29 libbenchmark_datastructure_btree_au_gcc_spinlock_atomic.c libbenchmark_datastructure_btree_au_gcc_spinlock_sync.c libbenchmark_datastructure_btree_au_msvc_spinlock.c libbenchmark_datastructure_btree_au_pthread_mutex.c libbenchmark_datastructure_btree_au_pthread_rwlock.c libbenchmark_datastructure_btree_au_pthread_spinlock_process_private.c libbenchmark_datastructure_btree_au_pthread_spinlock_process_shared.c libbenchmark_datastructure_btree_au_windows_critical_section.c libbenchmark_datastructure_btree_au_windows_mutex.c \
30 libbenchmark_datastructure_freelist_gcc_spinlock_atomic.c libbenchmark_datastructure_freelist_gcc_spinlock_sync.c libbenchmark_datastructure_freelist_msvc_spinlock.c libbenchmark_datastructure_freelist_pthread_mutex.c libbenchmark_datastructure_freelist_pthread_rwlock.c libbenchmark_datastructure_freelist_pthread_spinlock_process_private.c libbenchmark_datastructure_freelist_pthread_spinlock_process_shared.c libbenchmark_datastructure_freelist_windows_critical_section.c libbenchmark_datastructure_freelist_windows_mutex.c \
31 libbenchmark_datastructure_queue_umm_gcc_spinlock_atomic.c libbenchmark_datastructure_queue_umm_gcc_spinlock_sync.c libbenchmark_datastructure_queue_umm_msvc_spinlock.c libbenchmark_datastructure_queue_umm_pthread_mutex.c libbenchmark_datastructure_queue_umm_pthread_rwlock.c libbenchmark_datastructure_queue_umm_pthread_spinlock_process_private.c libbenchmark_datastructure_queue_umm_pthread_spinlock_process_shared.c libbenchmark_datastructure_queue_umm_windows_critical_section.c libbenchmark_datastructure_queue_umm_windows_mutex.c \
32 libbenchmark_misc_globals.c libbenchmark_misc_pal_helpers.c libbenchmark_misc_query.c \
33 libbenchmark_porting_abstraction_layer_populate_topology.c libbenchmark_porting_abstraction_layer_print_string.c \
34 libbenchmark_results_cleanup.c libbenchmark_results_compare.c libbenchmark_results_get_result.c libbenchmark_results_init.c libbenchmark_results_put_result.c \
35 libbenchmark_threadset_cleanup.c libbenchmark_threadset_init.c libbenchmark_threadset_operations.c \
36 libbenchmark_topology_cleanup.c libbenchmark_topology_compare.c libbenchmark_topology_init.c libbenchmark_topology_insert.c libbenchmark_topology_iterate.c libbenchmark_topology_lpsets.c libbenchmark_topology_numa.c libbenchmark_topology_query.c libbenchmark_topology_string.c \
37 libbenchmark_topology_node_cleanup.c libbenchmark_topology_node_compare.c libbenchmark_topology_node_init.c
38 OBJECTS := $(patsubst %.c,$(OBJDIR)/%.o,$(notdir $(SOURCES)))
41 ##### default paths fix up #####
42 CPATH := $(subst : ,:,$(SRCDIR):$(INCDIR))
46 DGFLAGS_MANDATORY := -MM
47 DGFLAGS_OPTIONAL := -std=gnu89
50 CFLAGS_MANDATORY := -c -fno-strict-aliasing
51 CFLAGS_OPTIONAL := -std=gnu89 -Wall -Werror -Wno-unknown-pragmas
52 CFLAGS_MANDATORY_COV := -O0 -ggdb -DCOVERAGE -fprofile-arcs -ftest-coverage
53 CFLAGS_MANDATORY_DBG := -O0 -ggdb -D_DEBUG
54 CFLAGS_MANDATORY_PROF := -O0 -ggdb -DPROF -pg
55 CFLAGS_MANDATORY_REL := -O2 -DNDEBUG
56 CFLAGS_MANDATORY_TSAN := -O0 -ggdb -DTSAN -fsanitize=thread -fPIC
60 ARFLAGS_MANDATORY := rcs
64 LDFLAGS_MANDATORY := -shared -Wl,-soname,$(SONAME) -o $(SOPATHNAME)
65 LDFLAGS_OPTIONAL := -std=gnu89 -Wall -Werror
66 LDFLAGS_MANDATORY_COV := -O0 -fprofile-arcs -ftest-coverage
67 LDFLAGS_MANDATORY_DBG := -O0 -ggdb
68 LDFLAGS_MANDATORY_PROF := -O0 -pg
69 LDFLAGS_MANDATORY_REL := -O2 -s
70 LDFLAGS_MANDATORY_TSAN := -O0 -fsanitize=thread -fPIC
72 ##### build variants #####
73 ifeq ($(findstring so,$(MAKECMDGOALS)),so)
74 CFLAGS_MANDATORY += -fPIC
77 # TRD : default to debug
78 ifeq ($(MAKECMDGOALS),)
79 CFLAGS_MANDATORY += $(CFLAGS_MANDATORY_DBG)
80 LDFLAGS_MANDATORY += $(LDFLAGS_MANDATORY_DBG)
83 ifeq ($(findstring cov,$(MAKECMDGOALS)),cov)
84 CFLAGS_MANDATORY += $(CFLAGS_MANDATORY_COV)
85 LDFLAGS_MANDATORY += $(LDFLAGS_MANDATORY_COV)
89 ifeq ($(findstring dbg,$(MAKECMDGOALS)),dbg)
90 CFLAGS_MANDATORY += $(CFLAGS_MANDATORY_DBG)
91 LDFLAGS_MANDATORY += $(LDFLAGS_MANDATORY_DBG)
94 ifeq ($(findstring prof,$(MAKECMDGOALS)),prof)
95 CFLAGS_MANDATORY += $(CFLAGS_MANDATORY_PROF)
96 LDFLAGS_MANDATORY += $(LDFLAGS_MANDATORY_PROF)
99 ifeq ($(findstring rel,$(MAKECMDGOALS)),rel)
100 CFLAGS_MANDATORY += $(CFLAGS_MANDATORY_REL)
101 LDFLAGS_MANDATORY += $(LDFLAGS_MANDATORY_REL)
104 ifeq ($(findstring tsan,$(MAKECMDGOALS)),tsan)
105 CFLAGS_MANDATORY += $(CFLAGS_MANDATORY_TSAN)
106 LDFLAGS_MANDATORY += $(LDFLAGS_MANDATORY_TSAN)
109 ##### search paths #####
110 vpath %.c $(patsubst %,$(SRCDIR)/%:,$(SRCDIRS))
112 ##### implicit rules #####
114 $(DG) $(DGFLAGS_OPTIONAL) $(DGFLAGS) $(DGFLAGS_MANDATORY) $< >$(OBJDIR)/$*.d
115 $(CC) $(CFLAGS_OPTIONAL) $(CFLAGS) $(CFLAGS_MANDATORY) -o $@ $<
117 ##### explicit rules #####
118 $(ARPATHNAME) : $(OBJECTS)
119 $(AR) $(ARFLAGS_OPTIONAL) $(ARFLAGS) $(ARFLAGS_MANDATORY) $(ARPATHNAME) $(OBJECTS)
121 $(SOPATHNAME) : $(OBJECTS)
122 $(LD) $(LDFLAGS_OPTIONAL) $(LDFLAGS) $(LDFLAGS_MANDATORY) $(OBJECTS) -o $(SOPATHNAME)
123 @ln -fs $(SOFILENAME) $(BINDIR)/$(SONAME)
124 @ln -fs $(SOFILENAME) $(BINDIR)/$(SOBASENAME)
127 .PHONY : clean ar_cov ar_dbg ar_prof ar_rel ar_tsan ar_vanilla so_cov so_dbg so_prof so_rel so_tsan so_vanilla
130 @rm -f $(BINDIR)/* $(OBJDIR)/*
132 ar_cov : $(ARPATHNAME) # archive (.a), coverage
133 ar_dbg : $(ARPATHNAME) # archive (.a), debug
134 ar_prof : $(ARPATHNAME) # archive (.a), profiling
135 ar_rel : $(ARPATHNAME) # archive (.a), release
136 ar_tsan : $(ARPATHNAME) # archive (.a), thread sanitizer
137 ar_vanilla : $(ARPATHNAME) # archive (.a), no specific-build arguments
139 # TRD : leading backslash to use command rather than alias
140 # as many Linux distros have a built-in alias to force
141 # a prompt ("y/n?") on file overwrite - silent and
142 # unexpected interference which breaks a makefile
143 @mkdir -p $(INSLIBDIR)
144 @\cp $(ARPATHNAME) $(INSLIBDIR)
145 @mkdir -p $(INSINCDIR)
146 @\cp -r $(INCDIR)/* $(INSINCDIR)
148 @rm $(INSLIBDIR)/$(ARFILENAME)
149 @rm -r $(INSINCDIR)/$(BINNAME)
150 @rm -r $(INSINCDIR)/$(BINNAME).h
152 so_cov : $(SOPATHNAME) # shared (.so), coverage
153 so_dbg : $(SOPATHNAME) # shared (.so), debug
154 so_prof : $(SOPATHNAME) # shared (.so), profiling
155 so_rel : $(SOPATHNAME) # shared (.so), release
156 so_tsan : $(SOPATHNAME) # shared (.so), thread sanitizer
157 so_vanilla : $(SOPATHNAME) # shared (.so), no specific-build arguments
159 @mkdir -p $(INSINCDIR)
160 @\cp $(SOPATHNAME) $(INSLIBDIR)
161 @ldconfig -vn $(INSLIBDIR)
162 @ln -s $(SONAME) $(INSLIBDIR)/$(SOBASENAME)
163 @mkdir -p $(INSLIBDIR)
164 @\cp -r $(INCDIR)/* $(INSINCDIR)
166 @rm -f $(INSLIBDIR)/$(SOFILENAME)
167 @rm -f $(INSLIBDIR)/$(SOBASENAME)
168 @rm -f $(INSLIBDIR)/$(SONAME)
169 @rm -r $(INSINCDIR)/$(BINNAME)
170 @rm -r $(INSINCDIR)/$(BINNAME).h
172 ##### dependencies #####