Makefile.template 21 KB

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