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,13 @@
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 waflib.Tools.asm
6
+ from waflib.TaskGen import feature
7
+ def apply_nasm_vars(self):
8
+ self.env.append_value('ASFLAGS',self.to_list(getattr(self,'nasm_flags',[])))
9
+ def configure(conf):
10
+ nasm=conf.find_program(['nasm','yasm'],var='AS')
11
+ conf.env.AS_TGT_F='-o'
12
+
13
+ feature('asm')(apply_nasm_vars)
@@ -0,0 +1,78 @@
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
6
+ from waflib import Task,Options,Utils
7
+ from waflib.Configure import conf
8
+ from waflib.TaskGen import extension,feature,before_method
9
+ def init_perlext(self):
10
+ self.uselib=self.to_list(getattr(self,'uselib',[]))
11
+ if not'PERLEXT'in self.uselib:self.uselib.append('PERLEXT')
12
+ self.env['cshlib_PATTERN']=self.env['cxxshlib_PATTERN']=self.env['perlext_PATTERN']
13
+ def xsubpp_file(self,node):
14
+ outnode=node.change_ext('.c')
15
+ self.create_task('xsubpp',node,outnode)
16
+ self.source.append(outnode)
17
+ class xsubpp(Task.Task):
18
+ run_str='${PERL} ${XSUBPP} -noprototypes -typemap ${EXTUTILS_TYPEMAP} ${SRC} > ${TGT}'
19
+ color='BLUE'
20
+ ext_out=['.h']
21
+ def check_perl_version(self,minver=None):
22
+ res=True
23
+ cver=""if minver is None else".".join(map(str,minver))
24
+ self.start_msg('Checking for minimum perl version %s'%cver)
25
+ perl=getattr(Options.options,'perlbinary',None)
26
+ if not perl:
27
+ perl=self.find_program('perl',var='PERL')
28
+ if not perl:
29
+ self.end_msg("Perl not found",color="YELLOW")
30
+ return False
31
+ self.env['PERL']=perl
32
+ version=self.cmd_and_log([perl,"-e",'printf \"%vd\", $^V'])
33
+ if not version:
34
+ res=False
35
+ version="Unknown"
36
+ elif not minver is None:
37
+ ver=tuple(map(int,version.split(".")))
38
+ if ver<minver:
39
+ res=False
40
+ self.end_msg(version,color="GREEN"if res else"YELLOW")
41
+ return res
42
+ def check_perl_module(self,module):
43
+ cmd=[self.env['PERL'],'-e','use %s'%module]
44
+ self.start_msg('perl module %s'%module)
45
+ try:
46
+ r=self.cmd_and_log(cmd)
47
+ except:
48
+ self.end_msg(False)
49
+ return None
50
+ self.end_msg(r or True)
51
+ return r
52
+ def check_perl_ext_devel(self):
53
+ env=self.env
54
+ perl=env.PERL
55
+ if not perl:
56
+ self.fatal('find perl first')
57
+ def read_out(cmd):
58
+ return Utils.to_list(self.cmd_and_log(perl+cmd))
59
+ env['LINKFLAGS_PERLEXT']=read_out(" -MConfig -e'print $Config{lddlflags}'")
60
+ env['INCLUDES_PERLEXT']=read_out(" -MConfig -e'print \"$Config{archlib}/CORE\"'")
61
+ env['CFLAGS_PERLEXT']=read_out(" -MConfig -e'print \"$Config{ccflags} $Config{cccdlflags}\"'")
62
+ env['XSUBPP']=read_out(" -MConfig -e'print \"$Config{privlib}/ExtUtils/xsubpp$Config{exe_ext}\"'")
63
+ env['EXTUTILS_TYPEMAP']=read_out(" -MConfig -e'print \"$Config{privlib}/ExtUtils/typemap\"'")
64
+ if not getattr(Options.options,'perlarchdir',None):
65
+ env['ARCHDIR_PERL']=self.cmd_and_log(perl+" -MConfig -e'print $Config{sitearch}'")
66
+ else:
67
+ env['ARCHDIR_PERL']=getattr(Options.options,'perlarchdir')
68
+ env['perlext_PATTERN']='%s.'+self.cmd_and_log(perl+" -MConfig -e'print $Config{dlext}'")
69
+ def options(opt):
70
+ opt.add_option('--with-perl-binary',type='string',dest='perlbinary',help='Specify alternate perl binary',default=None)
71
+ opt.add_option('--with-perl-archdir',type='string',dest='perlarchdir',help='Specify directory where to install arch specific files',default=None)
72
+
73
+ before_method('apply_incpaths','apply_link','propagate_uselib_vars')(init_perlext)
74
+ feature('perlext')(init_perlext)
75
+ extension('.xs')(xsubpp_file)
76
+ conf(check_perl_version)
77
+ conf(check_perl_module)
78
+ conf(check_perl_ext_devel)
@@ -0,0 +1,303 @@
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,sys
6
+ from waflib import Utils,Options,Errors
7
+ from waflib.Logs import debug,warn,info,error
8
+ from waflib.TaskGen import extension,before_method,after_method,feature
9
+ from waflib.Configure import conf
10
+ FRAG='''
11
+ #include <Python.h>
12
+ #ifdef __cplusplus
13
+ extern "C" {
14
+ #endif
15
+ void Py_Initialize(void);
16
+ void Py_Finalize(void);
17
+ #ifdef __cplusplus
18
+ }
19
+ #endif
20
+ int main()
21
+ {
22
+ Py_Initialize();
23
+ Py_Finalize();
24
+ return 0;
25
+ }
26
+ '''
27
+ INST='''
28
+ import sys, py_compile
29
+ py_compile.compile(sys.argv[1], sys.argv[2], sys.argv[3])
30
+ '''
31
+ def process_py(self,node):
32
+ try:
33
+ if not self.bld.is_install:
34
+ return
35
+ except:
36
+ return
37
+ try:
38
+ if not self.install_path:
39
+ return
40
+ except AttributeError:
41
+ self.install_path='${PYTHONDIR}'
42
+ def inst_py(ctx):
43
+ install_from=getattr(self,'install_from',None)
44
+ if install_from:
45
+ install_from=self.path.find_dir(install_from)
46
+ install_pyfile(self,node,install_from)
47
+ self.bld.add_post_fun(inst_py)
48
+ def install_pyfile(self,node,install_from=None):
49
+ from_node=install_from or node.parent
50
+ tsk=self.bld.install_as(self.install_path+'/'+node.path_from(from_node),node,postpone=False)
51
+ path=tsk.get_install_path()
52
+ if self.bld.is_install<0:
53
+ info("+ removing byte compiled python files")
54
+ for x in'co':
55
+ try:
56
+ os.remove(path+x)
57
+ except OSError:
58
+ pass
59
+ if self.bld.is_install>0:
60
+ try:
61
+ st1=os.stat(path)
62
+ except:
63
+ error('The python file is missing, this should not happen')
64
+ for x in['c','o']:
65
+ do_inst=self.env['PY'+x.upper()]
66
+ try:
67
+ st2=os.stat(path+x)
68
+ except OSError:
69
+ pass
70
+ else:
71
+ if st1.st_mtime<=st2.st_mtime:
72
+ do_inst=False
73
+ if do_inst:
74
+ lst=(x=='o')and[self.env['PYFLAGS_OPT']]or[]
75
+ (a,b,c)=(path,path+x,tsk.get_install_path(destdir=False)+x)
76
+ argv=self.env['PYTHON']+lst+['-c',INST,a,b,c]
77
+ info('+ byte compiling %r'%(path+x))
78
+ ret=Utils.subprocess.Popen(argv).wait()
79
+ if ret:
80
+ raise Errors.WafError('py%s compilation failed %r'%(x,path))
81
+ def feature_py(self):
82
+ pass
83
+ def init_pyext(self):
84
+ try:
85
+ if not self.install_path:
86
+ return
87
+ except AttributeError:
88
+ self.install_path='${PYTHONARCHDIR}'
89
+ self.uselib=self.to_list(getattr(self,'uselib',[]))
90
+ if not'PYEXT'in self.uselib:
91
+ self.uselib.append('PYEXT')
92
+ self.env['cshlib_PATTERN']=self.env['cxxshlib_PATTERN']=self.env['macbundle_PATTERN']=self.env['pyext_PATTERN']
93
+ def set_bundle(self):
94
+ if sys.platform.startswith('darwin'):
95
+ self.mac_bundle=True
96
+ def init_pyembed(self):
97
+ self.uselib=self.to_list(getattr(self,'uselib',[]))
98
+ if not'PYEMBED'in self.uselib:
99
+ self.uselib.append('PYEMBED')
100
+ def get_python_variables(conf,variables,imports=['import sys']):
101
+ program=list(imports)
102
+ program.append('')
103
+ for v in variables:
104
+ program.append("print(repr(%s))"%v)
105
+ os_env=dict(os.environ)
106
+ try:
107
+ del os_env['MACOSX_DEPLOYMENT_TARGET']
108
+ except KeyError:
109
+ pass
110
+ try:
111
+ out=conf.cmd_and_log(conf.env.PYTHON+['-c','\n'.join(program)],env=os_env)
112
+ except Errors.WafError:
113
+ conf.fatal('The distutils module is unusable: install "python-devel"?')
114
+ return_values=[]
115
+ for s in out.split('\n'):
116
+ s=s.strip()
117
+ if not s:
118
+ continue
119
+ if s=='None':
120
+ return_values.append(None)
121
+ elif s[0]=="'"and s[-1]=="'":
122
+ return_values.append(s[1:-1])
123
+ elif s[0].isdigit():
124
+ return_values.append(int(s))
125
+ else:break
126
+ return return_values
127
+ def check_python_headers(conf):
128
+ if not conf.env['CC_NAME']and not conf.env['CXX_NAME']:
129
+ conf.fatal('load a compiler first (gcc, g++, ..)')
130
+ if not conf.env['PYTHON_VERSION']:
131
+ conf.check_python_version()
132
+ env=conf.env
133
+ pybin=conf.env.PYTHON
134
+ if not pybin:
135
+ conf.fatal('could not find the python executable')
136
+ v='prefix SO LDFLAGS LIBDIR LIBPL INCLUDEPY Py_ENABLE_SHARED MACOSX_DEPLOYMENT_TARGET LDSHARED CFLAGS'.split()
137
+ try:
138
+ lst=conf.get_python_variables(["get_config_var('%s') or ''"%x for x in v],['from distutils.sysconfig import get_config_var'])
139
+ except RuntimeError:
140
+ conf.fatal("Python development headers not found (-v for details).")
141
+ vals=['%s = %r'%(x,y)for(x,y)in zip(v,lst)]
142
+ conf.to_log("Configuration returned from %r:\n%r\n"%(pybin,'\n'.join(vals)))
143
+ dct=dict(zip(v,lst))
144
+ x='MACOSX_DEPLOYMENT_TARGET'
145
+ if dct[x]:
146
+ conf.env[x]=conf.environ[x]=dct[x]
147
+ env['pyext_PATTERN']='%s'+dct['SO']
148
+ all_flags=dct['LDFLAGS']+' '+dct['CFLAGS']
149
+ conf.parse_flags(all_flags,'PYEMBED')
150
+ all_flags=dct['LDFLAGS']+' '+dct['LDSHARED']+' '+dct['CFLAGS']
151
+ conf.parse_flags(all_flags,'PYEXT')
152
+ result=None
153
+ for name in('python'+env['PYTHON_VERSION'],'python'+env['PYTHON_VERSION'].replace('.','')):
154
+ if not result and env['LIBPATH_PYEMBED']:
155
+ path=env['LIBPATH_PYEMBED']
156
+ conf.to_log("\n\n# Trying default LIBPATH_PYEMBED: %r\n"%path)
157
+ result=conf.check(lib=name,uselib='PYEMBED',libpath=path,mandatory=False,msg='Checking for library %s in LIBPATH_PYEMBED'%name)
158
+ if not result and dct['LIBDIR']:
159
+ path=[dct['LIBDIR']]
160
+ conf.to_log("\n\n# try again with -L$python_LIBDIR: %r\n"%path)
161
+ result=conf.check(lib=name,uselib='PYEMBED',libpath=path,mandatory=False,msg='Checking for library %s in LIBDIR'%name)
162
+ if not result and dct['LIBPL']:
163
+ path=[dct['LIBPL']]
164
+ conf.to_log("\n\n# try again with -L$python_LIBPL (some systems don't install the python library in $prefix/lib)\n")
165
+ result=conf.check(lib=name,uselib='PYEMBED',libpath=path,mandatory=False,msg='Checking for library %s in python_LIBPL'%name)
166
+ if not result:
167
+ path=[os.path.join(dct['prefix'],"libs")]
168
+ conf.to_log("\n\n# try again with -L$prefix/libs, and pythonXY name rather than pythonX.Y (win32)\n")
169
+ result=conf.check(lib=name,uselib='PYEMBED',libpath=path,mandatory=False,msg='Checking for library %s in $prefix/libs'%name)
170
+ if result:
171
+ break
172
+ if result:
173
+ env['LIBPATH_PYEMBED']=path
174
+ env.append_value('LIB_PYEMBED',[name])
175
+ else:
176
+ conf.to_log("\n\n### LIB NOT FOUND\n")
177
+ if(Utils.is_win32 or sys.platform.startswith('os2')or dct['Py_ENABLE_SHARED']):
178
+ env['LIBPATH_PYEXT']=env['LIBPATH_PYEMBED']
179
+ env['LIB_PYEXT']=env['LIB_PYEMBED']
180
+ num='.'.join(env['PYTHON_VERSION'].split('.')[:2])
181
+ conf.find_program(['python%s-config'%num,'python-config-%s'%num,'python%sm-config'%num],var='PYTHON_CONFIG',mandatory=False)
182
+ includes=[]
183
+ if conf.env.PYTHON_CONFIG:
184
+ for incstr in conf.cmd_and_log([conf.env.PYTHON_CONFIG,'--includes']).strip().split():
185
+ if(incstr.startswith('-I')or incstr.startswith('/I')):
186
+ incstr=incstr[2:]
187
+ if incstr not in includes:
188
+ includes.append(incstr)
189
+ conf.to_log("Include path for Python extensions (found via python-config --includes): %r\n"%(includes,))
190
+ env['INCLUDES_PYEXT']=includes
191
+ env['INCLUDES_PYEMBED']=includes
192
+ else:
193
+ conf.to_log("Include path for Python extensions ""(found via distutils module): %r\n"%(dct['INCLUDEPY'],))
194
+ env['INCLUDES_PYEXT']=[dct['INCLUDEPY']]
195
+ env['INCLUDES_PYEMBED']=[dct['INCLUDEPY']]
196
+ if env['CC_NAME']=='gcc':
197
+ env.append_value('CFLAGS_PYEMBED',['-fno-strict-aliasing'])
198
+ env.append_value('CFLAGS_PYEXT',['-fno-strict-aliasing'])
199
+ if env['CXX_NAME']=='gcc':
200
+ env.append_value('CXXFLAGS_PYEMBED',['-fno-strict-aliasing'])
201
+ env.append_value('CXXFLAGS_PYEXT',['-fno-strict-aliasing'])
202
+ if env.CC_NAME=="msvc":
203
+ from distutils.msvccompiler import MSVCCompiler
204
+ dist_compiler=MSVCCompiler()
205
+ dist_compiler.initialize()
206
+ env.append_value('CFLAGS_PYEXT',dist_compiler.compile_options)
207
+ env.append_value('CXXFLAGS_PYEXT',dist_compiler.compile_options)
208
+ env.append_value('LINKFLAGS_PYEXT',dist_compiler.ldflags_shared)
209
+ try:
210
+ conf.check(header_name='Python.h',define_name='HAVE_PYTHON_H',uselib='PYEMBED',fragment=FRAG,errmsg='Could not find the python development headers')
211
+ except conf.errors.ConfigurationError:
212
+ conf.check_cfg(path=conf.env.PYTHON_CONFIG,package='',uselib_store='PYEMBED',args=['--cflags','--libs'])
213
+ conf.check(header_name='Python.h',define_name='HAVE_PYTHON_H',msg='Getting the python flags from python-config',uselib='PYEMBED',fragment=FRAG,errmsg='Could not find the python development headers elsewhere')
214
+ def check_python_version(conf,minver=None):
215
+ assert minver is None or isinstance(minver,tuple)
216
+ pybin=conf.env['PYTHON']
217
+ if not pybin:
218
+ conf.fatal('could not find the python executable')
219
+ cmd=pybin+['-c','import sys\nfor x in sys.version_info: print(str(x))']
220
+ debug('python: Running python command %r'%cmd)
221
+ lines=conf.cmd_and_log(cmd).split()
222
+ assert len(lines)==5,"found %i lines, expected 5: %r"%(len(lines),lines)
223
+ pyver_tuple=(int(lines[0]),int(lines[1]),int(lines[2]),lines[3],int(lines[4]))
224
+ result=(minver is None)or(pyver_tuple>=minver)
225
+ if result:
226
+ pyver='.'.join([str(x)for x in pyver_tuple[:2]])
227
+ conf.env['PYTHON_VERSION']=pyver
228
+ if'PYTHONDIR'in conf.environ:
229
+ pydir=conf.environ['PYTHONDIR']
230
+ else:
231
+ if Utils.is_win32:
232
+ (python_LIBDEST,pydir)=conf.get_python_variables(["get_config_var('LIBDEST') or ''","get_python_lib(standard_lib=0, prefix=%r) or ''"%conf.env['PREFIX']],['from distutils.sysconfig import get_config_var, get_python_lib'])
233
+ else:
234
+ python_LIBDEST=None
235
+ (pydir,)=conf.get_python_variables(["get_python_lib(standard_lib=0, prefix=%r) or ''"%conf.env['PREFIX']],['from distutils.sysconfig import get_python_lib'])
236
+ if python_LIBDEST is None:
237
+ if conf.env['LIBDIR']:
238
+ python_LIBDEST=os.path.join(conf.env['LIBDIR'],"python"+pyver)
239
+ else:
240
+ python_LIBDEST=os.path.join(conf.env['PREFIX'],"lib","python"+pyver)
241
+ if'PYTHONARCHDIR'in conf.environ:
242
+ pyarchdir=conf.environ['PYTHONARCHDIR']
243
+ else:
244
+ (pyarchdir,)=conf.get_python_variables(["get_python_lib(plat_specific=1, standard_lib=0, prefix=%r) or ''"%conf.env['PREFIX']],['from distutils.sysconfig import get_python_lib'])
245
+ if not pyarchdir:
246
+ pyarchdir=pydir
247
+ if hasattr(conf,'define'):
248
+ conf.define('PYTHONDIR',pydir)
249
+ conf.define('PYTHONARCHDIR',pyarchdir)
250
+ conf.env['PYTHONDIR']=pydir
251
+ conf.env['PYTHONARCHDIR']=pyarchdir
252
+ pyver_full='.'.join(map(str,pyver_tuple[:3]))
253
+ if minver is None:
254
+ conf.msg('Checking for python version',pyver_full)
255
+ else:
256
+ minver_str='.'.join(map(str,minver))
257
+ conf.msg('Checking for python version',pyver_tuple,">= %s"%(minver_str,)and'GREEN'or'YELLOW')
258
+ if not result:
259
+ conf.fatal('The python version is too old, expecting %r'%(minver,))
260
+ PYTHON_MODULE_TEMPLATE='''
261
+ import %s
262
+ print(1)
263
+ '''
264
+ def check_python_module(conf,module_name):
265
+ conf.start_msg('Python module %s'%module_name)
266
+ try:
267
+ conf.cmd_and_log(conf.env['PYTHON']+['-c',PYTHON_MODULE_TEMPLATE%module_name])
268
+ except:
269
+ conf.end_msg(False)
270
+ conf.fatal('Could not find the python module %r'%module_name)
271
+ conf.end_msg(True)
272
+ def configure(conf):
273
+ try:
274
+ conf.find_program('python',var='PYTHON')
275
+ except conf.errors.ConfigurationError:
276
+ warn("could not find a python executable, setting to sys.executable '%s'"%sys.executable)
277
+ conf.env.PYTHON=sys.executable
278
+ if conf.env.PYTHON!=sys.executable:
279
+ warn("python executable '%s' different from sys.executable '%s'"%(conf.env.PYTHON,sys.executable))
280
+ conf.env.PYTHON=conf.cmd_to_list(conf.env.PYTHON)
281
+ v=conf.env
282
+ v['PYCMD']='"import sys, py_compile;py_compile.compile(sys.argv[1], sys.argv[2])"'
283
+ v['PYFLAGS']=''
284
+ v['PYFLAGS_OPT']='-O'
285
+ v['PYC']=getattr(Options.options,'pyc',1)
286
+ v['PYO']=getattr(Options.options,'pyo',1)
287
+ def options(opt):
288
+ opt.add_option('--nopyc',action='store_false',default=1,help='Do not install bytecode compiled .pyc files (configuration) [Default:install]',dest='pyc')
289
+ opt.add_option('--nopyo',action='store_false',default=1,help='Do not install optimised compiled .pyo files (configuration) [Default:install]',dest='pyo')
290
+
291
+ extension('.py')(process_py)
292
+ feature('py')(feature_py)
293
+ feature('pyext')(init_pyext)
294
+ before_method('propagate_uselib_vars','apply_link')(init_pyext)
295
+ after_method('apply_bundle')(init_pyext)
296
+ feature('pyext')(set_bundle)
297
+ before_method('apply_link','apply_bundle')(set_bundle)
298
+ before_method('propagate_uselib_vars')(init_pyembed)
299
+ feature('pyembed')(init_pyembed)
300
+ conf(get_python_variables)
301
+ conf(check_python_headers)
302
+ conf(check_python_version)
303
+ conf(check_python_module)
@@ -0,0 +1,424 @@
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 sys
6
+ if sys.hexversion < 0x020400f0: from sets import Set as set
7
+ try:
8
+ from xml.sax import make_parser
9
+ from xml.sax.handler import ContentHandler
10
+ except ImportError:
11
+ has_xml=False
12
+ ContentHandler=object
13
+ else:
14
+ has_xml=True
15
+ import os,sys
16
+ from waflib.Tools import c_preproc,cxx
17
+ from waflib import Task,Utils,Options,Errors
18
+ from waflib.TaskGen import feature,after_method,extension
19
+ from waflib.Configure import conf
20
+ from waflib.Logs import error
21
+ MOC_H=['.h','.hpp','.hxx','.hh']
22
+ EXT_RCC=['.qrc']
23
+ EXT_UI=['.ui']
24
+ EXT_QT4=['.cpp','.cc','.cxx','.C']
25
+ QT4_LIBS="QtCore QtGui QtUiTools QtNetwork QtOpenGL QtSql QtSvg QtTest QtXml QtXmlPatterns QtWebKit Qt3Support QtHelp QtScript QtDeclarative"
26
+ class qxx(cxx.cxx):
27
+ def __init__(self,*k,**kw):
28
+ Task.Task.__init__(self,*k,**kw)
29
+ self.moc_done=0
30
+ def scan(self):
31
+ (nodes,names)=c_preproc.scan(self)
32
+ for x in nodes:
33
+ if x.name.endswith('.moc'):
34
+ nodes.remove(x)
35
+ names.append(x.path_from(self.inputs[0].parent.get_bld()))
36
+ return(nodes,names)
37
+ def runnable_status(self):
38
+ if self.moc_done:
39
+ return Task.Task.runnable_status(self)
40
+ else:
41
+ for t in self.run_after:
42
+ if not t.hasrun:
43
+ return Task.ASK_LATER
44
+ self.add_moc_tasks()
45
+ return Task.Task.runnable_status(self)
46
+ def add_moc_tasks(self):
47
+ node=self.inputs[0]
48
+ bld=self.generator.bld
49
+ try:
50
+ self.signature()
51
+ except KeyError:
52
+ pass
53
+ else:
54
+ delattr(self,'cache_sig')
55
+ moctasks=[]
56
+ mocfiles=[]
57
+ try:
58
+ tmp_lst=bld.raw_deps[self.uid()]
59
+ bld.raw_deps[self.uid()]=[]
60
+ except KeyError:
61
+ tmp_lst=[]
62
+ for d in tmp_lst:
63
+ if not d.endswith('.moc'):
64
+ continue
65
+ if d in mocfiles:
66
+ error("paranoia owns")
67
+ continue
68
+ mocfiles.append(d)
69
+ h_node=None
70
+ try:ext=Options.options.qt_header_ext.split()
71
+ except AttributeError:pass
72
+ if not ext:ext=MOC_H
73
+ base2=d[:-4]
74
+ for x in[node.parent]+self.generator.includes_nodes:
75
+ for e in ext:
76
+ h_node=x.find_node(base2+e)
77
+ if h_node:
78
+ break
79
+ else:
80
+ continue
81
+ break
82
+ else:
83
+ raise Errors.WafError('no header found for %r which is a moc file'%d)
84
+ m_node=h_node.change_ext('.moc')
85
+ bld.node_deps[(self.inputs[0].parent.abspath(),m_node.name)]=h_node
86
+ task=Task.classes['moc'](env=self.env,generator=self.generator)
87
+ task.set_inputs(h_node)
88
+ task.set_outputs(m_node)
89
+ gen=bld.producer
90
+ gen.outstanding.insert(0,task)
91
+ gen.total+=1
92
+ moctasks.append(task)
93
+ tmp_lst=bld.raw_deps[self.uid()]=mocfiles
94
+ lst=bld.node_deps.get(self.uid(),())
95
+ for d in lst:
96
+ name=d.name
97
+ if name.endswith('.moc'):
98
+ task=Task.classes['moc'](env=self.env,generator=self.generator)
99
+ task.set_inputs(bld.node_deps[(self.inputs[0].parent.abspath(),name)])
100
+ task.set_outputs(d)
101
+ gen=bld.producer
102
+ gen.outstanding.insert(0,task)
103
+ gen.total+=1
104
+ moctasks.append(task)
105
+ self.run_after.update(set(moctasks))
106
+ self.moc_done=1
107
+ run=Task.classes['cxx'].__dict__['run']
108
+ class trans_update(Task.Task):
109
+ run_str='${QT_LUPDATE} ${SRC} -ts ${TGT}'
110
+ color='BLUE'
111
+ Task.update_outputs(trans_update)
112
+ class XMLHandler(ContentHandler):
113
+ def __init__(self):
114
+ self.buf=[]
115
+ self.files=[]
116
+ def startElement(self,name,attrs):
117
+ if name=='file':
118
+ self.buf=[]
119
+ def endElement(self,name):
120
+ if name=='file':
121
+ self.files.append(str(''.join(self.buf)))
122
+ def characters(self,cars):
123
+ self.buf.append(cars)
124
+ def create_rcc_task(self,node):
125
+ rcnode=node.change_ext('_rc.cpp')
126
+ rcctask=self.create_task('rcc',node,rcnode)
127
+ cpptask=self.create_task('cxx',rcnode,rcnode.change_ext('.o'))
128
+ try:
129
+ self.compiled_tasks.append(cpptask)
130
+ except AttributeError:
131
+ self.compiled_tasks=[cpptask]
132
+ return cpptask
133
+ def create_uic_task(self,node):
134
+ uictask=self.create_task('ui4',node)
135
+ uictask.outputs=[self.path.find_or_declare(self.env['ui_PATTERN']%node.name[:-3])]
136
+ def add_lang(self,node):
137
+ self.lang=self.to_list(getattr(self,'lang',[]))+[node]
138
+ def apply_qt4(self):
139
+ if getattr(self,'lang',None):
140
+ qmtasks=[]
141
+ for x in self.to_list(self.lang):
142
+ if isinstance(x,str):
143
+ x=self.path.find_resource(x+'.ts')
144
+ qmtasks.append(self.create_task('ts2qm',x,x.change_ext('.qm')))
145
+ if getattr(self,'update',None)and Options.options.trans_qt4:
146
+ cxxnodes=[a.inputs[0]for a in self.compiled_tasks]+[a.inputs[0]for a in self.tasks if getattr(a,'inputs',None)and a.inputs[0].name.endswith('.ui')]
147
+ for x in qmtasks:
148
+ self.create_task('trans_update',cxxnodes,x.inputs)
149
+ if getattr(self,'langname',None):
150
+ qmnodes=[x.outputs[0]for x in qmtasks]
151
+ rcnode=self.langname
152
+ if isinstance(rcnode,str):
153
+ rcnode=self.path.find_or_declare(rcnode+'.qrc')
154
+ t=self.create_task('qm2rcc',qmnodes,rcnode)
155
+ k=create_rcc_task(self,t.outputs[0])
156
+ self.link_task.inputs.append(k.outputs[0])
157
+ lst=[]
158
+ for flag in self.to_list(self.env['CXXFLAGS']):
159
+ if len(flag)<2:continue
160
+ f=flag[0:2]
161
+ if f in['-D','-I','/D','/I']:
162
+ if(f[0]=='/'):
163
+ lst.append('-'+flag[1:])
164
+ else:
165
+ lst.append(flag)
166
+ self.env['MOC_FLAGS']=lst
167
+ def cxx_hook(self,node):
168
+ return self.create_compiled_task('qxx',node)
169
+ class rcc(Task.Task):
170
+ color='BLUE'
171
+ run_str='${QT_RCC} -name ${SRC[0].name} ${SRC[0].abspath()} ${RCC_ST} -o ${TGT}'
172
+ ext_out=['.h']
173
+ def scan(self):
174
+ node=self.inputs[0]
175
+ parser=make_parser()
176
+ curHandler=XMLHandler()
177
+ parser.setContentHandler(curHandler)
178
+ fi=open(self.inputs[0].abspath())
179
+ parser.parse(fi)
180
+ fi.close()
181
+ nodes=[]
182
+ names=[]
183
+ root=self.inputs[0].parent
184
+ for x in curHandler.files:
185
+ nd=root.find_resource(x)
186
+ if nd:nodes.append(nd)
187
+ else:names.append(x)
188
+ return(nodes,names)
189
+ class moc(Task.Task):
190
+ color='BLUE'
191
+ run_str='${QT_MOC} ${MOC_FLAGS} ${MOCCPPPATH_ST:INCPATHS} ${MOCDEFINES_ST:DEFINES} ${SRC} ${MOC_ST} ${TGT}'
192
+ class ui4(Task.Task):
193
+ color='BLUE'
194
+ run_str='${QT_UIC} ${SRC} -o ${TGT}'
195
+ ext_out=['.h']
196
+ class ts2qm(Task.Task):
197
+ color='BLUE'
198
+ run_str='${QT_LRELEASE} ${QT_LRELEASE_FLAGS} ${SRC} -qm ${TGT}'
199
+ class qm2rcc(Task.Task):
200
+ color='BLUE'
201
+ after='ts2qm'
202
+ def run(self):
203
+ txt='\n'.join(['<file>%s</file>'%k.path_from(self.outputs[0].parent)for k in self.inputs])
204
+ code='<!DOCTYPE RCC><RCC version="1.0">\n<qresource>\n%s\n</qresource>\n</RCC>'%txt
205
+ self.outputs[0].write(code)
206
+ def configure(self):
207
+ self.find_qt4_binaries()
208
+ self.set_qt4_libs_to_check()
209
+ self.find_qt4_libraries()
210
+ self.add_qt4_rpath()
211
+ self.simplify_qt4_libs()
212
+ def find_qt4_binaries(self):
213
+ env=self.env
214
+ opt=Options.options
215
+ qtdir=getattr(opt,'qtdir','')
216
+ qtbin=getattr(opt,'qtbin','')
217
+ paths=[]
218
+ if qtdir:
219
+ qtbin=os.path.join(qtdir,'bin')
220
+ if not qtdir:
221
+ qtdir=self.environ.get('QT4_ROOT','')
222
+ qtbin=os.path.join(qtdir,'bin')
223
+ if qtbin:
224
+ paths=[qtbin]
225
+ if not qtdir:
226
+ paths=os.environ.get('PATH','').split(os.pathsep)
227
+ paths.append('/usr/share/qt4/bin/')
228
+ try:
229
+ lst=Utils.listdir('/usr/local/Trolltech/')
230
+ except OSError:
231
+ pass
232
+ else:
233
+ if lst:
234
+ lst.sort()
235
+ lst.reverse()
236
+ qtdir='/usr/local/Trolltech/%s/'%lst[0]
237
+ qtbin=os.path.join(qtdir,'bin')
238
+ paths.append(qtbin)
239
+ cand=None
240
+ prev_ver=['4','0','0']
241
+ for qmk in['qmake-qt4','qmake4','qmake']:
242
+ try:
243
+ qmake=self.find_program(qmk,path_list=paths)
244
+ except self.errors.ConfigurationError:
245
+ pass
246
+ else:
247
+ try:
248
+ version=self.cmd_and_log([qmake,'-query','QT_VERSION']).strip()
249
+ except self.errors.ConfigurationError:
250
+ pass
251
+ else:
252
+ if version:
253
+ new_ver=version.split('.')
254
+ if new_ver>prev_ver:
255
+ cand=qmake
256
+ prev_ver=new_ver
257
+ if cand:
258
+ self.env.QMAKE=cand
259
+ else:
260
+ self.fatal('Could not find qmake for qt4')
261
+ qtbin=self.cmd_and_log([self.env.QMAKE,'-query','QT_INSTALL_BINS']).strip()+os.sep
262
+ def find_bin(lst,var):
263
+ for f in lst:
264
+ try:
265
+ ret=self.find_program(f,path_list=paths)
266
+ except self.errors.ConfigurationError:
267
+ pass
268
+ else:
269
+ env[var]=ret
270
+ break
271
+ find_bin(['uic-qt3','uic3'],'QT_UIC3')
272
+ find_bin(['uic-qt4','uic'],'QT_UIC')
273
+ if not env['QT_UIC']:
274
+ self.fatal('cannot find the uic compiler for qt4')
275
+ try:
276
+ uicver=self.cmd_and_log(env['QT_UIC']+" -version 2>&1").strip()
277
+ except self.errors.ConfigurationError:
278
+ self.fatal('this uic compiler is for qt3, add uic for qt4 to your path')
279
+ uicver=uicver.replace('Qt User Interface Compiler ','').replace('User Interface Compiler for Qt','')
280
+ self.msg('Checking for uic version','%s'%uicver)
281
+ if uicver.find(' 3.')!=-1:
282
+ self.fatal('this uic compiler is for qt3, add uic for qt4 to your path')
283
+ find_bin(['moc-qt4','moc'],'QT_MOC')
284
+ find_bin(['rcc'],'QT_RCC')
285
+ find_bin(['lrelease-qt4','lrelease'],'QT_LRELEASE')
286
+ find_bin(['lupdate-qt4','lupdate'],'QT_LUPDATE')
287
+ env['UIC3_ST']='%s -o %s'
288
+ env['UIC_ST']='%s -o %s'
289
+ env['MOC_ST']='-o'
290
+ env['ui_PATTERN']='ui_%s.h'
291
+ env['QT_LRELEASE_FLAGS']=['-silent']
292
+ env.MOCCPPPATH_ST='-I%s'
293
+ env.MOCDEFINES_ST='-D%s'
294
+ def find_qt4_libraries(self):
295
+ qtlibs=getattr(Options.options,'qtlibs','')
296
+ if not qtlibs:
297
+ try:
298
+ qtlibs=self.cmd_and_log([self.env.QMAKE,'-query','QT_INSTALL_LIBS']).strip()
299
+ except Errors.WafError:
300
+ qtdir=self.cmd_and_log([self.env.QMAKE,'-query','QT_INSTALL_PREFIX']).strip()+os.sep
301
+ qtlibs=os.path.join(qtdir,'lib')
302
+ self.msg('Found the Qt4 libraries in',qtlibs)
303
+ qtincludes=self.cmd_and_log([self.env.QMAKE,'-query','QT_INSTALL_HEADERS']).strip()
304
+ env=self.env
305
+ if not'PKG_CONFIG_PATH'in os.environ:
306
+ os.environ['PKG_CONFIG_PATH']='%s:%s/pkgconfig:/usr/lib/qt4/lib/pkgconfig:/opt/qt4/lib/pkgconfig:/usr/lib/qt4/lib:/opt/qt4/lib'%(qtlibs,qtlibs)
307
+ try:
308
+ self.check_cfg(atleast_pkgconfig_version='0.1')
309
+ except self.errors.ConfigurationError:
310
+ for i in self.qt4_vars:
311
+ uselib=i.upper()
312
+ if sys.platform=="darwin":
313
+ frameworkName=i+".framework"
314
+ qtDynamicLib=os.path.join(qtlibs,frameworkName,i)
315
+ if os.path.exists(qtDynamicLib):
316
+ env.append_unique('FRAMEWORK_'+uselib,i)
317
+ self.msg('Checking for %s'%i,qtDynamicLib,'GREEN')
318
+ else:
319
+ self.msg('Checking for %s'%i,False,'YELLOW')
320
+ env.append_unique('INCLUDES_'+uselib,os.path.join(qtlibs,frameworkName,'Headers'))
321
+ elif sys.platform!="win32":
322
+ qtDynamicLib=os.path.join(qtlibs,"lib"+i+".so")
323
+ qtStaticLib=os.path.join(qtlibs,"lib"+i+".a")
324
+ if os.path.exists(qtDynamicLib):
325
+ env.append_unique('LIB_'+uselib,i)
326
+ self.msg('Checking for %s'%i,qtDynamicLib,'GREEN')
327
+ elif os.path.exists(qtStaticLib):
328
+ env.append_unique('LIB_'+uselib,i)
329
+ self.msg('Checking for %s'%i,qtStaticLib,'GREEN')
330
+ else:
331
+ self.msg('Checking for %s'%i,False,'YELLOW')
332
+ env.append_unique('LIBPATH_'+uselib,qtlibs)
333
+ env.append_unique('INCLUDES_'+uselib,qtincludes)
334
+ env.append_unique('INCLUDES_'+uselib,os.path.join(qtincludes,i))
335
+ else:
336
+ for k in("lib%s.a","lib%s4.a","%s.lib","%s4.lib"):
337
+ lib=os.path.join(qtlibs,k%i)
338
+ if os.path.exists(lib):
339
+ env.append_unique('LIB_'+uselib,i+k[k.find("%s")+2:k.find('.')])
340
+ self.msg('Checking for %s'%i,lib,'GREEN')
341
+ break
342
+ else:
343
+ self.msg('Checking for %s'%i,False,'YELLOW')
344
+ env.append_unique('LIBPATH_'+uselib,qtlibs)
345
+ env.append_unique('INCLUDES_'+uselib,qtincludes)
346
+ env.append_unique('INCLUDES_'+uselib,os.path.join(qtincludes,i))
347
+ uselib=i.upper()+"_debug"
348
+ for k in("lib%sd.a","lib%sd4.a","%sd.lib","%sd4.lib"):
349
+ lib=os.path.join(qtlibs,k%i)
350
+ if os.path.exists(lib):
351
+ env.append_unique('LIB_'+uselib,i+k[k.find("%s")+2:k.find('.')])
352
+ self.msg('Checking for %s'%i,lib,'GREEN')
353
+ break
354
+ else:
355
+ self.msg('Checking for %s'%i,False,'YELLOW')
356
+ env.append_unique('LIBPATH_'+uselib,qtlibs)
357
+ env.append_unique('INCLUDES_'+uselib,qtincludes)
358
+ env.append_unique('INCLUDES_'+uselib,os.path.join(qtincludes,i))
359
+ else:
360
+ for i in self.qt4_vars_debug+self.qt4_vars:
361
+ self.check_cfg(package=i,args='--cflags --libs',mandatory=False)
362
+ def simplify_qt4_libs(self):
363
+ env=self.env
364
+ def process_lib(vars_,coreval):
365
+ for d in vars_:
366
+ var=d.upper()
367
+ if var=='QTCORE':
368
+ continue
369
+ value=env['LIBPATH_'+var]
370
+ if value:
371
+ core=env[coreval]
372
+ accu=[]
373
+ for lib in value:
374
+ if lib in core:
375
+ continue
376
+ accu.append(lib)
377
+ env['LIBPATH_'+var]=accu
378
+ process_lib(self.qt4_vars,'LIBPATH_QTCORE')
379
+ process_lib(self.qt4_vars_debug,'LIBPATH_QTCORE_DEBUG')
380
+ def add_qt4_rpath(self):
381
+ env=self.env
382
+ if Options.options.want_rpath:
383
+ def process_rpath(vars_,coreval):
384
+ for d in vars_:
385
+ var=d.upper()
386
+ value=env['LIBPATH_'+var]
387
+ if value:
388
+ core=env[coreval]
389
+ accu=[]
390
+ for lib in value:
391
+ if var!='QTCORE':
392
+ if lib in core:
393
+ continue
394
+ accu.append('-Wl,--rpath='+lib)
395
+ env['RPATH_'+var]=accu
396
+ process_rpath(self.qt4_vars,'LIBPATH_QTCORE')
397
+ process_rpath(self.qt4_vars_debug,'LIBPATH_QTCORE_DEBUG')
398
+ def set_qt4_libs_to_check(self):
399
+ if not hasattr(self,'qt4_vars'):
400
+ self.qt4_vars=QT4_LIBS
401
+ self.qt4_vars=Utils.to_list(self.qt4_vars)
402
+ if not hasattr(self,'qt4_vars_debug'):
403
+ self.qt4_vars_debug=[a+'_debug'for a in self.qt4_vars]
404
+ self.qt4_vars_debug=Utils.to_list(self.qt4_vars_debug)
405
+ def options(opt):
406
+ opt.add_option('--want-rpath',action='store_true',default=False,dest='want_rpath',help='enable the rpath for qt libraries')
407
+ opt.add_option('--header-ext',type='string',default='',help='header extension for moc files',dest='qt_header_ext')
408
+ for i in'qtdir qtbin qtlibs'.split():
409
+ opt.add_option('--'+i,type='string',default='',dest=i)
410
+ if sys.platform=="darwin":
411
+ opt.add_option('--no-qt4-framework',action="store_false",help='do not use the framework version of Qt4 in OS X',dest='use_qt4_osxframework',default=True)
412
+ opt.add_option('--translate',action="store_true",help="collect translation strings",dest="trans_qt4",default=False)
413
+
414
+ extension(*EXT_RCC)(create_rcc_task)
415
+ extension(*EXT_UI)(create_uic_task)
416
+ extension('.ts')(add_lang)
417
+ feature('qt4')(apply_qt4)
418
+ after_method('apply_link')(apply_qt4)
419
+ extension(*EXT_QT4)(cxx_hook)
420
+ conf(find_qt4_binaries)
421
+ conf(find_qt4_libraries)
422
+ conf(simplify_qt4_libs)
423
+ conf(add_qt4_rpath)
424
+ conf(set_qt4_libs_to_check)