SConstruct 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566
  1. ############################################################################
  2. # Copyright 2016-2017 Intel Corporation
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. ############################################################################
  16. """use scons -k to invoke all builds regardless of unit test failures
  17. """
  18. import string
  19. import sys
  20. import SCons.Script
  21. import os.path
  22. import subprocess
  23. from subprocess import Popen, PIPE
  24. from parts import *
  25. import re
  26. import tempfile
  27. import shutil
  28. from collections import OrderedDict
  29. def get_parts_versions(env):
  30. """Get Parts related versions given SCons environment env"""
  31. return OrderedDict({'python': string.split(sys.version, " ", 1)[0],
  32. 'scons': str(SCons.__version__),
  33. 'parts': str(PartsExtensionVersion())})
  34. def get_toolchain_versions(env):
  35. """Get version of compilation toolchain given SCons environment env"""
  36. versions = OrderedDict()
  37. if 'MSVC_VERSION' in env:
  38. versions['compiler'] = 'MSVC ' + env['MSVC_VERSION']
  39. cmd = env.subst('echo int main(){return 0;} > a.cpp'
  40. ' | $CXX $CCFLAGS a.cpp /link /verbose')
  41. defaultlib_regexp = r'.*Searching (.*\.lib).*'
  42. elif 'GCC_VERSION' in env:
  43. versions['compiler'] = 'GCC ' + env['GCC_VERSION']
  44. if 'GXX_VERSION' in env:
  45. versions['compiler'] += ' and GXX ' + env['GXX_VERSION']
  46. if os.name == 'nt':
  47. cmd = env.subst('echo int main(){return 0;}'
  48. ' | $CXX $CCFLAGS -xc++ -Wl,--verbose -')
  49. else:
  50. cmd = env.subst('echo "int main(){return 0;}"'
  51. ' | $CXX $CCFLAGS -xc++ -Wl,--verbose -')
  52. else:
  53. if os.name == 'nt':
  54. cmd = env.subst('echo int main(){return 0;}'
  55. ' | $CXX $CCFLAGS -xc++ -Wl,--verbose -')
  56. else:
  57. cmd = env.subst('echo "int main(){return 0;}"'
  58. ' | $CC $CCFLAGS -xc -Wl,--verbose -')
  59. if os.name == 'nt':
  60. defaultlib_regexp = r'\n.* open (.*) succeeded'
  61. else:
  62. defaultlib_regexp = r'[\n(](/.*\.so[-.\da-fA-F]*).*'
  63. # Intel C compiler always depends from base toolchain
  64. if 'INTELC_VERSION' in env:
  65. versions['compiler'] = 'INTELC {0} with {1}'.format(
  66. env['INTELC_VERSION'],
  67. versions['compiler'])
  68. env['ENV']['PATH'] = str(env['ENV']['PATH'])
  69. temp_dir = tempfile.mkdtemp()
  70. try:
  71. proc = subprocess.Popen(cmd,
  72. cwd=temp_dir,
  73. env=env['ENV'],
  74. shell=True,
  75. stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  76. stdout, _ = proc.communicate()
  77. if proc.returncode != 0:
  78. versions['default_libs'] = 'failure executing: "{0}"'.format(cmd)
  79. else:
  80. default_libs = list(
  81. set(re.findall(defaultlib_regexp, stdout, re.M)))
  82. if 'MSVC_VERSION' in env:
  83. # for windows additionally report versions of Windows Kit used
  84. runtime_version_set = set()
  85. for lib_path in default_libs:
  86. path_components = os.path.realpath(lib_path).split(os.sep)
  87. if 'Windows Kits' in path_components:
  88. i = path_components.index('Windows Kits')
  89. runtime_version_set.add(
  90. 'Windows Kits {0} {1}'.format(path_components[i + 1],
  91. path_components[i + 3]))
  92. versions['sdk_or_libc'] = '; '.join(list(runtime_version_set))
  93. else:
  94. # for posix additionally report versions of libc used
  95. versions['sdk_or_libc'] = os.path.split(os.path.realpath(
  96. next((lib for lib in default_libs if
  97. 'libc' in lib.lower() and 'libcilk' not in lib.lower()), None)))[1]
  98. versions['default_libs'] = default_libs
  99. finally:
  100. shutil.rmtree(temp_dir)
  101. return versions
  102. def log_versions(env, include_toolchain=True):
  103. """Log tools and libraries versions given SCons environment env
  104. Args:
  105. env: Scons environment.
  106. include_toolchain: Log version of compilation toolchain if True.
  107. """
  108. versions = get_parts_versions(env)
  109. if include_toolchain:
  110. versions.update(get_toolchain_versions(env))
  111. print "**************** VERSIONS *************"
  112. long_names = {
  113. 'python': 'Python Version',
  114. 'scons': 'SCons Version',
  115. 'parts': 'Parts Version',
  116. 'compiler': 'Compiler Version',
  117. 'sdk_or_libc': 'Libc/SDK',
  118. 'default_libs': 'Default Libs'
  119. }
  120. for name, value in versions.iteritems():
  121. if not isinstance(value, list):
  122. print '* {0}: {1}'.format(long_names.get(name, name), value)
  123. else:
  124. print '* {0}:\n* \t{1}'.format(long_names.get(name, name),
  125. '\n* \t'.join(sorted(value)))
  126. print "***************************************"
  127. def include_parts(part_list, **kwargs):
  128. for parts_file in part_list:
  129. if os.path.isfile(DefaultEnvironment().subst(parts_file)):
  130. Part(parts_file=parts_file, **kwargs)
  131. ######## Part groups ####################################################
  132. ipp_parts = ['ext/ipp/ippcp.parts']
  133. utest_parts = ['ext/gtest/gtest.parts',
  134. 'epid/common-testhelper/common-testhelper.parts']
  135. common_parts = ['epid/common/common.parts']
  136. member_parts = ['epid/member/member.parts']
  137. verifier_parts = ['epid/verifier/verifier.parts']
  138. util_parts = ['example/util/util.parts']
  139. example_parts = ['ext/argtable3/argtable3.parts',
  140. 'example/verifysig/verifysig.parts',
  141. 'example/signmsg/signmsg.parts',
  142. 'example/data/data.parts',
  143. 'example/compressed_data/compressed_data.parts']
  144. sizing_parts = ['example/util/util_static.parts',
  145. 'example/signmsg/signmsg_shared.parts',
  146. 'example/verifysig/verifysig_shared.parts',
  147. 'example/verifysig/verifysig11_shared.parts']
  148. example_static_parts = ['example/util/util_static.parts',
  149. 'example/signmsg/signmsg_static.parts',
  150. 'example/verifysig/verifysig_static.parts']
  151. tools_parts = ['tools/revokegrp/revokegrp.parts',
  152. 'tools/revokekey/revokekey.parts',
  153. 'tools/revokesig/revokesig.parts',
  154. 'tools/extractkeys/extractkeys.parts',
  155. 'tools/extractgrps/extractgrps.parts']
  156. testbot_test_parts = ['test/testbot/testbot.parts',
  157. 'test/testbot/signmsg/signmsg_testbot.parts',
  158. 'test/testbot/verifysig/verifysig_testbot.parts',
  159. 'test/testbot/integration/integration_testbot.parts',
  160. 'test/testbot/ssh_remote/ssh_remote_testbot.parts',
  161. 'test/testbot/revokegrp/revokegrp_testbot.parts',
  162. 'test/testbot/revokekey/revokekey_testbot.parts',
  163. 'test/testbot/revokesig/revokesig_testbot.parts',
  164. 'test/testbot/extractkeys/extractkeys_testbot.parts',
  165. 'test/testbot/extractgrps/extractgrps_testbot.parts',
  166. 'tools/reports/reports.parts']
  167. tss_test_parts = ['test/tss/tss.parts']
  168. package_parts = ['ext/gtest/gtest.parts',
  169. 'ext/ipp/ippcp.parts',
  170. 'package.parts']
  171. memory_profiler_parts = ['tools/memory_profiler/memory_profiler.parts']
  172. internal_tools_parts = ['ext/argtable3/argtable3.parts',
  173. 'tools/ikgfwrapper/ikgfwrapper.parts']
  174. epid_data = ['test/epid_data/epid_data.parts']
  175. perf_benchmark_parts = ['ext/google_benchmark/google_benchmark.parts',
  176. 'test/performance/performance.parts']
  177. memory_benchmark_parts = ['test/dynamic_memory/dynamic_memory.parts']
  178. ######## End Part groups ###############################################
  179. ######## Commandline option setup #######################################
  180. product_variants = [
  181. 'production',
  182. 'internal-test',
  183. 'package-epid-sdk',
  184. 'internal-tools',
  185. 'benchmark',
  186. 'tiny',
  187. 'internal-test-tiny'
  188. ]
  189. default_variant = 'production'
  190. def is_production():
  191. return GetOption("product-variant") == 'production'
  192. def is_internal_test():
  193. return GetOption("product-variant") == 'internal-test'
  194. def is_internal_tools():
  195. return GetOption("product-variant") == 'internal-tools'
  196. def is_package():
  197. return GetOption("product-variant") == 'package-epid-sdk'
  198. def is_benchmark():
  199. return GetOption("product-variant") == 'benchmark'
  200. def is_tiny():
  201. return GetOption("product-variant") == 'tiny'
  202. def is_internal_test_tiny():
  203. return GetOption("product-variant") == 'internal-test-tiny'
  204. def use_commercial_ipp():
  205. return GetOption("use-commercial-ipp")
  206. def use_tss():
  207. return GetOption("use-tss")
  208. def config_has_instrumentation():
  209. return any(DefaultEnvironment().isConfigBasedOn(config_name)
  210. for config_name in ['instr_release'])
  211. def variant_dirname():
  212. s = GetOption("product-variant")
  213. if s == 'production':
  214. return 'epid-sdk'
  215. elif s == 'package-epid-sdk':
  216. return 'epid-sdk'
  217. elif s == 'tiny':
  218. return 'epid-sdk'
  219. else:
  220. return s
  221. AddOption("--product-variant", "--prod-var", nargs=1,
  222. help=("Select product variant to build. Possible "
  223. "options are: {0}. The default is {1} if no option "
  224. "is specified").format(", ".join(product_variants),
  225. default_variant),
  226. action='store', dest='product-variant', type='choice',
  227. choices=product_variants, default=default_variant)
  228. AddOption("--use-commercial-ipp",
  229. help=("Link with commercial IPP. The IPPROOT environment variable "
  230. "must be set."),
  231. action='store_true', dest='use-commercial-ipp',
  232. default=False)
  233. AddOption("--use-tss",
  234. help=("Link with TPM TSS. The TSSROOT environment variable "
  235. "must be set."),
  236. action='store_true', dest='use-tss',
  237. default=False)
  238. AddOption("--ipp-shared",
  239. help=("Build /ext/ipp as shared library."),
  240. action='store_true', dest='ipp-shared',
  241. default=False)
  242. AddOption("--enable-sanitizers",
  243. help=("Build with sanitizers (https://github.com/google/sanitizers)."),
  244. action='store_true', dest='sanitizers',
  245. default=False)
  246. AddOption("--sanitizers-recover",
  247. help=("Configure sanititzers to recover and continue execution "
  248. "on error found. Only applicable when sanitizers are enabled."
  249. "See --enable-sanitizers option."),
  250. action='store_true', dest='sanitizers-recover',
  251. default=False)
  252. SetOptionDefault("PRODUCT_VARIANT", variant_dirname())
  253. ######## End Commandline option setup ###################################
  254. # fix for parts 0.10.8 until we get better logic to extract ${CC}
  255. SetOptionDefault('PARTS_USE_SHORT_TOOL_NAMES', 1)
  256. def enable_sanitizers(recover):
  257. """
  258. Configures compiler to enable sanitizers.
  259. Adds sanitizer options to default scons environment such
  260. that it affects all parts.
  261. Args:
  262. recover: Enable sanitizers recovery from errors found when True.
  263. """
  264. env = DefaultEnvironment()
  265. error_msg = None
  266. try:
  267. major = int(env.subst('$GCC_VERSION').partition('.')[0])
  268. except ValueError:
  269. major = 0
  270. if major >= 6 and env['TARGET_OS'] == 'posix':
  271. if 'INTELC_VERSION' not in env:
  272. ccflags = ['-fsanitize=address,undefined', '-fno-sanitize=alignment',
  273. '-fno-sanitize=shift', '-fno-omit-frame-pointer']
  274. if recover:
  275. ccflags = ccflags + ['-fsanitize-recover=all', '-fsanitize-recover=address']
  276. else:
  277. ccflags = ccflags + ['-fno-sanitize-recover']
  278. # Extends default flags with sanitizer options
  279. SetOptionDefault('CCFLAGS', ccflags)
  280. SetOptionDefault('LIBS', ['asan', 'ubsan'])
  281. else:
  282. error_msg = """
  283. Build with sanitizers is not supported for Intel(R) C++ Compiler.
  284. Try scons --toolchain=gcc_6 --target=posix
  285. """
  286. else:
  287. # User experience with sanitizers in GCC 4.8 is not great. Use at least GCC 6.x.
  288. error_msg = """
  289. Build with sanitizers is only supported for GCC version greater than
  290. 6.x targeting posix OS. Current GCC version is "{0}" and OS target is "{1}".
  291. Try scons --toolchain=gcc_6 --target=posix
  292. """.format(env.get('GCC_VERSION', 'unknown'), env.get('TARGET_OS', 'unknown'))
  293. if error_msg is not None:
  294. env.PrintError(error_msg)
  295. def set_default_production_options():
  296. SetOptionDefault('CONFIG', 'release')
  297. SetOptionDefault('TARGET_VARIANT', '${TARGET_OS}-${TARGET_ARCH}')
  298. SetOptionDefault('INSTALL_ROOT',
  299. '#_install/${PRODUCT_VARIANT}')
  300. SetOptionDefault('INSTALL_TOOLS_BIN',
  301. '$INSTALL_ROOT/tools')
  302. SetOptionDefault('INSTALL_SAMPLE_BIN',
  303. '$INSTALL_ROOT/example')
  304. SetOptionDefault('INSTALL_EPID_INCLUDE',
  305. '$INSTALL_ROOT/include/epid')
  306. SetOptionDefault('INSTALL_IPP_INCLUDE',
  307. '$INSTALL_ROOT/include/ext/ipp/include')
  308. SetOptionDefault('INSTALL_TEST_BIN',
  309. '$INSTALL_ROOT/test')
  310. SetOptionDefault('INSTALL_LIB',
  311. '$INSTALL_ROOT/lib/${TARGET_VARIANT}')
  312. SetOptionDefault('INSTALL_SAMPLE_DATA',
  313. '$INSTALL_ROOT/example')
  314. SetOptionDefault('INSTALL_TOOLS_DATA',
  315. '$INSTALL_ROOT/tools')
  316. SetOptionDefault('PACKAGE_DIR',
  317. '#_package')
  318. SetOptionDefault('PACKAGE_ROOT',
  319. '#_package/${PRODUCT_VARIANT}')
  320. SetOptionDefault('ROOT',
  321. '#')
  322. SetOptionDefault('PACKAGE_NAME',
  323. '{PRODUCT_VARIANT}')
  324. if GetOption("sanitizers"):
  325. enable_sanitizers(GetOption("sanitizers-recover"))
  326. if is_production():
  327. set_default_production_options()
  328. ipp_mode = ['install_lib']
  329. if use_commercial_ipp():
  330. ipp_mode.append('use_commercial_ipp')
  331. sdk_mode = ['install_lib']
  332. if use_tss():
  333. sdk_mode.append('use_tss')
  334. if GetOption('ipp-shared'):
  335. ipp_mode.append('build_ipp_shared')
  336. include_parts(ipp_parts, mode=ipp_mode,
  337. INSTALL_INCLUDE='${INSTALL_IPP_INCLUDE}')
  338. include_parts(utest_parts + common_parts +
  339. member_parts + verifier_parts,
  340. mode=sdk_mode,
  341. INSTALL_INCLUDE='${INSTALL_EPID_INCLUDE}')
  342. include_parts(util_parts + example_parts,
  343. INSTALL_INCLUDE='${INSTALL_EPID_INCLUDE}',
  344. INSTALL_BIN='${INSTALL_SAMPLE_BIN}',
  345. INSTALL_DATA='${INSTALL_SAMPLE_DATA}')
  346. include_parts(tools_parts,
  347. INSTALL_BIN='${INSTALL_TOOLS_BIN}',
  348. INSTALL_DATA='${INSTALL_TOOLS_DATA}')
  349. Default('all')
  350. Default('utest::')
  351. if not use_tss():
  352. Default('run_utest::')
  353. if is_internal_test():
  354. set_default_production_options()
  355. sdk_mode = []
  356. if use_tss():
  357. sdk_mode.append('use_tss')
  358. include_parts(tss_test_parts)
  359. include_parts(ipp_parts)
  360. include_parts(utest_parts + common_parts +
  361. member_parts + verifier_parts,
  362. mode=sdk_mode)
  363. include_parts(util_parts + example_parts,
  364. INSTALL_BIN='${INSTALL_SAMPLE_BIN}',
  365. INSTALL_DATA='${INSTALL_SAMPLE_DATA}')
  366. include_parts(sizing_parts,
  367. INSTALL_BIN='${INSTALL_SAMPLE_BIN}')
  368. include_parts(tools_parts, INSTALL_BIN='${INSTALL_TOOLS_BIN}')
  369. include_parts(testbot_test_parts)
  370. Default('all')
  371. if is_internal_tools():
  372. set_default_production_options()
  373. include_parts(ipp_parts + utest_parts + common_parts + verifier_parts + member_parts + util_parts)
  374. include_parts(internal_tools_parts + memory_profiler_parts,
  375. INSTALL_BIN='${INSTALL_TOOLS_BIN}')
  376. Default('ikgfwrapper', 'memory_profiler')
  377. Default('run_utest::memory_profiler::')
  378. if is_benchmark():
  379. set_default_production_options()
  380. MODE = []
  381. if config_has_instrumentation():
  382. MODE.append('use_memory_profiler')
  383. ipp_mode = []
  384. if use_commercial_ipp():
  385. ipp_mode.append('use_commercial_ipp')
  386. # install ipp static and ipp shared builds into separate locations
  387. if GetOption('ipp-shared'):
  388. ipp_mode.append('build_ipp_shared')
  389. SetOptionDefault('INSTALL_TEST_BIN',
  390. '$INSTALL_ROOT/test_ipp_shared')
  391. SetOptionDefault('INSTALL_LIB',
  392. '$INSTALL_ROOT/lib_ipp_shared')
  393. else:
  394. SetOptionDefault('INSTALL_LIB',
  395. '$INSTALL_ROOT/lib')
  396. # do not allow file links to keep previous builds intact
  397. SetOptionDefault('CCOPY_LOGIC', 'copy')
  398. include_parts(ipp_parts, config_independent=True, mode=MODE + ipp_mode,
  399. INSTALL_BIN='${INSTALL_TEST_BIN}')
  400. include_parts(example_static_parts + utest_parts + perf_benchmark_parts +
  401. common_parts + verifier_parts +
  402. sizing_parts + epid_data,
  403. config_independent=True,
  404. mode=MODE,
  405. INSTALL_BIN='${INSTALL_TEST_BIN}')
  406. member_mode = ['install_lib']
  407. member_cfg = ('embedded' if not DefaultEnvironment().isConfigBasedOn(
  408. 'debug') and not config_has_instrumentation() else DefaultEnvironment().subst('$CONFIG'))
  409. Part(parts_file='epid/common/tinycommon.parts', CONFIG=member_cfg)
  410. Part(parts_file='epid/member/tinymember.parts', CONFIG=member_cfg,
  411. config_independent=True, mode=MODE + member_mode, INSTALL_BIN='${INSTALL_TEST_BIN}')
  412. if config_has_instrumentation():
  413. include_parts(memory_benchmark_parts + memory_profiler_parts,
  414. config_independent=True,
  415. mode=MODE,
  416. INSTALL_BIN='${INSTALL_TEST_BIN}')
  417. Default('build::')
  418. if is_package():
  419. set_default_production_options()
  420. include_parts(package_parts,
  421. mode=['install_package'],
  422. INSTALL_TOP_LEVEL='${PACKAGE_ROOT}')
  423. Default('package')
  424. if is_tiny():
  425. set_default_production_options()
  426. ### Member
  427. Part(parts_file='ext/gtest/gtest.parts')
  428. member_mode = ['install_lib']
  429. member_cfg = ('embedded'
  430. if not DefaultEnvironment().isConfigBasedOn('debug')
  431. else DefaultEnvironment().subst('$CONFIG'))
  432. Part(parts_file='epid/common/tinycommon.parts', CONFIG=member_cfg)
  433. Part(parts_file='epid/member/tinymember.parts', CONFIG=member_cfg,
  434. config_independent=True, mode=member_mode)
  435. Default('member::')
  436. Default('run_utest::member::')
  437. ### Verifier, samples and tools
  438. verifier_mode = ['install_lib']
  439. ipp_mode = ['install_lib']
  440. if use_commercial_ipp():
  441. ipp_mode.append('use_commercial_ipp')
  442. if GetOption('ipp-shared'):
  443. ipp_mode.append('build_ipp_shared')
  444. include_parts(ipp_parts, mode=ipp_mode,
  445. INSTALL_INCLUDE='${INSTALL_IPP_INCLUDE}')
  446. Part(parts_file='epid/common-testhelper/common-testhelper.parts',
  447. config_independent=True)
  448. include_parts(common_parts + verifier_parts,
  449. mode=verifier_mode,
  450. INSTALL_INCLUDE='${INSTALL_EPID_INCLUDE}')
  451. include_parts(util_parts + example_parts,
  452. INSTALL_INCLUDE='${INSTALL_EPID_INCLUDE}',
  453. INSTALL_BIN='${INSTALL_SAMPLE_BIN}',
  454. INSTALL_DATA='${INSTALL_SAMPLE_DATA}')
  455. include_parts(tools_parts,
  456. INSTALL_BIN='${INSTALL_TOOLS_BIN}',
  457. INSTALL_DATA='${INSTALL_TOOLS_DATA}')
  458. Default('all')
  459. Default('utest::')
  460. if is_internal_test_tiny():
  461. set_default_production_options()
  462. sdk_mode = []
  463. ### Member
  464. Part(parts_file='ext/gtest/gtest.parts')
  465. member_cfg = ('embedded'
  466. if not DefaultEnvironment().isConfigBasedOn('debug')
  467. else DefaultEnvironment().subst('$CONFIG'))
  468. Part(parts_file='epid/common/tinycommon.parts', CONFIG=member_cfg)
  469. Part(parts_file='epid/member/tinymember.parts', CONFIG=member_cfg,
  470. config_independent=True, mode=sdk_mode)
  471. ### Verifier, samples and tools
  472. include_parts(ipp_parts)
  473. Part(parts_file='epid/common-testhelper/common-testhelper.parts',
  474. config_independent=True)
  475. include_parts(common_parts + verifier_parts,
  476. mode=sdk_mode)
  477. include_parts(util_parts + example_parts,
  478. INSTALL_BIN='${INSTALL_SAMPLE_BIN}',
  479. INSTALL_DATA='${INSTALL_SAMPLE_DATA}')
  480. include_parts(tools_parts, INSTALL_BIN='${INSTALL_TOOLS_BIN}')
  481. include_parts(testbot_test_parts)
  482. Default('build::')
  483. log_versions(DefaultEnvironment(), not is_package())