You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

argfiles.sh 8.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. #!/bin/sh
  2. # info: test -argfile and @ variants
  3. # syntax: $0 (define JDKDIR and AJBASE)
  4. # @process-test ajc argfiles.sh # test -argfile and @ variants
  5. [ -n "$DEBUG" ] && set -vx
  6. errMssg() {
  7. [ -n "$1" ] && echo "## $0 $1"
  8. [ -n "$2" ] && exit "$2"
  9. }
  10. ## @testcase (support) NPE with -argfile foo.lst with "*.java"
  11. testcaseDesign() {
  12. cat<<EOF
  13. ## input variants
  14. command line: [ [-argfile | @] X <fileRef>{lst} ]...
  15. fileRef: [[local | relative | absolute] X [DOS|Unix|Mac]]
  16. file line: [ option | [@<fileRef>{lst} | <fileRef>{java|aj}] ]
  17. option: ajc options
  18. refLocality: [cwd | argfile]
  19. ## white box
  20. - @, -argfile delegate to same file-creation method
  21. - direct locality matters: null used for for locals and..
  22. - indirect locality matters: referent varies
  23. ## design
  24. -- structure
  25. - invocation
  26. - could set up as unit tests of ConfigParser.java
  27. - if so, have also to test delivery to ajc? e.g., do package names
  28. get calculated correctly under different path variants?
  29. Probably not an issue now, but perhaps later when source-path
  30. searching is enabled.
  31. - could invoke ajc.Main programmatically - can ajc be run repeatedly?
  32. -> might be easier/safer to script, uncover [bash, DOS,...] shell quirks?
  33. -- test case variants
  34. - command-line
  35. - test options
  36. - ajc
  37. - esp. multi-flag (-source 1.4) - separate lines?
  38. - VM/Javac?
  39. - @, -argfile is independent
  40. - test 0, 1, 3 on same line, interspersed
  41. - error: @java file, unflagged arg file
  42. - fileRef depends on locality:
  43. - parm file: CWD, relative-up, relative down-up, absolute, wrong \/:
  44. - relative and absolute traversing through directories with
  45. spaces in them (not in package-named directories)
  46. - file line: same, with * variants
  47. - * variants: [*.java | *.aj] [ empty | 1 | n>1 ]
  48. - fileRef also depends on indirection path:
  49. - add traversal cases
  50. - 1-2 levels of indirection
  51. - need to think about whether indirection depends on locality reference
  52. i.e., whether 1-2 levels of indirection need to be through
  53. all locality types (CWD, relative...)
  54. - basic argfile
  55. - options
  56. - files
  57. - @ref
  58. - comments
  59. - empty lines
  60. - *.java, *.aj references - re
  61. ## implementation
  62. - Source tree
  63. - minimal, star, maximal: all need each other to compile
  64. - some in default package, others in named packages
  65. - some do not share the same source base (or file system?)
  66. - files:
  67. Minimal:
  68. src/
  69. Main.java
  70. pack/Main.java
  71. Star:
  72. star/
  73. Main.java
  74. empty/
  75. many/One.java
  76. many/Two.java
  77. Maximal:
  78. src1/
  79. Src1DefaultMain.java
  80. pack1/Src1Pack1Main.java
  81. pack2/Src1Pack2Main.java
  82. src2/
  83. Src2DefaultMain.java
  84. pack1/Src2Pack1Main.java
  85. pack2/Src2Pack2Main.java
  86. -
  87. EOF
  88. }
  89. generateCurrentSource() {
  90. genSource "" Main "Main SomeClass" > Main.java
  91. genSource "" SomeClass "Main SomeClass" > SomeClass.java
  92. cat > current_Main_0.lst <<EOF
  93. *.java
  94. EOF
  95. cat > current_SomeClass_0.lst <<EOF
  96. *.java
  97. EOF
  98. echo "current"
  99. }
  100. generateMinimalSource() {
  101. mkdir -p src src/pack
  102. genSource "" Main "Main pack.Main" > src/Main.java
  103. genSource pack Main "pack.Main" > src/pack/Main.java
  104. cat > src/minimal_pack.Main_0.lst <<EOF
  105. pack/Main.java
  106. EOF
  107. cat > src/minimal_Main_1.lst <<EOF
  108. Main.java
  109. pack/Main.java
  110. EOF
  111. cat > src/pack/minimal_Main_2.lst <<EOF
  112. ../Main.java
  113. Main.java
  114. EOF
  115. cat > src/pack/minimal_Main_3.lst <<EOF
  116. ../*.java
  117. *.java
  118. EOF
  119. cat > minimal_Main_4.lst <<EOF
  120. @src/minimal_Main_1.lst
  121. EOF
  122. cat > src/minimal_Main_5.lst <<EOF
  123. @minimal_Main_1.lst
  124. EOF
  125. cat > src/minimal_Main_6.lst <<EOF
  126. @../src/minimal_Main_1.lst
  127. EOF
  128. cat > src/minimal_Main_7.lst <<EOF
  129. // starting comment
  130. Main.java // end of line comment
  131. // middle comment
  132. pack/Main.java
  133. // end comment
  134. EOF
  135. cat > src/minimal_Main_8.lst <<EOF
  136. *.java
  137. pack/*.java
  138. EOF
  139. echo "minimal"
  140. }
  141. generateStarSource() {
  142. echo "todo incomplete"
  143. mkdir -p star star/many star/empty
  144. genSource "" Main "Main many.One many.Two" > star/Main.java
  145. genSource "many" Main "many.One many.Two" > star/many/One.java
  146. genSource "many" Main "many.One many.Two" > star/many/Two.java
  147. cat > star/star_Main_1.lst <<EOF
  148. *.java
  149. empty/*.java
  150. many/*.java
  151. EOF
  152. mkdir src1/pack1 src1/pack2 src2/pack1 src2/pack2
  153. refs="pack1.Src1Pack1Main pack2.Src1Pack2Main pack1.Src2Pack1Main pack2.Src2Pack2Main"
  154. genSource "" Main "Src1Main $refs" > src1/Src1Main.java
  155. genSource "" Main "Src2Main $refs" > src2/Src2Main.java
  156. genSource "pack1" Main "$refs" > src1/pack1/Src1Pack1Main.java
  157. genSource "pack2" Main "$refs" > src1/pack2/Src1Pack2Main.java
  158. genSource "pack1" Main "$refs" > src2/pack1/Src2Pack1Main.java
  159. genSource "pack2" Main "$refs" > src2/pack2/Src2Pack2Main.java
  160. }
  161. genSource() {
  162. package="$1"
  163. class="$2"
  164. refs="$3"
  165. if [ -z "$package" ] ; then
  166. name="$class"
  167. else
  168. echo "package $package;"
  169. name="$package.$class"
  170. fi
  171. cat<<EOF
  172. public class $class {
  173. public static final String NAME = "$name";
  174. public static String[] ARGS = new String[]
  175. EOF
  176. sep='{'
  177. for i in $refs ; do
  178. echo " $sep ${i}.NAME"
  179. sep=','
  180. done
  181. cat<<EOF
  182. };
  183. public static void main (String[] args) {
  184. util.Util.signal(NAME + ".main",ARGS);
  185. }
  186. } // class $class
  187. EOF
  188. }
  189. getMain() {
  190. [ -n "$1" ] && echo "$1" | sed 's|.*_\([^_][^_]*\)_.*|\1|'
  191. }
  192. compile() {
  193. [ -d classes ] || mkdir classes
  194. rm -rf classes/*
  195. $JDKDIR/bin/java -classpath "$toolsjar" org.aspectj.tools.ajc.Main \
  196. -d classes -classpath "$utiljar${PS}$rtjar" "${@}"
  197. }
  198. run() {
  199. $JDKDIR/bin/java -classpath "$utiljar${PS}$rtjar${PS}classes" "${@}"
  200. }
  201. testAjc() {
  202. argfile="$1"
  203. [ -n "$VERBOSE" ] && echo "# $1"
  204. [ -f "$argfile" ] || errMssg "testAjc argfile: $1" 3
  205. main=`getMain "$argfile"`
  206. [ -n "$main" ] || errMssg "testAjc no main for argfile: $1" 3
  207. compile -argfile "$argfile" || errMssg "testAjc compile 1 fail: $1" 3
  208. run "$main" || errMssg "testAjc run 1 fail: $1" 3
  209. compile @"$argfile" || errMssg "testAjc compile 2 fail: $1" 3
  210. run "$main" || errMssg "testAjc run 2 fail: $1" 3
  211. }
  212. createUtilJar() {
  213. mkdir util
  214. cat > util/Util.java <<EOF
  215. package util;
  216. public class Util {
  217. public static void signal(String label, String[] names) {
  218. boolean printing = $printing;
  219. if (printing) {
  220. StringBuffer sb = new StringBuffer();
  221. sb.append(label);
  222. sb.append("=[");
  223. for (int i = 0; i < names.length; i++) {
  224. if (i > 0) sb.append(", ");
  225. sb.append(names[i]);
  226. }
  227. sb.append("]");
  228. System.out.println(sb.toString());
  229. }
  230. }
  231. }
  232. EOF
  233. compile util/Util.java
  234. "$JDKDIR/bin/jar" cf "$utiljar" -C classes .
  235. rm -rf util
  236. }
  237. getArgFiles() {
  238. name="$1"
  239. find . -name "$1"\*.lst | sed 's|./||'
  240. }
  241. echoSetup() {
  242. cat<<EOF
  243. ##### setup for $0
  244. JDKDIR: $JDKDIR
  245. AJ_BASE: $AJ_BASE
  246. uname -a: `uname -a`
  247. EOF
  248. }
  249. ############################################################## execution
  250. printing=true # must be true or false
  251. JDKDIR="${JDKDIR:-c:/home/apps/jdk13}"
  252. AJ_BASE="${AJ_BASE:-c:/home/wes/aj/aj-dist/tools}"
  253. [ -d "$JDKDIR" ] || errMssg "require JDKDIR=$JDKDIR" 3
  254. [ -d "$AJ_BASE" ] || errMssg "require AJ_BASE=$AJ_BASE" 3
  255. toolsjar="$AJ_BASE/lib/aspectjtools.jar"
  256. rtjar="$AJ_BASE/lib/aspectjrt.jar"
  257. utiljar="$AJ_BASE/lib/argfilesUtil.jar"
  258. [ -f "$toolsjar" ] || errMssg "require toolsjar=$toolsjar" 3
  259. [ -f "$rtjar" ] || errMssg "require rtjar=$rtjar" 3
  260. [ -f "$utiljar" ] || createUtilJar
  261. echoSetup
  262. d=tempArgfiles
  263. [ -d $d ] && rm -rf $d
  264. mkdir $d && cd $d
  265. name=`generateCurrentSource`
  266. for i in `getArgFiles "$name"` ; do testAjc "$i"; done
  267. name=`generateMinimalSource`
  268. for i in `getArgFiles "$name"` ; do testAjc "$i"; done
  269. # re-run without src prefix..
  270. cd src
  271. for i in `getArgFiles "$name"` ; do testAjc "$i"; done
  272. echo "tests passed if no compiler failures, only output"