Makefile.template 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925
  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. # Configurations
  19. VALID_CONFIG_opt = 1
  20. CC_opt = gcc
  21. CXX_opt = g++
  22. LD_opt = gcc
  23. LDXX_opt = g++
  24. CPPFLAGS_opt = -O2
  25. LDFLAGS_opt =
  26. DEFINES_opt = NDEBUG
  27. VALID_CONFIG_dbg = 1
  28. CC_dbg = gcc
  29. CXX_dbg = g++
  30. LD_dbg = gcc
  31. LDXX_dbg = g++
  32. CPPFLAGS_dbg = -O0
  33. LDFLAGS_dbg =
  34. DEFINES_dbg = _DEBUG DEBUG
  35. VALID_CONFIG_valgrind = 1
  36. CC_valgrind = gcc
  37. CXX_valgrind = g++
  38. LD_valgrind = gcc
  39. LDXX_valgrind = g++
  40. CPPFLAGS_valgrind = -O0
  41. OPENSSL_CFLAGS_valgrind = -DPURIFY
  42. LDFLAGS_valgrind =
  43. DEFINES_valgrind = _DEBUG DEBUG
  44. VALID_CONFIG_tsan = 1
  45. CC_tsan = clang
  46. CXX_tsan = clang++
  47. LD_tsan = clang
  48. LDXX_tsan = clang++
  49. CPPFLAGS_tsan = -O1 -fsanitize=thread -fno-omit-frame-pointer
  50. OPENSSL_CONFIG_tsan = no-asm
  51. LDFLAGS_tsan = -fsanitize=thread
  52. DEFINES_tsan = NDEBUG
  53. VALID_CONFIG_asan = 1
  54. CC_asan = clang
  55. CXX_asan = clang++
  56. LD_asan = clang
  57. LDXX_asan = clang++
  58. CPPFLAGS_asan = -O1 -fsanitize=address -fno-omit-frame-pointer
  59. OPENSSL_CONFIG_asan = no-asm
  60. LDFLAGS_asan = -fsanitize=address
  61. DEFINES_asan = NDEBUG
  62. VALID_CONFIG_msan = 1
  63. CC_msan = clang
  64. CXX_msan = clang++
  65. LD_msan = clang
  66. LDXX_msan = clang++
  67. CPPFLAGS_msan = -O1 -fsanitize=memory -fno-omit-frame-pointer
  68. OPENSSL_CFLAGS_msan = -DPURIFY
  69. OPENSSL_CONFIG_msan = no-asm
  70. LDFLAGS_msan = -fsanitize=memory
  71. DEFINES_msan = NDEBUG
  72. VALID_CONFIG_gcov = 1
  73. CC_gcov = gcc
  74. CXX_gcov = g++
  75. LD_gcov = gcc
  76. LDXX_gcov = g++
  77. CPPFLAGS_gcov = -O0 -fprofile-arcs -ftest-coverage
  78. LDFLAGS_gcov = -fprofile-arcs -ftest-coverage
  79. DEFINES_gcov = NDEBUG
  80. # General settings.
  81. # You may want to change these depending on your system.
  82. prefix ?= /usr/local
  83. PROTOC = protoc
  84. CONFIG ?= opt
  85. CC = $(CC_$(CONFIG))
  86. CXX = $(CXX_$(CONFIG))
  87. LD = $(LD_$(CONFIG))
  88. LDXX = $(LDXX_$(CONFIG))
  89. AR = ar
  90. STRIP = strip --strip-unneeded
  91. INSTALL = install -D
  92. RM = rm -f
  93. ifndef VALID_CONFIG_$(CONFIG)
  94. $(error Invalid CONFIG value '$(CONFIG)')
  95. endif
  96. HOST_CC = $(CC)
  97. HOST_CXX = $(CXX)
  98. HOST_LD = $(LD)
  99. HOST_LDXX = $(LDXX)
  100. CPPFLAGS += $(CPPFLAGS_$(CONFIG))
  101. DEFINES += $(DEFINES_$(CONFIG))
  102. LDFLAGS += $(LDFLAGS_$(CONFIG))
  103. CFLAGS += -std=c89 -pedantic
  104. CXXFLAGS += -std=c++11
  105. CPPFLAGS += -g -fPIC -Wall -Werror -Wno-long-long
  106. LDFLAGS += -g -pthread -fPIC
  107. INCLUDES = . include gens
  108. LIBS = rt m z pthread
  109. LIBSXX = protobuf
  110. LIBS_PROTOC = protoc protobuf
  111. ifneq ($(wildcard /usr/src/gtest/src/gtest-all.cc),)
  112. GTEST_LIB = /usr/src/gtest/src/gtest-all.cc -I/usr/src/gtest
  113. else
  114. GTEST_LIB = -lgtest
  115. endif
  116. GTEST_LIB += -lgflags
  117. ifeq ($(V),1)
  118. E = @:
  119. Q =
  120. else
  121. E = @echo
  122. Q = @
  123. endif
  124. VERSION = ${settings.version.major}.${settings.version.minor}.${settings.version.micro}.${settings.version.build}
  125. CPPFLAGS_NO_ARCH += $(addprefix -I, $(INCLUDES)) $(addprefix -D, $(DEFINES))
  126. CPPFLAGS += $(CPPFLAGS_NO_ARCH) $(ARCH_FLAGS)
  127. LDFLAGS += $(ARCH_FLAGS)
  128. LDLIBS += $(addprefix -l, $(LIBS))
  129. LDLIBSXX += $(addprefix -l, $(LIBSXX))
  130. HOST_LDLIBS_PROTOC += $(addprefix -l, $(LIBS_PROTOC))
  131. HOST_CPPFLAGS = $(CPPFLAGS)
  132. HOST_CFLAGS = $(CFLAGS)
  133. HOST_CXXFLAGS = $(CXXFLAGS)
  134. HOST_LDFLAGS = $(LDFLAGS)
  135. HOST_LDLIBS = $(LDLIBS)
  136. # These are automatically computed variables.
  137. # There shouldn't be any need to change anything from now on.
  138. HOST_SYSTEM = $(shell uname | cut -f 1 -d_)
  139. ifeq ($(SYSTEM),)
  140. SYSTEM = $(HOST_SYSTEM)
  141. endif
  142. ifeq ($(SYSTEM),MINGW32)
  143. SHARED_EXT = dll
  144. endif
  145. ifeq ($(SYSTEM),Darwin)
  146. SHARED_EXT = dylib
  147. endif
  148. ifeq ($(SHARED_EXT),)
  149. SHARED_EXT = so.$(VERSION)
  150. endif
  151. ifeq ($(wildcard .git),)
  152. IS_GIT_FOLDER = false
  153. else
  154. IS_GIT_FOLDER = true
  155. endif
  156. OPENSSL_ALPN_CHECK_CMD = $(CC) $(CFLAGS) $(CPPFLAGS) -o /dev/null test/build/openssl-alpn.c -lssl -lcrypto -ldl $(LDFLAGS)
  157. ZLIB_CHECK_CMD = $(CC) $(CFLAGS) $(CPPFLAGS) -o /dev/null test/build/zlib.c -lz $(LDFLAGS)
  158. HAS_SYSTEM_OPENSSL_ALPN = $(shell $(OPENSSL_ALPN_CHECK_CMD) 2> /dev/null && echo true || echo false)
  159. HAS_SYSTEM_ZLIB = $(shell $(ZLIB_CHECK_CMD) 2> /dev/null && echo true || echo false)
  160. ifeq ($(wildcard third_party/openssl/ssl/ssl.h),)
  161. HAS_EMBEDDED_OPENSSL_ALPN = false
  162. else
  163. HAS_EMBEDDED_OPENSSL_ALPN = true
  164. endif
  165. ifeq ($(wildcard third_party/zlib/zlib.h),)
  166. HAS_EMBEDDED_ZLIB = false
  167. else
  168. HAS_EMBEDDED_ZLIB = true
  169. endif
  170. ifeq ($(HAS_SYSTEM_ZLIB),false)
  171. ifeq ($(HAS_EMBEDDED_ZLIB),true)
  172. ZLIB_DEP = third_party/zlib/libz.a
  173. CPPFLAGS += -Ithird_party/zlib
  174. LDFLAGS += -Lthird_party/zlib
  175. else
  176. DEP_MISSING += zlib
  177. endif
  178. endif
  179. ifeq ($(HAS_SYSTEM_OPENSSL_ALPN),false)
  180. ifeq ($(HAS_EMBEDDED_OPENSSL_ALPN),true)
  181. OPENSSL_DEP = libs/$(CONFIG)/openssl/libssl.a
  182. OPENSSL_MERGE_LIBS += libs/$(CONFIG)/openssl/libssl.a libs/$(CONFIG)/openssl/libcrypto.a
  183. CPPFLAGS += -Ithird_party/openssl/include
  184. LDFLAGS += -Llibs/$(CONFIG)/openssl
  185. LIBS_SECURE = dl
  186. else
  187. NO_SECURE = true
  188. endif
  189. else
  190. LIBS_SECURE = ssl crypto dl
  191. endif
  192. LDLIBS_SECURE += $(addprefix -l, $(LIBS_SECURE))
  193. ifneq ($(DEP_MISSING),)
  194. NO_DEPS = true
  195. endif
  196. ifneq ($(MAKECMDGOALS),clean)
  197. NO_DEPS = true
  198. endif
  199. .SECONDARY = %.pb.h %.pb.cc
  200. ifeq ($(DEP_MISSING),)
  201. all: static shared\
  202. % for tgt in targets:
  203. % if tgt.build == 'all':
  204. bins/$(CONFIG)/${tgt.name}\
  205. % endif
  206. % endfor
  207. dep_error:
  208. @echo "You shouldn't see this message - all of your dependencies are correct."
  209. else
  210. all: dep_error git_update stop
  211. dep_error:
  212. @echo
  213. @echo "DEPENDENCY ERROR"
  214. @echo
  215. @echo "You are missing system dependencies that are essential to build grpc,"
  216. @echo "and the third_party directory doesn't have them:"
  217. @echo
  218. @echo " $(DEP_MISSING)"
  219. @echo
  220. @echo "Installing the development packages for your system will solve"
  221. @echo "this issue. Please consult INSTALL to get more information."
  222. @echo
  223. @echo "If you need information about why these tests failed, run:"
  224. @echo
  225. @echo " make run_dep_checks"
  226. @echo
  227. endif
  228. git_update:
  229. ifeq ($(IS_GIT_FOLDER),true)
  230. @echo "Additionally, since you are in a git clone, you can download the"
  231. @echo "missing dependencies in third_party by running the following command:"
  232. @echo
  233. @echo " git submodule update --init"
  234. @echo
  235. endif
  236. openssl_dep_error: openssl_dep_message git_update stop
  237. openssl_dep_message:
  238. @echo
  239. @echo "DEPENDENCY ERROR"
  240. @echo
  241. @echo "The target you are trying to run requires OpenSSL with ALPN support."
  242. @echo "Your system doesn't have it, and neither does the third_party directory."
  243. @echo
  244. @echo "Please consult INSTALL to get more information."
  245. @echo
  246. @echo "If you need information about why these tests failed, run:"
  247. @echo
  248. @echo " make run_dep_checks"
  249. @echo
  250. stop:
  251. @false
  252. % for tgt in targets:
  253. ${tgt.name}: bins/$(CONFIG)/${tgt.name}
  254. % endfor
  255. run_dep_checks:
  256. $(OPENSSL_ALPN_CHECK_CMD) || true
  257. $(ZLIB_CHECK_CMD) || true
  258. third_party/zlib/libz.a:
  259. (cd third_party/zlib ; CFLAGS="-fPIC -fvisibility=hidden" ./configure --static)
  260. $(MAKE) -C third_party/zlib
  261. libs/$(CONFIG)/openssl/libssl.a:
  262. (cd third_party/openssl ; CC="$(CC) -fPIC -fvisibility=hidden $(CPPFLAGS_$(CONFIG)) $(OPENSSL_CFLAGS_$(CONFIG))" ./config $(OPENSSL_CONFIG_$(CONFIG)))
  263. $(MAKE) -C third_party/openssl clean
  264. $(MAKE) -C third_party/openssl build_crypto build_ssl
  265. mkdir -p libs/$(CONFIG)/openssl
  266. cp third_party/openssl/libssl.a third_party/openssl/libcrypto.a libs/$(CONFIG)/openssl
  267. static: static_c static_cxx
  268. static_c: dep_c\
  269. % for lib in libs:
  270. % if lib.build == 'all' and not lib.get('c++', False):
  271. libs/$(CONFIG)/lib${lib.name}.a\
  272. % endif
  273. % endfor
  274. static_cxx: dep_cxx\
  275. % for lib in libs:
  276. % if lib.build == 'all' and lib.get('c++', False):
  277. libs/$(CONFIG)/lib${lib.name}.a\
  278. % endif
  279. % endfor
  280. shared: shared_c shared_cxx
  281. shared_c: dep_c\
  282. % for lib in libs:
  283. % if lib.build == 'all' and not lib.get('c++', False):
  284. libs/$(CONFIG)/lib${lib.name}.$(SHARED_EXT)\
  285. % endif
  286. % endfor
  287. shared_cxx: dep_cxx\
  288. % for lib in libs:
  289. % if lib.build == 'all' and lib.get('c++', False):
  290. libs/$(CONFIG)/lib${lib.name}.$(SHARED_EXT)\
  291. % endif
  292. % endfor
  293. privatelibs: privatelibs_c privatelibs_cxx
  294. privatelibs_c: dep_c\
  295. % for lib in libs:
  296. % if lib.build == 'private' and not lib.get('c++', False):
  297. libs/$(CONFIG)/lib${lib.name}.a\
  298. % endif
  299. % endfor
  300. privatelibs_cxx: dep_cxx\
  301. % for lib in libs:
  302. % if lib.build == 'private' and lib.get('c++', False):
  303. libs/$(CONFIG)/lib${lib.name}.a\
  304. % endif
  305. % endfor
  306. buildtests: buildtests_c buildtests_cxx
  307. buildtests_c: bins_dep_c privatelibs_c\
  308. % for tgt in targets:
  309. % if tgt.build == 'test' and not tgt.get('c++', False):
  310. bins/$(CONFIG)/${tgt.name}\
  311. % endif
  312. % endfor
  313. buildtests_cxx: bins_dep_cxx privatelibs_cxx\
  314. % for tgt in targets:
  315. % if tgt.build == 'test' and tgt.get('c++', False):
  316. bins/$(CONFIG)/${tgt.name}\
  317. % endif
  318. % endfor
  319. test: test_c test_cxx
  320. test_c: buildtests_c
  321. % for tgt in targets:
  322. % if tgt.build == 'test' and tgt.get('run', True) and not tgt.get('c++', False):
  323. $(E) "[RUN] Testing ${tgt.name}"
  324. $(Q) ./bins/$(CONFIG)/${tgt.name} || ( echo test ${tgt.name} failed ; exit 1 )
  325. % endif
  326. % endfor
  327. test_cxx: buildtests_cxx
  328. % for tgt in targets:
  329. % if tgt.build == 'test' and tgt.get('run', True) and tgt.get('c++', False):
  330. $(E) "[RUN] Testing ${tgt.name}"
  331. $(Q) ./bins/$(CONFIG)/${tgt.name} || ( echo test ${tgt.name} failed ; exit 1 )
  332. % endif
  333. % endfor
  334. tools: privatelibs\
  335. % for tgt in targets:
  336. % if tgt.build == 'tool':
  337. bins/$(CONFIG)/${tgt.name}\
  338. % endif
  339. % endfor
  340. protoc_plugins:\
  341. % for tgt in targets:
  342. % if tgt.build == 'protoc':
  343. bins/$(CONFIG)/${tgt.name}\
  344. % endif
  345. % endfor
  346. buildbenchmarks: privatelibs\
  347. % for tgt in targets:
  348. % if tgt.build == 'benchmark':
  349. bins/$(CONFIG)/${tgt.name}\
  350. % endif
  351. % endfor
  352. benchmarks: buildbenchmarks
  353. strip: strip-static strip-shared
  354. strip-static: strip-static_c strip-static_cxx
  355. strip-shared: strip-shared_c strip-shared_cxx
  356. strip-static_c: static_c
  357. % for lib in libs:
  358. % if not lib.get("c++", False):
  359. % if lib.build == "all":
  360. $(E) "[STRIP] Stripping lib${lib.name}.a"
  361. $(Q) $(STRIP) libs/$(CONFIG)/lib${lib.name}.a
  362. % endif
  363. % endif
  364. % endfor
  365. strip-static_cxx: static_cxx
  366. % for lib in libs:
  367. % if lib.get("c++", False):
  368. % if lib.build == "all":
  369. $(E) "[STRIP] Stripping lib${lib.name}.a"
  370. $(Q) $(STRIP) libs/$(CONFIG)/lib${lib.name}.a
  371. % endif
  372. % endif
  373. % endfor
  374. strip-shared_c: shared_c
  375. % for lib in libs:
  376. % if not lib.get("c++", False):
  377. % if lib.build == "all":
  378. $(E) "[STRIP] Stripping lib${lib.name}.so"
  379. $(Q) $(STRIP) libs/$(CONFIG)/lib${lib.name}.$(SHARED_EXT)
  380. % endif
  381. % endif
  382. % endfor
  383. strip-shared_cxx: shared_cxx
  384. % for lib in libs:
  385. % if lib.get("c++", False):
  386. % if lib.build == "all":
  387. $(E) "[STRIP] Stripping lib${lib.name}.so"
  388. $(Q) $(STRIP) libs/$(CONFIG)/lib${lib.name}.$(SHARED_EXT)
  389. % endif
  390. % endif
  391. % endfor
  392. % for p in protos:
  393. deps/$(CONFIG)/gens/${p}.pb.dep:
  394. $(Q) mkdir -p `dirname $@`
  395. $(Q) touch $@
  396. gens/${p}.pb.cc: ${p}.proto protoc_plugins
  397. $(E) "[PROTOC] Generating protobuf CC file from $<"
  398. $(Q) mkdir -p `dirname $@`
  399. $(Q) $(PROTOC) --cpp_out=gens --grpc_out=gens --plugin=protoc-gen-grpc=bins/$(CONFIG)/cpp_plugin $<
  400. % endfor
  401. deps/$(CONFIG)/%.dep : %.c
  402. $(E) "[DEP] Generating dependencies for $<"
  403. $(Q) mkdir -p `dirname $@`
  404. $(Q) $(CC) $(CFLAGS) $(CPPFLAGS_NO_ARCH) -MG -M $< > $@
  405. deps/$(CONFIG)/%.dep : %.cc
  406. $(E) "[DEP] Generating dependencies for $<"
  407. $(Q) mkdir -p `dirname $@`
  408. $(Q) $(CXX) $(CXXFLAGS) $(CPPFLAGS_NO_ARCH) -MG -M $< > $@
  409. objs/$(CONFIG)/%.o : %.c
  410. $(E) "[C] Compiling $<"
  411. $(Q) mkdir -p `dirname $@`
  412. $(Q) $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<
  413. objs/$(CONFIG)/%.o : gens/%.pb.cc
  414. $(E) "[CXX] Compiling $<"
  415. $(Q) mkdir -p `dirname $@`
  416. $(Q) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -o $@ $<
  417. objs/$(CONFIG)/src/compiler/%.o : src/compiler/%.cc
  418. $(E) "[HOSTCXX] Compiling $<"
  419. $(Q) mkdir -p `dirname $@`
  420. $(Q) $(HOST_CXX) $(HOST_CXXFLAGS) $(HOST_CPPFLAGS) -c -o $@ $<
  421. objs/$(CONFIG)/%.o : %.cc
  422. $(E) "[CXX] Compiling $<"
  423. $(Q) mkdir -p `dirname $@`
  424. $(Q) $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c -o $@ $<
  425. dep: dep_c dep_cxx
  426. dep_c:\
  427. % for lib in libs:
  428. % if not lib.get('c++', False):
  429. deps_lib${lib.name}\
  430. % endif
  431. % endfor
  432. bins_dep_c:\
  433. % for tgt in targets:
  434. % if not tgt.get('c++', False):
  435. deps_${tgt.name}\
  436. % endif
  437. % endfor
  438. dep_cxx:\
  439. % for lib in libs:
  440. % if lib.get('c++', False):
  441. deps_lib${lib.name}\
  442. % endif
  443. % endfor
  444. bins_dep_cxx:\
  445. % for tgt in targets:
  446. % if tgt.get('c++', False):
  447. deps_${tgt.name}\
  448. % endif
  449. % endfor
  450. install: install_c install_cxx
  451. install_c: install-headers_c install-static_c install-shared_c
  452. install_cxx: install-headers_cxx install-static_cxx install-shared_cxx
  453. install-headers: install-headers_c install-headers_cxx
  454. install-headers_c:
  455. $(E) "[INSTALL] Installing public C headers"
  456. $(Q) $(foreach h, $(PUBLIC_HEADERS_C), $(INSTALL) $(h) $(prefix)/$(h) && ) exit 0 || exit 1
  457. install-headers_cxx:
  458. $(E) "[INSTALL] Installing public C++ headers"
  459. $(Q) $(foreach h, $(PUBLIC_HEADERS_CXX), $(INSTALL) $(h) $(prefix)/$(h) && ) exit 0 || exit 1
  460. install-static: install-static_c install-static_cxx
  461. install-static_c: static_c strip-static_c
  462. % for lib in libs:
  463. % if not lib.get("c++", False):
  464. % if lib.build == "all":
  465. $(E) "[INSTALL] Installing lib${lib.name}.a"
  466. $(Q) $(INSTALL) libs/$(CONFIG)/lib${lib.name}.a $(prefix)/lib/lib${lib.name}.a
  467. % endif
  468. % endif
  469. % endfor
  470. install-static_cxx: static_cxx strip-static_cxx
  471. % for lib in libs:
  472. % if lib.get("c++", False):
  473. % if lib.build == "all":
  474. $(E) "[INSTALL] Installing lib${lib.name}.a"
  475. $(Q) $(INSTALL) libs/$(CONFIG)/lib${lib.name}.a $(prefix)/lib/lib${lib.name}.a
  476. % endif
  477. % endif
  478. % endfor
  479. install-shared_c: shared_c strip-shared_c
  480. % for lib in libs:
  481. % if not lib.get("c++", False):
  482. % if lib.build == "all":
  483. ifeq ($(SYSTEM),MINGW32)
  484. $(E) "[INSTALL] Installing ${lib.name}.$(SHARED_EXT)"
  485. $(Q) $(INSTALL) libs/$(CONFIG)/${lib.name}.$(SHARED_EXT) $(prefix)/lib/${lib.name}.$(SHARED_EXT)
  486. $(Q) $(INSTALL) libs/$(CONFIG)/lib${lib.name}-imp.a $(prefix)/lib/lib${lib.name}-imp.a
  487. else
  488. $(E) "[INSTALL] Installing lib${lib.name}.$(SHARED_EXT)"
  489. $(Q) $(INSTALL) libs/$(CONFIG)/lib${lib.name}.$(SHARED_EXT) $(prefix)/lib/lib${lib.name}.$(SHARED_EXT)
  490. ifneq ($(SYSTEM),Darwin)
  491. $(Q) ln -sf lib${lib.name}.$(SHARED_EXT) $(prefix)/lib/lib${lib.name}.so
  492. endif
  493. endif
  494. % endif
  495. % endif
  496. % endfor
  497. ifneq ($(SYSTEM),MINGW32)
  498. ifneq ($(SYSTEM),Darwin)
  499. $(Q) ldconfig
  500. endif
  501. endif
  502. install-shared_cxx: shared_cxx strip-shared_cxx
  503. % for lib in libs:
  504. % if lib.get("c++", False):
  505. % if lib.build == "all":
  506. ifeq ($(SYSTEM),MINGW32)
  507. $(E) "[INSTALL] Installing ${lib.name}.$(SHARED_EXT)"
  508. $(Q) $(INSTALL) libs/$(CONFIG)/${lib.name}.$(SHARED_EXT) $(prefix)/lib/${lib.name}.$(SHARED_EXT)
  509. $(Q) $(INSTALL) libs/$(CONFIG)/lib${lib.name}-imp.a $(prefix)/lib/lib${lib.name}-imp.a
  510. else
  511. $(E) "[INSTALL] Installing lib${lib.name}.$(SHARED_EXT)"
  512. $(Q) $(INSTALL) libs/$(CONFIG)/lib${lib.name}.$(SHARED_EXT) $(prefix)/lib/lib${lib.name}.$(SHARED_EXT)
  513. ifneq ($(SYSTEM),Darwin)
  514. $(Q) ln -sf lib${lib.name}.$(SHARED_EXT) $(prefix)/lib/lib${lib.name}.so
  515. endif
  516. endif
  517. % endif
  518. % endif
  519. % endfor
  520. ifneq ($(SYSTEM),MINGW32)
  521. ifneq ($(SYSTEM),Darwin)
  522. $(Q) ldconfig
  523. endif
  524. endif
  525. clean:\
  526. % for lib in libs:
  527. clean_lib${lib.name}\
  528. % endfor
  529. % for tgt in targets:
  530. clean_${tgt.name}\
  531. % endfor
  532. $(Q) $(RM) -r deps objs libs bins gens
  533. # The various libraries
  534. % for lib in libs:
  535. ${makelib(lib)}
  536. % endfor
  537. # All of the test targets, and protoc plugins
  538. % for tgt in targets:
  539. ${maketarget(tgt)}
  540. % endfor
  541. <%def name="makelib(lib)">
  542. LIB${lib.name.upper()}_SRC = \\
  543. % for src in lib.src:
  544. ${proto_to_cc(src)} \\
  545. % endfor
  546. % if "public_headers" in lib:
  547. % if lib.get("c++", False):
  548. PUBLIC_HEADERS_CXX += \\
  549. % else:
  550. PUBLIC_HEADERS_C += \\
  551. % endif
  552. % for hdr in lib.public_headers:
  553. ${hdr} \\
  554. % endfor
  555. % endif
  556. LIB${lib.name.upper()}_OBJS = $(addprefix objs/$(CONFIG)/, $(addsuffix .o, $(basename $(LIB${lib.name.upper()}_SRC))))
  557. LIB${lib.name.upper()}_DEPS = $(addprefix deps/$(CONFIG)/, $(addsuffix .dep, $(basename $(LIB${lib.name.upper()}_SRC))))
  558. % if lib.get('secure', True):
  559. ifeq ($(NO_SECURE),true)
  560. libs/$(CONFIG)/lib${lib.name}.a: openssl_dep_error
  561. % if lib.build == "all":
  562. ifeq ($(SYSTEM),MINGW32)
  563. libs/$(CONFIG)/${lib.name}.$(SHARED_EXT): openssl_dep_error
  564. else
  565. libs/$(CONFIG)/lib${lib.name}.$(SHARED_EXT): openssl_dep_error
  566. endif
  567. % endif
  568. else
  569. libs/$(CONFIG)/lib${lib.name}.a: $(OPENSSL_DEP) $(LIB${lib.name.upper()}_OBJS)
  570. % else:
  571. libs/$(CONFIG)/lib${lib.name}.a: $(LIB${lib.name.upper()}_OBJS)
  572. % endif
  573. $(E) "[AR] Creating $@"
  574. $(Q) mkdir -p `dirname $@`
  575. $(Q) $(AR) rcs libs/$(CONFIG)/lib${lib.name}.a $(LIB${lib.name.upper()}_OBJS)
  576. % if lib.get('baselib', False):
  577. % if lib.get('secure', True):
  578. $(Q) rm -rf tmp-merge
  579. $(Q) mkdir tmp-merge
  580. $(Q) ( cd tmp-merge ; $(AR) x ../libs/$(CONFIG)/lib${lib.name}.a )
  581. $(Q) for l in $(OPENSSL_MERGE_LIBS) ; do ( cd tmp-merge ; <%text>ar x ../$${l}</%text> ) ; done
  582. $(Q) rm -f libs/$(CONFIG)/lib${lib.name}.a tmp-merge/__.SYMDEF*
  583. $(Q) ar rcs libs/$(CONFIG)/lib${lib.name}.a tmp-merge/*
  584. $(Q) rm -rf tmp-merge
  585. % endif
  586. % endif
  587. <%
  588. if lib.get('c++', False):
  589. ld = '$(LDXX)'
  590. else:
  591. ld = '$(LD)'
  592. out_base = 'libs/$(CONFIG)/' + lib.name
  593. out_libbase = 'libs/$(CONFIG)/lib' + lib.name
  594. common = '$(LIB' + lib.name.upper() + '_OBJS) $(LDLIBS)'
  595. libs = ''
  596. lib_deps = ''
  597. mingw_libs = ''
  598. mingw_lib_deps = ''
  599. for dep in lib.get('deps', []):
  600. libs = libs + ' -l' + dep
  601. lib_deps = lib_deps + 'libs/$(CONFIG)/lib' + dep + '.$(SHARED_EXT)'
  602. mingw_libs = mingw_libs + ' -l' + dep + '-imp'
  603. mingw_lib_deps = mingw_lib_deps + 'libs/$(CONFIG)/' + dep + '.$(SHARED_EXT)'
  604. if lib.get('secure', True):
  605. common = common + ' $(LDLIBS_SECURE) $(OPENSSL_MERGE_LIBS)'
  606. lib_deps = lib_deps + ' $(OPENSSL_DEP)'
  607. mingw_lib_deps = mingw_lib_deps + ' $(OPENSSL_DEP)'
  608. %>
  609. % if lib.build == "all":
  610. ifeq ($(SYSTEM),MINGW32)
  611. ${out_base}.$(SHARED_EXT): $(LIB${lib.name.upper()}_OBJS) ${mingw_lib_deps}
  612. $(E) "[LD] Linking $@"
  613. $(Q) mkdir -p `dirname $@`
  614. $(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}
  615. else
  616. ${out_libbase}.$(SHARED_EXT): $(LIB${lib.name.upper()}_OBJS) ${lib_deps}
  617. $(E) "[LD] Linking $@"
  618. $(Q) mkdir -p `dirname $@`
  619. ifeq ($(SYSTEM),Darwin)
  620. $(Q) ${ld} $(LDFLAGS) -Llibs/$(CONFIG) -dynamiclib -o ${out_libbase}.$(SHARED_EXT) ${common}${libs}
  621. else
  622. $(Q) ${ld} $(LDFLAGS) -Llibs/$(CONFIG) -shared -Wl,-soname,lib${lib.name}.so.${settings.version.major} -o ${out_libbase}.$(SHARED_EXT) ${common}${libs}
  623. $(Q) ln -sf lib${lib.name}.$(SHARED_EXT) ${out_libbase}.so
  624. endif
  625. endif
  626. % endif
  627. % if lib.get('secure', True):
  628. endif
  629. % endif
  630. deps_lib${lib.name}: $(LIB${lib.name.upper()}_DEPS)
  631. % if lib.get('secure', True):
  632. ifneq ($(NO_SECURE),true)
  633. % endif
  634. ifneq ($(NO_DEPS),true)
  635. -include $(LIB${lib.name.upper()}_DEPS)
  636. endif
  637. % if lib.get('secure', True):
  638. endif
  639. % endif
  640. % for src in lib.src:
  641. % if not proto_re.match(src):
  642. objs/$(CONFIG)/${os.path.splitext(src)[0]}.o: \
  643. % for src2 in lib.src:
  644. % if proto_re.match(src2):
  645. ${proto_to_cc(src2)}\
  646. % endif
  647. % endfor
  648. % endif
  649. % endfor
  650. clean_lib${lib.name}:
  651. $(E) "[CLEAN] Cleaning lib${lib.name} files"
  652. $(Q) $(RM) $(LIB${lib.name.upper()}_OBJS)
  653. $(Q) $(RM) $(LIB${lib.name.upper()}_DEPS)
  654. $(Q) $(RM) libs/$(CONFIG)/lib${lib.name}.a
  655. $(Q) $(RM) libs/$(CONFIG)/lib${lib.name}.$(SHARED_EXT)
  656. </%def>
  657. <%def name="maketarget(tgt)">
  658. ${tgt.name.upper()}_SRC = \\
  659. % for src in tgt.src:
  660. ${proto_to_cc(src)} \\
  661. % endfor
  662. ${tgt.name.upper()}_OBJS = $(addprefix objs/$(CONFIG)/, $(addsuffix .o, $(basename $(${tgt.name.upper()}_SRC))))
  663. ${tgt.name.upper()}_DEPS = $(addprefix deps/$(CONFIG)/, $(addsuffix .dep, $(basename $(${tgt.name.upper()}_SRC))))
  664. % if tgt.get('secure', True):
  665. ifeq ($(NO_SECURE),true)
  666. bins/$(CONFIG)/${tgt.name}: openssl_dep_error
  667. else
  668. % endif
  669. bins/$(CONFIG)/${tgt.name}: $(${tgt.name.upper()}_OBJS)\
  670. % for dep in tgt.deps:
  671. libs/$(CONFIG)/lib${dep}.a\
  672. % endfor
  673. % if tgt.get("c++", False):
  674. % if tgt.build == 'protoc':
  675. $(E) "[HOSTLD] Linking $@"
  676. $(Q) mkdir -p `dirname $@`
  677. $(Q) $(HOST_LDXX) $(HOST_LDFLAGS) $(${tgt.name.upper()}_OBJS)\
  678. % else:
  679. $(E) "[LD] Linking $@"
  680. $(Q) mkdir -p `dirname $@`
  681. $(Q) $(LDXX) $(LDFLAGS) $(${tgt.name.upper()}_OBJS)\
  682. % endif
  683. % if tgt.build == 'test':
  684. $(GTEST_LIB)\
  685. % endif
  686. % else:
  687. $(E) "[LD] Linking $@"
  688. $(Q) mkdir -p `dirname $@`
  689. $(Q) $(LD) $(LDFLAGS) $(${tgt.name.upper()}_OBJS)\
  690. % endif
  691. % for dep in tgt.deps:
  692. libs/$(CONFIG)/lib${dep}.a\
  693. % endfor
  694. % if tgt.get("c++", False):
  695. % if tgt.build == 'protoc':
  696. $(HOST_LDLIBSXX)\
  697. % else:
  698. $(LDLIBSXX)\
  699. % endif
  700. % endif
  701. % if tgt.build == 'protoc':
  702. $(HOST_LDLIBS)\
  703. % else:
  704. $(LDLIBS)\
  705. % endif
  706. % if tgt.build == 'protoc':
  707. $(HOST_LDLIBS_PROTOC)\
  708. % elif tgt.get('secure', True):
  709. $(LDLIBS_SECURE)\
  710. % endif
  711. -o bins/$(CONFIG)/${tgt.name}
  712. % if tgt.get('secure', True):
  713. endif
  714. % endif
  715. % for src in tgt.src:
  716. objs/$(CONFIG)/${os.path.splitext(src)[0]}.o: \
  717. % for dep in tgt.deps:
  718. libs/$(CONFIG)/lib${dep}.a\
  719. % endfor
  720. % endfor
  721. deps_${tgt.name}: $(${tgt.name.upper()}_DEPS)
  722. % if tgt.get('secure', True):
  723. ifneq ($(NO_SECURE),true)
  724. % endif
  725. ifneq ($(NO_DEPS),true)
  726. -include $(${tgt.name.upper()}_DEPS)
  727. endif
  728. % if tgt.get('secure', True):
  729. endif
  730. % endif
  731. clean_${tgt.name}:
  732. $(E) "[CLEAN] Cleaning ${tgt.name} files"
  733. $(Q) $(RM) $(${tgt.name.upper()}_OBJS)
  734. $(Q) $(RM) $(${tgt.name.upper()}_DEPS)
  735. $(Q) $(RM) bins/$(CONFIG)/${tgt.name}
  736. </%def>
  737. .PHONY: all strip tools \
  738. dep_error openssl_dep_error openssl_dep_message git_update stop \
  739. buildtests buildtests_c buildtests_cxx \
  740. test test_c test_cxx \
  741. install install_c install_cxx \
  742. install-headers install-headers_c install-headers_cxx \
  743. install-shared install-shared_c install-shared_cxx \
  744. install-static install-static_c install-static_cxx \
  745. strip strip-shared strip-static \
  746. strip_c strip-shared_c strip-static_c \
  747. strip_cxx strip-shared_cxx strip-static_cxx \
  748. clean \
  749. dep_c dep_cxx bins_dep_c bins_dep_cxx\
  750. % for lib in libs:
  751. deps_lib${lib.name} clean_lib${lib.name}\
  752. % endfor
  753. % for tgt in targets:
  754. deps_${tgt.name} clean_${tgt.name}\
  755. % endfor