Makefile.template 28 KB

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