text_ux 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +25 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +51 -0
  7. data/Rakefile +18 -0
  8. data/ext/text_ux/extconf.rb +5 -0
  9. data/ext/text_ux/text_ux.cpp +252 -0
  10. data/lib/text_ux.rb +5 -0
  11. data/lib/text_ux/version.rb +3 -0
  12. data/spec/fixtures/test.ux +0 -0
  13. data/spec/spec_helper.rb +19 -0
  14. data/spec/text_ux_spec.rb +137 -0
  15. data/text_ux.gemspec +26 -0
  16. data/vendor/ux-trie/ux-0.1.9/.lock-waf_darwin_build +8 -0
  17. data/vendor/ux-trie/ux-0.1.9/.unittest-gtest/gtest-1.6.0/fused-src/gtest/gtest-all.cc +9118 -0
  18. data/vendor/ux-trie/ux-0.1.9/.unittest-gtest/gtest-1.6.0/fused-src/gtest/gtest.h +19537 -0
  19. data/vendor/ux-trie/ux-0.1.9/.unittest-gtest/gtest-1.6.0/fused-src/gtest/gtest_main.cc +39 -0
  20. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Build.py +733 -0
  21. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Build.pyc +0 -0
  22. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/ConfigSet.py +147 -0
  23. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/ConfigSet.pyc +0 -0
  24. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Configure.py +314 -0
  25. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Configure.pyc +0 -0
  26. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Context.py +298 -0
  27. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Context.pyc +0 -0
  28. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Errors.py +37 -0
  29. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Errors.pyc +0 -0
  30. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Logs.py +149 -0
  31. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Logs.pyc +0 -0
  32. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Node.py +500 -0
  33. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Node.pyc +0 -0
  34. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Options.py +130 -0
  35. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Options.pyc +0 -0
  36. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Runner.py +191 -0
  37. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Runner.pyc +0 -0
  38. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Scripting.py +358 -0
  39. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Scripting.pyc +0 -0
  40. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Task.py +669 -0
  41. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Task.pyc +0 -0
  42. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/TaskGen.py +341 -0
  43. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/TaskGen.pyc +0 -0
  44. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/__init__.py +4 -0
  45. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/__init__.pyc +0 -0
  46. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/ar.py +12 -0
  47. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/ar.pyc +0 -0
  48. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/asm.py +25 -0
  49. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/bison.py +29 -0
  50. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c.py +27 -0
  51. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_aliases.py +56 -0
  52. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_aliases.pyc +0 -0
  53. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_config.py +708 -0
  54. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_config.pyc +0 -0
  55. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_osx.py +121 -0
  56. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_osx.pyc +0 -0
  57. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_preproc.py +606 -0
  58. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_preproc.pyc +0 -0
  59. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_tests.py +110 -0
  60. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/c_tests.pyc +0 -0
  61. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/ccroot.py +372 -0
  62. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/ccroot.pyc +0 -0
  63. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/compiler_c.py +39 -0
  64. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/compiler_cxx.py +39 -0
  65. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/compiler_cxx.pyc +0 -0
  66. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/compiler_d.py +30 -0
  67. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/compiler_fc.py +45 -0
  68. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/cs.py +98 -0
  69. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/cxx.py +27 -0
  70. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/cxx.pyc +0 -0
  71. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/d.py +51 -0
  72. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/d_config.py +47 -0
  73. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/d_scan.py +133 -0
  74. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/dbus.py +30 -0
  75. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/dmd.py +43 -0
  76. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/errcheck.py +153 -0
  77. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/fc.py +123 -0
  78. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/fc_config.py +271 -0
  79. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/fc_scan.py +68 -0
  80. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/flex.py +27 -0
  81. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/g95.py +55 -0
  82. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gas.py +10 -0
  83. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gcc.py +98 -0
  84. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gdc.py +34 -0
  85. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gfortran.py +69 -0
  86. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/glib2.py +174 -0
  87. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gnu_dirs.py +65 -0
  88. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gxx.py +98 -0
  89. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/gxx.pyc +0 -0
  90. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/icc.py +31 -0
  91. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/icpc.py +30 -0
  92. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/ifort.py +42 -0
  93. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/intltool.py +78 -0
  94. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/irixcc.py +49 -0
  95. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/javaw.py +272 -0
  96. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/kde4.py +49 -0
  97. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/lua.py +19 -0
  98. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/msvc.py +650 -0
  99. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/nasm.py +13 -0
  100. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/perl.py +78 -0
  101. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/python.py +303 -0
  102. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/qt4.py +424 -0
  103. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/ruby.py +104 -0
  104. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/suncc.py +54 -0
  105. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/suncxx.py +55 -0
  106. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/tex.py +222 -0
  107. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/vala.py +215 -0
  108. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/waf_unit_test.py +79 -0
  109. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/winres.py +34 -0
  110. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/xlc.py +46 -0
  111. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Tools/xlcxx.py +46 -0
  112. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Utils.py +334 -0
  113. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/Utils.pyc +0 -0
  114. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/__init__.py +4 -0
  115. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/__init__.pyc +0 -0
  116. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/ansiterm.py +173 -0
  117. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/ansiterm.pyc +0 -0
  118. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/extras/__init__.py +4 -0
  119. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/extras/__init__.pyc +0 -0
  120. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/extras/compat15.py +223 -0
  121. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/extras/compat15.pyc +0 -0
  122. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/fixpy2.py +50 -0
  123. data/vendor/ux-trie/ux-0.1.9/.waf-1.6.8-3e3391c5f23fbabad81e6d17c63a1b1e/waflib/fixpy2.pyc +0 -0
  124. data/vendor/ux-trie/ux-0.1.9/src/bitVec.cpp +119 -0
  125. data/vendor/ux-trie/ux-0.1.9/src/bitVec.hpp +64 -0
  126. data/vendor/ux-trie/ux-0.1.9/src/bitVecTest.cpp +143 -0
  127. data/vendor/ux-trie/ux-0.1.9/src/cmdline.h +809 -0
  128. data/vendor/ux-trie/ux-0.1.9/src/rsDic.cpp +121 -0
  129. data/vendor/ux-trie/ux-0.1.9/src/rsDic.hpp +57 -0
  130. data/vendor/ux-trie/ux-0.1.9/src/ux.hpp +26 -0
  131. data/vendor/ux-trie/ux-0.1.9/src/uxMain.cpp +206 -0
  132. data/vendor/ux-trie/ux-0.1.9/src/uxMap.cpp +0 -0
  133. data/vendor/ux-trie/ux-0.1.9/src/uxMap.hpp +248 -0
  134. data/vendor/ux-trie/ux-0.1.9/src/uxMapTest.cpp +139 -0
  135. data/vendor/ux-trie/ux-0.1.9/src/uxTest.cpp +229 -0
  136. data/vendor/ux-trie/ux-0.1.9/src/uxTrie.cpp +529 -0
  137. data/vendor/ux-trie/ux-0.1.9/src/uxTrie.hpp +220 -0
  138. data/vendor/ux-trie/ux-0.1.9/src/uxUtil.cpp +92 -0
  139. data/vendor/ux-trie/ux-0.1.9/src/uxUtil.hpp +35 -0
  140. data/vendor/ux-trie/ux-0.1.9/src/wscript +43 -0
  141. data/vendor/ux-trie/ux-0.1.9/unittest_gtest.py +0 -0
  142. data/vendor/ux-trie/ux-0.1.9/unittest_gtest.pyc +0 -0
  143. data/vendor/ux-trie/ux-0.1.9/unittestt.py +166 -0
  144. data/vendor/ux-trie/ux-0.1.9/ux.pc.in +10 -0
  145. data/vendor/ux-trie/ux-0.1.9/waf +0 -0
  146. data/vendor/ux-trie/ux-0.1.9/wscript +32 -0
  147. metadata +249 -0
@@ -0,0 +1,130 @@
1
+ #! /usr/bin/env python
2
+ # encoding: utf-8
3
+ # WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
4
+
5
+ import os,tempfile,optparse,sys,re
6
+ from waflib import Logs,Utils,Context
7
+ cmds='distclean configure build install clean uninstall check dist distcheck'.split()
8
+ options={}
9
+ commands=[]
10
+ lockfile=os.environ.get('WAFLOCK','.lock-waf_%s_build'%sys.platform)
11
+ try:cache_global=os.path.abspath(os.environ['WAFCACHE'])
12
+ except KeyError:cache_global=''
13
+ platform=Utils.unversioned_sys_platform()
14
+ class opt_parser(optparse.OptionParser):
15
+ def __init__(self,ctx):
16
+ optparse.OptionParser.__init__(self,conflict_handler="resolve",version='waf %s (%s)'%(Context.WAFVERSION,Context.WAFREVISION))
17
+ self.formatter.width=Logs.get_term_cols()
18
+ p=self.add_option
19
+ self.ctx=ctx
20
+ jobs=ctx.jobs()
21
+ p('-j','--jobs',dest='jobs',default=jobs,type='int',help='amount of parallel jobs (%r)'%jobs)
22
+ p('-k','--keep',dest='keep',default=0,action='count',help='keep running happily even if errors are found')
23
+ p('-v','--verbose',dest='verbose',default=0,action='count',help='verbosity level -v -vv or -vvv [default: 0]')
24
+ p('--nocache',dest='nocache',default=False,action='store_true',help='ignore the WAFCACHE (if set)')
25
+ p('--zones',dest='zones',default='',action='store',help='debugging zones (task_gen, deps, tasks, etc)')
26
+ gr=optparse.OptionGroup(self,'configure options')
27
+ self.add_option_group(gr)
28
+ gr.add_option('-o','--out',action='store',default='',help='build dir for the project',dest='out')
29
+ gr.add_option('-t','--top',action='store',default='',help='src dir for the project',dest='top')
30
+ default_prefix=os.environ.get('PREFIX')
31
+ if not default_prefix:
32
+ if platform=='win32':
33
+ d=tempfile.gettempdir()
34
+ default_prefix=d[0].upper()+d[1:]
35
+ else:
36
+ default_prefix='/usr/local/'
37
+ gr.add_option('--prefix',dest='prefix',default=default_prefix,help='installation prefix [default: %r]'%default_prefix)
38
+ gr.add_option('--download',dest='download',default=False,action='store_true',help='try to download the tools if missing')
39
+ gr=optparse.OptionGroup(self,'build and install options')
40
+ self.add_option_group(gr)
41
+ gr.add_option('-p','--progress',dest='progress_bar',default=0,action='count',help='-p: progress bar; -pp: ide output')
42
+ gr.add_option('--targets',dest='targets',default='',action='store',help='task generators, e.g. "target1,target2"')
43
+ gr=optparse.OptionGroup(self,'step options')
44
+ self.add_option_group(gr)
45
+ gr.add_option('--files',dest='files',default='',action='store',help='files to process, by regexp, e.g. "*/main.c,*/test/main.o"')
46
+ default_destdir=os.environ.get('DESTDIR','')
47
+ gr=optparse.OptionGroup(self,'install/uninstall options')
48
+ self.add_option_group(gr)
49
+ gr.add_option('--destdir',help='installation root [default: %r]'%default_destdir,default=default_destdir,dest='destdir')
50
+ gr.add_option('-f','--force',dest='force',default=False,action='store_true',help='force file installation')
51
+ def get_usage(self):
52
+ cmds_str={}
53
+ for cls in Context.classes:
54
+ if not cls.cmd or cls.cmd=='options':
55
+ continue
56
+ s=cls.__doc__ or''
57
+ cmds_str[cls.cmd]=s
58
+ if Context.g_module:
59
+ for(k,v)in Context.g_module.__dict__.items():
60
+ if k in['options','init','shutdown']:
61
+ continue
62
+ if type(v)is type(Context.create_context):
63
+ if v.__doc__ and not k.startswith('_'):
64
+ cmds_str[k]=v.__doc__
65
+ just=0
66
+ for k in cmds_str:
67
+ just=max(just,len(k))
68
+ lst=[' %s: %s'%(k.ljust(just),v)for(k,v)in cmds_str.items()]
69
+ lst.sort()
70
+ ret='\n'.join(lst)
71
+ return'''waf [commands] [options]
72
+
73
+ Main commands (example: ./waf build -j4)
74
+ %s
75
+ '''%ret
76
+ class OptionsContext(Context.Context):
77
+ cmd='options'
78
+ fun='options'
79
+ def __init__(self,**kw):
80
+ super(OptionsContext,self).__init__(**kw)
81
+ self.parser=opt_parser(self)
82
+ self.option_groups={}
83
+ def jobs(self):
84
+ count=int(os.environ.get('JOBS',0))
85
+ if count<1:
86
+ if'NUMBER_OF_PROCESSORS'in os.environ:
87
+ count=int(os.environ.get('NUMBER_OF_PROCESSORS',1))
88
+ else:
89
+ if hasattr(os,'sysconf_names'):
90
+ if'SC_NPROCESSORS_ONLN'in os.sysconf_names:
91
+ count=int(os.sysconf('SC_NPROCESSORS_ONLN'))
92
+ elif'SC_NPROCESSORS_CONF'in os.sysconf_names:
93
+ count=int(os.sysconf('SC_NPROCESSORS_CONF'))
94
+ if not count and os.name not in('nt','java'):
95
+ tmp=self.cmd_and_log(['sysctl','-n','hw.ncpu'])
96
+ if re.match('^[0-9]+$',tmp):
97
+ count=int(tmp)
98
+ if count<1:
99
+ count=1
100
+ elif count>1024:
101
+ count=1024
102
+ return count
103
+ def add_option(self,*k,**kw):
104
+ self.parser.add_option(*k,**kw)
105
+ def add_option_group(self,*k,**kw):
106
+ try:
107
+ gr=self.option_groups[k[0]]
108
+ except:
109
+ gr=self.parser.add_option_group(*k,**kw)
110
+ self.option_groups[k[0]]=gr
111
+ return gr
112
+ def get_option_group(self,opt_str):
113
+ try:
114
+ return self.option_groups[opt_str]
115
+ except KeyError:
116
+ for group in self.parser.option_groups:
117
+ if group.title==opt_str:
118
+ return group
119
+ return None
120
+ def parse_args(self,_args=None):
121
+ global options,commands
122
+ (options,leftover_args)=self.parser.parse_args(args=_args)
123
+ commands=leftover_args
124
+ if options.destdir:
125
+ options.destdir=os.path.abspath(os.path.expanduser(options.destdir))
126
+ if options.verbose>=1:
127
+ self.load('errcheck')
128
+ def execute(self):
129
+ super(OptionsContext,self).execute()
130
+ self.parse_args()
@@ -0,0 +1,191 @@
1
+ #! /usr/bin/env python
2
+ # encoding: utf-8
3
+ # WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
4
+
5
+ import random,atexit
6
+ try:
7
+ from queue import Queue
8
+ except:
9
+ from Queue import Queue
10
+ from waflib import Utils,Task,Errors
11
+ GAP=10
12
+ class TaskConsumer(Utils.threading.Thread):
13
+ def __init__(self):
14
+ Utils.threading.Thread.__init__(self)
15
+ self.ready=Queue()
16
+ self.setDaemon(1)
17
+ self.start()
18
+ def run(self):
19
+ try:
20
+ self.loop()
21
+ except:
22
+ pass
23
+ def loop(self):
24
+ while 1:
25
+ tsk=self.ready.get()
26
+ if not isinstance(tsk,Task.TaskBase):
27
+ tsk(self)
28
+ else:
29
+ tsk.process()
30
+ pool=Queue()
31
+ def get_pool():
32
+ try:
33
+ return pool.get(False)
34
+ except:
35
+ return TaskConsumer()
36
+ def put_pool(x):
37
+ pool.put(x)
38
+ def _free_resources():
39
+ global pool
40
+ lst=[]
41
+ while pool.qsize():
42
+ lst.append(pool.get())
43
+ for x in lst:
44
+ x.ready.put(None)
45
+ for x in lst:
46
+ x.join()
47
+ pool=None
48
+ atexit.register(_free_resources)
49
+ class Parallel(object):
50
+ def __init__(self,bld,j=2):
51
+ self.numjobs=j
52
+ self.bld=bld
53
+ self.outstanding=[]
54
+ self.frozen=[]
55
+ self.out=Queue(0)
56
+ self.count=0
57
+ self.processed=1
58
+ self.stop=False
59
+ self.error=[]
60
+ self.biter=None
61
+ self.dirty=False
62
+ def get_next_task(self):
63
+ if not self.outstanding:
64
+ return None
65
+ return self.outstanding.pop(0)
66
+ def postpone(self,tsk):
67
+ if random.randint(0,1):
68
+ self.frozen.insert(0,tsk)
69
+ else:
70
+ self.frozen.append(tsk)
71
+ def refill_task_list(self):
72
+ while self.count>self.numjobs*GAP:
73
+ self.get_out()
74
+ while not self.outstanding:
75
+ if self.count:
76
+ self.get_out()
77
+ elif self.frozen:
78
+ try:
79
+ cond=self.deadlock==self.processed
80
+ except:
81
+ pass
82
+ else:
83
+ if cond:
84
+ msg='check the build order for the tasks'
85
+ for tsk in self.frozen:
86
+ if not tsk.run_after:
87
+ msg='check the methods runnable_status'
88
+ break
89
+ lst=[]
90
+ for tsk in self.frozen:
91
+ lst.append('%s\t-> %r'%(repr(tsk),[id(x)for x in tsk.run_after]))
92
+ raise Errors.WafError('Deadlock detected: %s%s'%(msg,''.join(lst)))
93
+ self.deadlock=self.processed
94
+ if self.frozen:
95
+ self.outstanding+=self.frozen
96
+ self.frozen=[]
97
+ elif not self.count:
98
+ self.outstanding.extend(self.biter.next())
99
+ self.total=self.bld.total()
100
+ break
101
+ def add_more_tasks(self,tsk):
102
+ if getattr(tsk,'more_tasks',None):
103
+ self.outstanding+=tsk.more_tasks
104
+ self.total+=len(tsk.more_tasks)
105
+ def get_out(self):
106
+ tsk=self.out.get()
107
+ if not self.stop:
108
+ self.add_more_tasks(tsk)
109
+ self.count-=1
110
+ self.dirty=True
111
+ def error_handler(self,tsk):
112
+ if not self.bld.keep:
113
+ self.stop=True
114
+ self.error.append(tsk)
115
+ def add_task(self,tsk):
116
+ try:
117
+ self.pool
118
+ except AttributeError:
119
+ self.init_task_pool()
120
+ self.ready.put(tsk)
121
+ def init_task_pool(self):
122
+ pool=self.pool=[get_pool()for i in range(self.numjobs)]
123
+ self.ready=Queue(0)
124
+ def setq(consumer):
125
+ consumer.ready=self.ready
126
+ for x in pool:
127
+ x.ready.put(setq)
128
+ return pool
129
+ def free_task_pool(self):
130
+ def setq(consumer):
131
+ consumer.ready=Queue(0)
132
+ self.out.put(self)
133
+ try:
134
+ pool=self.pool
135
+ except:
136
+ pass
137
+ else:
138
+ for x in pool:
139
+ self.ready.put(setq)
140
+ for x in pool:
141
+ self.get_out()
142
+ for x in pool:
143
+ put_pool(x)
144
+ self.pool=[]
145
+ def start(self):
146
+ self.total=self.bld.total()
147
+ while not self.stop:
148
+ self.refill_task_list()
149
+ tsk=self.get_next_task()
150
+ if not tsk:
151
+ if self.count:
152
+ continue
153
+ else:
154
+ break
155
+ if tsk.hasrun:
156
+ self.processed+=1
157
+ continue
158
+ if self.stop:
159
+ break
160
+ try:
161
+ st=tsk.runnable_status()
162
+ except Exception:
163
+ self.processed+=1
164
+ if not self.stop and self.bld.keep:
165
+ tsk.hasrun=Task.SKIPPED
166
+ if self.bld.keep==1:
167
+ self.stop=True
168
+ continue
169
+ tsk.err_msg=Utils.ex_stack()
170
+ tsk.hasrun=Task.EXCEPTION
171
+ self.error_handler(tsk)
172
+ continue
173
+ if st==Task.ASK_LATER:
174
+ self.postpone(tsk)
175
+ elif st==Task.SKIP_ME:
176
+ self.processed+=1
177
+ tsk.hasrun=Task.SKIPPED
178
+ self.add_more_tasks(tsk)
179
+ else:
180
+ tsk.position=(self.processed,self.total)
181
+ self.count+=1
182
+ tsk.master=self
183
+ self.processed+=1
184
+ if self.numjobs==1:
185
+ tsk.process()
186
+ else:
187
+ self.add_task(tsk)
188
+ while self.error and self.count:
189
+ self.get_out()
190
+ assert(self.count==0 or self.stop)
191
+ self.free_task_pool()
@@ -0,0 +1,358 @@
1
+ #! /usr/bin/env python
2
+ # encoding: utf-8
3
+ # WARNING! Do not edit! http://waf.googlecode.com/git/docs/wafbook/single.html#_obtaining_the_waf_file
4
+
5
+ import os,shutil,traceback,errno,sys,stat
6
+ from waflib import Utils,Configure,Logs,Options,ConfigSet,Context,Errors,Build,Node
7
+ build_dir_override=None
8
+ no_climb_commands=['configure']
9
+ default_cmd="build"
10
+ def waf_entry_point(current_directory,version,wafdir):
11
+ Logs.init_log()
12
+ if Context.WAFVERSION!=version:
13
+ Logs.error('Waf script %r and library %r do not match (directory %r)'%(version,Context.WAFVERSION,wafdir))
14
+ sys.exit(1)
15
+ if'--version'in sys.argv:
16
+ ctx=Context.create_context('options')
17
+ ctx.curdir=current_directory
18
+ ctx.parse_args()
19
+ sys.exit(0)
20
+ Context.waf_dir=wafdir
21
+ Context.launch_dir=current_directory
22
+ no_climb=os.environ.get('NOCLIMB',None)
23
+ if not no_climb:
24
+ for k in no_climb_commands:
25
+ if k in sys.argv:
26
+ no_climb=True
27
+ break
28
+ cur=current_directory
29
+ while cur:
30
+ lst=os.listdir(cur)
31
+ if Options.lockfile in lst:
32
+ env=ConfigSet.ConfigSet()
33
+ try:
34
+ env.load(os.path.join(cur,Options.lockfile))
35
+ ino=os.stat(cur)[stat.ST_INO]
36
+ except Exception:
37
+ pass
38
+ else:
39
+ for x in[env.run_dir,env.top_dir,env.out_dir]:
40
+ if Utils.is_win32:
41
+ if cur==x:
42
+ load=True
43
+ break
44
+ else:
45
+ try:
46
+ ino2=os.stat(x)[stat.ST_INO]
47
+ except:
48
+ pass
49
+ else:
50
+ if ino==ino2:
51
+ load=True
52
+ break
53
+ else:
54
+ Logs.warn('invalid lock file in %s'%cur)
55
+ load=False
56
+ if load:
57
+ Context.run_dir=env.run_dir
58
+ Context.top_dir=env.top_dir
59
+ Context.out_dir=env.out_dir
60
+ break
61
+ if not Context.run_dir:
62
+ if Context.WSCRIPT_FILE in lst:
63
+ Context.run_dir=cur
64
+ next=os.path.dirname(cur)
65
+ if next==cur:
66
+ break
67
+ cur=next
68
+ if no_climb:
69
+ break
70
+ if not Context.run_dir:
71
+ if'-h'in sys.argv or'--help'in sys.argv:
72
+ Logs.warn('No wscript file found: the help message may be incomplete')
73
+ ctx=Context.create_context('options')
74
+ ctx.curdir=current_directory
75
+ ctx.parse_args()
76
+ sys.exit(0)
77
+ Logs.error('Waf: Run from a directory containing a file named %r'%Context.WSCRIPT_FILE)
78
+ sys.exit(1)
79
+ try:
80
+ os.chdir(Context.run_dir)
81
+ except OSError:
82
+ Logs.error('Waf: The folder %r is unreadable'%Context.run_dir)
83
+ sys.exit(1)
84
+ try:
85
+ set_main_module(Context.run_dir+os.sep+Context.WSCRIPT_FILE)
86
+ except Errors.WafError ,e:
87
+ Logs.pprint('RED',e.verbose_msg)
88
+ Logs.error(str(e))
89
+ sys.exit(1)
90
+ except Exception ,e:
91
+ Logs.error('Waf: The wscript in %r is unreadable'%Context.run_dir,e)
92
+ traceback.print_exc(file=sys.stdout)
93
+ sys.exit(2)
94
+ try:
95
+ run_commands()
96
+ except Errors.WafError ,e:
97
+ if Logs.verbose>1:
98
+ Logs.pprint('RED',e.verbose_msg)
99
+ Logs.error(e.msg)
100
+ sys.exit(1)
101
+ except Exception ,e:
102
+ traceback.print_exc(file=sys.stdout)
103
+ sys.exit(2)
104
+ except KeyboardInterrupt:
105
+ Logs.pprint('RED','Interrupted')
106
+ sys.exit(68)
107
+ def set_main_module(file_path):
108
+ Context.g_module=Context.load_module(file_path)
109
+ Context.g_module.root_path=file_path
110
+ def set_def(obj):
111
+ name=obj.__name__
112
+ if not name in Context.g_module.__dict__:
113
+ setattr(Context.g_module,name,obj)
114
+ for k in[update,dist,distclean,distcheck,update]:
115
+ set_def(k)
116
+ if not'init'in Context.g_module.__dict__:
117
+ Context.g_module.init=Utils.nada
118
+ if not'shutdown'in Context.g_module.__dict__:
119
+ Context.g_module.shutdown=Utils.nada
120
+ if not'options'in Context.g_module.__dict__:
121
+ Context.g_module.options=Utils.nada
122
+ def parse_options():
123
+ Context.create_context('options').execute()
124
+ if not Options.commands:
125
+ Options.commands=[default_cmd]
126
+ Logs.verbose=Options.options.verbose
127
+ Logs.init_log()
128
+ if Options.options.zones:
129
+ Logs.zones=Options.options.zones.split(',')
130
+ if not Logs.verbose:
131
+ Logs.verbose=1
132
+ elif Logs.verbose>0:
133
+ Logs.zones=['runner']
134
+ if Logs.verbose>2:
135
+ Logs.zones=['*']
136
+ def run_command(cmd_name):
137
+ ctx=Context.create_context(cmd_name)
138
+ ctx.options=Options.options
139
+ ctx.cmd=cmd_name
140
+ ctx.execute()
141
+ return ctx
142
+ def run_commands():
143
+ parse_options()
144
+ run_command('init')
145
+ while Options.commands:
146
+ cmd_name=Options.commands.pop(0)
147
+ timer=Utils.Timer()
148
+ run_command(cmd_name)
149
+ if not Options.options.progress_bar:
150
+ elapsed=' (%s)'%str(timer)
151
+ Logs.info('%r finished successfully%s'%(cmd_name,elapsed))
152
+ run_command('shutdown')
153
+ def _can_distclean(name):
154
+ for k in'.o .moc .exe'.split():
155
+ if name.endswith(k):
156
+ return True
157
+ return False
158
+ def distclean_dir(dirname):
159
+ for(root,dirs,files)in os.walk(dirname):
160
+ for f in files:
161
+ if _can_distclean(f):
162
+ fname=root+os.sep+f
163
+ try:
164
+ os.unlink(fname)
165
+ except:
166
+ Logs.warn('could not remove %r'%fname)
167
+ for x in[Context.DBFILE,'config.log']:
168
+ try:
169
+ os.unlink(x)
170
+ except:
171
+ pass
172
+ try:
173
+ shutil.rmtree('c4che')
174
+ except:
175
+ pass
176
+ def distclean(ctx):
177
+ '''removes the build directory'''
178
+ lst=os.listdir('.')
179
+ for f in lst:
180
+ if f==Options.lockfile:
181
+ try:
182
+ proj=ConfigSet.ConfigSet(f)
183
+ except:
184
+ Logs.warn('could not read %r'%f)
185
+ continue
186
+ if proj['out_dir']!=proj['top_dir']:
187
+ try:
188
+ shutil.rmtree(proj['out_dir'])
189
+ except IOError:
190
+ pass
191
+ except OSError ,e:
192
+ if e.errno!=errno.ENOENT:
193
+ Logs.warn('project %r cannot be removed'%proj[Context.OUT])
194
+ else:
195
+ distclean_dir(proj['out_dir'])
196
+ for k in(proj['out_dir'],proj['top_dir'],proj['run_dir']):
197
+ try:
198
+ os.remove(os.path.join(k,Options.lockfile))
199
+ except OSError ,e:
200
+ if e.errno!=errno.ENOENT:
201
+ Logs.warn('file %r cannot be removed'%f)
202
+ if f.startswith('.waf-')and not Options.commands:
203
+ shutil.rmtree(f,ignore_errors=True)
204
+ class Dist(Context.Context):
205
+ cmd='dist'
206
+ fun='dist'
207
+ algo='tar.bz2'
208
+ ext_algo={}
209
+ def execute(self):
210
+ self.recurse([os.path.dirname(Context.g_module.root_path)])
211
+ self.archive()
212
+ def archive(self):
213
+ import tarfile
214
+ arch_name=self.get_arch_name()
215
+ try:
216
+ self.base_path
217
+ except:
218
+ self.base_path=self.path
219
+ node=self.base_path.make_node(arch_name)
220
+ try:
221
+ node.delete()
222
+ except:
223
+ pass
224
+ files=self.get_files()
225
+ if self.algo.startswith('tar.'):
226
+ tar=tarfile.open(arch_name,'w:'+self.algo.replace('tar.',''))
227
+ for x in files:
228
+ tinfo=tar.gettarinfo(name=x.abspath(),arcname=self.get_tar_prefix()+'/'+x.path_from(self.base_path))
229
+ tinfo.uid=0
230
+ tinfo.gid=0
231
+ tinfo.uname='root'
232
+ tinfo.gname='root'
233
+ fu=None
234
+ try:
235
+ fu=open(x.abspath(),'rb')
236
+ tar.addfile(tinfo,fileobj=fu)
237
+ finally:
238
+ fu.close()
239
+ tar.close()
240
+ elif self.algo=='zip':
241
+ import zipfile
242
+ zip=zipfile.ZipFile(arch_name,'w',compression=zipfile.ZIP_DEFLATED)
243
+ for x in files:
244
+ archive_name=self.get_base_name()+'/'+x.path_from(self.base_path)
245
+ zip.write(x.abspath(),archive_name,zipfile.ZIP_DEFLATED)
246
+ zip.close()
247
+ else:
248
+ self.fatal('Valid algo types are tar.bz2, tar.gz or zip')
249
+ try:
250
+ from hashlib import sha1 as sha
251
+ except ImportError:
252
+ from sha import sha
253
+ try:
254
+ digest=" (sha=%r)"%sha(node.read()).hexdigest()
255
+ except:
256
+ digest=''
257
+ Logs.info('New archive created: %s%s'%(self.arch_name,digest))
258
+ def get_tar_prefix(self):
259
+ try:
260
+ return self.tar_prefix
261
+ except:
262
+ return self.get_base_name()
263
+ def get_arch_name(self):
264
+ try:
265
+ self.arch_name
266
+ except:
267
+ self.arch_name=self.get_base_name()+'.'+self.ext_algo.get(self.algo,self.algo)
268
+ return self.arch_name
269
+ def get_base_name(self):
270
+ try:
271
+ self.base_name
272
+ except:
273
+ appname=getattr(Context.g_module,Context.APPNAME,'noname')
274
+ version=getattr(Context.g_module,Context.VERSION,'1.0')
275
+ self.base_name=appname+'-'+version
276
+ return self.base_name
277
+ def get_excl(self):
278
+ try:
279
+ return self.excl
280
+ except:
281
+ self.excl=Node.exclude_regs+' **/waf-1.6.* **/.waf-1.6* **/*~ **/*.rej **/*.orig **/*.pyc **/*.pyo **/*.bak **/*.swp **/.lock-w*'
282
+ nd=self.root.find_node(Context.out_dir)
283
+ if nd:
284
+ self.excl+=' '+nd.path_from(self.base_path)
285
+ return self.excl
286
+ def get_files(self):
287
+ try:
288
+ files=self.files
289
+ except:
290
+ files=self.base_path.ant_glob('**/*',excl=self.get_excl())
291
+ return files
292
+ def dist(ctx):
293
+ '''makes a tarball for redistributing the sources'''
294
+ pass
295
+ class DistCheck(Dist):
296
+ fun='distcheck'
297
+ cmd='distcheck'
298
+ def execute(self):
299
+ self.recurse([os.path.dirname(Context.g_module.root_path)])
300
+ self.archive()
301
+ self.check()
302
+ def check(self):
303
+ import tempfile,tarfile
304
+ t=None
305
+ try:
306
+ t=tarfile.open(self.get_arch_name())
307
+ for x in t:
308
+ t.extract(x)
309
+ finally:
310
+ if t:
311
+ t.close()
312
+ instdir=tempfile.mkdtemp('.inst',self.get_base_name())
313
+ ret=Utils.subprocess.Popen([sys.argv[0],'configure','install','uninstall','--destdir='+instdir],cwd=self.get_base_name()).wait()
314
+ if ret:
315
+ raise Errors.WafError('distcheck failed with code %i'%ret)
316
+ if os.path.exists(instdir):
317
+ raise Errors.WafError('distcheck succeeded, but files were left in %s'%instdir)
318
+ shutil.rmtree(self.get_base_name())
319
+ def distcheck(ctx):
320
+ '''checks if the project compiles (tarball from 'dist')'''
321
+ pass
322
+ def update(ctx):
323
+ '''updates the plugins from the *waflib/extras* directory'''
324
+ lst=Options.options.files.split(',')
325
+ if not lst:
326
+ lst=[x for x in Utils.listdir(Context.waf_dir+'/waflib/extras')if x.endswith('.py')]
327
+ for x in lst:
328
+ tool=x.replace('.py','')
329
+ try:
330
+ Configure.download_tool(tool,force=True,ctx=ctx)
331
+ except Errors.WafError:
332
+ Logs.error('Could not find the tool %s in the remote repository'%x)
333
+ def autoconfigure(execute_method):
334
+ def execute(self):
335
+ if not Configure.autoconfig:
336
+ return execute_method(self)
337
+ env=ConfigSet.ConfigSet()
338
+ do_config=False
339
+ try:
340
+ env.load(os.path.join(Context.top_dir,Options.lockfile))
341
+ except Exception:
342
+ Logs.warn('Configuring the project')
343
+ do_config=True
344
+ else:
345
+ if env.run_dir!=Context.run_dir:
346
+ do_config=True
347
+ else:
348
+ h=0
349
+ for f in env['files']:
350
+ h=hash((h,Utils.readf(f,'rb')))
351
+ do_config=h!=env.hash
352
+ if do_config:
353
+ Options.commands.insert(0,self.cmd)
354
+ Options.commands.insert(0,'configure')
355
+ return
356
+ return execute_method(self)
357
+ return execute
358
+ Build.BuildContext.execute=autoconfigure(Build.BuildContext.execute)