Makefile 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. # Licensed to the Apache Software Foundation (ASF) under one
  2. # or more contributor license agreements. See the NOTICE file
  3. # distributed with this work for additional information
  4. # regarding copyright ownership. The ASF licenses this file
  5. # to you under the Apache License, Version 2.0 (the
  6. # "License"); you may not use this file except in compliance
  7. # with the License. You may obtain a copy of the License at
  8. #
  9. # http://www.apache.org/licenses/LICENSE-2.0
  10. #
  11. # Unless required by applicable law or agreed to in writing,
  12. # software distributed under the License is distributed on an
  13. # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  14. # KIND, either express or implied. See the License for the
  15. # specific language governing permissions and limitations
  16. # under the License.
  17. NEED_LIBPROTOC=1
  18. include config.mk
  19. # Notes on the flags:
  20. # 1. Added -fno-omit-frame-pointer: perf/tcmalloc-profiler use frame pointers by default
  21. # 2. Added -D__const__= : Avoid over-optimizations of TLS variables by GCC>=4.8
  22. # 3. Removed -Werror: Not block compilation for non-vital warnings, especially when the
  23. # code is tested on newer systems. If the code is used in production, add -Werror back
  24. CPPFLAGS+=-DBTHREAD_USE_FAST_PTHREAD_MUTEX -D__const__= -D_GNU_SOURCE -DUSE_SYMBOLIZE -DNO_TCMALLOC -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -DNDEBUG -DBRPC_REVISION=\"$(shell git rev-parse --short HEAD)\"
  25. CXXFLAGS=$(CPPFLAGS) -O2 -pipe -Wall -W -fPIC -fstrict-aliasing -Wno-invalid-offsetof -Wno-unused-parameter -fno-omit-frame-pointer -std=c++0x
  26. CFLAGS=$(CPPFLAGS) -O2 -pipe -Wall -W -fPIC -fstrict-aliasing -Wno-unused-parameter -fno-omit-frame-pointer
  27. DEBUG_CXXFLAGS = $(filter-out -DNDEBUG,$(CXXFLAGS)) -DUNIT_TEST -DBVAR_NOT_LINK_DEFAULT_VARIABLES
  28. DEBUG_CFLAGS = $(filter-out -DNDEBUG,$(CFLAGS)) -DUNIT_TEST
  29. HDRPATHS=-I./src $(addprefix -I, $(HDRS))
  30. LIBPATHS = $(addprefix -L, $(LIBS))
  31. COMMA = ,
  32. SOPATHS = $(addprefix -Wl$(COMMA)-rpath$(COMMA), $(LIBS))
  33. SRCEXTS = .c .cc .cpp .proto
  34. SOEXT = so
  35. ifeq ($(SYSTEM),Darwin)
  36. SOEXT = dylib
  37. endif
  38. #required by butil/crc32.cc to boost performance for 10x
  39. ifeq ($(shell test $(GCC_VERSION) -ge 40400; echo $$?),0)
  40. CXXFLAGS+=-msse4 -msse4.2
  41. endif
  42. #not solved yet
  43. ifeq ($(CC),gcc)
  44. ifeq ($(shell test $(GCC_VERSION) -ge 70000; echo $$?),0)
  45. CXXFLAGS+=-Wno-aligned-new
  46. endif
  47. endif
  48. BUTIL_SOURCES = \
  49. src/butil/third_party/dmg_fp/g_fmt.cc \
  50. src/butil/third_party/dmg_fp/dtoa_wrapper.cc \
  51. src/butil/third_party/dynamic_annotations/dynamic_annotations.c \
  52. src/butil/third_party/icu/icu_utf.cc \
  53. src/butil/third_party/superfasthash/superfasthash.c \
  54. src/butil/third_party/modp_b64/modp_b64.cc \
  55. src/butil/third_party/symbolize/demangle.cc \
  56. src/butil/third_party/symbolize/symbolize.cc \
  57. src/butil/third_party/snappy/snappy-sinksource.cc \
  58. src/butil/third_party/snappy/snappy-stubs-internal.cc \
  59. src/butil/third_party/snappy/snappy.cc \
  60. src/butil/third_party/murmurhash3/murmurhash3.cpp \
  61. src/butil/arena.cpp \
  62. src/butil/at_exit.cc \
  63. src/butil/atomicops_internals_x86_gcc.cc \
  64. src/butil/base64.cc \
  65. src/butil/big_endian.cc \
  66. src/butil/cpu.cc \
  67. src/butil/debug/alias.cc \
  68. src/butil/debug/asan_invalid_access.cc \
  69. src/butil/debug/crash_logging.cc \
  70. src/butil/debug/debugger.cc \
  71. src/butil/debug/debugger_posix.cc \
  72. src/butil/debug/dump_without_crashing.cc \
  73. src/butil/debug/proc_maps_linux.cc \
  74. src/butil/debug/stack_trace.cc \
  75. src/butil/debug/stack_trace_posix.cc \
  76. src/butil/environment.cc \
  77. src/butil/files/file.cc \
  78. src/butil/files/file_posix.cc \
  79. src/butil/files/file_enumerator.cc \
  80. src/butil/files/file_enumerator_posix.cc \
  81. src/butil/files/file_path.cc \
  82. src/butil/files/file_path_constants.cc \
  83. src/butil/files/memory_mapped_file.cc \
  84. src/butil/files/memory_mapped_file_posix.cc \
  85. src/butil/files/scoped_file.cc \
  86. src/butil/files/scoped_temp_dir.cc \
  87. src/butil/file_util.cc \
  88. src/butil/file_util_posix.cc \
  89. src/butil/guid.cc \
  90. src/butil/guid_posix.cc \
  91. src/butil/hash.cc \
  92. src/butil/lazy_instance.cc \
  93. src/butil/location.cc \
  94. src/butil/md5.cc \
  95. src/butil/memory/aligned_memory.cc \
  96. src/butil/memory/ref_counted.cc \
  97. src/butil/memory/ref_counted_memory.cc \
  98. src/butil/memory/singleton.cc \
  99. src/butil/memory/weak_ptr.cc \
  100. src/butil/posix/file_descriptor_shuffle.cc \
  101. src/butil/posix/global_descriptors.cc \
  102. src/butil/process_util.cc \
  103. src/butil/rand_util.cc \
  104. src/butil/rand_util_posix.cc \
  105. src/butil/fast_rand.cpp \
  106. src/butil/safe_strerror_posix.cc \
  107. src/butil/sha1_portable.cc \
  108. src/butil/strings/latin1_string_conversions.cc \
  109. src/butil/strings/nullable_string16.cc \
  110. src/butil/strings/safe_sprintf.cc \
  111. src/butil/strings/string16.cc \
  112. src/butil/strings/string_number_conversions.cc \
  113. src/butil/strings/string_split.cc \
  114. src/butil/strings/string_piece.cc \
  115. src/butil/strings/string_util.cc \
  116. src/butil/strings/string_util_constants.cc \
  117. src/butil/strings/stringprintf.cc \
  118. src/butil/strings/utf_offset_string_conversions.cc \
  119. src/butil/strings/utf_string_conversion_utils.cc \
  120. src/butil/strings/utf_string_conversions.cc \
  121. src/butil/synchronization/cancellation_flag.cc \
  122. src/butil/synchronization/condition_variable_posix.cc \
  123. src/butil/synchronization/waitable_event_posix.cc \
  124. src/butil/threading/non_thread_safe_impl.cc \
  125. src/butil/threading/platform_thread_posix.cc \
  126. src/butil/threading/simple_thread.cc \
  127. src/butil/threading/thread_checker_impl.cc \
  128. src/butil/threading/thread_collision_warner.cc \
  129. src/butil/threading/thread_id_name_manager.cc \
  130. src/butil/threading/thread_local_posix.cc \
  131. src/butil/threading/thread_local_storage.cc \
  132. src/butil/threading/thread_local_storage_posix.cc \
  133. src/butil/threading/thread_restrictions.cc \
  134. src/butil/threading/watchdog.cc \
  135. src/butil/time/clock.cc \
  136. src/butil/time/default_clock.cc \
  137. src/butil/time/default_tick_clock.cc \
  138. src/butil/time/tick_clock.cc \
  139. src/butil/time/time.cc \
  140. src/butil/time/time_posix.cc \
  141. src/butil/version.cc \
  142. src/butil/logging.cc \
  143. src/butil/class_name.cpp \
  144. src/butil/errno.cpp \
  145. src/butil/find_cstr.cpp \
  146. src/butil/status.cpp \
  147. src/butil/string_printf.cpp \
  148. src/butil/thread_local.cpp \
  149. src/butil/unix_socket.cpp \
  150. src/butil/endpoint.cpp \
  151. src/butil/fd_utility.cpp \
  152. src/butil/files/temp_file.cpp \
  153. src/butil/files/file_watcher.cpp \
  154. src/butil/time.cpp \
  155. src/butil/zero_copy_stream_as_streambuf.cpp \
  156. src/butil/crc32c.cc \
  157. src/butil/containers/case_ignored_flat_map.cpp \
  158. src/butil/iobuf.cpp \
  159. src/butil/binary_printer.cpp \
  160. src/butil/recordio.cc \
  161. src/butil/popen.cpp
  162. ifeq ($(SYSTEM), Linux)
  163. BUTIL_SOURCES += src/butil/file_util_linux.cc \
  164. src/butil/threading/platform_thread_linux.cc \
  165. src/butil/strings/sys_string_conversions_posix.cc
  166. endif
  167. ifeq ($(SYSTEM), Darwin)
  168. BUTIL_SOURCES += src/butil/mac/bundle_locations.mm \
  169. src/butil/mac/foundation_util.mm \
  170. src/butil/file_util_mac.mm \
  171. src/butil/threading/platform_thread_mac.mm \
  172. src/butil/strings/sys_string_conversions_mac.mm \
  173. src/butil/time/time_mac.cc \
  174. src/butil/mac/scoped_mach_port.cc
  175. endif
  176. BUTIL_OBJS = $(addsuffix .o, $(basename $(BUTIL_SOURCES)))
  177. BVAR_DIRS = src/bvar src/bvar/detail
  178. BVAR_SOURCES = $(foreach d,$(BVAR_DIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))
  179. BVAR_OBJS = $(addsuffix .o, $(basename $(BVAR_SOURCES)))
  180. BTHREAD_DIRS = src/bthread
  181. BTHREAD_SOURCES = $(foreach d,$(BTHREAD_DIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))
  182. BTHREAD_OBJS = $(addsuffix .o, $(basename $(BTHREAD_SOURCES)))
  183. JSON2PB_DIRS = src/json2pb
  184. JSON2PB_SOURCES = $(foreach d,$(JSON2PB_DIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))
  185. JSON2PB_OBJS = $(addsuffix .o, $(basename $(JSON2PB_SOURCES)))
  186. BRPC_DIRS = src/brpc src/brpc/details src/brpc/builtin src/brpc/policy
  187. THRIFT_SOURCES = $(foreach d,$(BRPC_DIRS),$(wildcard $(addprefix $(d)/thrift*,$(SRCEXTS))))
  188. BRPC_SOURCES_ALL = $(foreach d,$(BRPC_DIRS),$(wildcard $(addprefix $(d)/*,$(SRCEXTS))))
  189. BRPC_SOURCES = $(filter-out $(THRIFT_SOURCES), $(BRPC_SOURCES_ALL))
  190. BRPC_PROTOS = $(filter %.proto,$(BRPC_SOURCES))
  191. BRPC_CFAMILIES = $(filter-out %.proto %.pb.cc,$(BRPC_SOURCES))
  192. BRPC_OBJS = $(BRPC_PROTOS:.proto=.pb.o) $(addsuffix .o, $(basename $(BRPC_CFAMILIES)))
  193. MCPACK2PB_SOURCES = \
  194. src/mcpack2pb/field_type.cpp \
  195. src/mcpack2pb/mcpack2pb.cpp \
  196. src/mcpack2pb/parser.cpp \
  197. src/mcpack2pb/serializer.cpp
  198. MCPACK2PB_OBJS = src/idl_options.pb.o $(addsuffix .o, $(basename $(MCPACK2PB_SOURCES)))
  199. ifeq (ENABLE_THRIFT_FRAMED_PROTOCOL, $(findstring ENABLE_THRIFT_FRAMED_PROTOCOL, $(CPPFLAGS)))
  200. THRIFT_OBJS = $(addsuffix .o, $(basename $(THRIFT_SOURCES)))
  201. endif
  202. OBJS=$(BUTIL_OBJS) $(BVAR_OBJS) $(BTHREAD_OBJS) $(JSON2PB_OBJS) $(MCPACK2PB_OBJS) $(BRPC_OBJS) $(THRIFT_OBJS)
  203. BVAR_DEBUG_OBJS=$(BUTIL_OBJS:.o=.dbg.o) $(BVAR_OBJS:.o=.dbg.o)
  204. DEBUG_OBJS = $(OBJS:.o=.dbg.o)
  205. PROTOS=$(BRPC_PROTOS) src/idl_options.proto
  206. .PHONY:all
  207. all: protoc-gen-mcpack libbrpc.a libbrpc.$(SOEXT) output/include output/lib output/bin
  208. .PHONY:debug
  209. debug: test/libbrpc.dbg.$(SOEXT) test/libbvar.dbg.a
  210. .PHONY:clean
  211. clean:
  212. @echo "Cleaning"
  213. @rm -rf src/mcpack2pb/generator.o protoc-gen-mcpack libbrpc.a libbrpc.$(SOEXT) $(OBJS) output/include output/lib output/bin $(PROTOS:.proto=.pb.h) $(PROTOS:.proto=.pb.cc)
  214. .PHONY:clean_debug
  215. clean_debug:
  216. @rm -rf test/libbrpc.dbg.$(SOEXT) test/libbvar.dbg.a $(DEBUG_OBJS)
  217. .PRECIOUS: %.o
  218. protoc-gen-mcpack: src/idl_options.pb.cc src/mcpack2pb/generator.o libbrpc.a
  219. @echo "Linking $@"
  220. ifeq ($(SYSTEM),Linux)
  221. @$(CXX) -o $@ $(HDRPATHS) $(LIBPATHS) -std=c++0x -Xlinker "-(" $^ -Wl,-Bstatic $(STATIC_LINKINGS) -Wl,-Bdynamic -Xlinker "-)" $(DYNAMIC_LINKINGS)
  222. else ifeq ($(SYSTEM),Darwin)
  223. @$(CXX) -o $@ $(HDRPATHS) $(LIBPATHS) -std=c++0x $^ $(STATIC_LINKINGS) $(DYNAMIC_LINKINGS)
  224. endif
  225. # force generation of pb headers before compiling to avoid fail-to-import issues in compiling pb.cc
  226. libbrpc.a:$(BRPC_PROTOS:.proto=.pb.h) $(OBJS)
  227. @echo "Packing $@"
  228. @ar crs $@ $(filter %.o,$^)
  229. libbrpc.$(SOEXT):$(BRPC_PROTOS:.proto=.pb.h) $(OBJS)
  230. @echo "Linking $@"
  231. ifeq ($(SYSTEM),Linux)
  232. @$(CXX) -shared -o $@ $(LIBPATHS) $(SOPATHS) -Xlinker "-(" $(filter %.o,$^) -Xlinker "-)" $(STATIC_LINKINGS) $(DYNAMIC_LINKINGS)
  233. else ifeq ($(SYSTEM),Darwin)
  234. @$(CXX) -dynamiclib -Wl,-headerpad_max_install_names -o $@ -install_name @rpath/$@ $(LIBPATHS) $(SOPATHS) $(filter %.o,$^) $(STATIC_LINKINGS) $(DYNAMIC_LINKINGS)
  235. endif
  236. test/libbvar.dbg.a:$(BVAR_DEBUG_OBJS)
  237. @echo "Packing $@"
  238. @ar crs $@ $^
  239. test/libbrpc.dbg.$(SOEXT):$(BRPC_PROTOS:.proto=.pb.h) $(DEBUG_OBJS)
  240. @echo "Linking $@"
  241. ifeq ($(SYSTEM),Linux)
  242. @$(CXX) -shared -o $@ $(LIBPATHS) $(SOPATHS) -Xlinker "-(" $(filter %.o,$^) -Xlinker "-)" $(STATIC_LINKINGS) $(DYNAMIC_LINKINGS)
  243. else ifeq ($(SYSTEM),Darwin)
  244. @$(CXX) -dynamiclib -Wl,-headerpad_max_install_names -o $@ -install_name @rpath/libbrpc.dbg.$(SOEXT) $(LIBPATHS) $(SOPATHS) $(filter %.o,$^) $(STATIC_LINKINGS) $(DYNAMIC_LINKINGS)
  245. endif
  246. .PHONY:output/include
  247. output/include:
  248. @echo "Copying to $@"
  249. @for dir in `find src -type f -name "*.h" -exec dirname {} \\; | sed -e 's/^src\///g' -e '/^src$$/d' | sort | uniq`; do mkdir -p $@/$$dir && cp src/$$dir/*.h $@/$$dir/; done
  250. @for dir in `find src -type f -name "*.hpp" -exec dirname {} \\; | sed -e 's/^src\///g' -e '/^src$$/d' | sort | uniq`; do mkdir -p $@/$$dir && cp src/$$dir/*.hpp $@/$$dir/; done
  251. @cp src/idl_options.proto src/idl_options.pb.h $@
  252. .PHONY:output/lib
  253. output/lib:libbrpc.a libbrpc.$(SOEXT)
  254. @echo "Copying to $@"
  255. @mkdir -p $@
  256. @cp $^ $@
  257. .PHONY:output/bin
  258. output/bin:protoc-gen-mcpack
  259. @echo "Copying to $@"
  260. @mkdir -p $@
  261. @cp $^ $@
  262. %.pb.cc %.pb.h:%.proto
  263. @echo "Generating $@"
  264. @$(PROTOC) --cpp_out=./src --proto_path=./src --proto_path=$(PROTOBUF_HDR) $<
  265. %.o:%.cpp
  266. @echo "Compiling $@"
  267. @$(CXX) -c $(HDRPATHS) $(CXXFLAGS) $< -o $@
  268. %http2_rpc_protocol.dbg.o:%http2_rpc_protocol.cpp
  269. @echo "Compiling $@ with O2"
  270. @$(CXX) -c $(HDRPATHS) -O2 $(DEBUG_CXXFLAGS) $< -o $@
  271. %hpack.dbg.o:%hpack.cpp
  272. @echo "Compiling $@ with O2"
  273. @$(CXX) -c $(HDRPATHS) -O2 $(DEBUG_CXXFLAGS) $< -o $@
  274. %.dbg.o:%.cpp
  275. @echo "Compiling $@"
  276. @$(CXX) -c $(HDRPATHS) $(DEBUG_CXXFLAGS) $< -o $@
  277. %.o:%.cc
  278. @echo "Compiling $@"
  279. @$(CXX) -c $(HDRPATHS) $(CXXFLAGS) $< -o $@
  280. %.dbg.o:%.cc
  281. @echo "Compiling $@"
  282. @$(CXX) -c $(HDRPATHS) $(DEBUG_CXXFLAGS) $< -o $@
  283. %.o:%.mm
  284. @echo "Compiling $@"
  285. @$(CXX) -c $(HDRPATHS) $(CXXFLAGS) $< -o $@
  286. %.dbg.o:%.mm
  287. @echo "Compiling $@"
  288. @$(CXX) -c $(HDRPATHS) $(DEBUG_CXXFLAGS) $< -o $@
  289. %.o:%.c
  290. @echo "Compiling $@"
  291. @$(CC) -c $(HDRPATHS) $(CFLAGS) $< -o $@
  292. %.dbg.o:%.c
  293. @echo "Compiling $@"
  294. @$(CC) -c $(HDRPATHS) $(DEBUG_CFLAGS) $< -o $@