Makefile.template 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077
  1. # GRPC global makefile
  2. # This currently builds C and C++ code.
  3. <%!
  4. import re
  5. import os
  6. proto_re = re.compile('(.*)\\.proto')
  7. def excluded(filename, exclude_res):
  8. for r in exclude_res:
  9. if r.match(filename):
  10. return True
  11. return False
  12. def proto_to_cc(filename):
  13. m = proto_re.match(filename)
  14. if not m:
  15. return filename
  16. return 'gens/' + m.group(1) + '.pb.cc'
  17. %>
  18. # Basic platform detection
  19. HOST_SYSTEM = $(shell uname | cut -f 1 -d_)
  20. ifeq ($(SYSTEM),)
  21. SYSTEM = $(HOST_SYSTEM)
  22. endif
  23. # Configurations
  24. VALID_CONFIG_opt = 1
  25. CC_opt = gcc
  26. CXX_opt = g++
  27. LD_opt = gcc
  28. LDXX_opt = g++
  29. CPPFLAGS_opt = -O2
  30. LDFLAGS_opt =
  31. DEFINES_opt = NDEBUG
  32. VALID_CONFIG_dbg = 1
  33. CC_dbg = gcc
  34. CXX_dbg = g++
  35. LD_dbg = gcc
  36. LDXX_dbg = g++
  37. CPPFLAGS_dbg = -O0
  38. LDFLAGS_dbg =
  39. DEFINES_dbg = _DEBUG DEBUG
  40. VALID_CONFIG_valgrind = 1
  41. REQUIRE_CUSTOM_LIBRARIES_valgrind = 1
  42. CC_valgrind = gcc
  43. CXX_valgrind = g++
  44. LD_valgrind = gcc
  45. LDXX_valgrind = g++
  46. CPPFLAGS_valgrind = -O0
  47. OPENSSL_CFLAGS_valgrind = -DPURIFY
  48. LDFLAGS_valgrind =
  49. DEFINES_valgrind = _DEBUG DEBUG
  50. VALID_CONFIG_tsan = 1
  51. REQUIRE_CUSTOM_LIBRARIES_tsan = 1
  52. CC_tsan = clang
  53. CXX_tsan = clang++
  54. LD_tsan = clang
  55. LDXX_tsan = clang++
  56. CPPFLAGS_tsan = -O1 -fsanitize=thread -fno-omit-frame-pointer
  57. OPENSSL_CONFIG_tsan = no-asm
  58. LDFLAGS_tsan = -fsanitize=thread
  59. DEFINES_tsan = NDEBUG
  60. VALID_CONFIG_asan = 1
  61. REQUIRE_CUSTOM_LIBRARIES_asan = 1
  62. CC_asan = clang
  63. CXX_asan = clang++
  64. LD_asan = clang
  65. LDXX_asan = clang++
  66. CPPFLAGS_asan = -O1 -fsanitize=address -fno-omit-frame-pointer
  67. OPENSSL_CONFIG_asan = no-asm
  68. LDFLAGS_asan = -fsanitize=address
  69. DEFINES_asan = NDEBUG
  70. VALID_CONFIG_msan = 1
  71. REQUIRE_CUSTOM_LIBRARIES_msan = 1
  72. CC_msan = clang
  73. CXX_msan = clang++
  74. LD_msan = clang
  75. LDXX_msan = clang++
  76. CPPFLAGS_msan = -O1 -fsanitize=memory -fno-omit-frame-pointer
  77. OPENSSL_CFLAGS_msan = -DPURIFY
  78. OPENSSL_CONFIG_msan = no-asm
  79. LDFLAGS_msan = -fsanitize=memory
  80. DEFINES_msan = NDEBUG
  81. VALID_CONFIG_gcov = 1
  82. CC_gcov = gcc
  83. CXX_gcov = g++
  84. LD_gcov = gcc
  85. LDXX_gcov = g++
  86. CPPFLAGS_gcov = -O0 -fprofile-arcs -ftest-coverage
  87. LDFLAGS_gcov = -fprofile-arcs -ftest-coverage
  88. DEFINES_gcov = NDEBUG
  89. # General settings.
  90. # You may want to change these depending on your system.
  91. prefix ?= /usr/local
  92. PROTOC = protoc
  93. CONFIG ?= opt
  94. CC = $(CC_$(CONFIG))
  95. CXX = $(CXX_$(CONFIG))
  96. LD = $(LD_$(CONFIG))
  97. LDXX = $(LDXX_$(CONFIG))
  98. AR = ar
  99. STRIP = strip --strip-unneeded
  100. INSTALL = install -D
  101. RM = rm -f
  102. ifndef VALID_CONFIG_$(CONFIG)
  103. $(error Invalid CONFIG value '$(CONFIG)')
  104. endif
  105. # The HOST compiler settings are used to compile the protoc plugins.
  106. # In most cases, you won't have to change anything, but if you are
  107. # cross-compiling, you can override these variables from GNU make's
  108. # command line: make CC=cross-gcc HOST_CC=gcc
  109. HOST_CC = $(CC)
  110. HOST_CXX = $(CXX)
  111. HOST_LD = $(LD)
  112. HOST_LDXX = $(LDXX)
  113. CPPFLAGS += $(CPPFLAGS_$(CONFIG))
  114. DEFINES += $(DEFINES_$(CONFIG))
  115. LDFLAGS += $(LDFLAGS_$(CONFIG))
  116. CFLAGS += -std=c89 -pedantic
  117. CXXFLAGS += -std=c++11
  118. CPPFLAGS += -g -fPIC -Wall -Wextra -Werror -Wno-long-long -Wno-unused-parameter
  119. LDFLAGS += -g -fPIC
  120. INCLUDES = . include gens
  121. ifeq ($(SYSTEM),Darwin)
  122. LIBS = m z
  123. else
  124. LIBS = rt m z pthread
  125. LDFLAGS += -pthread
  126. endif
  127. ifneq ($(wildcard /usr/src/gtest/src/gtest-all.cc),)
  128. GTEST_LIB = /usr/src/gtest/src/gtest-all.cc -I/usr/src/gtest
  129. else
  130. GTEST_LIB = -lgtest
  131. endif
  132. GTEST_LIB += -lgflags
  133. ifeq ($(V),1)
  134. E = @:
  135. Q =
  136. else
  137. E = @echo
  138. Q = @
  139. endif
  140. VERSION = ${settings.version.major}.${settings.version.minor}.${settings.version.micro}.${settings.version.build}
  141. CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES))
  142. CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS)
  143. LDFLAGS += $(ARCH_FLAGS)
  144. LDLIBS += $(addprefix -l, $(LIBS))
  145. LDLIBSXX += $(addprefix -l, $(LIBSXX))
  146. HOST_CPPFLAGS = $(CPPFLAGS)
  147. HOST_CFLAGS = $(CFLAGS)
  148. HOST_CXXFLAGS = $(CXXFLAGS)
  149. HOST_LDFLAGS = $(LDFLAGS)
  150. HOST_LDLIBS = $(LDLIBS)
  151. # These are automatically computed variables.
  152. # There shouldn't be any need to change anything from now on.
  153. ifeq ($(SYSTEM),MINGW32)
  154. SHARED_EXT = dll
  155. endif
  156. ifeq ($(SYSTEM),Darwin)
  157. SHARED_EXT = dylib
  158. endif
  159. ifeq ($(SHARED_EXT),)
  160. SHARED_EXT = so.$(VERSION)
  161. endif
  162. ifeq ($(wildcard .git),)
  163. IS_GIT_FOLDER = false
  164. else
  165. IS_GIT_FOLDER = true
  166. endif
  167. OPENSSL_ALPN_CHECK_CMD = $(CC) $(CFLAGS) $(CPPFLAGS) -o /dev/null test/build/openssl-alpn.c -lssl -lcrypto -ldl $(LDFLAGS)
  168. ZLIB_CHECK_CMD = $(CC) $(CFLAGS) $(CPPFLAGS) -o /dev/null test/build/zlib.c -lz $(LDFLAGS)
  169. PERFTOOLS_CHECK_CMD = $(CC) $(CFLAGS) $(CPPFLAGS) -o /dev/null test/build/perftools.c -lprofiler $(LDFLAGS)
  170. PROTOBUF_CHECK_CMD = $(CXX) $(CXXFLAGS) $(CPPFLAGS) -o /dev/null test/build/protobuf.cc -lprotobuf $(LDFLAGS)
  171. PROTOC_CHECK_CMD = protoc --version | grep -q libprotoc.3
  172. ifndef REQUIRE_CUSTOM_LIBRARIES_$(CONFIG)
  173. HAS_SYSTEM_PERFTOOLS = $(shell $(PERFTOOLS_CHECK_CMD) 2> /dev/null && echo true || echo false)
  174. ifeq ($(HAS_SYSTEM_PERFTOOLS),true)
  175. DEFINES += GRPC_HAVE_PERFTOOLS
  176. LIBS += profiler
  177. endif
  178. endif
  179. ifndef REQUIRE_CUSTOM_LIBRARIES_$(CONFIG)
  180. HAS_SYSTEM_OPENSSL_ALPN = $(shell $(OPENSSL_ALPN_CHECK_CMD) 2> /dev/null && echo true || echo false)
  181. HAS_SYSTEM_ZLIB = $(shell $(ZLIB_CHECK_CMD) 2> /dev/null && echo true || echo false)
  182. HAS_SYSTEM_PROTOBUF = $(shell $(PROTOBUF_CHECK_CMD) 2> /dev/null && echo true || echo false)
  183. else
  184. # override system libraries if the config requires a custom compiled library
  185. HAS_SYSTEM_OPENSSL_ALPN = false
  186. HAS_SYSTEM_ZLIB = false
  187. HAS_SYSTEM_PROTOBUF = false
  188. endif
  189. HAS_VALID_PROTOC = $(shell $(PROTOC_CHECK_CMD) 2> /dev/null && echo true || echo false)
  190. ifeq ($(wildcard third_party/openssl/ssl/ssl.h),)
  191. HAS_EMBEDDED_OPENSSL_ALPN = false
  192. else
  193. HAS_EMBEDDED_OPENSSL_ALPN = true
  194. endif
  195. ifeq ($(wildcard third_party/zlib/zlib.h),)
  196. HAS_EMBEDDED_ZLIB = false
  197. else
  198. HAS_EMBEDDED_ZLIB = true
  199. endif
  200. ifeq ($(wildcard third_party/protobuf/src/google/protobuf/descriptor.pb.h),)
  201. HAS_EMBEDDED_PROTOBUF = false
  202. ifneq ($(HAS_VALID_PROTOC),true)
  203. NO_PROTOC = true
  204. endif
  205. else
  206. HAS_EMBEDDED_PROTOBUF = true
  207. endif
  208. ifeq ($(HAS_SYSTEM_ZLIB),false)
  209. ifeq ($(HAS_EMBEDDED_ZLIB),true)
  210. ZLIB_DEP = libs/$(CONFIG)/zlib/libz.a
  211. CPPFLAGS += -Ithird_party/zlib
  212. LDFLAGS += -Llibs/$(CONFIG)/zlib
  213. else
  214. DEP_MISSING += zlib
  215. endif
  216. endif
  217. ifeq ($(HAS_SYSTEM_OPENSSL_ALPN),false)
  218. ifeq ($(HAS_EMBEDDED_OPENSSL_ALPN),true)
  219. OPENSSL_DEP = libs/$(CONFIG)/openssl/libssl.a
  220. OPENSSL_MERGE_LIBS += libs/$(CONFIG)/openssl/libssl.a libs/$(CONFIG)/openssl/libcrypto.a
  221. CPPFLAGS += -Ithird_party/openssl/include
  222. LDFLAGS += -Llibs/$(CONFIG)/openssl
  223. LIBS_SECURE = dl
  224. else
  225. NO_SECURE = true
  226. endif
  227. else
  228. LIBS_SECURE = ssl crypto dl
  229. endif
  230. LDLIBS_SECURE += $(addprefix -l, $(LIBS_SECURE))
  231. ifeq ($(HAS_SYSTEM_PROTOBUF),false)
  232. ifeq ($(HAS_EMBEDDED_PROTOBUF),true)
  233. PROTOBUF_DEP = libs/$(CONFIG)/protobuf/libprotobuf.a
  234. CPPFLAGS += -Ithird_party/protobuf/src
  235. LDFLAGS += -Llibs/$(CONFIG)/protobuf
  236. PROTOC = bins/$(CONFIG)/protobuf/protoc
  237. else
  238. NO_PROTOBUF = true
  239. endif
  240. else
  241. endif
  242. LIBS_PROTOBUF = protobuf
  243. LIBS_PROTOC = protoc protobuf
  244. LDLIBS_PROTOBUF += $(addprefix -l, $(LIBS_PROTOBUF))
  245. HOST_LDLIBS_PROTOC += $(addprefix -l, $(LIBS_PROTOC))
  246. ifeq ($(MAKECMDGOALS),clean)
  247. NO_DEPS = true
  248. endif
  249. .SECONDARY = %.pb.h %.pb.cc
  250. PROTOC_PLUGINS=\
  251. % for tgt in targets:
  252. % if tgt.build == 'protoc':
  253. bins/$(CONFIG)/${tgt.name}\
  254. % endif
  255. % endfor
  256. ifeq ($(DEP_MISSING),)
  257. all: static shared\
  258. % for tgt in targets:
  259. % if tgt.build == 'all':
  260. bins/$(CONFIG)/${tgt.name}\
  261. % endif
  262. % endfor
  263. dep_error:
  264. @echo "You shouldn't see this message - all of your dependencies are correct."
  265. else
  266. all: dep_error git_update stop
  267. dep_error:
  268. @echo
  269. @echo "DEPENDENCY ERROR"
  270. @echo
  271. @echo "You are missing system dependencies that are essential to build grpc,"
  272. @echo "and the third_party directory doesn't have them:"
  273. @echo
  274. @echo " $(DEP_MISSING)"
  275. @echo
  276. @echo "Installing the development packages for your system will solve"
  277. @echo "this issue. Please consult INSTALL to get more information."
  278. @echo
  279. @echo "If you need information about why these tests failed, run:"
  280. @echo
  281. @echo " make run_dep_checks"
  282. @echo
  283. endif
  284. git_update:
  285. ifeq ($(IS_GIT_FOLDER),true)
  286. @echo "Additionally, since you are in a git clone, you can download the"
  287. @echo "missing dependencies in third_party by running the following command:"
  288. @echo
  289. @echo " git submodule update --init"
  290. @echo
  291. endif
  292. openssl_dep_error: openssl_dep_message git_update stop
  293. protobuf_dep_error: protobuf_dep_message git_update stop
  294. protoc_dep_error: protoc_dep_message git_update stop
  295. openssl_dep_message:
  296. @echo
  297. @echo "DEPENDENCY ERROR"
  298. @echo
  299. @echo "The target you are trying to run requires OpenSSL with ALPN support."
  300. @echo "Your system doesn't have it, and neither does the third_party directory."
  301. @echo
  302. @echo "Please consult INSTALL to get more information."
  303. @echo
  304. @echo "If you need information about why these tests failed, run:"
  305. @echo
  306. @echo " make run_dep_checks"
  307. @echo
  308. protobuf_dep_message:
  309. @echo
  310. @echo "DEPENDENCY ERROR"
  311. @echo
  312. @echo "The target you are trying to run requires protobuf 3.0.0+"
  313. @echo "Your system doesn't have it, and neither does the third_party directory."
  314. @echo
  315. @echo "Please consult INSTALL to get more information."
  316. @echo
  317. @echo "If you need information about why these tests failed, run:"
  318. @echo
  319. @echo " make run_dep_checks"
  320. @echo
  321. protoc_dep_message:
  322. @echo
  323. @echo "DEPENDENCY ERROR"
  324. @echo
  325. @echo "The target you are trying to run requires protobuf-compiler 3.0.0+"
  326. @echo "Your system doesn't have it, and neither does the third_party directory."
  327. @echo
  328. @echo "Please consult INSTALL to get more information."
  329. @echo
  330. @echo "If you need information about why these tests failed, run:"
  331. @echo
  332. @echo " make run_dep_checks"
  333. @echo
  334. stop:
  335. @false
  336. % for tgt in targets:
  337. ${tgt.name}: bins/$(CONFIG)/${tgt.name}
  338. % endfor
  339. run_dep_checks:
  340. $(OPENSSL_ALPN_CHECK_CMD) || true
  341. $(ZLIB_CHECK_CMD) || true
  342. $(PERFTOOLS_CHECK_CMD) || true
  343. $(PROTOBUF_CHECK_CMD) || true
  344. $(PROTOC_CHECK_CMD) || true
  345. libs/$(CONFIG)/zlib/libz.a:
  346. $(E) "[MAKE] Building zlib"
  347. $(Q)(cd third_party/zlib ; CC="$(CC)" CFLAGS="-fPIC -fvisibility=hidden $(CPPFLAGS_$(CONFIG))" ./configure --static)
  348. $(Q)$(MAKE) -C third_party/zlib clean
  349. $(Q)$(MAKE) -C third_party/zlib
  350. $(Q)mkdir -p libs/$(CONFIG)/zlib
  351. $(Q)cp third_party/zlib/libz.a libs/$(CONFIG)/zlib
  352. libs/$(CONFIG)/openssl/libssl.a:
  353. $(E) "[MAKE] Building openssl for $(SYSTEM)"
  354. ifeq ($(SYSTEM),Darwin)
  355. $(Q)(cd third_party/openssl ; CC="$(CC) -fPIC -fvisibility=hidden $(CPPFLAGS_$(CONFIG)) $(OPENSSL_CFLAGS_$(CONFIG))" ./Configure darwin64-x86_64-cc $(OPENSSL_CONFIG_$(CONFIG)))
  356. else
  357. $(Q)(cd third_party/openssl ; CC="$(CC) -fPIC -fvisibility=hidden $(CPPFLAGS_$(CONFIG)) $(OPENSSL_CFLAGS_$(CONFIG))" ./config $(OPENSSL_CONFIG_$(CONFIG)))
  358. endif
  359. $(Q)$(MAKE) -C third_party/openssl clean
  360. $(Q)$(MAKE) -C third_party/openssl build_crypto build_ssl
  361. $(Q)mkdir -p libs/$(CONFIG)/openssl
  362. $(Q)cp third_party/openssl/libssl.a third_party/openssl/libcrypto.a libs/$(CONFIG)/openssl
  363. third_party/protobuf/configure:
  364. $(E) "[AUTOGEN] Preparing protobuf"
  365. $(Q)(cd third_party/protobuf ; autoreconf -f -i -Wall,no-obsolete)
  366. libs/$(CONFIG)/protobuf/libprotobuf.a: third_party/protobuf/configure
  367. $(E) "[MAKE] Building protobuf"
  368. $(Q)(cd third_party/protobuf ; CC="$(CC)" CXX="$(CXX)" LDFLAGS="$(LDFLAGS_$(CONFIG)) -g" CXXFLAGS="-DLANG_CXX11 -std=c++11" CPPFLAGS="$(CPPFLAGS_$(CONFIG)) -g" ./configure --disable-shared --enable-static)
  369. $(Q)$(MAKE) -C third_party/protobuf clean
  370. $(Q)$(MAKE) -C third_party/protobuf
  371. $(Q)mkdir -p libs/$(CONFIG)/protobuf
  372. $(Q)mkdir -p bins/$(CONFIG)/protobuf
  373. $(Q)cp third_party/protobuf/src/.libs/libprotoc.a libs/$(CONFIG)/protobuf
  374. $(Q)cp third_party/protobuf/src/.libs/libprotobuf.a libs/$(CONFIG)/protobuf
  375. $(Q)cp third_party/protobuf/src/protoc bins/$(CONFIG)/protobuf
  376. static: static_c static_cxx
  377. static_c: \
  378. % for lib in libs:
  379. % if lib.build == 'all' and lib.language == 'c':
  380. libs/$(CONFIG)/lib${lib.name}.a\
  381. % endif
  382. % endfor
  383. static_cxx: \
  384. % for lib in libs:
  385. % if lib.build == 'all' and lib.language == 'c++':
  386. libs/$(CONFIG)/lib${lib.name}.a\
  387. % endif
  388. % endfor
  389. shared: shared_c shared_cxx
  390. shared_c: \
  391. % for lib in libs:
  392. % if lib.build == 'all' and lib.language == 'c':
  393. libs/$(CONFIG)/lib${lib.name}.$(SHARED_EXT)\
  394. % endif
  395. % endfor
  396. shared_cxx: \
  397. % for lib in libs:
  398. % if lib.build == 'all' and lib.language == 'c++':
  399. libs/$(CONFIG)/lib${lib.name}.$(SHARED_EXT)\
  400. % endif
  401. % endfor
  402. privatelibs: privatelibs_c privatelibs_cxx
  403. privatelibs_c: \
  404. % for lib in libs:
  405. % if lib.build == 'private' and lib.language == 'c':
  406. libs/$(CONFIG)/lib${lib.name}.a\
  407. % endif
  408. % endfor
  409. privatelibs_cxx: \
  410. % for lib in libs:
  411. % if lib.build == 'private' and lib.language == 'c++':
  412. libs/$(CONFIG)/lib${lib.name}.a\
  413. % endif
  414. % endfor
  415. buildtests: buildtests_c buildtests_cxx
  416. buildtests_c: privatelibs_c\
  417. % for tgt in targets:
  418. % if tgt.build == 'test' and not tgt.language == 'c++':
  419. bins/$(CONFIG)/${tgt.name}\
  420. % endif
  421. % endfor
  422. buildtests_cxx: privatelibs_cxx\
  423. % for tgt in targets:
  424. % if tgt.build == 'test' and tgt.language == 'c++':
  425. bins/$(CONFIG)/${tgt.name}\
  426. % endif
  427. % endfor
  428. test: test_c test_cxx
  429. test_c: buildtests_c
  430. % for tgt in targets:
  431. % if tgt.build == 'test' and tgt.get('run', True) and not tgt.language == 'c++':
  432. $(E) "[RUN] Testing ${tgt.name}"
  433. $(Q) ./bins/$(CONFIG)/${tgt.name} || ( echo test ${tgt.name} failed ; exit 1 )
  434. % endif
  435. % endfor
  436. test_cxx: buildtests_cxx
  437. % for tgt in targets:
  438. % if tgt.build == 'test' and tgt.get('run', True) and tgt.language == 'c++':
  439. $(E) "[RUN] Testing ${tgt.name}"
  440. $(Q) ./bins/$(CONFIG)/${tgt.name} || ( echo test ${tgt.name} failed ; exit 1 )
  441. % endif
  442. % endfor
  443. tools: privatelibs\
  444. % for tgt in targets:
  445. % if tgt.build == 'tool':
  446. bins/$(CONFIG)/${tgt.name}\
  447. % endif
  448. % endfor
  449. buildbenchmarks: privatelibs\
  450. % for tgt in targets:
  451. % if tgt.build == 'benchmark':
  452. bins/$(CONFIG)/${tgt.name}\
  453. % endif
  454. % endfor
  455. benchmarks: buildbenchmarks
  456. strip: strip-static strip-shared
  457. strip-static: strip-static_c strip-static_cxx
  458. strip-shared: strip-shared_c strip-shared_cxx
  459. # TODO(nnoble): the strip target is stripping in-place, instead
  460. # of copying files in a temporary folder.
  461. # This prevents proper debugging after running make install.
  462. strip-static_c: static_c
  463. ifeq ($(CONFIG),opt)
  464. % for lib in libs:
  465. % if lib.language == "c":
  466. % if lib.build == "all":
  467. $(E) "[STRIP] Stripping lib${lib.name}.a"
  468. $(Q) $(STRIP) libs/$(CONFIG)/lib${lib.name}.a
  469. % endif
  470. % endif
  471. % endfor
  472. endif
  473. strip-static_cxx: static_cxx
  474. ifeq ($(CONFIG),opt)
  475. % for lib in libs:
  476. % if lib.language == "c++":
  477. % if lib.build == "all":
  478. $(E) "[STRIP] Stripping lib${lib.name}.a"
  479. $(Q) $(STRIP) libs/$(CONFIG)/lib${lib.name}.a
  480. % endif
  481. % endif
  482. % endfor
  483. endif
  484. strip-shared_c: shared_c
  485. ifeq ($(CONFIG),opt)
  486. % for lib in libs:
  487. % if lib.language == "c":
  488. % if lib.build == "all":
  489. $(E) "[STRIP] Stripping lib${lib.name}.so"
  490. $(Q) $(STRIP) libs/$(CONFIG)/lib${lib.name}.$(SHARED_EXT)
  491. % endif
  492. % endif
  493. % endfor
  494. endif
  495. strip-shared_cxx: shared_cxx
  496. ifeq ($(CONFIG),opt)
  497. % for lib in libs:
  498. % if lib.language == "c++":
  499. % if lib.build == "all":
  500. $(E) "[STRIP] Stripping lib${lib.name}.so"
  501. $(Q) $(STRIP) libs/$(CONFIG)/lib${lib.name}.$(SHARED_EXT)
  502. % endif
  503. % endif
  504. % endfor
  505. endif
  506. % for p in protos:
  507. ifeq ($(NO_PROTOC),true)
  508. gens/${p}.pb.cc: protoc_dep_error
  509. else
  510. gens/${p}.pb.cc: ${p}.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS)
  511. $(E) "[PROTOC] Generating protobuf CC file from $<"
  512. $(Q) mkdir -p `dirname $@`
  513. $(Q) $(PROTOC) --cpp_out=gens --grpc_out=gens --plugin=protoc-gen-grpc=bins/$(CONFIG)/cpp_plugin $<
  514. endif
  515. % endfor
  516. objs/$(CONFIG)/%.o : %.c
  517. $(E) "[C] Compiling $<"
  518. $(Q) mkdir -p `dirname $@`
  519. $(Q) $(CC) $(CFLAGS) $(CPPFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $<
  520. objs/$(CONFIG)/%.o : gens/%.pb.cc
  521. $(E) "[CXX] Compiling $<"
  522. $(Q) mkdir -p `dirname $@`
  523. $(Q) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $<
  524. objs/$(CONFIG)/src/compiler/%.o : src/compiler/%.cc
  525. $(E) "[HOSTCXX] Compiling $<"
  526. $(Q) mkdir -p `dirname $@`
  527. $(Q) $(HOST_CXX) $(HOST_CXXFLAGS) $(HOST_CPPFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $<
  528. objs/$(CONFIG)/%.o : %.cc
  529. $(E) "[CXX] Compiling $<"
  530. $(Q) mkdir -p `dirname $@`
  531. $(Q) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -MMD -MF $(addsuffix .dep, $(basename $@)) -c -o $@ $<
  532. install: install_c install_cxx
  533. install_c: install-headers_c install-static_c install-shared_c
  534. install_cxx: install-headers_cxx install-static_cxx install-shared_cxx
  535. install-headers: install-headers_c install-headers_cxx
  536. install-headers_c:
  537. $(E) "[INSTALL] Installing public C headers"
  538. $(Q) $(foreach h, $(PUBLIC_HEADERS_C), $(INSTALL) $(h) $(prefix)/$(h) && ) exit 0 || exit 1
  539. install-headers_cxx:
  540. $(E) "[INSTALL] Installing public C++ headers"
  541. $(Q) $(foreach h, $(PUBLIC_HEADERS_CXX), $(INSTALL) $(h) $(prefix)/$(h) && ) exit 0 || exit 1
  542. install-static: install-static_c install-static_cxx
  543. install-static_c: static_c strip-static_c
  544. % for lib in libs:
  545. % if lib.language == "c":
  546. % if lib.build == "all":
  547. $(E) "[INSTALL] Installing lib${lib.name}.a"
  548. $(Q) $(INSTALL) libs/$(CONFIG)/lib${lib.name}.a $(prefix)/lib/lib${lib.name}.a
  549. % endif
  550. % endif
  551. % endfor
  552. install-static_cxx: static_cxx strip-static_cxx
  553. % for lib in libs:
  554. % if lib.language == "c++":
  555. % if lib.build == "all":
  556. $(E) "[INSTALL] Installing lib${lib.name}.a"
  557. $(Q) $(INSTALL) libs/$(CONFIG)/lib${lib.name}.a $(prefix)/lib/lib${lib.name}.a
  558. % endif
  559. % endif
  560. % endfor
  561. install-shared_c: shared_c strip-shared_c
  562. % for lib in libs:
  563. % if lib.language == "c":
  564. % if lib.build == "all":
  565. ifeq ($(SYSTEM),MINGW32)
  566. $(E) "[INSTALL] Installing ${lib.name}.$(SHARED_EXT)"
  567. $(Q) $(INSTALL) libs/$(CONFIG)/${lib.name}.$(SHARED_EXT) $(prefix)/lib/${lib.name}.$(SHARED_EXT)
  568. $(Q) $(INSTALL) libs/$(CONFIG)/lib${lib.name}-imp.a $(prefix)/lib/lib${lib.name}-imp.a
  569. else
  570. $(E) "[INSTALL] Installing lib${lib.name}.$(SHARED_EXT)"
  571. $(Q) $(INSTALL) libs/$(CONFIG)/lib${lib.name}.$(SHARED_EXT) $(prefix)/lib/lib${lib.name}.$(SHARED_EXT)
  572. ifneq ($(SYSTEM),Darwin)
  573. $(Q) ln -sf lib${lib.name}.$(SHARED_EXT) $(prefix)/lib/lib${lib.name}.so
  574. endif
  575. endif
  576. % endif
  577. % endif
  578. % endfor
  579. ifneq ($(SYSTEM),MINGW32)
  580. ifneq ($(SYSTEM),Darwin)
  581. $(Q) ldconfig
  582. endif
  583. endif
  584. install-shared_cxx: shared_cxx strip-shared_cxx
  585. % for lib in libs:
  586. % if lib.language == "c++":
  587. % if lib.build == "all":
  588. ifeq ($(SYSTEM),MINGW32)
  589. $(E) "[INSTALL] Installing ${lib.name}.$(SHARED_EXT)"
  590. $(Q) $(INSTALL) libs/$(CONFIG)/${lib.name}.$(SHARED_EXT) $(prefix)/lib/${lib.name}.$(SHARED_EXT)
  591. $(Q) $(INSTALL) libs/$(CONFIG)/lib${lib.name}-imp.a $(prefix)/lib/lib${lib.name}-imp.a
  592. else
  593. $(E) "[INSTALL] Installing lib${lib.name}.$(SHARED_EXT)"
  594. $(Q) $(INSTALL) libs/$(CONFIG)/lib${lib.name}.$(SHARED_EXT) $(prefix)/lib/lib${lib.name}.$(SHARED_EXT)
  595. ifneq ($(SYSTEM),Darwin)
  596. $(Q) ln -sf lib${lib.name}.$(SHARED_EXT) $(prefix)/lib/lib${lib.name}.so
  597. endif
  598. endif
  599. % endif
  600. % endif
  601. % endfor
  602. ifneq ($(SYSTEM),MINGW32)
  603. ifneq ($(SYSTEM),Darwin)
  604. $(Q) ldconfig
  605. endif
  606. endif
  607. clean:
  608. $(Q) $(RM) -rf objs libs bins gens
  609. # The various libraries
  610. % for lib in libs:
  611. ${makelib(lib)}
  612. % endfor
  613. # All of the test targets, and protoc plugins
  614. % for tgt in targets:
  615. ${maketarget(tgt)}
  616. % endfor
  617. <%def name="makelib(lib)">
  618. LIB${lib.name.upper()}_SRC = \\
  619. % for src in lib.src:
  620. ${proto_to_cc(src)} \\
  621. % endfor
  622. % if "public_headers" in lib:
  623. % if lib.language == "c++":
  624. PUBLIC_HEADERS_CXX += \\
  625. % else:
  626. PUBLIC_HEADERS_C += \\
  627. % endif
  628. % for hdr in lib.public_headers:
  629. ${hdr} \\
  630. % endfor
  631. % endif
  632. LIB${lib.name.upper()}_OBJS = $(addprefix objs/$(CONFIG)/, $(addsuffix .o, $(basename $(LIB${lib.name.upper()}_SRC))))
  633. ## If the library requires OpenSSL with ALPN, let's add some restrictions.
  634. % if lib.get('secure', True):
  635. ifeq ($(NO_SECURE),true)
  636. # You can't build secure libraries if you don't have OpenSSL with ALPN.
  637. libs/$(CONFIG)/lib${lib.name}.a: openssl_dep_error
  638. % if lib.build == "all":
  639. ifeq ($(SYSTEM),MINGW32)
  640. libs/$(CONFIG)/${lib.name}.$(SHARED_EXT): openssl_dep_error
  641. else
  642. libs/$(CONFIG)/lib${lib.name}.$(SHARED_EXT): openssl_dep_error
  643. endif
  644. % endif
  645. else
  646. % if lib.language == 'c++':
  647. ifeq ($(NO_PROTOBUF),true)
  648. # You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay.
  649. libs/$(CONFIG)/lib${lib.name}.a: protobuf_dep_error
  650. % if lib.build == "all":
  651. ifeq ($(SYSTEM),MINGW32)
  652. libs/$(CONFIG)/${lib.name}.$(SHARED_EXT): protobuf_dep_error
  653. else
  654. libs/$(CONFIG)/lib${lib.name}.$(SHARED_EXT): protobuf_dep_error
  655. endif
  656. % endif
  657. else
  658. % endif
  659. ifneq ($(OPENSSL_DEP),)
  660. # This is to ensure the embedded OpenSSL is built beforehand, properly
  661. # installing headers to their final destination on the drive. We need this
  662. # otherwise parallel compilation will fail if a source is compiled first.
  663. % for src in lib.src:
  664. ${src}: $(OPENSSL_DEP)
  665. % endfor
  666. endif
  667. libs/$(CONFIG)/lib${lib.name}.a: $(ZLIB_DEP) $(OPENSSL_DEP)\
  668. ## The else here corresponds to the if secure earlier.
  669. % else:
  670. % if lib.language == 'c++':
  671. ifeq ($(NO_PROTOBUF),true)
  672. # You can't build a C++ library if you don't have protobuf - a bit overreached, but still okay.
  673. libs/$(CONFIG)/lib${lib.name}.a: protobuf_dep_error
  674. % if lib.build == "all":
  675. ifeq ($(SYSTEM),MINGW32)
  676. libs/$(CONFIG)/${lib.name}.$(SHARED_EXT): protobuf_dep_error
  677. else
  678. libs/$(CONFIG)/lib${lib.name}.$(SHARED_EXT): protobuf_dep_error
  679. endif
  680. % endif
  681. else
  682. % endif
  683. libs/$(CONFIG)/lib${lib.name}.a: $(ZLIB_DEP)\
  684. % endif
  685. % if lib.language == 'c++':
  686. $(PROTOBUF_DEP)\
  687. % endif
  688. $(LIB${lib.name.upper()}_OBJS)
  689. $(E) "[AR] Creating $@"
  690. $(Q) mkdir -p `dirname $@`
  691. $(Q) rm -f libs/$(CONFIG)/lib${lib.name}.a
  692. $(Q) $(AR) rcs libs/$(CONFIG)/lib${lib.name}.a $(LIB${lib.name.upper()}_OBJS)
  693. % if lib.get('baselib', False):
  694. % if lib.get('secure', True):
  695. $(Q) rm -rf tmp-merge
  696. $(Q) mkdir tmp-merge
  697. $(Q) ( cd tmp-merge ; $(AR) x ../libs/$(CONFIG)/lib${lib.name}.a )
  698. $(Q) for l in $(OPENSSL_MERGE_LIBS) ; do ( cd tmp-merge ; <%text>ar x ../$${l}</%text> ) ; done
  699. $(Q) rm -f libs/$(CONFIG)/lib${lib.name}.a tmp-merge/__.SYMDEF*
  700. $(Q) ar rcs libs/$(CONFIG)/lib${lib.name}.a tmp-merge/*
  701. $(Q) rm -rf tmp-merge
  702. % endif
  703. % endif
  704. ifeq ($(SYSTEM),Darwin)
  705. $(Q) ranlib libs/$(CONFIG)/lib${lib.name}.a
  706. endif
  707. <%
  708. if lib.language == 'c++':
  709. ld = '$(LDXX)'
  710. else:
  711. ld = '$(LD)'
  712. out_base = 'libs/$(CONFIG)/' + lib.name
  713. out_libbase = 'libs/$(CONFIG)/lib' + lib.name
  714. common = '$(LIB' + lib.name.upper() + '_OBJS) $(LDLIBS)'
  715. libs = ''
  716. lib_deps = ' $(ZLIB_DEP)'
  717. mingw_libs = ''
  718. mingw_lib_deps = ' $(ZLIB_DEP)'
  719. for dep in lib.get('deps', []):
  720. libs = libs + ' -l' + dep
  721. lib_deps = lib_deps + ' libs/$(CONFIG)/lib' + dep + '.$(SHARED_EXT)'
  722. mingw_libs = mingw_libs + ' -l' + dep + '-imp'
  723. mingw_lib_deps = mingw_lib_deps + 'libs/$(CONFIG)/' + dep + '.$(SHARED_EXT)'
  724. if lib.get('secure', True):
  725. common = common + ' $(LDLIBS_SECURE) $(OPENSSL_MERGE_LIBS)'
  726. lib_deps = lib_deps + ' $(OPENSSL_DEP)'
  727. mingw_lib_deps = mingw_lib_deps + ' $(OPENSSL_DEP)'
  728. %>
  729. % if lib.build == "all":
  730. ifeq ($(SYSTEM),MINGW32)
  731. ${out_base}.$(SHARED_EXT): $(LIB${lib.name.upper()}_OBJS) ${mingw_lib_deps}
  732. $(E) "[LD] Linking $@"
  733. $(Q) mkdir -p `dirname $@`
  734. $(Q) ${ld} $(LDFLAGS) -Llibs/$(CONFIG) -shared -Wl,--output-def=${out_base}.def -Wl,--out-implib=${out_libbase}-imp.a -o ${out_base}.$(SHARED_EXT) ${common}${mingw_libs}
  735. else
  736. ${out_libbase}.$(SHARED_EXT): $(LIB${lib.name.upper()}_OBJS) ${lib_deps}
  737. $(E) "[LD] Linking $@"
  738. $(Q) mkdir -p `dirname $@`
  739. ifeq ($(SYSTEM),Darwin)
  740. $(Q) ${ld} $(LDFLAGS) -Llibs/$(CONFIG) -dynamiclib -o ${out_libbase}.$(SHARED_EXT) ${common}${libs}
  741. else
  742. $(Q) ${ld} $(LDFLAGS) -Llibs/$(CONFIG) -shared -Wl,-soname,lib${lib.name}.so.${settings.version.major} -o ${out_libbase}.$(SHARED_EXT) ${common}${libs}
  743. $(Q) ln -sf lib${lib.name}.$(SHARED_EXT) ${out_libbase}.so.${settings.version.major}
  744. $(Q) ln -sf lib${lib.name}.$(SHARED_EXT) ${out_libbase}.so
  745. endif
  746. endif
  747. % endif
  748. % if lib.get('secure', True):
  749. ## If the lib was secure, we have to close the Makefile's if that tested
  750. ## the presence of an ALPN-capable OpenSSL.
  751. endif
  752. % endif
  753. % if lib.language == 'c++':
  754. ## If the lib was C++, we have to close the Makefile's if that tested
  755. ## the presence of protobuf 3.0.0+
  756. endif
  757. % endif
  758. % if lib.get('secure', True):
  759. ifneq ($(NO_SECURE),true)
  760. % endif
  761. ifneq ($(NO_DEPS),true)
  762. -include $(LIB${lib.name.upper()}_OBJS:.o=.dep)
  763. endif
  764. % if lib.get('secure', True):
  765. endif
  766. % endif
  767. % for src in lib.src:
  768. % if not proto_re.match(src):
  769. objs/$(CONFIG)/${os.path.splitext(src)[0]}.o: \
  770. % for src2 in lib.src:
  771. % if proto_re.match(src2):
  772. ${proto_to_cc(src2)}\
  773. % endif
  774. % endfor
  775. % endif
  776. % endfor
  777. </%def>
  778. <%def name="maketarget(tgt)">
  779. ${tgt.name.upper()}_SRC = \\
  780. % for src in tgt.src:
  781. ${proto_to_cc(src)} \\
  782. % endfor
  783. ${tgt.name.upper()}_OBJS = $(addprefix objs/$(CONFIG)/, $(addsuffix .o, $(basename $(${tgt.name.upper()}_SRC))))
  784. % if tgt.get('secure', True):
  785. ifeq ($(NO_SECURE),true)
  786. # You can't build secure targets if you don't have OpenSSL with ALPN.
  787. bins/$(CONFIG)/${tgt.name}: openssl_dep_error
  788. else
  789. % endif
  790. ##
  791. ## We're not trying to add a dependency on building zlib and openssl here,
  792. ## as it's already done in the libraries. We're assuming that the build
  793. ## trickles down, and that a secure target requires a secure version of
  794. ## a library.
  795. ##
  796. ## That simplifies the codegen a bit, but prevents a fully defined Makefile.
  797. ## I can live with that.
  798. ##
  799. % if tgt.build == 'protoc':
  800. ifeq ($(NO_PROTOBUF),true)
  801. # You can't build the protoc plugins if you don't have protobuf 3.0.0+.
  802. bins/$(CONFIG)/${tgt.name}: protobuf_dep_error
  803. else
  804. bins/$(CONFIG)/${tgt.name}: $(PROTOBUF_DEP) $(${tgt.name.upper()}_OBJS)\
  805. % else:
  806. bins/$(CONFIG)/${tgt.name}: $(${tgt.name.upper()}_OBJS)\
  807. % endif
  808. % for dep in tgt.deps:
  809. libs/$(CONFIG)/lib${dep}.a\
  810. % endfor
  811. % if tgt.language == "c++":
  812. ## C++ targets specificies.
  813. % if tgt.build == 'protoc':
  814. $(E) "[HOSTLD] Linking $@"
  815. $(Q) mkdir -p `dirname $@`
  816. $(Q) $(HOST_LDXX) $(HOST_LDFLAGS) $(${tgt.name.upper()}_OBJS)\
  817. % else:
  818. $(E) "[LD] Linking $@"
  819. $(Q) mkdir -p `dirname $@`
  820. $(Q) $(LDXX) $(LDFLAGS) $(${tgt.name.upper()}_OBJS)\
  821. % endif
  822. % if tgt.build == 'test':
  823. $(GTEST_LIB)\
  824. % endif
  825. % else:
  826. ## C-only targets specificities.
  827. $(E) "[LD] Linking $@"
  828. $(Q) mkdir -p `dirname $@`
  829. $(Q) $(LD) $(LDFLAGS) $(${tgt.name.upper()}_OBJS)\
  830. % endif
  831. % for dep in tgt.deps:
  832. libs/$(CONFIG)/lib${dep}.a\
  833. % endfor
  834. % if tgt.language == "c++":
  835. % if tgt.build == 'protoc':
  836. $(HOST_LDLIBSXX) $(HOST_LDLIBS_PROTOC)\
  837. % else:
  838. $(LDLIBSXX) $(LDLIBS_PROTOBUF)\
  839. % endif
  840. % endif
  841. % if tgt.build == 'protoc':
  842. $(HOST_LDLIBS)\
  843. % else:
  844. $(LDLIBS)\
  845. % endif
  846. % if tgt.build == 'protoc':
  847. $(HOST_LDLIBS_PROTOC)\
  848. % elif tgt.get('secure', True):
  849. $(LDLIBS_SECURE)\
  850. % endif
  851. -o bins/$(CONFIG)/${tgt.name}
  852. % if tgt.build == 'protoc':
  853. endif
  854. % endif
  855. % if tgt.get('secure', True):
  856. endif
  857. % endif
  858. % for src in tgt.src:
  859. objs/$(CONFIG)/${os.path.splitext(src)[0]}.o: \
  860. % for dep in tgt.deps:
  861. libs/$(CONFIG)/lib${dep}.a\
  862. % endfor
  863. % endfor
  864. deps_${tgt.name}: $(${tgt.name.upper()}_OBJS:.o=.dep)
  865. % if tgt.get('secure', True):
  866. ifneq ($(NO_SECURE),true)
  867. % endif
  868. ifneq ($(NO_DEPS),true)
  869. -include $(${tgt.name.upper()}_OBJS:.o=.dep)
  870. endif
  871. % if tgt.get('secure', True):
  872. endif
  873. % endif
  874. </%def>
  875. .PHONY: all strip tools \
  876. dep_error openssl_dep_error openssl_dep_message git_update stop \
  877. buildtests buildtests_c buildtests_cxx \
  878. test test_c test_cxx \
  879. install install_c install_cxx \
  880. install-headers install-headers_c install-headers_cxx \
  881. install-shared install-shared_c install-shared_cxx \
  882. install-static install-static_c install-static_cxx \
  883. strip strip-shared strip-static \
  884. strip_c strip-shared_c strip-static_c \
  885. strip_cxx strip-shared_cxx strip-static_cxx \
  886. dep_c dep_cxx bins_dep_c bins_dep_cxx \
  887. clean