text_ux 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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)