qrscanner 0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (480) hide show
  1. data/CHANGELOG +2 -0
  2. data/Manifest +478 -0
  3. data/README +41 -0
  4. data/Rakefile +9 -0
  5. data/bin/qrscanner +9 -0
  6. data/ext/qrscanner/extconf.rb +70 -0
  7. data/ext/qrscanner/qrscanner.c +32 -0
  8. data/ext/qrscanner/zxing/README +43 -0
  9. data/ext/qrscanner/zxing/SConscript +55 -0
  10. data/ext/qrscanner/zxing/SConstruct +7 -0
  11. data/ext/qrscanner/zxing/astyle-options +12 -0
  12. data/ext/qrscanner/zxing/blackboxtest.sh +45 -0
  13. data/ext/qrscanner/zxing/core/src/zxing/BarcodeFormat.cpp +38 -0
  14. data/ext/qrscanner/zxing/core/src/zxing/BarcodeFormat.h +42 -0
  15. data/ext/qrscanner/zxing/core/src/zxing/Binarizer.cpp +36 -0
  16. data/ext/qrscanner/zxing/core/src/zxing/Binarizer.h +46 -0
  17. data/ext/qrscanner/zxing/core/src/zxing/BinaryBitmap.cpp +67 -0
  18. data/ext/qrscanner/zxing/core/src/zxing/BinaryBitmap.h +57 -0
  19. data/ext/qrscanner/zxing/core/src/zxing/DecodeHints.cpp +111 -0
  20. data/ext/qrscanner/zxing/core/src/zxing/DecodeHints.h +69 -0
  21. data/ext/qrscanner/zxing/core/src/zxing/Exception.cpp +25 -0
  22. data/ext/qrscanner/zxing/core/src/zxing/Exception.h +39 -0
  23. data/ext/qrscanner/zxing/core/src/zxing/LuminanceSource.cpp +47 -0
  24. data/ext/qrscanner/zxing/core/src/zxing/LuminanceSource.h +49 -0
  25. data/ext/qrscanner/zxing/core/src/zxing/MultiFormatReader.cpp +102 -0
  26. data/ext/qrscanner/zxing/core/src/zxing/MultiFormatReader.h +49 -0
  27. data/ext/qrscanner/zxing/core/src/zxing/Reader.cpp +31 -0
  28. data/ext/qrscanner/zxing/core/src/zxing/Reader.h +40 -0
  29. data/ext/qrscanner/zxing/core/src/zxing/ReaderException.cpp +32 -0
  30. data/ext/qrscanner/zxing/core/src/zxing/ReaderException.h +34 -0
  31. data/ext/qrscanner/zxing/core/src/zxing/Result.cpp +59 -0
  32. data/ext/qrscanner/zxing/core/src/zxing/Result.h +53 -0
  33. data/ext/qrscanner/zxing/core/src/zxing/ResultPoint.cpp +27 -0
  34. data/ext/qrscanner/zxing/core/src/zxing/ResultPoint.h +39 -0
  35. data/ext/qrscanner/zxing/core/src/zxing/ResultPointCallback.cpp +26 -0
  36. data/ext/qrscanner/zxing/core/src/zxing/ResultPointCallback.h +39 -0
  37. data/ext/qrscanner/zxing/core/src/zxing/common/Array.cpp +22 -0
  38. data/ext/qrscanner/zxing/core/src/zxing/common/Array.h +207 -0
  39. data/ext/qrscanner/zxing/core/src/zxing/common/BitArray.cpp +129 -0
  40. data/ext/qrscanner/zxing/core/src/zxing/common/BitArray.h +55 -0
  41. data/ext/qrscanner/zxing/core/src/zxing/common/BitMatrix.cpp +178 -0
  42. data/ext/qrscanner/zxing/core/src/zxing/common/BitMatrix.h +65 -0
  43. data/ext/qrscanner/zxing/core/src/zxing/common/BitSource.cpp +75 -0
  44. data/ext/qrscanner/zxing/core/src/zxing/common/BitSource.h +67 -0
  45. data/ext/qrscanner/zxing/core/src/zxing/common/Counted.cpp +32 -0
  46. data/ext/qrscanner/zxing/core/src/zxing/common/Counted.h +205 -0
  47. data/ext/qrscanner/zxing/core/src/zxing/common/DecoderResult.cpp +37 -0
  48. data/ext/qrscanner/zxing/core/src/zxing/common/DecoderResult.h +43 -0
  49. data/ext/qrscanner/zxing/core/src/zxing/common/DetectorResult.cpp +41 -0
  50. data/ext/qrscanner/zxing/core/src/zxing/common/DetectorResult.h +46 -0
  51. data/ext/qrscanner/zxing/core/src/zxing/common/EdgeDetector.cpp +191 -0
  52. data/ext/qrscanner/zxing/core/src/zxing/common/EdgeDetector.h +38 -0
  53. data/ext/qrscanner/zxing/core/src/zxing/common/GlobalHistogramBinarizer.cpp +209 -0
  54. data/ext/qrscanner/zxing/core/src/zxing/common/GlobalHistogramBinarizer.h +47 -0
  55. data/ext/qrscanner/zxing/core/src/zxing/common/GreyscaleLuminanceSource.cpp +70 -0
  56. data/ext/qrscanner/zxing/core/src/zxing/common/GreyscaleLuminanceSource.h +62 -0
  57. data/ext/qrscanner/zxing/core/src/zxing/common/GreyscaleRotatedLuminanceSource.cpp +65 -0
  58. data/ext/qrscanner/zxing/core/src/zxing/common/GreyscaleRotatedLuminanceSource.h +60 -0
  59. data/ext/qrscanner/zxing/core/src/zxing/common/GridSampler.cpp +101 -0
  60. data/ext/qrscanner/zxing/core/src/zxing/common/GridSampler.h +43 -0
  61. data/ext/qrscanner/zxing/core/src/zxing/common/HybridBinarizer.cpp +168 -0
  62. data/ext/qrscanner/zxing/core/src/zxing/common/HybridBinarizer.h +55 -0
  63. data/ext/qrscanner/zxing/core/src/zxing/common/IllegalArgumentException.cpp +31 -0
  64. data/ext/qrscanner/zxing/core/src/zxing/common/IllegalArgumentException.h +33 -0
  65. data/ext/qrscanner/zxing/core/src/zxing/common/PerspectiveTransform.cpp +107 -0
  66. data/ext/qrscanner/zxing/core/src/zxing/common/PerspectiveTransform.h +49 -0
  67. data/ext/qrscanner/zxing/core/src/zxing/common/Point.h +47 -0
  68. data/ext/qrscanner/zxing/core/src/zxing/common/Str.cpp +38 -0
  69. data/ext/qrscanner/zxing/core/src/zxing/common/Str.h +40 -0
  70. data/ext/qrscanner/zxing/core/src/zxing/common/reedsolomon/GF256.cpp +136 -0
  71. data/ext/qrscanner/zxing/core/src/zxing/common/reedsolomon/GF256.h +68 -0
  72. data/ext/qrscanner/zxing/core/src/zxing/common/reedsolomon/GF256Poly.cpp +198 -0
  73. data/ext/qrscanner/zxing/core/src/zxing/common/reedsolomon/GF256Poly.h +53 -0
  74. data/ext/qrscanner/zxing/core/src/zxing/common/reedsolomon/ReedSolomonDecoder.cpp +193 -0
  75. data/ext/qrscanner/zxing/core/src/zxing/common/reedsolomon/ReedSolomonDecoder.h +46 -0
  76. data/ext/qrscanner/zxing/core/src/zxing/common/reedsolomon/ReedSolomonException.cpp +30 -0
  77. data/ext/qrscanner/zxing/core/src/zxing/common/reedsolomon/ReedSolomonException.h +33 -0
  78. data/ext/qrscanner/zxing/core/src/zxing/datamatrix/DataMatrixReader.cpp +82 -0
  79. data/ext/qrscanner/zxing/core/src/zxing/datamatrix/DataMatrixReader.h +45 -0
  80. data/ext/qrscanner/zxing/core/src/zxing/datamatrix/Version.cpp +199 -0
  81. data/ext/qrscanner/zxing/core/src/zxing/datamatrix/Version.h +87 -0
  82. data/ext/qrscanner/zxing/core/src/zxing/datamatrix/decoder/BitMatrixParser.cpp +364 -0
  83. data/ext/qrscanner/zxing/core/src/zxing/datamatrix/decoder/BitMatrixParser.h +59 -0
  84. data/ext/qrscanner/zxing/core/src/zxing/datamatrix/decoder/DataBlock.cpp +113 -0
  85. data/ext/qrscanner/zxing/core/src/zxing/datamatrix/decoder/DataBlock.h +49 -0
  86. data/ext/qrscanner/zxing/core/src/zxing/datamatrix/decoder/DecodedBitStreamParser.cpp +404 -0
  87. data/ext/qrscanner/zxing/core/src/zxing/datamatrix/decoder/DecodedBitStreamParser.h +103 -0
  88. data/ext/qrscanner/zxing/core/src/zxing/datamatrix/decoder/Decoder.cpp +96 -0
  89. data/ext/qrscanner/zxing/core/src/zxing/datamatrix/decoder/Decoder.h +50 -0
  90. data/ext/qrscanner/zxing/core/src/zxing/datamatrix/detector/CornerPoint.cpp +54 -0
  91. data/ext/qrscanner/zxing/core/src/zxing/datamatrix/detector/CornerPoint.h +47 -0
  92. data/ext/qrscanner/zxing/core/src/zxing/datamatrix/detector/Detector.cpp +315 -0
  93. data/ext/qrscanner/zxing/core/src/zxing/datamatrix/detector/Detector.h +79 -0
  94. data/ext/qrscanner/zxing/core/src/zxing/datamatrix/detector/MonochromeRectangleDetector.cpp +172 -0
  95. data/ext/qrscanner/zxing/core/src/zxing/datamatrix/detector/MonochromeRectangleDetector.h +61 -0
  96. data/ext/qrscanner/zxing/core/src/zxing/oned/Code128Reader.cpp +490 -0
  97. data/ext/qrscanner/zxing/core/src/zxing/oned/Code128Reader.h +63 -0
  98. data/ext/qrscanner/zxing/core/src/zxing/oned/Code39Reader.cpp +352 -0
  99. data/ext/qrscanner/zxing/core/src/zxing/oned/Code39Reader.h +58 -0
  100. data/ext/qrscanner/zxing/core/src/zxing/oned/EAN13Reader.cpp +95 -0
  101. data/ext/qrscanner/zxing/core/src/zxing/oned/EAN13Reader.h +44 -0
  102. data/ext/qrscanner/zxing/core/src/zxing/oned/EAN8Reader.cpp +73 -0
  103. data/ext/qrscanner/zxing/core/src/zxing/oned/EAN8Reader.h +41 -0
  104. data/ext/qrscanner/zxing/core/src/zxing/oned/ITFReader.cpp +363 -0
  105. data/ext/qrscanner/zxing/core/src/zxing/oned/ITFReader.h +56 -0
  106. data/ext/qrscanner/zxing/core/src/zxing/oned/MultiFormatOneDReader.cpp +66 -0
  107. data/ext/qrscanner/zxing/core/src/zxing/oned/MultiFormatOneDReader.h +38 -0
  108. data/ext/qrscanner/zxing/core/src/zxing/oned/MultiFormatUPCEANReader.cpp +87 -0
  109. data/ext/qrscanner/zxing/core/src/zxing/oned/MultiFormatUPCEANReader.h +38 -0
  110. data/ext/qrscanner/zxing/core/src/zxing/oned/OneDReader.cpp +206 -0
  111. data/ext/qrscanner/zxing/core/src/zxing/oned/OneDReader.h +50 -0
  112. data/ext/qrscanner/zxing/core/src/zxing/oned/OneDResultPoint.cpp +36 -0
  113. data/ext/qrscanner/zxing/core/src/zxing/oned/OneDResultPoint.h +40 -0
  114. data/ext/qrscanner/zxing/core/src/zxing/oned/UPCAReader.cpp +65 -0
  115. data/ext/qrscanner/zxing/core/src/zxing/oned/UPCAReader.h +49 -0
  116. data/ext/qrscanner/zxing/core/src/zxing/oned/UPCEANReader.cpp +311 -0
  117. data/ext/qrscanner/zxing/core/src/zxing/oned/UPCEANReader.h +77 -0
  118. data/ext/qrscanner/zxing/core/src/zxing/oned/UPCEReader.cpp +143 -0
  119. data/ext/qrscanner/zxing/core/src/zxing/oned/UPCEReader.h +47 -0
  120. data/ext/qrscanner/zxing/core/src/zxing/qrcode/ErrorCorrectionLevel.cpp +49 -0
  121. data/ext/qrscanner/zxing/core/src/zxing/qrcode/ErrorCorrectionLevel.h +46 -0
  122. data/ext/qrscanner/zxing/core/src/zxing/qrcode/FormatInformation.cpp +108 -0
  123. data/ext/qrscanner/zxing/core/src/zxing/qrcode/FormatInformation.h +54 -0
  124. data/ext/qrscanner/zxing/core/src/zxing/qrcode/QRCodeReader.cpp +82 -0
  125. data/ext/qrscanner/zxing/core/src/zxing/qrcode/QRCodeReader.h +43 -0
  126. data/ext/qrscanner/zxing/core/src/zxing/qrcode/Version.cpp +557 -0
  127. data/ext/qrscanner/zxing/core/src/zxing/qrcode/Version.h +85 -0
  128. data/ext/qrscanner/zxing/core/src/zxing/qrcode/decoder/BitMatrixParser.cpp +191 -0
  129. data/ext/qrscanner/zxing/core/src/zxing/qrcode/decoder/BitMatrixParser.h +56 -0
  130. data/ext/qrscanner/zxing/core/src/zxing/qrcode/decoder/DataBlock.cpp +118 -0
  131. data/ext/qrscanner/zxing/core/src/zxing/qrcode/decoder/DataBlock.h +50 -0
  132. data/ext/qrscanner/zxing/core/src/zxing/qrcode/decoder/DataMask.cpp +159 -0
  133. data/ext/qrscanner/zxing/core/src/zxing/qrcode/decoder/DataMask.h +50 -0
  134. data/ext/qrscanner/zxing/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.cpp +353 -0
  135. data/ext/qrscanner/zxing/core/src/zxing/qrcode/decoder/DecodedBitStreamParser.h +59 -0
  136. data/ext/qrscanner/zxing/core/src/zxing/qrcode/decoder/Decoder.cpp +103 -0
  137. data/ext/qrscanner/zxing/core/src/zxing/qrcode/decoder/Decoder.h +47 -0
  138. data/ext/qrscanner/zxing/core/src/zxing/qrcode/decoder/Mode.cpp +73 -0
  139. data/ext/qrscanner/zxing/core/src/zxing/qrcode/decoder/Mode.h +50 -0
  140. data/ext/qrscanner/zxing/core/src/zxing/qrcode/detector/AlignmentPattern.cpp +46 -0
  141. data/ext/qrscanner/zxing/core/src/zxing/qrcode/detector/AlignmentPattern.h +45 -0
  142. data/ext/qrscanner/zxing/core/src/zxing/qrcode/detector/AlignmentPatternFinder.cpp +209 -0
  143. data/ext/qrscanner/zxing/core/src/zxing/qrcode/detector/AlignmentPatternFinder.h +68 -0
  144. data/ext/qrscanner/zxing/core/src/zxing/qrcode/detector/Detector.cpp +286 -0
  145. data/ext/qrscanner/zxing/core/src/zxing/qrcode/detector/Detector.h +64 -0
  146. data/ext/qrscanner/zxing/core/src/zxing/qrcode/detector/FinderPattern.cpp +58 -0
  147. data/ext/qrscanner/zxing/core/src/zxing/qrcode/detector/FinderPattern.h +48 -0
  148. data/ext/qrscanner/zxing/core/src/zxing/qrcode/detector/FinderPatternFinder.cpp +540 -0
  149. data/ext/qrscanner/zxing/core/src/zxing/qrcode/detector/FinderPatternFinder.h +69 -0
  150. data/ext/qrscanner/zxing/core/src/zxing/qrcode/detector/FinderPatternInfo.cpp +41 -0
  151. data/ext/qrscanner/zxing/core/src/zxing/qrcode/detector/FinderPatternInfo.h +47 -0
  152. data/ext/qrscanner/zxing/core/src/zxing/qrcode/detector/QREdgeDetector.cpp +169 -0
  153. data/ext/qrscanner/zxing/core/src/zxing/qrcode/detector/QREdgeDetector.h +48 -0
  154. data/ext/qrscanner/zxing/core/tests/src/TestRunner.cpp +30 -0
  155. data/ext/qrscanner/zxing/core/tests/src/common/BitArrayTest.cpp +96 -0
  156. data/ext/qrscanner/zxing/core/tests/src/common/BitArrayTest.h +50 -0
  157. data/ext/qrscanner/zxing/core/tests/src/common/BitMatrixTest.cpp +107 -0
  158. data/ext/qrscanner/zxing/core/tests/src/common/BitMatrixTest.h +55 -0
  159. data/ext/qrscanner/zxing/core/tests/src/common/BitSourceTest.cpp +49 -0
  160. data/ext/qrscanner/zxing/core/tests/src/common/BitSourceTest.h +42 -0
  161. data/ext/qrscanner/zxing/core/tests/src/common/BlackPointEstimatorTest.cpp +47 -0
  162. data/ext/qrscanner/zxing/core/tests/src/common/BlackPointEstimatorTest.h +45 -0
  163. data/ext/qrscanner/zxing/core/tests/src/common/CountedTest.cpp +54 -0
  164. data/ext/qrscanner/zxing/core/tests/src/common/CountedTest.h +46 -0
  165. data/ext/qrscanner/zxing/core/tests/src/common/PerspectiveTransformTest.cpp +69 -0
  166. data/ext/qrscanner/zxing/core/tests/src/common/PerspectiveTransformTest.h +47 -0
  167. data/ext/qrscanner/zxing/core/tests/src/common/reedsolomon/ReedSolomonTest.cpp +130 -0
  168. data/ext/qrscanner/zxing/core/tests/src/common/reedsolomon/ReedSolomonTest.h +62 -0
  169. data/ext/qrscanner/zxing/core/tests/src/qrcode/ErrorCorrectionLevelTest.cpp +47 -0
  170. data/ext/qrscanner/zxing/core/tests/src/qrcode/ErrorCorrectionLevelTest.h +45 -0
  171. data/ext/qrscanner/zxing/core/tests/src/qrcode/FormatInformationTest.cpp +70 -0
  172. data/ext/qrscanner/zxing/core/tests/src/qrcode/FormatInformationTest.h +47 -0
  173. data/ext/qrscanner/zxing/core/tests/src/qrcode/VersionTest.cpp +88 -0
  174. data/ext/qrscanner/zxing/core/tests/src/qrcode/VersionTest.h +49 -0
  175. data/ext/qrscanner/zxing/core/tests/src/qrcode/decoder/DataMaskTest.cpp +134 -0
  176. data/ext/qrscanner/zxing/core/tests/src/qrcode/decoder/DataMaskTest.h +91 -0
  177. data/ext/qrscanner/zxing/core/tests/src/qrcode/decoder/ModeTest.cpp +52 -0
  178. data/ext/qrscanner/zxing/core/tests/src/qrcode/decoder/ModeTest.h +47 -0
  179. data/ext/qrscanner/zxing/format +2 -0
  180. data/ext/qrscanner/zxing/magick/src/MagickBitmapSource.cpp +99 -0
  181. data/ext/qrscanner/zxing/magick/src/MagickBitmapSource.h +49 -0
  182. data/ext/qrscanner/zxing/magick/src/example.cpp +83 -0
  183. data/ext/qrscanner/zxing/magick/src/main.cpp +241 -0
  184. data/ext/qrscanner/zxing/magick/src/qrscanner.cpp +188 -0
  185. data/ext/qrscanner/zxing/osx.xcodeproj/project.pbxproj +1045 -0
  186. data/ext/qrscanner/zxing/scons/scons-LICENSE +25 -0
  187. data/ext/qrscanner/zxing/scons/scons-README +204 -0
  188. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Action.py +1241 -0
  189. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Action.pyc +0 -0
  190. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Builder.py +877 -0
  191. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Builder.pyc +0 -0
  192. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/CacheDir.py +216 -0
  193. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/CacheDir.pyc +0 -0
  194. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Conftest.py +793 -0
  195. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Conftest.pyc +0 -0
  196. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Debug.py +220 -0
  197. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Debug.pyc +0 -0
  198. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Defaults.py +480 -0
  199. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Defaults.pyc +0 -0
  200. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Environment.py +2318 -0
  201. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Environment.pyc +0 -0
  202. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Errors.py +205 -0
  203. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Errors.pyc +0 -0
  204. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Executor.py +633 -0
  205. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Executor.pyc +0 -0
  206. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Job.py +435 -0
  207. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Job.pyc +0 -0
  208. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Memoize.py +244 -0
  209. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Memoize.pyc +0 -0
  210. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Node/Alias.py +152 -0
  211. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Node/Alias.pyc +0 -0
  212. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Node/FS.py +3142 -0
  213. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Node/FS.pyc +0 -0
  214. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Node/Python.py +128 -0
  215. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Node/Python.pyc +0 -0
  216. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Node/__init__.py +1328 -0
  217. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Node/__init__.pyc +0 -0
  218. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Options/BoolOption.py +50 -0
  219. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Options/BoolOption.pyc +0 -0
  220. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Options/EnumOption.py +50 -0
  221. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Options/EnumOption.pyc +0 -0
  222. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Options/ListOption.py +50 -0
  223. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Options/ListOption.pyc +0 -0
  224. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Options/PackageOption.py +50 -0
  225. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Options/PackageOption.pyc +0 -0
  226. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Options/PathOption.py +76 -0
  227. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Options/PathOption.pyc +0 -0
  228. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Options/__init__.py +67 -0
  229. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Options/__init__.pyc +0 -0
  230. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/PathList.py +231 -0
  231. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/PathList.pyc +0 -0
  232. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Platform/__init__.py +241 -0
  233. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Platform/__init__.pyc +0 -0
  234. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Platform/aix.py +69 -0
  235. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Platform/cygwin.py +55 -0
  236. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Platform/darwin.py +46 -0
  237. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Platform/hpux.py +46 -0
  238. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Platform/irix.py +44 -0
  239. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Platform/os2.py +58 -0
  240. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Platform/posix.py +263 -0
  241. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Platform/posix.pyc +0 -0
  242. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Platform/sunos.py +50 -0
  243. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Platform/win32.py +385 -0
  244. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/SConf.py +1030 -0
  245. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/SConf.pyc +0 -0
  246. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/SConsign.py +383 -0
  247. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/SConsign.pyc +0 -0
  248. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Scanner/C.py +132 -0
  249. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Scanner/C.pyc +0 -0
  250. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Scanner/D.py +73 -0
  251. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Scanner/D.pyc +0 -0
  252. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Scanner/Dir.py +109 -0
  253. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Scanner/Dir.pyc +0 -0
  254. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Scanner/Fortran.py +316 -0
  255. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Scanner/Fortran.pyc +0 -0
  256. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Scanner/IDL.py +48 -0
  257. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Scanner/LaTeX.py +362 -0
  258. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Scanner/LaTeX.pyc +0 -0
  259. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Scanner/Prog.py +101 -0
  260. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Scanner/Prog.pyc +0 -0
  261. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Scanner/RC.py +55 -0
  262. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Scanner/__init__.py +413 -0
  263. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Scanner/__init__.pyc +0 -0
  264. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Script/Interactive.py +384 -0
  265. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Script/Interactive.pyc +0 -0
  266. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Script/Main.py +1334 -0
  267. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Script/Main.pyc +0 -0
  268. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Script/SConsOptions.py +939 -0
  269. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Script/SConsOptions.pyc +0 -0
  270. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Script/SConscript.py +640 -0
  271. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Script/SConscript.pyc +0 -0
  272. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Script/__init__.py +412 -0
  273. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Script/__init__.pyc +0 -0
  274. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Sig.py +63 -0
  275. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Subst.py +904 -0
  276. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Subst.pyc +0 -0
  277. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Taskmaster.py +1017 -0
  278. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Taskmaster.pyc +0 -0
  279. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/386asm.py +61 -0
  280. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/BitKeeper.py +67 -0
  281. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/BitKeeper.pyc +0 -0
  282. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/CVS.py +73 -0
  283. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/CVS.pyc +0 -0
  284. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/FortranCommon.py +246 -0
  285. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/FortranCommon.pyc +0 -0
  286. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/JavaCommon.py +323 -0
  287. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/JavaCommon.pyc +0 -0
  288. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/__init__.py +56 -0
  289. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/arch.py +61 -0
  290. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/common.py +240 -0
  291. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/netframework.py +82 -0
  292. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/sdk.py +391 -0
  293. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/vc.py +456 -0
  294. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/MSCommon/vs.py +499 -0
  295. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/Perforce.py +103 -0
  296. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/Perforce.pyc +0 -0
  297. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/PharLapCommon.py +137 -0
  298. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/PharLapCommon.pyc +0 -0
  299. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/RCS.py +64 -0
  300. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/RCS.pyc +0 -0
  301. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/SCCS.py +64 -0
  302. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/SCCS.pyc +0 -0
  303. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/Subversion.py +71 -0
  304. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/__init__.py +681 -0
  305. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/__init__.pyc +0 -0
  306. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/aixc++.py +82 -0
  307. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/aixcc.py +74 -0
  308. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/aixf77.py +80 -0
  309. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/aixlink.py +76 -0
  310. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/applelink.py +71 -0
  311. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/ar.py +63 -0
  312. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/ar.pyc +0 -0
  313. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/as.py +78 -0
  314. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/as.pyc +0 -0
  315. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/bcc32.py +81 -0
  316. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/c++.py +99 -0
  317. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/c++.pyc +0 -0
  318. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/cc.py +102 -0
  319. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/cc.pyc +0 -0
  320. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/cvf.py +58 -0
  321. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/default.py +50 -0
  322. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/default.pyc +0 -0
  323. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/dmd.py +223 -0
  324. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/dmd.pyc +0 -0
  325. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/dvi.py +64 -0
  326. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/dvipdf.py +124 -0
  327. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/dvipdf.pyc +0 -0
  328. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/dvips.py +94 -0
  329. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/dvips.pyc +0 -0
  330. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/f77.py +62 -0
  331. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/f77.pyc +0 -0
  332. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/f90.py +62 -0
  333. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/f90.pyc +0 -0
  334. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/f95.py +63 -0
  335. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/f95.pyc +0 -0
  336. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/filesystem.py +98 -0
  337. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/filesystem.pyc +0 -0
  338. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/fortran.py +62 -0
  339. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/fortran.pyc +0 -0
  340. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/g++.py +90 -0
  341. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/g++.pyc +0 -0
  342. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/g77.py +73 -0
  343. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/g77.pyc +0 -0
  344. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/gas.py +53 -0
  345. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/gas.pyc +0 -0
  346. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/gcc.py +80 -0
  347. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/gcc.pyc +0 -0
  348. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/gfortran.py +64 -0
  349. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/gfortran.pyc +0 -0
  350. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/gnulink.py +63 -0
  351. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/gnulink.pyc +0 -0
  352. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/gs.py +81 -0
  353. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/gs.pyc +0 -0
  354. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/hpc++.py +84 -0
  355. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/hpcc.py +53 -0
  356. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/hplink.py +77 -0
  357. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/icc.py +59 -0
  358. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/icl.py +52 -0
  359. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/ifl.py +72 -0
  360. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/ifl.pyc +0 -0
  361. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/ifort.py +88 -0
  362. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/ifort.pyc +0 -0
  363. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/ilink.py +59 -0
  364. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/ilink32.py +60 -0
  365. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/install.py +229 -0
  366. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/install.pyc +0 -0
  367. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/intelc.py +482 -0
  368. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/ipkg.py +67 -0
  369. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/jar.py +110 -0
  370. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/jar.pyc +0 -0
  371. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/javac.py +230 -0
  372. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/javac.pyc +0 -0
  373. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/javah.py +137 -0
  374. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/javah.pyc +0 -0
  375. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/latex.py +79 -0
  376. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/latex.pyc +0 -0
  377. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/lex.py +97 -0
  378. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/lex.pyc +0 -0
  379. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/link.py +121 -0
  380. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/link.pyc +0 -0
  381. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/linkloc.py +112 -0
  382. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/m4.py +63 -0
  383. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/m4.pyc +0 -0
  384. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/masm.py +77 -0
  385. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/midl.py +88 -0
  386. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/mingw.py +158 -0
  387. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/mslib.py +64 -0
  388. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/mslink.py +266 -0
  389. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/mssdk.py +50 -0
  390. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/msvc.py +268 -0
  391. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/msvs.py +1388 -0
  392. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/mwcc.py +207 -0
  393. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/mwld.py +107 -0
  394. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/nasm.py +72 -0
  395. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/packaging/__init__.py +312 -0
  396. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/packaging/ipk.py +185 -0
  397. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/packaging/msi.py +527 -0
  398. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/packaging/rpm.py +365 -0
  399. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/packaging/src_tarbz2.py +43 -0
  400. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/packaging/src_targz.py +43 -0
  401. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/packaging/src_zip.py +43 -0
  402. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/packaging/tarbz2.py +44 -0
  403. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/packaging/targz.py +44 -0
  404. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/packaging/zip.py +44 -0
  405. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/pdf.py +78 -0
  406. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/pdf.pyc +0 -0
  407. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/pdflatex.py +83 -0
  408. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/pdflatex.pyc +0 -0
  409. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/pdftex.py +108 -0
  410. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/pdftex.pyc +0 -0
  411. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/qt.py +336 -0
  412. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/rmic.py +120 -0
  413. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/rmic.pyc +0 -0
  414. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/rpcgen.py +70 -0
  415. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/rpcgen.pyc +0 -0
  416. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/rpm.py +132 -0
  417. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/rpm.pyc +0 -0
  418. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/sgiar.py +68 -0
  419. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/sgic++.py +58 -0
  420. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/sgicc.py +53 -0
  421. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/sgilink.py +63 -0
  422. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/sunar.py +67 -0
  423. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/sunc++.py +142 -0
  424. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/suncc.py +58 -0
  425. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/sunf77.py +63 -0
  426. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/sunf90.py +64 -0
  427. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/sunf95.py +64 -0
  428. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/sunlink.py +77 -0
  429. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/swig.py +182 -0
  430. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/swig.pyc +0 -0
  431. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/tar.py +73 -0
  432. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/tar.pyc +0 -0
  433. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/tex.py +807 -0
  434. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/tex.pyc +0 -0
  435. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/textfile.py +175 -0
  436. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/tlib.py +53 -0
  437. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/wix.py +99 -0
  438. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/wix.pyc +0 -0
  439. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/yacc.py +130 -0
  440. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/yacc.pyc +0 -0
  441. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/zip.py +99 -0
  442. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Tool/zip.pyc +0 -0
  443. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Util.py +1496 -0
  444. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Util.pyc +0 -0
  445. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Variables/BoolVariable.py +89 -0
  446. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Variables/BoolVariable.pyc +0 -0
  447. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Variables/EnumVariable.py +103 -0
  448. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Variables/EnumVariable.pyc +0 -0
  449. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Variables/ListVariable.py +135 -0
  450. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Variables/ListVariable.pyc +0 -0
  451. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Variables/PackageVariable.py +106 -0
  452. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Variables/PackageVariable.pyc +0 -0
  453. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Variables/PathVariable.py +147 -0
  454. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Variables/PathVariable.pyc +0 -0
  455. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Variables/__init__.py +312 -0
  456. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Variables/__init__.pyc +0 -0
  457. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Warnings.py +246 -0
  458. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/Warnings.pyc +0 -0
  459. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/__init__.py +49 -0
  460. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/__init__.pyc +0 -0
  461. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/compat/__init__.py +237 -0
  462. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/compat/__init__.pyc +0 -0
  463. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/compat/_scons_builtins.py +150 -0
  464. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/compat/_scons_builtins.pyc +0 -0
  465. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/compat/_scons_collections.py +45 -0
  466. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/compat/_scons_dbm.py +45 -0
  467. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/compat/_scons_hashlib.py +76 -0
  468. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/compat/_scons_io.py +45 -0
  469. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/compat/_scons_sets.py +563 -0
  470. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/compat/_scons_subprocess.py +1281 -0
  471. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/cpp.py +589 -0
  472. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/cpp.pyc +0 -0
  473. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/dblite.py +251 -0
  474. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/dblite.pyc +0 -0
  475. data/ext/qrscanner/zxing/scons/scons-local-2.0.0.final.0/SCons/exitfuncs.py +77 -0
  476. data/ext/qrscanner/zxing/scons/scons-time.py +1544 -0
  477. data/ext/qrscanner/zxing/scons/scons.py +196 -0
  478. data/ext/qrscanner/zxing/scons/sconsign.py +513 -0
  479. data/qrscanner.gemspec +33 -0
  480. metadata +1023 -0
@@ -0,0 +1,128 @@
1
+ """scons.Node.Python
2
+
3
+ Python nodes.
4
+
5
+ """
6
+
7
+ #
8
+ # Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
9
+ #
10
+ # Permission is hereby granted, free of charge, to any person obtaining
11
+ # a copy of this software and associated documentation files (the
12
+ # "Software"), to deal in the Software without restriction, including
13
+ # without limitation the rights to use, copy, modify, merge, publish,
14
+ # distribute, sublicense, and/or sell copies of the Software, and to
15
+ # permit persons to whom the Software is furnished to do so, subject to
16
+ # the following conditions:
17
+ #
18
+ # The above copyright notice and this permission notice shall be included
19
+ # in all copies or substantial portions of the Software.
20
+ #
21
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
22
+ # KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
23
+ # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28
+ #
29
+
30
+ __revision__ = "src/engine/SCons/Node/Python.py 5023 2010/06/14 22:05:46 scons"
31
+
32
+ import SCons.Node
33
+
34
+ class ValueNodeInfo(SCons.Node.NodeInfoBase):
35
+ current_version_id = 1
36
+
37
+ field_list = ['csig']
38
+
39
+ def str_to_node(self, s):
40
+ return Value(s)
41
+
42
+ class ValueBuildInfo(SCons.Node.BuildInfoBase):
43
+ current_version_id = 1
44
+
45
+ class Value(SCons.Node.Node):
46
+ """A class for Python variables, typically passed on the command line
47
+ or generated by a script, but not from a file or some other source.
48
+ """
49
+
50
+ NodeInfo = ValueNodeInfo
51
+ BuildInfo = ValueBuildInfo
52
+
53
+ def __init__(self, value, built_value=None):
54
+ SCons.Node.Node.__init__(self)
55
+ self.value = value
56
+ if built_value is not None:
57
+ self.built_value = built_value
58
+
59
+ def str_for_display(self):
60
+ return repr(self.value)
61
+
62
+ def __str__(self):
63
+ return str(self.value)
64
+
65
+ def make_ready(self):
66
+ self.get_csig()
67
+
68
+ def build(self, **kw):
69
+ if not hasattr(self, 'built_value'):
70
+ SCons.Node.Node.build(self, **kw)
71
+
72
+ is_up_to_date = SCons.Node.Node.children_are_up_to_date
73
+
74
+ def is_under(self, dir):
75
+ # Make Value nodes get built regardless of
76
+ # what directory scons was run from. Value nodes
77
+ # are outside the filesystem:
78
+ return 1
79
+
80
+ def write(self, built_value):
81
+ """Set the value of the node."""
82
+ self.built_value = built_value
83
+
84
+ def read(self):
85
+ """Return the value. If necessary, the value is built."""
86
+ self.build()
87
+ if not hasattr(self, 'built_value'):
88
+ self.built_value = self.value
89
+ return self.built_value
90
+
91
+ def get_text_contents(self):
92
+ """By the assumption that the node.built_value is a
93
+ deterministic product of the sources, the contents of a Value
94
+ are the concatenation of all the contents of its sources. As
95
+ the value need not be built when get_contents() is called, we
96
+ cannot use the actual node.built_value."""
97
+ ###TODO: something reasonable about universal newlines
98
+ contents = str(self.value)
99
+ for kid in self.children(None):
100
+ contents = contents + kid.get_contents()
101
+ return contents
102
+
103
+ get_contents = get_text_contents ###TODO should return 'bytes' value
104
+
105
+ def changed_since_last_build(self, target, prev_ni):
106
+ cur_csig = self.get_csig()
107
+ try:
108
+ return cur_csig != prev_ni.csig
109
+ except AttributeError:
110
+ return 1
111
+
112
+ def get_csig(self, calc=None):
113
+ """Because we're a Python value node and don't have a real
114
+ timestamp, we get to ignore the calculator and just use the
115
+ value contents."""
116
+ try:
117
+ return self.ninfo.csig
118
+ except AttributeError:
119
+ pass
120
+ contents = self.get_contents()
121
+ self.get_ninfo().csig = contents
122
+ return contents
123
+
124
+ # Local Variables:
125
+ # tab-width:4
126
+ # indent-tabs-mode:nil
127
+ # End:
128
+ # vim: set expandtab tabstop=4 shiftwidth=4:
@@ -0,0 +1,1328 @@
1
+ """SCons.Node
2
+
3
+ The Node package for the SCons software construction utility.
4
+
5
+ This is, in many ways, the heart of SCons.
6
+
7
+ A Node is where we encapsulate all of the dependency information about
8
+ any thing that SCons can build, or about any thing which SCons can use
9
+ to build some other thing. The canonical "thing," of course, is a file,
10
+ but a Node can also represent something remote (like a web page) or
11
+ something completely abstract (like an Alias).
12
+
13
+ Each specific type of "thing" is specifically represented by a subclass
14
+ of the Node base class: Node.FS.File for files, Node.Alias for aliases,
15
+ etc. Dependency information is kept here in the base class, and
16
+ information specific to files/aliases/etc. is in the subclass. The
17
+ goal, if we've done this correctly, is that any type of "thing" should
18
+ be able to depend on any other type of "thing."
19
+
20
+ """
21
+
22
+ #
23
+ # Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation
24
+ #
25
+ # Permission is hereby granted, free of charge, to any person obtaining
26
+ # a copy of this software and associated documentation files (the
27
+ # "Software"), to deal in the Software without restriction, including
28
+ # without limitation the rights to use, copy, modify, merge, publish,
29
+ # distribute, sublicense, and/or sell copies of the Software, and to
30
+ # permit persons to whom the Software is furnished to do so, subject to
31
+ # the following conditions:
32
+ #
33
+ # The above copyright notice and this permission notice shall be included
34
+ # in all copies or substantial portions of the Software.
35
+ #
36
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
37
+ # KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
38
+ # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
39
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
40
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
41
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
42
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
43
+
44
+ __revision__ = "src/engine/SCons/Node/__init__.py 5023 2010/06/14 22:05:46 scons"
45
+
46
+ import collections
47
+ import copy
48
+ from itertools import chain
49
+
50
+ from SCons.Debug import logInstanceCreation
51
+ import SCons.Executor
52
+ import SCons.Memoize
53
+ import SCons.Util
54
+
55
+ from SCons.Debug import Trace
56
+
57
+ def classname(obj):
58
+ return str(obj.__class__).split('.')[-1]
59
+
60
+ # Node states
61
+ #
62
+ # These are in "priority" order, so that the maximum value for any
63
+ # child/dependency of a node represents the state of that node if
64
+ # it has no builder of its own. The canonical example is a file
65
+ # system directory, which is only up to date if all of its children
66
+ # were up to date.
67
+ no_state = 0
68
+ pending = 1
69
+ executing = 2
70
+ up_to_date = 3
71
+ executed = 4
72
+ failed = 5
73
+
74
+ StateString = {
75
+ 0 : "no_state",
76
+ 1 : "pending",
77
+ 2 : "executing",
78
+ 3 : "up_to_date",
79
+ 4 : "executed",
80
+ 5 : "failed",
81
+ }
82
+
83
+ # controls whether implicit dependencies are cached:
84
+ implicit_cache = 0
85
+
86
+ # controls whether implicit dep changes are ignored:
87
+ implicit_deps_unchanged = 0
88
+
89
+ # controls whether the cached implicit deps are ignored:
90
+ implicit_deps_changed = 0
91
+
92
+ # A variable that can be set to an interface-specific function be called
93
+ # to annotate a Node with information about its creation.
94
+ def do_nothing(node): pass
95
+
96
+ Annotate = do_nothing
97
+
98
+ # Classes for signature info for Nodes.
99
+
100
+ class NodeInfoBase(object):
101
+ """
102
+ The generic base class for signature information for a Node.
103
+
104
+ Node subclasses should subclass NodeInfoBase to provide their own
105
+ logic for dealing with their own Node-specific signature information.
106
+ """
107
+ current_version_id = 1
108
+ def __init__(self, node=None):
109
+ # Create an object attribute from the class attribute so it ends up
110
+ # in the pickled data in the .sconsign file.
111
+ self._version_id = self.current_version_id
112
+ def update(self, node):
113
+ try:
114
+ field_list = self.field_list
115
+ except AttributeError:
116
+ return
117
+ for f in field_list:
118
+ try:
119
+ delattr(self, f)
120
+ except AttributeError:
121
+ pass
122
+ try:
123
+ func = getattr(node, 'get_' + f)
124
+ except AttributeError:
125
+ pass
126
+ else:
127
+ setattr(self, f, func())
128
+ def convert(self, node, val):
129
+ pass
130
+ def merge(self, other):
131
+ self.__dict__.update(other.__dict__)
132
+ def format(self, field_list=None, names=0):
133
+ if field_list is None:
134
+ try:
135
+ field_list = self.field_list
136
+ except AttributeError:
137
+ field_list = sorted(self.__dict__.keys())
138
+ fields = []
139
+ for field in field_list:
140
+ try:
141
+ f = getattr(self, field)
142
+ except AttributeError:
143
+ f = None
144
+ f = str(f)
145
+ if names:
146
+ f = field + ': ' + f
147
+ fields.append(f)
148
+ return fields
149
+
150
+ class BuildInfoBase(object):
151
+ """
152
+ The generic base class for build information for a Node.
153
+
154
+ This is what gets stored in a .sconsign file for each target file.
155
+ It contains a NodeInfo instance for this node (signature information
156
+ that's specific to the type of Node) and direct attributes for the
157
+ generic build stuff we have to track: sources, explicit dependencies,
158
+ implicit dependencies, and action information.
159
+ """
160
+ current_version_id = 1
161
+ def __init__(self, node=None):
162
+ # Create an object attribute from the class attribute so it ends up
163
+ # in the pickled data in the .sconsign file.
164
+ self._version_id = self.current_version_id
165
+ self.bsourcesigs = []
166
+ self.bdependsigs = []
167
+ self.bimplicitsigs = []
168
+ self.bactsig = None
169
+ def merge(self, other):
170
+ self.__dict__.update(other.__dict__)
171
+
172
+ class Node(object):
173
+ """The base Node class, for entities that we know how to
174
+ build, or use to build other Nodes.
175
+ """
176
+
177
+ if SCons.Memoize.use_memoizer:
178
+ __metaclass__ = SCons.Memoize.Memoized_Metaclass
179
+
180
+ memoizer_counters = []
181
+
182
+ class Attrs(object):
183
+ pass
184
+
185
+ def __init__(self):
186
+ if __debug__: logInstanceCreation(self, 'Node.Node')
187
+ # Note that we no longer explicitly initialize a self.builder
188
+ # attribute to None here. That's because the self.builder
189
+ # attribute may be created on-the-fly later by a subclass (the
190
+ # canonical example being a builder to fetch a file from a
191
+ # source code system like CVS or Subversion).
192
+
193
+ # Each list of children that we maintain is accompanied by a
194
+ # dictionary used to look up quickly whether a node is already
195
+ # present in the list. Empirical tests showed that it was
196
+ # fastest to maintain them as side-by-side Node attributes in
197
+ # this way, instead of wrapping up each list+dictionary pair in
198
+ # a class. (Of course, we could always still do that in the
199
+ # future if we had a good reason to...).
200
+ self.sources = [] # source files used to build node
201
+ self.sources_set = set()
202
+ self._specific_sources = False
203
+ self.depends = [] # explicit dependencies (from Depends)
204
+ self.depends_set = set()
205
+ self.ignore = [] # dependencies to ignore
206
+ self.ignore_set = set()
207
+ self.prerequisites = SCons.Util.UniqueList()
208
+ self.implicit = None # implicit (scanned) dependencies (None means not scanned yet)
209
+ self.waiting_parents = set()
210
+ self.waiting_s_e = set()
211
+ self.ref_count = 0
212
+ self.wkids = None # Kids yet to walk, when it's an array
213
+
214
+ self.env = None
215
+ self.state = no_state
216
+ self.precious = None
217
+ self.noclean = 0
218
+ self.nocache = 0
219
+ self.always_build = None
220
+ self.includes = None
221
+ self.attributes = self.Attrs() # Generic place to stick information about the Node.
222
+ self.side_effect = 0 # true iff this node is a side effect
223
+ self.side_effects = [] # the side effects of building this target
224
+ self.linked = 0 # is this node linked to the variant directory?
225
+
226
+ self.clear_memoized_values()
227
+
228
+ # Let the interface in which the build engine is embedded
229
+ # annotate this Node with its own info (like a description of
230
+ # what line in what file created the node, for example).
231
+ Annotate(self)
232
+
233
+ def disambiguate(self, must_exist=None):
234
+ return self
235
+
236
+ def get_suffix(self):
237
+ return ''
238
+
239
+ memoizer_counters.append(SCons.Memoize.CountValue('get_build_env'))
240
+
241
+ def get_build_env(self):
242
+ """Fetch the appropriate Environment to build this node.
243
+ """
244
+ try:
245
+ return self._memo['get_build_env']
246
+ except KeyError:
247
+ pass
248
+ result = self.get_executor().get_build_env()
249
+ self._memo['get_build_env'] = result
250
+ return result
251
+
252
+ def get_build_scanner_path(self, scanner):
253
+ """Fetch the appropriate scanner path for this node."""
254
+ return self.get_executor().get_build_scanner_path(scanner)
255
+
256
+ def set_executor(self, executor):
257
+ """Set the action executor for this node."""
258
+ self.executor = executor
259
+
260
+ def get_executor(self, create=1):
261
+ """Fetch the action executor for this node. Create one if
262
+ there isn't already one, and requested to do so."""
263
+ try:
264
+ executor = self.executor
265
+ except AttributeError:
266
+ if not create:
267
+ raise
268
+ try:
269
+ act = self.builder.action
270
+ except AttributeError:
271
+ executor = SCons.Executor.Null(targets=[self])
272
+ else:
273
+ executor = SCons.Executor.Executor(act,
274
+ self.env or self.builder.env,
275
+ [self.builder.overrides],
276
+ [self],
277
+ self.sources)
278
+ self.executor = executor
279
+ return executor
280
+
281
+ def executor_cleanup(self):
282
+ """Let the executor clean up any cached information."""
283
+ try:
284
+ executor = self.get_executor(create=None)
285
+ except AttributeError:
286
+ pass
287
+ else:
288
+ executor.cleanup()
289
+
290
+ def reset_executor(self):
291
+ "Remove cached executor; forces recompute when needed."
292
+ try:
293
+ delattr(self, 'executor')
294
+ except AttributeError:
295
+ pass
296
+
297
+ def push_to_cache(self):
298
+ """Try to push a node into a cache
299
+ """
300
+ pass
301
+
302
+ def retrieve_from_cache(self):
303
+ """Try to retrieve the node's content from a cache
304
+
305
+ This method is called from multiple threads in a parallel build,
306
+ so only do thread safe stuff here. Do thread unsafe stuff in
307
+ built().
308
+
309
+ Returns true iff the node was successfully retrieved.
310
+ """
311
+ return 0
312
+
313
+ #
314
+ # Taskmaster interface subsystem
315
+ #
316
+
317
+ def make_ready(self):
318
+ """Get a Node ready for evaluation.
319
+
320
+ This is called before the Taskmaster decides if the Node is
321
+ up-to-date or not. Overriding this method allows for a Node
322
+ subclass to be disambiguated if necessary, or for an implicit
323
+ source builder to be attached.
324
+ """
325
+ pass
326
+
327
+ def prepare(self):
328
+ """Prepare for this Node to be built.
329
+
330
+ This is called after the Taskmaster has decided that the Node
331
+ is out-of-date and must be rebuilt, but before actually calling
332
+ the method to build the Node.
333
+
334
+ This default implementation checks that explicit or implicit
335
+ dependencies either exist or are derived, and initializes the
336
+ BuildInfo structure that will hold the information about how
337
+ this node is, uh, built.
338
+
339
+ (The existence of source files is checked separately by the
340
+ Executor, which aggregates checks for all of the targets built
341
+ by a specific action.)
342
+
343
+ Overriding this method allows for for a Node subclass to remove
344
+ the underlying file from the file system. Note that subclass
345
+ methods should call this base class method to get the child
346
+ check and the BuildInfo structure.
347
+ """
348
+ for d in self.depends:
349
+ if d.missing():
350
+ msg = "Explicit dependency `%s' not found, needed by target `%s'."
351
+ raise SCons.Errors.StopError(msg % (d, self))
352
+ if self.implicit is not None:
353
+ for i in self.implicit:
354
+ if i.missing():
355
+ msg = "Implicit dependency `%s' not found, needed by target `%s'."
356
+ raise SCons.Errors.StopError(msg % (i, self))
357
+ self.binfo = self.get_binfo()
358
+
359
+ def build(self, **kw):
360
+ """Actually build the node.
361
+
362
+ This is called by the Taskmaster after it's decided that the
363
+ Node is out-of-date and must be rebuilt, and after the prepare()
364
+ method has gotten everything, uh, prepared.
365
+
366
+ This method is called from multiple threads in a parallel build,
367
+ so only do thread safe stuff here. Do thread unsafe stuff
368
+ in built().
369
+
370
+ """
371
+ try:
372
+ self.get_executor()(self, **kw)
373
+ except SCons.Errors.BuildError, e:
374
+ e.node = self
375
+ raise
376
+
377
+ def built(self):
378
+ """Called just after this node is successfully built."""
379
+
380
+ # Clear the implicit dependency caches of any Nodes
381
+ # waiting for this Node to be built.
382
+ for parent in self.waiting_parents:
383
+ parent.implicit = None
384
+
385
+ self.clear()
386
+
387
+ self.ninfo.update(self)
388
+
389
+ def visited(self):
390
+ """Called just after this node has been visited (with or
391
+ without a build)."""
392
+ try:
393
+ binfo = self.binfo
394
+ except AttributeError:
395
+ # Apparently this node doesn't need build info, so
396
+ # don't bother calculating or storing it.
397
+ pass
398
+ else:
399
+ self.ninfo.update(self)
400
+ self.store_info()
401
+
402
+ #
403
+ #
404
+ #
405
+
406
+ def add_to_waiting_s_e(self, node):
407
+ self.waiting_s_e.add(node)
408
+
409
+ def add_to_waiting_parents(self, node):
410
+ """
411
+ Returns the number of nodes added to our waiting parents list:
412
+ 1 if we add a unique waiting parent, 0 if not. (Note that the
413
+ returned values are intended to be used to increment a reference
414
+ count, so don't think you can "clean up" this function by using
415
+ True and False instead...)
416
+ """
417
+ wp = self.waiting_parents
418
+ if node in wp:
419
+ return 0
420
+ wp.add(node)
421
+ return 1
422
+
423
+ def postprocess(self):
424
+ """Clean up anything we don't need to hang onto after we've
425
+ been built."""
426
+ self.executor_cleanup()
427
+ self.waiting_parents = set()
428
+
429
+ def clear(self):
430
+ """Completely clear a Node of all its cached state (so that it
431
+ can be re-evaluated by interfaces that do continuous integration
432
+ builds).
433
+ """
434
+ # The del_binfo() call here isn't necessary for normal execution,
435
+ # but is for interactive mode, where we might rebuild the same
436
+ # target and need to start from scratch.
437
+ self.del_binfo()
438
+ self.clear_memoized_values()
439
+ self.ninfo = self.new_ninfo()
440
+ self.executor_cleanup()
441
+ try:
442
+ delattr(self, '_calculated_sig')
443
+ except AttributeError:
444
+ pass
445
+ self.includes = None
446
+
447
+ def clear_memoized_values(self):
448
+ self._memo = {}
449
+
450
+ def builder_set(self, builder):
451
+ self.builder = builder
452
+ try:
453
+ del self.executor
454
+ except AttributeError:
455
+ pass
456
+
457
+ def has_builder(self):
458
+ """Return whether this Node has a builder or not.
459
+
460
+ In Boolean tests, this turns out to be a *lot* more efficient
461
+ than simply examining the builder attribute directly ("if
462
+ node.builder: ..."). When the builder attribute is examined
463
+ directly, it ends up calling __getattr__ for both the __len__
464
+ and __nonzero__ attributes on instances of our Builder Proxy
465
+ class(es), generating a bazillion extra calls and slowing
466
+ things down immensely.
467
+ """
468
+ try:
469
+ b = self.builder
470
+ except AttributeError:
471
+ # There was no explicit builder for this Node, so initialize
472
+ # the self.builder attribute to None now.
473
+ b = self.builder = None
474
+ return b is not None
475
+
476
+ def set_explicit(self, is_explicit):
477
+ self.is_explicit = is_explicit
478
+
479
+ def has_explicit_builder(self):
480
+ """Return whether this Node has an explicit builder
481
+
482
+ This allows an internal Builder created by SCons to be marked
483
+ non-explicit, so that it can be overridden by an explicit
484
+ builder that the user supplies (the canonical example being
485
+ directories)."""
486
+ try:
487
+ return self.is_explicit
488
+ except AttributeError:
489
+ self.is_explicit = None
490
+ return self.is_explicit
491
+
492
+ def get_builder(self, default_builder=None):
493
+ """Return the set builder, or a specified default value"""
494
+ try:
495
+ return self.builder
496
+ except AttributeError:
497
+ return default_builder
498
+
499
+ multiple_side_effect_has_builder = has_builder
500
+
501
+ def is_derived(self):
502
+ """
503
+ Returns true iff this node is derived (i.e. built).
504
+
505
+ This should return true only for nodes whose path should be in
506
+ the variant directory when duplicate=0 and should contribute their build
507
+ signatures when they are used as source files to other derived files. For
508
+ example: source with source builders are not derived in this sense,
509
+ and hence should not return true.
510
+ """
511
+ return self.has_builder() or self.side_effect
512
+
513
+ def alter_targets(self):
514
+ """Return a list of alternate targets for this Node.
515
+ """
516
+ return [], None
517
+
518
+ def get_found_includes(self, env, scanner, path):
519
+ """Return the scanned include lines (implicit dependencies)
520
+ found in this node.
521
+
522
+ The default is no implicit dependencies. We expect this method
523
+ to be overridden by any subclass that can be scanned for
524
+ implicit dependencies.
525
+ """
526
+ return []
527
+
528
+ def get_implicit_deps(self, env, scanner, path):
529
+ """Return a list of implicit dependencies for this node.
530
+
531
+ This method exists to handle recursive invocation of the scanner
532
+ on the implicit dependencies returned by the scanner, if the
533
+ scanner's recursive flag says that we should.
534
+ """
535
+ if not scanner:
536
+ return []
537
+
538
+ # Give the scanner a chance to select a more specific scanner
539
+ # for this Node.
540
+ #scanner = scanner.select(self)
541
+
542
+ nodes = [self]
543
+ seen = {}
544
+ seen[self] = 1
545
+ deps = []
546
+ while nodes:
547
+ n = nodes.pop(0)
548
+ d = [x for x in n.get_found_includes(env, scanner, path) if x not in seen]
549
+ if d:
550
+ deps.extend(d)
551
+ for n in d:
552
+ seen[n] = 1
553
+ nodes.extend(scanner.recurse_nodes(d))
554
+
555
+ return deps
556
+
557
+ def get_env_scanner(self, env, kw={}):
558
+ return env.get_scanner(self.scanner_key())
559
+
560
+ def get_target_scanner(self):
561
+ return self.builder.target_scanner
562
+
563
+ def get_source_scanner(self, node):
564
+ """Fetch the source scanner for the specified node
565
+
566
+ NOTE: "self" is the target being built, "node" is
567
+ the source file for which we want to fetch the scanner.
568
+
569
+ Implies self.has_builder() is true; again, expect to only be
570
+ called from locations where this is already verified.
571
+
572
+ This function may be called very often; it attempts to cache
573
+ the scanner found to improve performance.
574
+ """
575
+ scanner = None
576
+ try:
577
+ scanner = self.builder.source_scanner
578
+ except AttributeError:
579
+ pass
580
+ if not scanner:
581
+ # The builder didn't have an explicit scanner, so go look up
582
+ # a scanner from env['SCANNERS'] based on the node's scanner
583
+ # key (usually the file extension).
584
+ scanner = self.get_env_scanner(self.get_build_env())
585
+ if scanner:
586
+ scanner = scanner.select(node)
587
+ return scanner
588
+
589
+ def add_to_implicit(self, deps):
590
+ if not hasattr(self, 'implicit') or self.implicit is None:
591
+ self.implicit = []
592
+ self.implicit_set = set()
593
+ self._children_reset()
594
+ self._add_child(self.implicit, self.implicit_set, deps)
595
+
596
+ def scan(self):
597
+ """Scan this node's dependents for implicit dependencies."""
598
+ # Don't bother scanning non-derived files, because we don't
599
+ # care what their dependencies are.
600
+ # Don't scan again, if we already have scanned.
601
+ if self.implicit is not None:
602
+ return
603
+ self.implicit = []
604
+ self.implicit_set = set()
605
+ self._children_reset()
606
+ if not self.has_builder():
607
+ return
608
+
609
+ build_env = self.get_build_env()
610
+ executor = self.get_executor()
611
+
612
+ # Here's where we implement --implicit-cache.
613
+ if implicit_cache and not implicit_deps_changed:
614
+ implicit = self.get_stored_implicit()
615
+ if implicit is not None:
616
+ # We now add the implicit dependencies returned from the
617
+ # stored .sconsign entry to have already been converted
618
+ # to Nodes for us. (We used to run them through a
619
+ # source_factory function here.)
620
+
621
+ # Update all of the targets with them. This
622
+ # essentially short-circuits an N*M scan of the
623
+ # sources for each individual target, which is a hell
624
+ # of a lot more efficient.
625
+ for tgt in executor.get_all_targets():
626
+ tgt.add_to_implicit(implicit)
627
+
628
+ if implicit_deps_unchanged or self.is_up_to_date():
629
+ return
630
+ # one of this node's sources has changed,
631
+ # so we must recalculate the implicit deps:
632
+ self.implicit = []
633
+ self.implicit_set = set()
634
+
635
+ # Have the executor scan the sources.
636
+ executor.scan_sources(self.builder.source_scanner)
637
+
638
+ # If there's a target scanner, have the executor scan the target
639
+ # node itself and associated targets that might be built.
640
+ scanner = self.get_target_scanner()
641
+ if scanner:
642
+ executor.scan_targets(scanner)
643
+
644
+ def scanner_key(self):
645
+ return None
646
+
647
+ def select_scanner(self, scanner):
648
+ """Selects a scanner for this Node.
649
+
650
+ This is a separate method so it can be overridden by Node
651
+ subclasses (specifically, Node.FS.Dir) that *must* use their
652
+ own Scanner and don't select one the Scanner.Selector that's
653
+ configured for the target.
654
+ """
655
+ return scanner.select(self)
656
+
657
+ def env_set(self, env, safe=0):
658
+ if safe and self.env:
659
+ return
660
+ self.env = env
661
+
662
+ #
663
+ # SIGNATURE SUBSYSTEM
664
+ #
665
+
666
+ NodeInfo = NodeInfoBase
667
+ BuildInfo = BuildInfoBase
668
+
669
+ def new_ninfo(self):
670
+ ninfo = self.NodeInfo(self)
671
+ return ninfo
672
+
673
+ def get_ninfo(self):
674
+ try:
675
+ return self.ninfo
676
+ except AttributeError:
677
+ self.ninfo = self.new_ninfo()
678
+ return self.ninfo
679
+
680
+ def new_binfo(self):
681
+ binfo = self.BuildInfo(self)
682
+ return binfo
683
+
684
+ def get_binfo(self):
685
+ """
686
+ Fetch a node's build information.
687
+
688
+ node - the node whose sources will be collected
689
+ cache - alternate node to use for the signature cache
690
+ returns - the build signature
691
+
692
+ This no longer handles the recursive descent of the
693
+ node's children's signatures. We expect that they're
694
+ already built and updated by someone else, if that's
695
+ what's wanted.
696
+ """
697
+ try:
698
+ return self.binfo
699
+ except AttributeError:
700
+ pass
701
+
702
+ binfo = self.new_binfo()
703
+ self.binfo = binfo
704
+
705
+ executor = self.get_executor()
706
+ ignore_set = self.ignore_set
707
+
708
+ if self.has_builder():
709
+ binfo.bact = str(executor)
710
+ binfo.bactsig = SCons.Util.MD5signature(executor.get_contents())
711
+
712
+ if self._specific_sources:
713
+ sources = []
714
+ for s in self.sources:
715
+ if s not in ignore_set:
716
+ sources.append(s)
717
+ else:
718
+ sources = executor.get_unignored_sources(self, self.ignore)
719
+ seen = set()
720
+ bsources = []
721
+ bsourcesigs = []
722
+ for s in sources:
723
+ if not s in seen:
724
+ seen.add(s)
725
+ bsources.append(s)
726
+ bsourcesigs.append(s.get_ninfo())
727
+ binfo.bsources = bsources
728
+ binfo.bsourcesigs = bsourcesigs
729
+
730
+ depends = self.depends
731
+ dependsigs = []
732
+ for d in depends:
733
+ if d not in ignore_set:
734
+ dependsigs.append(d.get_ninfo())
735
+ binfo.bdepends = depends
736
+ binfo.bdependsigs = dependsigs
737
+
738
+ implicit = self.implicit or []
739
+ implicitsigs = []
740
+ for i in implicit:
741
+ if i not in ignore_set:
742
+ implicitsigs.append(i.get_ninfo())
743
+ binfo.bimplicit = implicit
744
+ binfo.bimplicitsigs = implicitsigs
745
+
746
+ return binfo
747
+
748
+ def del_binfo(self):
749
+ """Delete the build info from this node."""
750
+ try:
751
+ delattr(self, 'binfo')
752
+ except AttributeError:
753
+ pass
754
+
755
+ def get_csig(self):
756
+ try:
757
+ return self.ninfo.csig
758
+ except AttributeError:
759
+ ninfo = self.get_ninfo()
760
+ ninfo.csig = SCons.Util.MD5signature(self.get_contents())
761
+ return self.ninfo.csig
762
+
763
+ def get_cachedir_csig(self):
764
+ return self.get_csig()
765
+
766
+ def store_info(self):
767
+ """Make the build signature permanent (that is, store it in the
768
+ .sconsign file or equivalent)."""
769
+ pass
770
+
771
+ def do_not_store_info(self):
772
+ pass
773
+
774
+ def get_stored_info(self):
775
+ return None
776
+
777
+ def get_stored_implicit(self):
778
+ """Fetch the stored implicit dependencies"""
779
+ return None
780
+
781
+ #
782
+ #
783
+ #
784
+
785
+ def set_precious(self, precious = 1):
786
+ """Set the Node's precious value."""
787
+ self.precious = precious
788
+
789
+ def set_noclean(self, noclean = 1):
790
+ """Set the Node's noclean value."""
791
+ # Make sure noclean is an integer so the --debug=stree
792
+ # output in Util.py can use it as an index.
793
+ self.noclean = noclean and 1 or 0
794
+
795
+ def set_nocache(self, nocache = 1):
796
+ """Set the Node's nocache value."""
797
+ # Make sure nocache is an integer so the --debug=stree
798
+ # output in Util.py can use it as an index.
799
+ self.nocache = nocache and 1 or 0
800
+
801
+ def set_always_build(self, always_build = 1):
802
+ """Set the Node's always_build value."""
803
+ self.always_build = always_build
804
+
805
+ def exists(self):
806
+ """Does this node exists?"""
807
+ # All node exist by default:
808
+ return 1
809
+
810
+ def rexists(self):
811
+ """Does this node exist locally or in a repositiory?"""
812
+ # There are no repositories by default:
813
+ return self.exists()
814
+
815
+ def missing(self):
816
+ return not self.is_derived() and \
817
+ not self.linked and \
818
+ not self.rexists()
819
+
820
+ def remove(self):
821
+ """Remove this Node: no-op by default."""
822
+ return None
823
+
824
+ def add_dependency(self, depend):
825
+ """Adds dependencies."""
826
+ try:
827
+ self._add_child(self.depends, self.depends_set, depend)
828
+ except TypeError, e:
829
+ e = e.args[0]
830
+ if SCons.Util.is_List(e):
831
+ s = list(map(str, e))
832
+ else:
833
+ s = str(e)
834
+ raise SCons.Errors.UserError("attempted to add a non-Node dependency to %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e)))
835
+
836
+ def add_prerequisite(self, prerequisite):
837
+ """Adds prerequisites"""
838
+ self.prerequisites.extend(prerequisite)
839
+ self._children_reset()
840
+
841
+ def add_ignore(self, depend):
842
+ """Adds dependencies to ignore."""
843
+ try:
844
+ self._add_child(self.ignore, self.ignore_set, depend)
845
+ except TypeError, e:
846
+ e = e.args[0]
847
+ if SCons.Util.is_List(e):
848
+ s = list(map(str, e))
849
+ else:
850
+ s = str(e)
851
+ raise SCons.Errors.UserError("attempted to ignore a non-Node dependency of %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e)))
852
+
853
+ def add_source(self, source):
854
+ """Adds sources."""
855
+ if self._specific_sources:
856
+ return
857
+ try:
858
+ self._add_child(self.sources, self.sources_set, source)
859
+ except TypeError, e:
860
+ e = e.args[0]
861
+ if SCons.Util.is_List(e):
862
+ s = list(map(str, e))
863
+ else:
864
+ s = str(e)
865
+ raise SCons.Errors.UserError("attempted to add a non-Node as source of %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e)))
866
+
867
+ def _add_child(self, collection, set, child):
868
+ """Adds 'child' to 'collection', first checking 'set' to see if it's
869
+ already present."""
870
+ #if type(child) is not type([]):
871
+ # child = [child]
872
+ #for c in child:
873
+ # if not isinstance(c, Node):
874
+ # raise TypeError, c
875
+ added = None
876
+ for c in child:
877
+ if c not in set:
878
+ set.add(c)
879
+ collection.append(c)
880
+ added = 1
881
+ if added:
882
+ self._children_reset()
883
+
884
+ def set_specific_source(self, source):
885
+ self.add_source(source)
886
+ self._specific_sources = True
887
+
888
+ def add_wkid(self, wkid):
889
+ """Add a node to the list of kids waiting to be evaluated"""
890
+ if self.wkids is not None:
891
+ self.wkids.append(wkid)
892
+
893
+ def _children_reset(self):
894
+ self.clear_memoized_values()
895
+ # We need to let the Executor clear out any calculated
896
+ # build info that it's cached so we can re-calculate it.
897
+ self.executor_cleanup()
898
+
899
+ memoizer_counters.append(SCons.Memoize.CountValue('_children_get'))
900
+
901
+ def _children_get(self):
902
+ try:
903
+ return self._memo['children_get']
904
+ except KeyError:
905
+ pass
906
+
907
+ # The return list may contain duplicate Nodes, especially in
908
+ # source trees where there are a lot of repeated #includes
909
+ # of a tangle of .h files. Profiling shows, however, that
910
+ # eliminating the duplicates with a brute-force approach that
911
+ # preserves the order (that is, something like:
912
+ #
913
+ # u = []
914
+ # for n in list:
915
+ # if n not in u:
916
+ # u.append(n)"
917
+ #
918
+ # takes more cycles than just letting the underlying methods
919
+ # hand back cached values if a Node's information is requested
920
+ # multiple times. (Other methods of removing duplicates, like
921
+ # using dictionary keys, lose the order, and the only ordered
922
+ # dictionary patterns I found all ended up using "not in"
923
+ # internally anyway...)
924
+ if self.ignore_set:
925
+ if self.implicit is None:
926
+ iter = chain(self.sources,self.depends)
927
+ else:
928
+ iter = chain(self.sources, self.depends, self.implicit)
929
+
930
+ children = []
931
+ for i in iter:
932
+ if i not in self.ignore_set:
933
+ children.append(i)
934
+ else:
935
+ if self.implicit is None:
936
+ children = self.sources + self.depends
937
+ else:
938
+ children = self.sources + self.depends + self.implicit
939
+
940
+ self._memo['children_get'] = children
941
+ return children
942
+
943
+ def all_children(self, scan=1):
944
+ """Return a list of all the node's direct children."""
945
+ if scan:
946
+ self.scan()
947
+
948
+ # The return list may contain duplicate Nodes, especially in
949
+ # source trees where there are a lot of repeated #includes
950
+ # of a tangle of .h files. Profiling shows, however, that
951
+ # eliminating the duplicates with a brute-force approach that
952
+ # preserves the order (that is, something like:
953
+ #
954
+ # u = []
955
+ # for n in list:
956
+ # if n not in u:
957
+ # u.append(n)"
958
+ #
959
+ # takes more cycles than just letting the underlying methods
960
+ # hand back cached values if a Node's information is requested
961
+ # multiple times. (Other methods of removing duplicates, like
962
+ # using dictionary keys, lose the order, and the only ordered
963
+ # dictionary patterns I found all ended up using "not in"
964
+ # internally anyway...)
965
+ if self.implicit is None:
966
+ return self.sources + self.depends
967
+ else:
968
+ return self.sources + self.depends + self.implicit
969
+
970
+ def children(self, scan=1):
971
+ """Return a list of the node's direct children, minus those
972
+ that are ignored by this node."""
973
+ if scan:
974
+ self.scan()
975
+ return self._children_get()
976
+
977
+ def set_state(self, state):
978
+ self.state = state
979
+
980
+ def get_state(self):
981
+ return self.state
982
+
983
+ def state_has_changed(self, target, prev_ni):
984
+ return (self.state != SCons.Node.up_to_date)
985
+
986
+ def get_env(self):
987
+ env = self.env
988
+ if not env:
989
+ import SCons.Defaults
990
+ env = SCons.Defaults.DefaultEnvironment()
991
+ return env
992
+
993
+ def changed_since_last_build(self, target, prev_ni):
994
+ """
995
+
996
+ Must be overridden in a specific subclass to return True if this
997
+ Node (a dependency) has changed since the last time it was used
998
+ to build the specified target. prev_ni is this Node's state (for
999
+ example, its file timestamp, length, maybe content signature)
1000
+ as of the last time the target was built.
1001
+
1002
+ Note that this method is called through the dependency, not the
1003
+ target, because a dependency Node must be able to use its own
1004
+ logic to decide if it changed. For example, File Nodes need to
1005
+ obey if we're configured to use timestamps, but Python Value Nodes
1006
+ never use timestamps and always use the content. If this method
1007
+ were called through the target, then each Node's implementation
1008
+ of this method would have to have more complicated logic to
1009
+ handle all the different Node types on which it might depend.
1010
+ """
1011
+ raise NotImplementedError
1012
+
1013
+ def Decider(self, function):
1014
+ SCons.Util.AddMethod(self, function, 'changed_since_last_build')
1015
+
1016
+ def changed(self, node=None):
1017
+ """
1018
+ Returns if the node is up-to-date with respect to the BuildInfo
1019
+ stored last time it was built. The default behavior is to compare
1020
+ it against our own previously stored BuildInfo, but the stored
1021
+ BuildInfo from another Node (typically one in a Repository)
1022
+ can be used instead.
1023
+
1024
+ Note that we now *always* check every dependency. We used to
1025
+ short-circuit the check by returning as soon as we detected
1026
+ any difference, but we now rely on checking every dependency
1027
+ to make sure that any necessary Node information (for example,
1028
+ the content signature of an #included .h file) is updated.
1029
+ """
1030
+ t = 0
1031
+ if t: Trace('changed(%s [%s], %s)' % (self, classname(self), node))
1032
+ if node is None:
1033
+ node = self
1034
+
1035
+ result = False
1036
+
1037
+ bi = node.get_stored_info().binfo
1038
+ then = bi.bsourcesigs + bi.bdependsigs + bi.bimplicitsigs
1039
+ children = self.children()
1040
+
1041
+ diff = len(children) - len(then)
1042
+ if diff:
1043
+ # The old and new dependency lists are different lengths.
1044
+ # This always indicates that the Node must be rebuilt.
1045
+ # We also extend the old dependency list with enough None
1046
+ # entries to equal the new dependency list, for the benefit
1047
+ # of the loop below that updates node information.
1048
+ then.extend([None] * diff)
1049
+ if t: Trace(': old %s new %s' % (len(then), len(children)))
1050
+ result = True
1051
+
1052
+ for child, prev_ni in zip(children, then):
1053
+ if child.changed_since_last_build(self, prev_ni):
1054
+ if t: Trace(': %s changed' % child)
1055
+ result = True
1056
+
1057
+ contents = self.get_executor().get_contents()
1058
+ if self.has_builder():
1059
+ import SCons.Util
1060
+ newsig = SCons.Util.MD5signature(contents)
1061
+ if bi.bactsig != newsig:
1062
+ if t: Trace(': bactsig %s != newsig %s' % (bi.bactsig, newsig))
1063
+ result = True
1064
+
1065
+ if not result:
1066
+ if t: Trace(': up to date')
1067
+
1068
+ if t: Trace('\n')
1069
+
1070
+ return result
1071
+
1072
+ def is_up_to_date(self):
1073
+ """Default check for whether the Node is current: unknown Node
1074
+ subtypes are always out of date, so they will always get built."""
1075
+ return None
1076
+
1077
+ def children_are_up_to_date(self):
1078
+ """Alternate check for whether the Node is current: If all of
1079
+ our children were up-to-date, then this Node was up-to-date, too.
1080
+
1081
+ The SCons.Node.Alias and SCons.Node.Python.Value subclasses
1082
+ rebind their current() method to this method."""
1083
+ # Allow the children to calculate their signatures.
1084
+ self.binfo = self.get_binfo()
1085
+ if self.always_build:
1086
+ return None
1087
+ state = 0
1088
+ for kid in self.children(None):
1089
+ s = kid.get_state()
1090
+ if s and (not state or s > state):
1091
+ state = s
1092
+ return (state == 0 or state == SCons.Node.up_to_date)
1093
+
1094
+ def is_literal(self):
1095
+ """Always pass the string representation of a Node to
1096
+ the command interpreter literally."""
1097
+ return 1
1098
+
1099
+ def render_include_tree(self):
1100
+ """
1101
+ Return a text representation, suitable for displaying to the
1102
+ user, of the include tree for the sources of this node.
1103
+ """
1104
+ if self.is_derived() and self.env:
1105
+ env = self.get_build_env()
1106
+ for s in self.sources:
1107
+ scanner = self.get_source_scanner(s)
1108
+ if scanner:
1109
+ path = self.get_build_scanner_path(scanner)
1110
+ else:
1111
+ path = None
1112
+ def f(node, env=env, scanner=scanner, path=path):
1113
+ return node.get_found_includes(env, scanner, path)
1114
+ return SCons.Util.render_tree(s, f, 1)
1115
+ else:
1116
+ return None
1117
+
1118
+ def get_abspath(self):
1119
+ """
1120
+ Return an absolute path to the Node. This will return simply
1121
+ str(Node) by default, but for Node types that have a concept of
1122
+ relative path, this might return something different.
1123
+ """
1124
+ return str(self)
1125
+
1126
+ def for_signature(self):
1127
+ """
1128
+ Return a string representation of the Node that will always
1129
+ be the same for this particular Node, no matter what. This
1130
+ is by contrast to the __str__() method, which might, for
1131
+ instance, return a relative path for a file Node. The purpose
1132
+ of this method is to generate a value to be used in signature
1133
+ calculation for the command line used to build a target, and
1134
+ we use this method instead of str() to avoid unnecessary
1135
+ rebuilds. This method does not need to return something that
1136
+ would actually work in a command line; it can return any kind of
1137
+ nonsense, so long as it does not change.
1138
+ """
1139
+ return str(self)
1140
+
1141
+ def get_string(self, for_signature):
1142
+ """This is a convenience function designed primarily to be
1143
+ used in command generators (i.e., CommandGeneratorActions or
1144
+ Environment variables that are callable), which are called
1145
+ with a for_signature argument that is nonzero if the command
1146
+ generator is being called to generate a signature for the
1147
+ command line, which determines if we should rebuild or not.
1148
+
1149
+ Such command generators should use this method in preference
1150
+ to str(Node) when converting a Node to a string, passing
1151
+ in the for_signature parameter, such that we will call
1152
+ Node.for_signature() or str(Node) properly, depending on whether
1153
+ we are calculating a signature or actually constructing a
1154
+ command line."""
1155
+ if for_signature:
1156
+ return self.for_signature()
1157
+ return str(self)
1158
+
1159
+ def get_subst_proxy(self):
1160
+ """
1161
+ This method is expected to return an object that will function
1162
+ exactly like this Node, except that it implements any additional
1163
+ special features that we would like to be in effect for
1164
+ Environment variable substitution. The principle use is that
1165
+ some Nodes would like to implement a __getattr__() method,
1166
+ but putting that in the Node type itself has a tendency to kill
1167
+ performance. We instead put it in a proxy and return it from
1168
+ this method. It is legal for this method to return self
1169
+ if no new functionality is needed for Environment substitution.
1170
+ """
1171
+ return self
1172
+
1173
+ def explain(self):
1174
+ if not self.exists():
1175
+ return "building `%s' because it doesn't exist\n" % self
1176
+
1177
+ if self.always_build:
1178
+ return "rebuilding `%s' because AlwaysBuild() is specified\n" % self
1179
+
1180
+ old = self.get_stored_info()
1181
+ if old is None:
1182
+ return None
1183
+
1184
+ old = old.binfo
1185
+ old.prepare_dependencies()
1186
+
1187
+ try:
1188
+ old_bkids = old.bsources + old.bdepends + old.bimplicit
1189
+ old_bkidsigs = old.bsourcesigs + old.bdependsigs + old.bimplicitsigs
1190
+ except AttributeError:
1191
+ return "Cannot explain why `%s' is being rebuilt: No previous build information found\n" % self
1192
+
1193
+ new = self.get_binfo()
1194
+
1195
+ new_bkids = new.bsources + new.bdepends + new.bimplicit
1196
+ new_bkidsigs = new.bsourcesigs + new.bdependsigs + new.bimplicitsigs
1197
+
1198
+ osig = dict(zip(old_bkids, old_bkidsigs))
1199
+ nsig = dict(zip(new_bkids, new_bkidsigs))
1200
+
1201
+ # The sources and dependencies we'll want to report are all stored
1202
+ # as relative paths to this target's directory, but we want to
1203
+ # report them relative to the top-level SConstruct directory,
1204
+ # so we only print them after running them through this lambda
1205
+ # to turn them into the right relative Node and then return
1206
+ # its string.
1207
+ def stringify( s, E=self.dir.Entry ) :
1208
+ if hasattr( s, 'dir' ) :
1209
+ return str(E(s))
1210
+ return str(s)
1211
+
1212
+ lines = []
1213
+
1214
+ removed = [x for x in old_bkids if not x in new_bkids]
1215
+ if removed:
1216
+ removed = list(map(stringify, removed))
1217
+ fmt = "`%s' is no longer a dependency\n"
1218
+ lines.extend([fmt % s for s in removed])
1219
+
1220
+ for k in new_bkids:
1221
+ if not k in old_bkids:
1222
+ lines.append("`%s' is a new dependency\n" % stringify(k))
1223
+ elif k.changed_since_last_build(self, osig[k]):
1224
+ lines.append("`%s' changed\n" % stringify(k))
1225
+
1226
+ if len(lines) == 0 and old_bkids != new_bkids:
1227
+ lines.append("the dependency order changed:\n" +
1228
+ "%sold: %s\n" % (' '*15, list(map(stringify, old_bkids))) +
1229
+ "%snew: %s\n" % (' '*15, list(map(stringify, new_bkids))))
1230
+
1231
+ if len(lines) == 0:
1232
+ def fmt_with_title(title, strlines):
1233
+ lines = strlines.split('\n')
1234
+ sep = '\n' + ' '*(15 + len(title))
1235
+ return ' '*15 + title + sep.join(lines) + '\n'
1236
+ if old.bactsig != new.bactsig:
1237
+ if old.bact == new.bact:
1238
+ lines.append("the contents of the build action changed\n" +
1239
+ fmt_with_title('action: ', new.bact))
1240
+ else:
1241
+ lines.append("the build action changed:\n" +
1242
+ fmt_with_title('old: ', old.bact) +
1243
+ fmt_with_title('new: ', new.bact))
1244
+
1245
+ if len(lines) == 0:
1246
+ return "rebuilding `%s' for unknown reasons\n" % self
1247
+
1248
+ preamble = "rebuilding `%s' because" % self
1249
+ if len(lines) == 1:
1250
+ return "%s %s" % (preamble, lines[0])
1251
+ else:
1252
+ lines = ["%s:\n" % preamble] + lines
1253
+ return ( ' '*11).join(lines)
1254
+
1255
+ class NodeList(collections.UserList):
1256
+ def __str__(self):
1257
+ return str(list(map(str, self.data)))
1258
+
1259
+ def get_children(node, parent): return node.children()
1260
+ def ignore_cycle(node, stack): pass
1261
+ def do_nothing(node, parent): pass
1262
+
1263
+ class Walker(object):
1264
+ """An iterator for walking a Node tree.
1265
+
1266
+ This is depth-first, children are visited before the parent.
1267
+ The Walker object can be initialized with any node, and
1268
+ returns the next node on the descent with each get_next() call.
1269
+ 'kids_func' is an optional function that will be called to
1270
+ get the children of a node instead of calling 'children'.
1271
+ 'cycle_func' is an optional function that will be called
1272
+ when a cycle is detected.
1273
+
1274
+ This class does not get caught in node cycles caused, for example,
1275
+ by C header file include loops.
1276
+ """
1277
+ def __init__(self, node, kids_func=get_children,
1278
+ cycle_func=ignore_cycle,
1279
+ eval_func=do_nothing):
1280
+ self.kids_func = kids_func
1281
+ self.cycle_func = cycle_func
1282
+ self.eval_func = eval_func
1283
+ node.wkids = copy.copy(kids_func(node, None))
1284
+ self.stack = [node]
1285
+ self.history = {} # used to efficiently detect and avoid cycles
1286
+ self.history[node] = None
1287
+
1288
+ def get_next(self):
1289
+ """Return the next node for this walk of the tree.
1290
+
1291
+ This function is intentionally iterative, not recursive,
1292
+ to sidestep any issues of stack size limitations.
1293
+ """
1294
+
1295
+ while self.stack:
1296
+ if self.stack[-1].wkids:
1297
+ node = self.stack[-1].wkids.pop(0)
1298
+ if not self.stack[-1].wkids:
1299
+ self.stack[-1].wkids = None
1300
+ if node in self.history:
1301
+ self.cycle_func(node, self.stack)
1302
+ else:
1303
+ node.wkids = copy.copy(self.kids_func(node, self.stack[-1]))
1304
+ self.stack.append(node)
1305
+ self.history[node] = None
1306
+ else:
1307
+ node = self.stack.pop()
1308
+ del self.history[node]
1309
+ if node:
1310
+ if self.stack:
1311
+ parent = self.stack[-1]
1312
+ else:
1313
+ parent = None
1314
+ self.eval_func(node, parent)
1315
+ return node
1316
+ return None
1317
+
1318
+ def is_done(self):
1319
+ return not self.stack
1320
+
1321
+
1322
+ arg2nodes_lookups = []
1323
+
1324
+ # Local Variables:
1325
+ # tab-width:4
1326
+ # indent-tabs-mode:nil
1327
+ # End:
1328
+ # vim: set expandtab tabstop=4 shiftwidth=4: