From 5bde16a1f94ebe5b52d4d065b2aa5f7315b62cb3 Mon Sep 17 00:00:00 2001 From: Leo Treggiari <leo.treggiari@intel.com> Date: Mon, 9 May 2005 03:37:42 +0000 Subject: [PATCH] Second set of changes for multiple input & output Gnu definitions are updated to use new schema elements --- .../.classpath | 24 +- .../plugin.xml | 15 +- .../resources/oldTypeProjects/1.2/test12.zip | Bin 1844 -> 3820 bytes .../resources/oldTypeProjects/2.0/test20.zip | Bin 9016 -> 4214 bytes .../resources/oldTypeProjects/2.1/test21.zip | Bin 0 -> 6770 bytes .../linkedFolder/Benchmarks/makefile | 43 +++ .../linkedFolder/Benchmarks/objects.mk | 7 + .../linkedFolder/Benchmarks/sources.mk | 15 + .../linkedFolder/Benchmarks/subdir.mk | 34 ++ .../test21Projects/linkedFolder/f1.c | 8 + .../test21Projects/linkedFolder/f2.c | 8 + .../test21Projects/linkedFolder/test_ar.h | 2 + .../resources/test21Projects/linkedLib/f1.c | 8 + .../resources/test21Projects/linkedLib/f2.c | 8 + .../test21Projects/linkedLib/linkedLib.zip | Bin 0 -> 3037 bytes .../test21Projects/linkedLib/test_ar.h | 2 + .../multiResConfig/testResCfg.zip | Bin 0 -> 7101 bytes .../singleFileExe/testSingleExe.zip | Bin 0 -> 3168 bytes .../test21Projects/twoFileSO/testDoubleSO.zip | Bin 0 -> 3430 bytes .../testplugin/ManagedBuildTestHelper.java | 279 ++++++++++++++- .../tests/suite/AllManagedBuildTests.java | 4 +- .../tests/ScannerConfigDiscoveryTests.java | 6 +- .../core/tests/ManagedBuildCoreTests.java | 6 +- .../core/tests/ManagedBuildCoreTests20.java | 34 +- .../tests/ManagedProject21MakefileTests.java | 307 +++++++++++++++++ .../core/tests/ManagedProjectUpdateTests.java | 63 +++- .../core/tests/ResourceBuildCoreTests.java | 47 +-- .../plugin.properties | 9 +- .../plugin.xml | 42 +++ .../schema/buildDefinitions.exsd | 10 +- .../managedbuilder/core/IAdditionalInput.java | 6 +- .../cdt/managedbuilder/core/IOutputType.java | 10 +- .../cdt/managedbuilder/core/ITool.java | 20 +- .../cdt/managedbuilder/core/IToolChain.java | 29 +- .../core/ManagedBuildManager.java | 29 +- .../internal/core/AdditionalInput.java | 11 +- .../internal/core/Configuration.java | 30 +- .../internal/core/InputType.java | 16 +- .../internal/core/ManagedBuildInfo.java | 11 +- .../internal/core/OutputType.java | 19 +- .../managedbuilder/internal/core/Tool.java | 75 +++- .../internal/core/ToolChain.java | 59 +++- .../internal/core/ToolReference.java | 4 + .../makegen/gnu/GnuMakefileGenerator.java | 324 ++++++++++++------ .../makegen/gnu/IManagedBuildGnuToolInfo.java | 11 +- .../makegen/gnu/ManagedBuildGnuToolInfo.java | 192 +++++++---- .../UpdateManagedProject21.java | 73 ++++ .../UpdateManagedProjectManager.java | 8 +- .../plugin.xml | 306 +++++++++++++---- .../internal/ui/ToolsSettingsBlock.java | 71 +++- 50 files changed, 1831 insertions(+), 454 deletions(-) create mode 100644 build/org.eclipse.cdt.managedbuilder.core.tests/resources/oldTypeProjects/2.1/test21.zip create mode 100644 build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/Benchmarks/makefile create mode 100644 build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/Benchmarks/objects.mk create mode 100644 build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/Benchmarks/sources.mk create mode 100644 build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/Benchmarks/subdir.mk create mode 100644 build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/f1.c create mode 100644 build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/f2.c create mode 100644 build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/test_ar.h create mode 100644 build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedLib/f1.c create mode 100644 build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedLib/f2.c create mode 100644 build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedLib/linkedLib.zip create mode 100644 build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedLib/test_ar.h create mode 100644 build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/multiResConfig/testResCfg.zip create mode 100644 build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/singleFileExe/testSingleExe.zip create mode 100644 build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/twoFileSO/testDoubleSO.zip create mode 100644 build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ManagedProject21MakefileTests.java create mode 100644 build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProject21.java diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/.classpath b/build/org.eclipse.cdt.managedbuilder.core.tests/.classpath index ec976833fce..14d41daf60e 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/.classpath +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/.classpath @@ -1,8 +1,24 @@ <?xml version="1.0" encoding="UTF-8"?> <classpath> - <classpathentry kind="src" path="tests"/> - <classpathentry kind="src" path="suite"/> - <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> - <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> + <classpathentry kind="src" path="tests"> + <attributes> + </attributes> + </classpathentry> + <classpathentry kind="src" path="suite"> + <attributes> + </attributes> + </classpathentry> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"> + <attributes> + </attributes> + </classpathentry> + <classpathentry excluding="tests/|suite/" kind="src" path=""> + <attributes> + </attributes> + </classpathentry> + <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"> + <attributes> + </attributes> + </classpathentry> <classpathentry kind="output" path="bin"/> </classpath> diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/plugin.xml b/build/org.eclipse.cdt.managedbuilder.core.tests/plugin.xml index f5f7d616476..e31ef0b4db0 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/plugin.xml +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/plugin.xml @@ -16,6 +16,7 @@ <import plugin="org.eclipse.core.resources"/> <import plugin="org.eclipse.ui"/> <import plugin="org.eclipse.ui.ide"/> + <import plugin="org.eclipse.compare"/> </requires> <!-- Managed Make Builder Tool Specifications - CDT 2.0 format --> @@ -1202,9 +1203,9 @@ <projectType isAbstract="false" - isTest="true" - name="testgnu.exe" - id="cdt.managedbuild.target.testgnu.exe"> + isTest="true" + name="testgnu21.exe" + id="cdt.managedbuild.target.testgnu21.exe"> <configuration name="Dbg" id="cdt.managedbuild.config.testgnu.exe.debug" @@ -1343,8 +1344,8 @@ <projectType isAbstract="false" isTest="true" - name="testgnu.so" - id="cdt.managedbuild.target.testgnu.so"> + name="testgnu21.so" + id="cdt.managedbuild.target.testgnu21.so"> <configuration name="Debug" cleanCommand="rm -rf" @@ -1511,9 +1512,9 @@ <projectType isTest="true" - name="testgnu.lib" + name="testgnu21.lib" isAbstract="false" - id="cdt.managedbuild.target.testgnu.lib"> + id="cdt.managedbuild.target.testgnu21.lib"> <configuration name="Dbg" artifactExtension="a" diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/oldTypeProjects/1.2/test12.zip b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/oldTypeProjects/1.2/test12.zip index f1a0046625e8072a605bd06dd31dc33975b249f1..d37ca3b4f20aa4b46d46d04335e12b6f9f25e915 100644 GIT binary patch literal 3820 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 R0#<+(2mnX@U-F3#_&<ZcetrM| literal 1844 zcmWIWW@Zs#U|`^2_*3d`$Yb2~>Ix$R!!~vX22O@52EF8zlBCkioRnafRE9l3Wk7Wa zTuySyDG8YZi3te?2@MSL3TY{<#*wa#E*Dk_OTO`6yLGwTZ7~`BzUaP*osEs13mY0) zb#xDYm>)QgQH3pNHG_)CfgHgO3uTuW4xg0{M?T!(G|E?P7U-(%axh~E4dG>Azay9G zm@f~(S3`aM9~+45QT`~eGyg%r@`b7*nv5G`!)`IlJH@_R_c=-O=i(xn7w^^|FXLFU zBG%!S-XZhnm1*<TllT59S*fy%J(_zl_nb+JZVP5=wmxJ1XZqW4#)Hd~@6P?xlyz$1 zo^8+gX8gX!5&7@R)Q_r9!r!fU`aoc-U&xf5-m4ZI;LDmWClJBp=EHO~c(KUU)W)?= z%+U|UWWqQ_bC+1hTV2T27F0czF7|D<J%{WGiIbN;R+LQXbGKy+oPRbueQ!mhw$|&0 zb?I`y_gvk$GV_V!^Lfh)OY~|J9d$G6*Qq!9$IU2CD^aaTUio?M(RshlMtlfg-6$g` z?|(^WwoI9qd2XU^efz7|Tim3S^A|AnCkSlqdCD?FgnRu#FZX8$tA);$&NEmn=G0W{ zE5><NspPNI&nI7Wr}n=8cq)AA4`z><w-)X_cr`=*d;X0;VLmCHsYkXnWUx*w;1^Pt zpT5^b>e}lm2Kg4>U*2|@r>@PnH}`(k=^c3-x0e;JW{TeaK3-ymy0&Bef9{S+DMntK z9~xMn*!8ELfByC5_DXivzYiY$@VxE6>L>9M&5*@=6z+dHw$JOExy1IXC;lJZ_crzZ z{Qly#x9zr?^t#_S<d_tGAktd({+ukv>FTrH-zf*6B)Z4nUYV^2CM|DZ!sCV}x`Lwo ztkmR^flGF^6Ap46GT>=@-}FA9YWwBc?dJ|U9BeiSkYBK^Fl2j4O6i&H+oM_erJsFK zfA~8}Y4g5y5$so@+BNTYn5H+}lI%`BwSM~HtkawC7AbE1$h(t0<NO-Wor{AS*5zDo z;?NFUozBsh;A118Go|GoGvBKl{HFekwGQ5i+h*i&vAAn<&5WZyb4<@In*T|;;2M|U zi;nW}39oYuKBjz{c=Nmaz8n9)KNl0-%kBC$TxatAK&Rh~s3EHM>|n`lV2E-tfif&G z8xMGJ_D(#T$D}CIdVSUpzO-*myNVi<lccBL-D1ZOm&ajsfMv$A{`drmvnveWS=|3? z$)2#={_dIji<PNow?$1%HFakW(@@@i_2csmH$rw-nWe7XoZj-GQ*KU{^P9esLp;|b z*uNxhO*83sIhfU}cBO}Jxyxy;`K+=lgO^KvysM-V`ovx4sar}=&zi|B3j^1>Gbv4o zcrN6c=k9*MN=2ymnYhjyF|BtG{K_<Y^=I`lF8;o+mFHkm#|2BByL&56OmTLI_j$MT z<<$e5y+yY9zj^&PbnkcJ&kyG;il1NiXZn9o&~t%`Mh3kycSEgZ-<)KCY!C(oeMxF@ ziC%I+0ew@lIkfNu6{4AWB?`HTnRyzT)x2DsMX4pFMR^Ja*1TM`yj%g^j7(zOxXOP) zkf#_J859_{HG)`3wE+vbHV6%2g%sB4=AdS2WOGV^NfKlZJVg>P2{kDrn{=ERXcB&7 la77EUF;1)uNRfo(8c-Mpc(byBe9i)d3c%v&A5bv^0|52gw+jFO diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/oldTypeProjects/2.0/test20.zip b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/oldTypeProjects/2.0/test20.zip index e783c848ce4817a238a8eb57f3a6a4f070e84256..fec4d8bd5be59124a7e8c05aec35e4e7392d6852 100644 GIT binary patch delta 3376 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 literal 9016 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 TV#Net0_-5`v;p!j0N}p>uTJ$J diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/oldTypeProjects/2.1/test21.zip b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/oldTypeProjects/2.1/test21.zip new file mode 100644 index 0000000000000000000000000000000000000000..57a52f38655ab8a4762f05bd39612a8ad84e24ac GIT binary patch literal 6770 zcmeHLc{r49`yL`P_H0=~A|rd*vM<@mPC}LjV;kF$t;JSjCtJ4c%9dn#ZLg)s#2~U| z&r+6BWGTt_Ox~K|H~rrKzQ4XXj)&)Xj{7{X`@Zh;zV7R~^t6r;(Sbl9Qc!SJmgw?* zGQ@EL5a=Nx2m}Vc3ff)scK3ukLG8Sg5_AkhgsH<<d$!qA$H7Y|<@lVW3#<yN%cDqC z#FGk}<i4D}Nur2M{gMrpwS`fK^;Vgs<(FfG)tYvlg1g`a0x|*mWX=Hd$M(bg^-}Wb zY8-rnRl>*nS+~!2H9)~5jhwrbZPzu!wG9_nwE`RFhFSfNtrZw15v_&sq*g}3Z`Gab zV^KJ>$z0YKm_lwG8_Y#muw4x9zXC<9%q5Se3RsB8Ac>2%ta#_D&PrClNTW21|E^ZA zt*^9KLfueo5a1-N<@VPO-;s^amEq|U3d#*L{_+l!9ra2>3D#L)<(efuriNahs+-&h z2c9(t1;>nA@>ZOY>)V2LK~|IRmL<{m?&vf96+#}ec&&BjPUQfV-f!Q@0KQ{=a0xmF z`0NefKT?eE{&8GTyrSDP4(f};(XXXdCK=zB)^o%ps!UX~oFU16MjFpl0aBB?K`?7l zUh;7p{-Zna)(7_bD^suhpy={qRH1nu!P&(4h9%D%0e)qh==F$=9xIx*W3rNicizW* zL7pgo;wN8q#YP$Jn2Zb=WY%$H%G5<BbIO4)7(NJDQW@hqZ9FGZ<H;ooDJi{2lw;VW zMtCaD>>cgJnmjIRHd>_WIt#<*alW2uT}nu_P+AW`Uh@`%C~+ib+jPZWYEL>7m0QfT z$DS@Whc^rAk8nPTZGX6!5gaH#_Z|K>2<re}zyUWQ-#RV<3%3KFqrl^819KC!(<<ZD z5O`_W*?m@@S5QavHAqBs{d}2U-Ss+!mGS4@G8NXg`u>$MN}j5=@xjRqafXGD^w3@H z#}fE71@tSz93_Ys=ZMG>2`PvT6s!brOr`-QRgIRB0)QzY;GqE?RfL<JHw^CPC4_ks z5wz?2Www(@l<z!!v0t6!SvnVbKDsJ;^0M0*xvvxYb7jKFI2w{uz(2Xk02UC)-6BWy z=gU8TFki9U*kv~Y<AhGEN_zn3MT{H-ItGlxoEcjL%;nmL<V)~$VNm<(y-hZL-SpxM zOm-pF_WJ2QgZcKwLoU+N)50bd@wdfyH_yf8YcMMP;H`zEJikG;w-&{2L2eHt%nI$X z<KAHit|1O3H)85~2;XJ8DYaGB`fh7g@aTXfjXVomOJBH;m<x}p#hQBPmiaD?qK9#Z z#<sDp@jNO`g!)d9v-ieyXt9DYDL7R;OM^R{csQQd`m`2Pqe}0SP+J}j+wx0n_FTP$ z2}QZ^iEb4=hQI{UPctUTE$-hVpbxXwV;NF~#BQLXJZrg2$wc%#nbiswE^ajQ_1)}_ zo)fsr%L65%QA`!qOl`<+EbpM88dhT1u|yMEFn&%XX|Mfe5ZT!s<5>1ZcDN4J42Q5O z(wz24j=X?YfDx#D*B@_uDd$QzL3w8)tzp>>J^w6XA!*0ngmiRV!?=Y*ohU^)DUC?G z@&fTYfAbesyh-FY*Uf?(yF*X%$n;8lNRKB@D&>A0y;D6w6#t>FMknxrKuvc(VMhm% zQ!e*a3G=77kf+hzGkrTCpUa$_;%zaj{w0YE=OoOUf<&IKkoLLS-$iR&lxzRUyfivW zQz49;pH)QGFy%xZL!8(c;%v1Pkmp4!(~OnHNsjo6C~dnYkl3cd;&mxUKl_|fNtAqU zLs?@A5n>EKT3IVIv+=k(O}5y#S~%0To>YIyF4R?(k!~veep7>~P~hH}?~7BGJT+JM z1Z#WNEe066m5W@a-8$XQeYxN2&Fb@(b}|XkFwq#Tr}Rk8Wi?-?(W|n|L><z)@MI>d zGJ1=&nvG6Bh4z7nw(ez=bgtXF(p%dX<E1rTDrdJA9>3by(qE3;y^7K0zJ65-3J>TP z6U&vLZg!5YHlEI2LfC<)eDe<sq(3<Dpyv0vI}e?WlK@1=&j{-3E@TAt^7i`qS5!nu z&<pDA4RdqAHJ7TBd%zs~AFz1mnt2Ee`FAkB`IBoOoCEV8XjGuK2nQTj9mbvhe{uLM zAC4-2^4vk}{_Tv3G+&WiF~1@WEnxk3q`4|8VrygPjBx*NgdF#58k1-Cw$Hg^RjxlC zWT&Asg=U0aoi{ShDm`(;W29EqluGv@8Bs{ZE!gaRBU>|fHYA~HWoWC`7gjA^d%{x- z-(K5@ukmyE@qHUYYZF0R&mckUZqQ@oFCLqPFG=k=-u`MZo6^ned!?<I`UrQChmn(& z(OwDR?u&8t$+a+B16698&|`U_b>NrFPUD~41+G1r8su+5&|LD<3oH?;zT3TWcSv)} zD>ME3PI5mDog%G6-NOO$L<aZg?Ct21l>yaPAKXXE>KZ-{S;&<-TGher!{X4HM#SX7 zD(+H7k2G3Nml(R27a>-{3{amWV!1oJwBOsbtp^VLed4kn%6#q3UsuO;s7JG$$DVJE z+IDI4S-WUw^O&z8^2ETY>iylUlucCDDfG0qTr1n<wVE(FuaLnp#&caUpb7i%kqo0b z!<F)!tV}in@I5oRlZlRzH1(-^Df)0W+VR1)kbW7uClh4IkRV2`&?z22j>7v4i*s>o za9<@Aq%!M*bwJXZr;Q^=K-Y1rJ@b;$JbzR00HiRIx<F2K#NJ!+bJP9NhJcN>t>z$K z{(h+K&c>?evP`d-Ypaa+%cCE|SHzVcoX~z@b4GB+@^bAMdW@7i(f|3T?wjY*XU3eu z5@}sdvV4S$U60ipQ=~yaKA(6tmzdPZwInWdTF|E(?If*M<q7}6Y<ZKt`tOlFV(e8| ze@LL1>liCgm>bL+X5;cdeg03M|8;%hzqT-64_;CGf%cwjzNiNyFAow(<L?{+fiOWD z=Q_g1W-o;8HJGQMt8<xwrSq6DT~K-J-b~bKbQ=%c4sHXvJU}JR3;AFz6q2J}DPX_M z9OMno+iM!8<XqnDSA>$AZe@7Mi!sZtqMp*o6{?p-nV<?sBVJ0*LeDc7xN6@%7o10$ z=Nj0$;vnZIZj>!nx@<rmryF9xy3%hLX_jtHjbttykAJI#BKG-0DvlCo_U*q?2h&!_ zD*JnCvefOf({1?Z_B`5u7rMD{N=mHr=(1%_-#g0(HzwC_Xq8FBHFv=6>?^}jALyPB z1qoe{ZoW~ezIrhz_MO2XDJ-u{f-hkzSBJB*XgN(FaH&KHwR)klTq%2wUfMPE6l2pw zzN1nWo2U+1+U(THGhr{E<`w9R+4$E}4a4t^vKNx99PeExvGcMhH<^xo6La~8!lT4s zv*xgelgfefTLi5!m13NoFYk8z#Ww`*fHlsIG<}rkmXuq7uu+VL&blRgxjBnKzC;Ph z@JFSb%aA$hlg2qPNWYgtJxneCAhEXBZ%uO2<`m=5sNVY66ny3}(x(2(yCc|OBn9L@ z%5O50`hZOoB?5ttAKXM&8)v9J%mrFz&>E92Of4%!yC-a1sToIBvU#_v|ESWK5vr05 z`C8WaC>4^$uBfB*P4g<~a+r}Z<={8MS-*4e$@M5zcz}fi(bJBlh|BuIkefTwMvkc$ zDGTD5S}a2P8REb@F@5krix-F?SpDr!Cxf%219Qkm-9tZD>0I}vm$sIO&};MAHjWgh z-!62qGvMHUPrGt5XDAv{5zcikU!7GW<;`t9OHp{}Tnjm2QF6rjkFTb0tsAi!-HBAJ zbUlBy^y#O~ADiWFo`U3@jRY$1<SQzIGI{BLgf3n;zrqz`Bzq}Kv^QYYvT8-pl7yad z9x-~}DJTIY1(6c3Ia(<BzQbp);Fa;&$Ep?PTEUI)gT0-N2ig_3!RLbK6UL>+YHaN9 zTszwoL|VeT(^<VsJuS4tncmD?-$Q-8zY6w6Z2f%$I$>i=&^<GqgnyHnM_+5~8(f+p zSYEqll(<?}Pdv2OgIt6^>_WEG5ub|$)61MQ@?Uw)1aq^tZaRH~$-VL)3@}H2U+NQH zjMhMzczMQJKu(L&({>kaUGaOIQRI8_(ml9F<3x8ZRB1d#d}^DqETl+ian_6U3r8QK zz*4q9E!)X2m>)Ut;;YLptJM_q&V^BStN_43k|)rIfan4nzYIKw@>;kprlsKp99~0{ zLc!^I0~2?C0aULJKT2D-8};b5&Ly;#fF{3&j=p+Vx5l8MJIb`POGsZ`2gR>XR9q-J zJ^yxo?Xx$TNkt{Gh;oQ!$lKk_Muk9}>J*cK=d{~}RRP9h0TmvafEOI$X$Qqjpe(kR ztWB7_V>Rq=<!cT>pw?$UjP!_JEVP6O*9g|P)hMO&1q3XQ*i3FIPIslmeF6s~+Ao80 zxF$^VuMHw*H^YvkMO54_T5=~rhASSo&U2itHDz$fXoqICORZ3~T()9>@l{^*+)Wo; zdoR<VlK=F$FAZa@aQ$7W?HQy*8ck^l3sf&*6RoBXHj(D?$gS#=*3#oT?^vK;T?BuX zy=SI^f~1$rj`R$_qDV+QS-O=GM1b`(CR(z4o~{Z8mS_M(OH2&KiI#tkk-inR6^W%V z)59^6!fr2Un3Bhv$}U8cbS|K0ux`uZ5>Ic#noIB&#Nce6aV2asSG4E)iD*?Ai{W&_ zG;f<D%T?i>`=(hG^o|tE^>jz_2eRqz1S~$fSgIp@SB1jxq`F7W93hE6QNuNsXp+UU zaWNi_Uh%1qtKwVNtJ{WMzOA`6>^4d|7a+ovgld|$&j-sF3}s3b1gUszrg0sK-d-zl zu(F!?k@-l?eyT0WNKEMsY&kk&Zp+c|F6&~wJ=KG6Z#CEM1ecXi^ZK<bvgCALg!@9$ z;vAj^Co_Q`(DU``4yg`?er->ELlrKyx}dhgb!9#C33s^!%csH`yJUF-z5<RKI7e|U z_0{XIsabii91kvya*QgmZL-ZMbiUEhyVFaTkyXicCM3;${Fy%rU1}d@^@)TfWYPcj zdQl6fgI;~zj2DFm`19-o?*R0A(JC9;SL;j)vAvGG*_)E#Uv0dbf9~1-O?bGF!SrhW zt=OUdJqCLL>S+-W(*4|V{LMoE0wMr$VEzF=oK_+(5MSpEGkhN?1IX%E9}O3Uuib=2 z$pYP&{pJ%c24BAji>UxG*rj3KfbP*geBWz_i?{u+7y^uM$N}wR;kah;wTQ50&jYyM zSu(CUd=)$fwr{SR_`os41>&pdvA~Ukz{6ACUlhIyA4|at=;hz)eT*>nx$sr|Sgvb- z;KB(ZxNF1L0l<>w{5u)`^&UPDn2rFJ_Wd7de;pa@S`YJJIs{lA4ifx++vmYQv%{jp zB%@eH+dnWK=K6C70mHR_(y{=q-$MM|Prwy2z5)-6mj|{Ri~pzG!`-{XqB?kfrhw)t zZZ?jMEco(qtXUF@0|x=S^4~WP?h^2&g;=g`$^%@#l0;krd}#%i01ZR}9OYt@3|tC) zi2;^E7bu%?D6nY)E(N|z7fT@qw1#jgew8Wv4Et_BtW-ea|NJn)Y!OJ8|6Sdfk^4W) Z8wDV;|Epx;pTtZcCJ-m^CXEpy=s!Dt<Ffz& literal 0 HcmV?d00001 diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/Benchmarks/makefile b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/Benchmarks/makefile new file mode 100644 index 00000000000..35ecf0d02bc --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/Benchmarks/makefile @@ -0,0 +1,43 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +ROOT := .. + +-include $(ROOT)/makefile.init + +RM := rm -rf + +# All of the sources participating in the build are defined here +-include sources.mk +-include $(SUBDIRS:%=%/subdir.mk) +-include objects.mk +ifneq ($(strip $(DEPS)),) +-include $(DEPS) +endif + +-include $(ROOT)/makefile.defs + +# Add inputs and outputs from these tool invocations to the build variables + +# All Target +all: lib.a + +# Tool invocations +lib.a: $(OBJS) $(USER_OBJS) + @echo 'Building target: $@' + @echo 'Invoking: archiver.gnu' + @echo ar -r lib.a $(OBJS) $(USER_OBJS) $(LIBS) + @ar -r lib.a $(OBJS) $(USER_OBJS) $(LIBS) + @echo 'Finished building target: $@' + @echo ' ' + +# Other Targets +clean: + -$(RM) $(OBJS)$(DEPS) lib.a + -@echo ' ' + +.PHONY: all clean dependents +.SECONDARY: + +-include $(ROOT)/makefile.targets diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/Benchmarks/objects.mk b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/Benchmarks/objects.mk new file mode 100644 index 00000000000..eae6a31b65d --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/Benchmarks/objects.mk @@ -0,0 +1,7 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +LIBS := + +USER_OBJS := \ No newline at end of file diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/Benchmarks/sources.mk b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/Benchmarks/sources.mk new file mode 100644 index 00000000000..754c6cdd840 --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/Benchmarks/sources.mk @@ -0,0 +1,15 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +C_SRCS := +S_UPPER_SRCS := +O_SRCS := +S_SRCS := +OBJS := +DEPS := + +# Every subdirectory with source files must be described here +SUBDIRS := \ +. \ + diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/Benchmarks/subdir.mk b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/Benchmarks/subdir.mk new file mode 100644 index 00000000000..b7f88c05d88 --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/Benchmarks/subdir.mk @@ -0,0 +1,34 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_SRCS += \ +$(ROOT)/f1.c \ +$(ROOT)/f2.c + +OBJS += \ +${addprefix ./, \ +f1.o \ +f2.o \ +} + +DEPS += \ +${addprefix ./, \ +f1.d \ +f2.d \ +} + + +# Each subdirectory must supply rules for building sources it contributes +%.o: $(ROOT)/%.c + @echo 'Building file: $<' + @echo 'Invoking: compiler.gnu.c' + @echo gcc -O0 -g3 -Wall -c -fmessage-length=0 -o$@ $< + @gcc -O0 -g3 -Wall -c -fmessage-length=0 -o$@ $< && \ + echo -n $(@:%.o=%.d) $(dir $@) > $(@:%.o=%.d) && \ + gcc -MM -MG -P -w -O0 -g3 -Wall -c -fmessage-length=0 $< >> $(@:%.o=%.d) + @echo 'Finished building: $<' + @echo ' ' + + diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/f1.c b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/f1.c new file mode 100644 index 00000000000..5e77893b8a6 --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/f1.c @@ -0,0 +1,8 @@ +#include <stdio.h> +#include "test_ar.h" + +void f1_ar() +{ + printf ( "Hello from f1_ar.\n" ) ; + return ; +} diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/f2.c b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/f2.c new file mode 100644 index 00000000000..56e2c730d4d --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/f2.c @@ -0,0 +1,8 @@ +#include <stdio.h> +#include "test_ar.h" + +void f2_ar() +{ + printf ( "Hello from f2_ar.\n" ) ; + return ; +} diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/test_ar.h b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/test_ar.h new file mode 100644 index 00000000000..55e38f0d5ac --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedFolder/test_ar.h @@ -0,0 +1,2 @@ +void f1_ar() ; +void f2_ar() ; diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedLib/f1.c b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedLib/f1.c new file mode 100644 index 00000000000..5e77893b8a6 --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedLib/f1.c @@ -0,0 +1,8 @@ +#include <stdio.h> +#include "test_ar.h" + +void f1_ar() +{ + printf ( "Hello from f1_ar.\n" ) ; + return ; +} diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedLib/f2.c b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedLib/f2.c new file mode 100644 index 00000000000..56e2c730d4d --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedLib/f2.c @@ -0,0 +1,8 @@ +#include <stdio.h> +#include "test_ar.h" + +void f2_ar() +{ + printf ( "Hello from f2_ar.\n" ) ; + return ; +} diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedLib/linkedLib.zip b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedLib/linkedLib.zip new file mode 100644 index 0000000000000000000000000000000000000000..c13a0f08a7770d5ebb61d2e7dc4ca308634a408b GIT binary patch literal 3037 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 Z|G$DXMln(Sqp?pA@Rgd7aT*H){tI~?>P!Ft literal 0 HcmV?d00001 diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedLib/test_ar.h b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedLib/test_ar.h new file mode 100644 index 00000000000..55e38f0d5ac --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/linkedLib/test_ar.h @@ -0,0 +1,2 @@ +void f1_ar() ; +void f2_ar() ; diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/multiResConfig/testResCfg.zip b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/multiResConfig/testResCfg.zip new file mode 100644 index 0000000000000000000000000000000000000000..d60c3f775ceb3ef8f67dc3b1e8654350d541763b GIT binary patch literal 7101 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 D@xgt$ literal 0 HcmV?d00001 diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/singleFileExe/testSingleExe.zip b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/singleFileExe/testSingleExe.zip new file mode 100644 index 0000000000000000000000000000000000000000..e8ba2abbf1fad6feec77cf94e4a74f32462f5dc0 GIT binary patch literal 3168 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 literal 0 HcmV?d00001 diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/twoFileSO/testDoubleSO.zip b/build/org.eclipse.cdt.managedbuilder.core.tests/resources/test21Projects/twoFileSO/testDoubleSO.zip new file mode 100644 index 0000000000000000000000000000000000000000..c4e8bd95c9d3bcb1a9d90f3e6633896bf796bc4a GIT binary patch literal 3430 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 literal 0 HcmV?d00001 diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/managedbuilder/testplugin/ManagedBuildTestHelper.java b/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/managedbuilder/testplugin/ManagedBuildTestHelper.java index b867f1f4163..cf40dbf8c39 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/managedbuilder/testplugin/ManagedBuildTestHelper.java +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/managedbuilder/testplugin/ManagedBuildTestHelper.java @@ -1,5 +1,5 @@ /********************************************************************** - * Copyright (c) 2004 Intel Corporation and others. + * Copyright (c) 2004, 2005 Intel Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at @@ -11,6 +11,8 @@ package org.eclipse.cdt.managedbuilder.testplugin; import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.zip.ZipFile; @@ -18,23 +20,37 @@ import java.util.zip.ZipFile; import junit.framework.Assert; import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.ICDescriptor; +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; +import org.eclipse.cdt.managedbuilder.core.IManagedProject; +import org.eclipse.cdt.managedbuilder.core.IProjectType; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.cdt.managedbuilder.core.ManagedBuilderCorePlugin; +import org.eclipse.cdt.managedbuilder.core.ManagedCProjectNature; import org.eclipse.cdt.make.core.MakeCorePlugin; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; +import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.IWorkspaceDescription; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.ui.dialogs.IOverwriteQuery; import org.eclipse.ui.wizards.datatransfer.ImportOperation; import org.eclipse.ui.wizards.datatransfer.ZipFileStructureProvider; +//import org.eclipse.compare.structuremergeviewer.Differencer; +//import org.eclipse.compare.ResourceNode;; public class ManagedBuildTestHelper { + /* (non-Javadoc) * Create a new project named <code>name</code> or return the project in * the workspace of the same name if it exists. @@ -43,19 +59,23 @@ public class ManagedBuildTestHelper { * @return * @throws CoreException */ - static public IProject createProject(String name) throws CoreException { + static public IProject createProject(String name, IPath location, String projectId, String projectTypeId) throws CoreException { IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); IProject newProjectHandle = root.getProject(name); IProject project = null; if (!newProjectHandle.exists()) { - IWorkspace workspace = ResourcesPlugin.getWorkspace(); - IWorkspaceDescription workspaceDesc = workspace.getDescription(); - workspaceDesc.setAutoBuilding(false); - workspace.setDescription(workspaceDesc); - IProjectDescription description = workspace.newProjectDescription(newProjectHandle.getName()); - //description.setLocation(root.getLocation()); - project = CCorePlugin.getDefault().createCProject(description, newProjectHandle, new NullProgressMonitor(), MakeCorePlugin.MAKE_PROJECT_ID); + if (projectId.equals(ManagedBuilderCorePlugin.MANAGED_MAKE_PROJECT_ID)) { + project = createNewManagedProject(newProjectHandle, name, location, projectId, projectTypeId); + } else { + IWorkspace workspace = ResourcesPlugin.getWorkspace(); + IWorkspaceDescription workspaceDesc = workspace.getDescription(); + workspaceDesc.setAutoBuilding(false); + workspace.setDescription(workspaceDesc); + IProjectDescription description = workspace.newProjectDescription(newProjectHandle.getName()); + //description.setLocation(root.getLocation()); + project = CCorePlugin.getDefault().createCProject(description, newProjectHandle, new NullProgressMonitor(), MakeCorePlugin.MAKE_PROJECT_ID); + } } else { newProjectHandle.refreshLocal(IResource.DEPTH_INFINITE, null); project = newProjectHandle; @@ -94,15 +114,20 @@ public class ManagedBuildTestHelper { } } - static public IProject createProject(String projectName, File zip) throws CoreException, InvocationTargetException, IOException { + static public IProject createProject(String projectName, File zip, IPath location, String projectTypeId) throws CoreException, InvocationTargetException, IOException { IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot(); IProject project= root.getProject(projectName); if (project.exists()) removeProject(projectName); - importFilesFromZip(new ZipFile(zip),project.getFullPath(),null); + IPath destPath = (location != null) ? + location : + project.getFullPath(); + if (zip != null) { + importFilesFromZip(new ZipFile(zip), destPath, null); + } - return createProject(projectName); + return createProject(projectName, location, ManagedBuilderCorePlugin.MANAGED_MAKE_PROJECT_ID, projectTypeId); } static public void importFilesFromZip(ZipFile srcZipFile, IPath destPath, IProgressMonitor monitor) throws InvocationTargetException { @@ -116,6 +141,234 @@ public class ManagedBuildTestHelper { op.run(monitor); } catch (InterruptedException e) { // should not happen + Assert.assertTrue(false); } } -} + + static public IProject createNewManagedProject(IProject newProjectHandle, String name, IPath location, + String projectId, String projectTypeId) throws CoreException { + // Create the base project + IProject project = null; + IWorkspace workspace = ResourcesPlugin.getWorkspace(); + IWorkspaceDescription workspaceDesc = workspace.getDescription(); + workspaceDesc.setAutoBuilding(false); + workspace.setDescription(workspaceDesc); + IProjectDescription description = workspace.newProjectDescription(newProjectHandle.getName()); + if (location != null) { + description.setLocation(location); + } + project = CCorePlugin.getDefault().createCProject(description, newProjectHandle, new NullProgressMonitor(), projectId); + // Add the managed build nature and builder + addManagedBuildNature(project); + + // Find the base project type definition + IProjectType[] projTypes = ManagedBuildManager.getDefinedProjectTypes(); + IProjectType projType = ManagedBuildManager.getProjectType(projectTypeId); + Assert.assertNotNull(projType); + + // Create the managed-project (.cdtbuild) for our project that builds an executable. + IManagedProject newProject = null; + try { + newProject = ManagedBuildManager.createManagedProject(project, projType); + } catch (Exception e) { + Assert.fail("Failed to create managed project for: " + project.getName()); + } + Assert.assertEquals(newProject.getName(), projType.getName()); + Assert.assertFalse(newProject.equals(projType)); + ManagedBuildManager.setNewProjectVersion(project); + // Copy over the configs + IConfiguration defaultConfig = null; + IConfiguration[] configs = projType.getConfigurations(); + for (int i = 0; i < configs.length; ++i) { + // Make the first configuration the default + if (i == 0) { + defaultConfig = newProject.createConfiguration(configs[i], projType.getId() + "." + i); + } else { + newProject.createConfiguration(configs[i], projType.getId() + "." + i); + } + } + ManagedBuildManager.setDefaultConfiguration(project, defaultConfig); + + // Initialize the path entry container + IStatus initResult = ManagedBuildManager.initBuildInfoContainer(project); + if (initResult.getCode() != IStatus.OK) { + Assert.fail("Initializing build information failed for: " + project.getName() + " because: " + initResult.getMessage()); + } + return project; + } + + static public void addManagedBuildNature (IProject project) { + // Create the buildinformation object for the project + IManagedBuildInfo info = ManagedBuildManager.createBuildInfo(project); + info.setValid(true); + + // Add the managed build nature + try { + ManagedCProjectNature.addManagedNature(project, new NullProgressMonitor()); + ManagedCProjectNature.addManagedBuilder(project, new NullProgressMonitor()); + } catch (CoreException e) { + Assert.fail("Test failed on adding managed build nature or builder: " + e.getLocalizedMessage()); + } + + // Associate the project with the managed builder so the clients can get proper information + ICDescriptor desc = null; + try { + desc = CCorePlugin.getDefault().getCProjectDescription(project, true); + desc.remove(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID); + desc.create(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID, ManagedBuildManager.INTERFACE_IDENTITY); + } catch (CoreException e) { + Assert.fail("Test failed on adding managed builder as scanner info provider: " + e.getLocalizedMessage()); + } + try { + desc.saveProjectData(); + } catch (CoreException e) { + Assert.fail("Test failed on saving the ICDescriptor data: " + e.getLocalizedMessage()); } + } + + static public void compareBenchmarks(IProject project, IPath testDir, IPath[] files) { + try { + project.refreshLocal(IResource.DEPTH_INFINITE, null); + } catch (Exception e) { + Assert.fail("File " + files[0].lastSegment() + " - project refresh failed."); + } + for (int i=0; i<files.length; i++) { + IPath testFile = testDir.append(files[i]); + IPath benchmarkFile = Path.fromOSString("Benchmarks/" + files[i]); + StringBuffer testBuffer = readContentsStripLineEnds(project, testFile); + StringBuffer benchmarkBuffer = readContentsStripLineEnds(project, benchmarkFile); + if (!testBuffer.toString().equals(benchmarkBuffer.toString())) { + Assert.fail("File " + testFile.lastSegment() + " does not match its benchmark."); + } + } + } + + static public StringBuffer readContentsStripLineEnds(IProject project, IPath path) { + StringBuffer buff = new StringBuffer(); + IFile file = project.getFile(path); + IWorkspaceRoot root = project.getWorkspace().getRoot(); + IPath fullPath = root.getLocation(); + fullPath = fullPath.append(file.getFullPath()); + try { + FileReader input = null; + try { + input = new FileReader(fullPath.toFile()); + } catch (Exception e) { + Assert.fail("File " + fullPath.toString() + " could not be read."); + } + //InputStream input = file.getContents(true); + int c; + do { + c = input.read(); + if (c == -1) break; + if (c != '\r' && c != '\n') { + buff.append((char)c); + } + } while (c != -1); + input.close(); + } catch (Exception e) { + Assert.fail("File " + file.toString() + " could not be read."); + } + return buff; + } + + static public IPath copyFilesToTempDir(IPath srcDir, IPath tmpSubDir, IPath[] files) { + IPath tmpSrcDir = null; + String userDirStr = System.getProperty("user.home"); + if (userDirStr != null) { + IPath userDir = Path.fromOSString(userDirStr); + tmpSrcDir = userDir.append(tmpSubDir); + if (userDir.toString().equalsIgnoreCase(tmpSrcDir.toString())) { + Assert.fail("Temporary sub-directory cannot be the empty string."); + } else { + File tmpSrcDirFile = tmpSrcDir.toFile(); + if (tmpSrcDirFile.exists()) { + // Make sure that this is the expected directory before we delete it... + if (tmpSrcDir.lastSegment().equals(tmpSubDir.lastSegment())) { + deleteDirectory(tmpSrcDirFile); + } else { + Assert.fail("Temporary directory " + tmpSrcDirFile.toString() + " already exists."); + } + } + boolean succeed = tmpSrcDirFile.mkdir(); + if (succeed) { + for (int i=0; i<files.length; i++) { + IPath file = files[i]; + IPath srcFile = srcDir.append(file); + FileReader srcReader = null; + try { + srcReader = new FileReader(srcFile.toFile()); + } catch (Exception e) { + Assert.fail("File " + file.toString() + " could not be read."); + } + if (file.segmentCount() > 1) { + IPath newDir = tmpSrcDir; + do { + IPath dir = file.uptoSegment(1); + newDir = newDir.append(dir); + file = file.removeFirstSegments(1); + succeed = newDir.toFile().mkdir(); + } while (file.segmentCount() > 1); + } + IPath destFile = tmpSrcDir.append(files[i]); + FileWriter writer = null; + try { + writer = new FileWriter(destFile.toFile()); + } catch (Exception e) { + Assert.fail("File " + files[i].toString() + " could not be written."); + } + try { + int c; + do { + c = srcReader.read(); + if (c == -1) break; + writer.write(c); + } while (c != -1); + srcReader.close(); + writer.close(); + } catch (Exception e) { + Assert.fail("File " + file.toString() + " could not be copied."); + } + } + } + } + } + return tmpSrcDir; + } + + static public void deleteTempDir(IPath tmpSubDir, IPath[] files) { + IPath tmpSrcDir = null; + String userDirStr = System.getProperty("user.home"); + if (userDirStr != null) { + IPath userDir = Path.fromOSString(userDirStr); + tmpSrcDir = userDir.append(tmpSubDir); + if (userDir.toString().equalsIgnoreCase(tmpSrcDir.toString())) { + Assert.fail("Temporary sub-directory cannot be the empty string."); + } else { + File tmpSrcDirFile = tmpSrcDir.toFile(); + if (!tmpSrcDirFile.exists()) { + Assert.fail("Temporary directory " + tmpSrcDirFile.toString() + " does not exist."); + } else { + boolean succeed; + for (int i=0; i<files.length; i++) { + // Delete the file + IPath thisFile = tmpSrcDir.append(files[i]); + succeed = thisFile.toFile().delete(); + } + // Delete the dir + succeed = tmpSrcDirFile.delete(); + } + } + } + } + + static private void deleteDirectory(File dir) { + File[] toDelete = dir.listFiles(); + for (int i=0; i<toDelete.length; i++) { + File fileToDelete = toDelete[i]; + if (fileToDelete.isDirectory()) { + deleteDirectory(fileToDelete); + } + fileToDelete.delete(); + } + } +} \ No newline at end of file diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/managedbuilder/tests/suite/AllManagedBuildTests.java b/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/managedbuilder/tests/suite/AllManagedBuildTests.java index b6b3f3729de..6e2ba27f8d1 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/managedbuilder/tests/suite/AllManagedBuildTests.java +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/managedbuilder/tests/suite/AllManagedBuildTests.java @@ -1,5 +1,5 @@ /********************************************************************** - * Copyright (c) 2004 IBM Corporation and others. + * Copyright (c) 2004, 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at @@ -16,6 +16,7 @@ import org.eclipse.cdt.managedbuild.core.tests.ManagedBuildCoreTests20; import org.eclipse.cdt.managedbuild.core.tests.ManagedCommandLineGeneratorTest; import org.eclipse.cdt.managedbuild.core.tests.ManagedProjectUpdateTests; import org.eclipse.cdt.managedbuild.core.tests.ResourceBuildCoreTests; +import org.eclipse.cdt.managedbuild.core.tests.ManagedProject21MakefileTests; import junit.framework.Test; import junit.framework.TestSuite; @@ -38,6 +39,7 @@ public class AllManagedBuildTests { suite.addTest(ManagedProjectUpdateTests.suite()); suite.addTest(ManagedCommandLineGeneratorTest.suite()); suite.addTest(ResourceBuildCoreTests.suite()); + suite.addTest(ManagedProject21MakefileTests.suite()); //$JUnit-END$ return suite; } diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/standardbuilder/core/tests/ScannerConfigDiscoveryTests.java b/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/standardbuilder/core/tests/ScannerConfigDiscoveryTests.java index d6eb36c4b05..23d94685777 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/standardbuilder/core/tests/ScannerConfigDiscoveryTests.java +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/suite/org/eclipse/cdt/standardbuilder/core/tests/ScannerConfigDiscoveryTests.java @@ -1,5 +1,5 @@ /********************************************************************** - * Copyright (c) 2004 IBM Corporation and others. + * Copyright (c) 2004, 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at @@ -18,6 +18,7 @@ import junit.framework.TestCase; import org.eclipse.cdt.core.CCProjectNature; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.parser.IScannerInfo; +import org.eclipse.cdt.make.core.MakeCorePlugin; import org.eclipse.cdt.make.core.MakeProjectNature; import org.eclipse.cdt.make.core.scannerconfig.ScannerConfigNature; import org.eclipse.cdt.make.internal.core.scannerconfig2.PerProjectSICollector; @@ -25,6 +26,7 @@ import org.eclipse.cdt.managedbuilder.testplugin.ManagedBuildTestHelper; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; @@ -48,7 +50,7 @@ public class ScannerConfigDiscoveryTests extends TestCase { protected void setUp() throws Exception { fMonitor = new NullProgressMonitor(); - fCProject = ManagedBuildTestHelper.createProject("SCD"); + fCProject = ManagedBuildTestHelper.createProject("SCD", (IPath)null, MakeCorePlugin.MAKE_PROJECT_ID, null); fCFile = fCProject.getProject().getFile("main.c"); if (!fCFile.exists()) { fCFile.create(new ByteArrayInputStream(" \n".getBytes()), false, fMonitor); diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ManagedBuildCoreTests.java b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ManagedBuildCoreTests.java index d49761a8e25..2707426e40b 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ManagedBuildCoreTests.java +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ManagedBuildCoreTests.java @@ -54,11 +54,11 @@ public class ManagedBuildCoreTests extends TestCase { */ public void testLoadManifest() throws Exception { IProjectType[] projTypes = ManagedBuildManager.getDefinedProjectTypes(); - exeType = ManagedBuildManager.getProjectType("cdt.managedbuild.target.testgnu.exe"); + exeType = ManagedBuildManager.getProjectType("cdt.managedbuild.target.testgnu21.exe"); checkExeProjectType(exeType); - dllType = ManagedBuildManager.getProjectType("cdt.managedbuild.target.testgnu.so"); + dllType = ManagedBuildManager.getProjectType("cdt.managedbuild.target.testgnu21.so"); checkSoProjectType(dllType); - libType = ManagedBuildManager.getProjectType("cdt.managedbuild.target.testgnu.lib"); + libType = ManagedBuildManager.getProjectType("cdt.managedbuild.target.testgnu21.lib"); checkLibProjectType(libType); } diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ManagedBuildCoreTests20.java b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ManagedBuildCoreTests20.java index b8124804171..49df8c72dc1 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ManagedBuildCoreTests20.java +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ManagedBuildCoreTests20.java @@ -20,7 +20,6 @@ import junit.framework.TestCase; import junit.framework.TestSuite; import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.ICDescriptor; import org.eclipse.cdt.core.parser.CodeReader; import org.eclipse.cdt.core.parser.IParser; import org.eclipse.cdt.core.parser.IScanner; @@ -62,6 +61,7 @@ import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; +import org.eclipse.cdt.managedbuilder.testplugin.ManagedBuildTestHelper; /* * These tests exercise CDT 2.0 manifest file functionality @@ -505,7 +505,7 @@ public class ManagedBuildCoreTests20 extends TestCase { try { project = createProject(projectName); // Now associate the builder with the project - addManagedBuildNature(project); + ManagedBuildTestHelper.addManagedBuildNature(project); IProjectDescription description = project.getDescription(); // Make sure it has a managed nature if (description != null) { @@ -731,34 +731,6 @@ public class ManagedBuildCoreTests20 extends TestCase { assertEquals(4, i); } - private void addManagedBuildNature (IProject project) { - // Create the buildinformation object for the project - IManagedBuildInfo info = ManagedBuildManager.createBuildInfo(project); - info.setValid(true); - - // Add the managed build nature - try { - ManagedCProjectNature.addManagedNature(project, new NullProgressMonitor()); - ManagedCProjectNature.addManagedBuilder(project, new NullProgressMonitor()); - } catch (CoreException e) { - fail("Test failed on adding managed build nature or builder: " + e.getLocalizedMessage()); - } - - // Associate the project with the managed builder so the clients can get proper information - ICDescriptor desc = null; - try { - desc = CCorePlugin.getDefault().getCProjectDescription(project, true); - desc.remove(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID); - desc.create(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID, ManagedBuildManager.INTERFACE_IDENTITY); - } catch (CoreException e) { - fail("Test failed on adding managed builder as scanner info provider: " + e.getLocalizedMessage()); - } - try { - desc.saveProjectData(); - } catch (CoreException e) { - fail("Test failed on saving the ICDescriptor data: " + e.getLocalizedMessage()); } - } - /** * Tests the tool settings through the interface the makefile generator * uses. @@ -1772,7 +1744,7 @@ public class ManagedBuildCoreTests20 extends TestCase { try { project = createProject(projectName2); // Now associate the builder with the project - addManagedBuildNature(project); + ManagedBuildTestHelper.addManagedBuildNature(project); IProjectDescription description = project.getDescription(); // Make sure it has a managed nature if (description != null) { diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ManagedProject21MakefileTests.java b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ManagedProject21MakefileTests.java new file mode 100644 index 00000000000..cf7fff5248a --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ManagedProject21MakefileTests.java @@ -0,0 +1,307 @@ +/********************************************************************** + * Copyright (c) 2005 Intel Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * Intel Corporation - Initial API and implementation + **********************************************************************/ + +/********************************************************************** + * These tests are for a 2.1 style tool integration. That is, the + * tool integration does not use any 3.0 elements or attributes, + * including InputType, OutputType, etc. + **********************************************************************/ + +package org.eclipse.cdt.managedbuild.core.tests; + +import java.io.File; +import java.io.FileFilter; +import java.util.ArrayList; + +import junit.framework.Test; +import junit.framework.TestCase; +import junit.framework.TestSuite; + +import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.cdt.managedbuilder.projectconverter.UpdateManagedProjectManager; +import org.eclipse.cdt.managedbuilder.testplugin.CTestPlugin; +import org.eclipse.cdt.managedbuilder.testplugin.ManagedBuildTestHelper; +import org.eclipse.core.resources.*; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.OperationCanceledException; +import org.eclipse.core.runtime.Path; +import org.eclipse.ui.dialogs.IOverwriteQuery; + +public class ManagedProject21MakefileTests extends TestCase { + public static final String MBS_TEMP_DIR = "MBSTemp"; + + static boolean pathVariableCreated = false; + + public ManagedProject21MakefileTests(String name) { + super(name); + } + + public static Test suite() { + TestSuite suite = new TestSuite(ManagedProject21MakefileTests.class.getName()); + + suite.addTest(new ManagedProject21MakefileTests("testSingleFileExe")); + suite.addTest(new ManagedProject21MakefileTests("testTwoFileSO")); + suite.addTest(new ManagedProject21MakefileTests("testMultiResConfig")); + //suite.addTest(new ManagedProject21MakefileTests("testLinkedLib")); + //suite.addTest(new ManagedProject21MakefileTests("testLinkedFolder")); + + return suite; + } + + private IProject[] createProject(String projName, IPath location, String projectTypeId, boolean containsZip){ + File testDir = CTestPlugin.getFileInPlugin(new Path("resources/test21Projects/" + projName)); + if(testDir == null) { + fail("Test project directory " + testDir.getName() + " is missing."); + return null; + } + + ArrayList projectList = null; + if (containsZip) { + File projectZips[] = testDir.listFiles(new FileFilter(){ + public boolean accept(File pathname){ + if(pathname.isDirectory()) + return false; + return true; + } + }); + + projectList = new ArrayList(projectZips.length); + for(int i = 0; i < projectZips.length; i++){ + try{ + String projectName = projectZips[i].getName(); + if(!projectName.endsWith(".zip")) + continue; + + projectName = projectName.substring(0,projectName.length()-".zip".length()); + if(projectName.length() == 0) + continue; + IProject project = ManagedBuildTestHelper.createProject(projectName, projectZips[i], location, projectTypeId); + if(project != null) + projectList.add(project); + } + catch(Exception e){ + } + } + if(projectList.size() == 0) { + fail("No projects found in test project directory " + testDir.getName() + ". The .zip file may be missing or corrupt."); + return null; + } + } else { + try{ + IProject project = ManagedBuildTestHelper.createProject(projName, null, location, projectTypeId); + if(project != null) + projectList = new ArrayList(1); + projectList.add(project); + } catch(Exception e){} + } + + return (IProject[])projectList.toArray(new IProject[projectList.size()]); + } + + private IProject[] createProjects(String projName, IPath location, String projectTypeId, boolean containsZip) { + + // In case the projects need to be updated... + IOverwriteQuery queryALL = new IOverwriteQuery(){ + public String queryOverwrite(String file) { + return ALL; + }}; + IOverwriteQuery queryNOALL = new IOverwriteQuery(){ + public String queryOverwrite(String file) { + return NO_ALL; + }}; + + UpdateManagedProjectManager.setBackupFileOverwriteQuery(queryALL); + UpdateManagedProjectManager.setUpdateProjectQuery(queryALL); + + IProject projects[] = createProject(projName, location, projectTypeId, containsZip); + return projects; + } + + private void buildProjects(IProject projects[], IPath[] files) { + if(projects == null || projects.length == 0) + return; + + for(int i = 0; i < projects.length; i++){ + IProject curProject = projects[i]; + + IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(curProject); + + //check whether the managed build info is converted + boolean isCompatible = UpdateManagedProjectManager.isCompatibleProject(info); + assertTrue(isCompatible); + + if(isCompatible){ + // Build the project in order to generate the maekfiles + try{ + curProject.build(IncrementalProjectBuilder.INCREMENTAL_BUILD,null); + } + catch(CoreException e){ + fail(e.getStatus().getMessage()); + } + catch(OperationCanceledException e){ + fail("the project \"" + curProject.getName() + "\" build was cancelled, exception message: " + e.getMessage()); + } + + //compare the generated makefiles to their benchmarks + if (files != null && files.length > 0) { + if (i == 0) { + String configName = info.getDefaultConfiguration().getName(); + IPath buildDir = Path.fromOSString(configName); + ManagedBuildTestHelper.compareBenchmarks(curProject, buildDir, files); + } + } + } + } + + for(int i = 0; i < projects.length; i++) + ManagedBuildTestHelper.removeProject(projects[i].getName()); + } + + private void createPathVariable(IPath tmpDir) { + IWorkspace workspace = ResourcesPlugin.getWorkspace(); + workspace = ResourcesPlugin.getWorkspace(); + IPathVariableManager pathMan = workspace.getPathVariableManager(); + String name = MBS_TEMP_DIR; + try { + if (pathMan.validateName(name).isOK() && pathMan.validateValue(tmpDir).isOK()) { + pathMan.setValue(name, tmpDir); + } else { + fail("could not create the path variable " + name); + } + } catch (Exception e) {fail("could not create the path variable " + name);} + } + + private void createFileLink(IProject project, IPath tmpDir, String linkName, String fileName) { + IWorkspace workspace = ResourcesPlugin.getWorkspace(); + String name = MBS_TEMP_DIR; + if (!pathVariableCreated) { + createPathVariable(tmpDir); + pathVariableCreated = true; + } + + try { + // Now we can create a linked resource relative to the defined path variable: + IFile linkF1 = project.getFile(linkName); + IPath location = new Path("MBSTemp/" + fileName); + if (workspace.validateLinkLocation(linkF1, location).isOK()) { + linkF1.createLink(location, IResource.NONE, null); + } else { + fail("could not create the link to " + name); + } + } catch (Exception e) {fail("could not create the link to " + name);} + } + + /* (non-Javadoc) + * tests 2.1 style tool integration for a single file executable + */ + public void testSingleFileExe(){ + IPath[] makefiles = { + Path.fromOSString("makefile"), + Path.fromOSString("objects.mk"), + Path.fromOSString("sources.mk"), + Path.fromOSString("subdir.mk")}; + IProject[] projects = createProjects("singleFileExe", null, null, true); + buildProjects(projects, makefiles); + } + + /* (non-Javadoc) + * tests 2.1 style tool integration for a two file SO + */ + public void testTwoFileSO(){ + IPath[] makefiles = { + Path.fromOSString("makefile"), + Path.fromOSString("objects.mk"), + Path.fromOSString("sources.mk"), + Path.fromOSString("subdir.mk")}; + IProject[] projects = createProjects("twoFileSO", null, null, true); + buildProjects(projects, makefiles); + } + + /* (non-Javadoc) + * tests 2.1 style tool integration for multiple source files & a resource configuration + */ + public void testMultiResConfig(){ + IPath[] makefiles = { + Path.fromOSString("makefile"), + Path.fromOSString("objects.mk"), + Path.fromOSString("sources.mk"), + Path.fromOSString("subdir.mk"), + Path.fromOSString("source1/subdir.mk"), + Path.fromOSString("source2/subdir.mk"), + Path.fromOSString("source2/source21/subdir.mk")}; + IProject[] projects = createProjects("multiResConfig", null, null, true); + buildProjects(projects, makefiles); + } + + /* (non-Javadoc) + * tests 2.1 style tool integration for linked files + */ + public void testLinkedLib(){ + IPath[] makefiles = { + Path.fromOSString("makefile"), + Path.fromOSString("objects.mk"), + //Path.fromOSString("subdir.mk") // Can't compare this yet since it contains absolute paths! + Path.fromOSString("sources.mk")}; + IPath[] linkedFiles = { + Path.fromOSString("f1.c"), + Path.fromOSString("f2.c"), + Path.fromOSString("test_ar.h")}; + File srcDirFile = CTestPlugin.getFileInPlugin(new Path("resources/test21Projects/linkedLib/")); + IPath srcDir = Path.fromOSString(srcDirFile.toString()); + IPath tmpSubDir = Path.fromOSString("CDTMBSTest"); + IPath tmpDir = ManagedBuildTestHelper.copyFilesToTempDir(srcDir, tmpSubDir, linkedFiles); + try { + IProject[] projects = createProjects("linkedLib", null, "cdt.managedbuild.target.testgnu21.lib", true); + // There should be only one project. Add our linked files to it. + IProject project = projects[0]; + createFileLink(project, tmpDir, "f1.c", "f1.c"); + createFileLink(project, tmpDir, "f2link.c", "f2.c"); + createFileLink(project, tmpDir, "test_ar.h", "test_ar.h"); + // Build the project + buildProjects(projects, makefiles); + } finally {ManagedBuildTestHelper.deleteTempDir(tmpSubDir, linkedFiles);} + } + + /* (non-Javadoc) + * tests 2.1 style tool integration for a linked folder + */ + public void testLinkedFolder(){ + IPath[] makefiles = { + Path.fromOSString("makefile"), + Path.fromOSString("objects.mk"), + Path.fromOSString("subdir.mk"), + Path.fromOSString("sources.mk")}; + IPath[] linkedFiles = { + Path.fromOSString("f1.c"), + Path.fromOSString("f2.c"), + Path.fromOSString("test_ar.h"), + Path.fromOSString("Benchmarks/makefile"), + Path.fromOSString("Benchmarks/objects.mk"), + Path.fromOSString("Benchmarks/subdir.mk"), + Path.fromOSString("Benchmarks/sources.mk")}; + File srcDirFile = CTestPlugin.getFileInPlugin(new Path("resources/test21Projects/linkedFolder/")); + IPath srcDir = Path.fromOSString(srcDirFile.toString()); + IPath tmpSubDir = Path.fromOSString("CDTMBSTest"); + IPath tmpDir = ManagedBuildTestHelper.copyFilesToTempDir(srcDir, tmpSubDir, linkedFiles); + if (!pathVariableCreated) { + createPathVariable(tmpDir); + pathVariableCreated = true; + } + try { + IPath location = Path.fromOSString(MBS_TEMP_DIR); + IProject[] projects = createProjects("linkedFolder", location, "cdt.managedbuild.target.testgnu21.lib", false); + // Build the project + buildProjects(projects, makefiles); + } finally {ManagedBuildTestHelper.deleteTempDir(tmpSubDir, linkedFiles);} + } +} diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ManagedProjectUpdateTests.java b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ManagedProjectUpdateTests.java index 914c5f8e162..b1a2fdcca9b 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ManagedProjectUpdateTests.java +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ManagedProjectUpdateTests.java @@ -1,5 +1,5 @@ /********************************************************************** - * Copyright (c) 2004 Intel Corporation and others. + * Copyright (c) 2004, 2005 Intel Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at @@ -26,6 +26,7 @@ import org.eclipse.cdt.managedbuilder.testplugin.ManagedBuildTestHelper; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Path; import org.eclipse.ui.dialogs.IOverwriteQuery; @@ -40,8 +41,10 @@ public class ManagedProjectUpdateTests extends TestCase { suite.addTest(new ManagedProjectUpdateTests("testProjectUpdate12_Update")); suite.addTest(new ManagedProjectUpdateTests("testProjectUpdate20_Update")); + suite.addTest(new ManagedProjectUpdateTests("testProjectUpdate21_Update")); suite.addTest(new ManagedProjectUpdateTests("testProjectUpdate12_NoUpdate")); suite.addTest(new ManagedProjectUpdateTests("testProjectUpdate20_NoUpdate")); + suite.addTest(new ManagedProjectUpdateTests("testProjectUpdate21_NoUpdate")); return suite; } @@ -75,7 +78,7 @@ public class ManagedProjectUpdateTests extends TestCase { projectName = projectName.substring(0,projectName.length()-".zip".length()); if(projectName.length() == 0) continue; - IProject project = ManagedBuildTestHelper.createProject(projectName,projectZips[i]); + IProject project = ManagedBuildTestHelper.createProject(projectName, projectZips[i], null, null); if(project != null) projectList.add(project); } @@ -89,7 +92,8 @@ public class ManagedProjectUpdateTests extends TestCase { return (IProject[])projectList.toArray(new IProject[projectList.size()]); } - private void doTestProjectUpdate(String version, boolean updateProject, boolean overwriteBackupFiles){ + private void doTestProjectUpdate(String version, boolean updateProject, boolean overwriteBackupFiles, + IPath[] files){ IOverwriteQuery queryALL = new IOverwriteQuery(){ public String queryOverwrite(String file) { return ALL; @@ -99,8 +103,8 @@ public class ManagedProjectUpdateTests extends TestCase { return NO_ALL; }}; - UpdateManagedProjectManager.setBackupFileOverwriteQuery(updateProject ? queryALL : queryNOALL); - UpdateManagedProjectManager.setUpdateProjectQuery(overwriteBackupFiles ? queryALL : queryNOALL); + UpdateManagedProjectManager.setBackupFileOverwriteQuery(overwriteBackupFiles ? queryALL : queryNOALL); + UpdateManagedProjectManager.setUpdateProjectQuery(updateProject ? queryALL : queryNOALL); IProject projects[] = createVersionProjects(version); if(projects == null || projects.length == 0) @@ -132,6 +136,15 @@ public class ManagedProjectUpdateTests extends TestCase { catch(OperationCanceledException e){ fail("the project \"" + curProject.getName() + "\" build was cancelled, exception message: " + e.getMessage()); } + + //compare the generated makefiles to their benchmarks + if (files != null && files.length > 0) { + if (i == 0) { + String configName = info.getDefaultConfiguration().getName(); + IPath buildDir = Path.fromOSString(configName); + ManagedBuildTestHelper.compareBenchmarks(curProject, buildDir, files); + } + } } } @@ -144,7 +157,12 @@ public class ManagedProjectUpdateTests extends TestCase { * in case when user chooses to update the project */ public void testProjectUpdate12_Update(){ - doTestProjectUpdate("1.2",true,true); + IPath[] makefiles = { + Path.fromOSString("makefile"), + Path.fromOSString("objects.mk"), + Path.fromOSString("sources.mk"), + Path.fromOSString("subdir.mk")}; + doTestProjectUpdate("1.2", true, true, makefiles); } /* (non-Javadoc) @@ -152,7 +170,26 @@ public class ManagedProjectUpdateTests extends TestCase { * in case when user chooses to update the project */ public void testProjectUpdate20_Update(){ - doTestProjectUpdate("2.0",true,true); + IPath[] makefiles = { + Path.fromOSString("makefile"), + Path.fromOSString("objects.mk"), + Path.fromOSString("sources.mk"), + Path.fromOSString("subdir.mk")}; + doTestProjectUpdate("2.0", true, true, makefiles); + } + + /* (non-Javadoc) + * tests project v2.1 update + * in case when user chooses to update the project + */ + public void testProjectUpdate21_Update(){ + IPath[] makefiles = { + Path.fromOSString("makefile"), + Path.fromOSString("objects.mk"), + Path.fromOSString("sources.mk"), + Path.fromOSString("subdir.mk"), + Path.fromOSString("Functions/subdir.mk")}; + doTestProjectUpdate("2.1", true, true, makefiles); } /* (non-Javadoc) @@ -160,7 +197,7 @@ public class ManagedProjectUpdateTests extends TestCase { * in case when user chooses not to update the project */ public void testProjectUpdate12_NoUpdate(){ - doTestProjectUpdate("1.2",false,true); + doTestProjectUpdate("1.2", false, true, null); } /* (non-Javadoc) @@ -168,6 +205,14 @@ public class ManagedProjectUpdateTests extends TestCase { * in case when user chooses not to update the project */ public void testProjectUpdate20_NoUpdate(){ - doTestProjectUpdate("2.0",false,true); + doTestProjectUpdate("2.0", false, true, null); + } + + /* (non-Javadoc) + * tests project v2.1 update + * in case when user chooses not to update the project + */ + public void testProjectUpdate21_NoUpdate(){ + doTestProjectUpdate("2.1", false, true, null); } } diff --git a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ResourceBuildCoreTests.java b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ResourceBuildCoreTests.java index d1566ae3db5..dc9f3b1a25f 100644 --- a/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ResourceBuildCoreTests.java +++ b/build/org.eclipse.cdt.managedbuilder.core.tests/tests/org/eclipse/cdt/managedbuild/core/tests/ResourceBuildCoreTests.java @@ -17,7 +17,6 @@ import junit.framework.TestCase; import junit.framework.TestSuite; import org.eclipse.cdt.core.CCorePlugin; -import org.eclipse.cdt.core.ICDescriptor; import org.eclipse.cdt.make.core.MakeCorePlugin; import org.eclipse.cdt.managedbuilder.core.BuildException; import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; @@ -31,6 +30,7 @@ import org.eclipse.cdt.managedbuilder.core.IOptionCategory; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.cdt.managedbuilder.core.ManagedCProjectNature; import org.eclipse.cdt.managedbuilder.internal.core.Tool; +import org.eclipse.cdt.managedbuilder.testplugin.ManagedBuildTestHelper; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; @@ -84,7 +84,7 @@ public class ResourceBuildCoreTests extends TestCase { project = createProject(projectName); // Now associate the builder with the project - addManagedBuildNature(project); + ManagedBuildTestHelper.addManagedBuildNature(project); IProjectDescription description = project.getDescription(); // Make sure it has a managed nature if (description != null) { @@ -97,7 +97,7 @@ public class ResourceBuildCoreTests extends TestCase { // Find the base project type definition IProjectType[] projTypes = ManagedBuildManager.getDefinedProjectTypes(); - IProjectType projType = ManagedBuildManager.getProjectType("cdt.managedbuild.target.testgnu.exe"); + IProjectType projType = ManagedBuildManager.getProjectType("cdt.managedbuild.target.testgnu21.exe"); assertNotNull(projType); // Create the managed-project (.cdtbuild) for our project that builds an executable. @@ -271,7 +271,7 @@ public class ResourceBuildCoreTests extends TestCase { project = createProject(projectName); // Now associate the builder with the project - addManagedBuildNature(project); + ManagedBuildTestHelper.addManagedBuildNature(project); IProjectDescription description = project.getDescription(); // Make sure it has a managed nature if (description != null) { @@ -284,7 +284,7 @@ public class ResourceBuildCoreTests extends TestCase { // Find the base project type definition IProjectType[] projTypes = ManagedBuildManager.getDefinedProjectTypes(); - IProjectType projType = ManagedBuildManager.getProjectType("cdt.managedbuild.target.testgnu.exe"); + IProjectType projType = ManagedBuildManager.getProjectType("cdt.managedbuild.target.testgnu21.exe"); assertNotNull(projType); // Create the managed-project (.cdtbuild) for our project that builds an executable. @@ -372,7 +372,7 @@ public class ResourceBuildCoreTests extends TestCase { project = createProject(projectName); // Now associate the builder with the project - addManagedBuildNature(project); + ManagedBuildTestHelper.addManagedBuildNature(project); IProjectDescription description = project.getDescription(); // Make sure it has a managed nature if (description != null) { @@ -385,7 +385,7 @@ public class ResourceBuildCoreTests extends TestCase { // Find the base project type definition IProjectType[] projTypes = ManagedBuildManager.getDefinedProjectTypes(); - IProjectType projType = ManagedBuildManager.getProjectType("cdt.managedbuild.target.testgnu.exe"); + IProjectType projType = ManagedBuildManager.getProjectType("cdt.managedbuild.target.testgnu21.exe"); assertNotNull(projType); // Create the managed-project (.cdtbuild) for our project that builds an executable. @@ -624,7 +624,7 @@ public class ResourceBuildCoreTests extends TestCase { try { project = createProject(projectName); // Now associate the builder with the project - addManagedBuildNature(project); + ManagedBuildTestHelper.addManagedBuildNature(project); IProjectDescription description = project.getDescription(); // Make sure it has a managed nature if (description != null) { @@ -637,7 +637,7 @@ public class ResourceBuildCoreTests extends TestCase { // Find the base project type definition IProjectType[] projTypes = ManagedBuildManager.getDefinedProjectTypes(); - IProjectType projType = ManagedBuildManager.getProjectType("cdt.managedbuild.target.testgnu.exe"); + IProjectType projType = ManagedBuildManager.getProjectType("cdt.managedbuild.target.testgnu21.exe"); assertNotNull(projType); // Create the managed-project (.cdtbuild) for our project that builds a dummy executable @@ -711,34 +711,5 @@ public class ResourceBuildCoreTests extends TestCase { // checkBuildTestSettings(info); ManagedBuildManager.removeBuildInfo(project); } - - private void addManagedBuildNature (IProject project) { - // Create the buildinformation object for the project - IManagedBuildInfo info = ManagedBuildManager.createBuildInfo(project); - info.setValid(true); - - // Add the managed build nature - try { - ManagedCProjectNature.addManagedNature(project, new NullProgressMonitor()); - // ManagedCProjectNature.addManagedBuilder(project, new NullProgressMonitor()); - } catch (CoreException e) { - fail("Test failed on adding managed build nature or builder: " + e.getLocalizedMessage()); - } - - // Associate the project with the managed builder so the clients can get proper information - ICDescriptor desc = null; - try { - desc = CCorePlugin.getDefault().getCProjectDescription(project, true); - desc.remove(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID); - desc.create(CCorePlugin.BUILD_SCANNER_INFO_UNIQ_ID, ManagedBuildManager.INTERFACE_IDENTITY); - } catch (CoreException e) { - fail("Test failed on adding managed builder as scanner info provider: " + e.getLocalizedMessage()); - } - try { - desc.saveProjectData(); - } catch (CoreException e) { - fail("Test failed on saving the ICDescriptor data: " + e.getLocalizedMessage()); } - } - } \ No newline at end of file diff --git a/build/org.eclipse.cdt.managedbuilder.core/plugin.properties b/build/org.eclipse.cdt.managedbuilder.core/plugin.properties index e02c184fb59..0642eac89d8 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/plugin.properties +++ b/build/org.eclipse.cdt.managedbuilder.core/plugin.properties @@ -1,5 +1,5 @@ ############################################################################### -# Copyright (c) 2003, 2004 IBM Corporation and others. +# Copyright (c) 2003, 2005 IBM Corporation and others. # All rights reserved. This program and the accompanying materials # are made available under the terms of the Common Public License v1.0 # which accompanies this distribution, and is available at @@ -13,4 +13,9 @@ providerName=Eclipse.org GeneratedMakefileCBuilder.name=Generated Makefile Builder ManagedBuildNature.name=Managed Builder Project -ManagedMakeProject.name=Managed Make Project \ No newline at end of file +ManagedMakeProject.name=Managed Make Project + +objectFileName=Object File +executableName=Executable File +staticLibraryName=Static Library +sharedLibraryName=Shared Library diff --git a/build/org.eclipse.cdt.managedbuilder.core/plugin.xml b/build/org.eclipse.cdt.managedbuilder.core/plugin.xml index 7a7a29b5e70..e54cc6a881b 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/plugin.xml +++ b/build/org.eclipse.cdt.managedbuilder.core/plugin.xml @@ -121,4 +121,46 @@ type="text"/> </extension> +<!-- =================================================================================== --> +<!-- Define C/C++ "object" files ContentTypes --> +<!-- =================================================================================== --> + <extension point="org.eclipse.core.runtime.contentTypes"> + <!-- declares a content type for object files --> + <content-type id="compiledObjectFile" name="%objectFileName" + priority="high"/> + <!-- declares a content type for executable files --> + <content-type id="executableFile" name="%executableName" + priority="high"/> + <!-- declares a content type for static libraries --> + <content-type id="staticLibrary" name="%staticLibraryName" + priority="high"/> + <!-- declares a content type for shared libraries --> + <content-type id="sharedLibrary" name="%sharedLibraryName" + priority="high"/> + </extension> + + <extension point="org.eclipse.core.runtime.contentTypes"> + <file-association + content-type="org.eclipse.cdt.managedbuilder.core.compiledObjectFile" + file-extensions="obj,o"/> + </extension> + + <extension point="org.eclipse.core.runtime.contentTypes"> + <file-association + content-type="org.eclipse.cdt.managedbuilder.core.executableFile" + file-extensions="exe,"/> + </extension> + + <extension point="org.eclipse.core.runtime.contentTypes"> + <file-association + content-type="org.eclipse.cdt.managedbuilder.core.staticLibrary" + file-extensions="lib,a"/> + </extension> + + <extension point="org.eclipse.core.runtime.contentTypes"> + <file-association + content-type="org.eclipse.cdt.managedbuilder.core.sharedLibrary" + file-extensions="dll,so"/> + </extension> + </plugin> diff --git a/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd b/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd index 79f85f11548..1e2ccbe535b 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd +++ b/build/org.eclipse.cdt.managedbuilder.core/schema/buildDefinitions.exsd @@ -1330,15 +1330,7 @@ If the "buildPathResolver" attribute is specified, the "pathDelim <meta.section type="examples"/> </appInfo> <documentation> - The following is an example of the extension point usage: -<p> -<pre> - <extension - id="buildExample" - name="Definitions for Build Example" - point="org.eclipse.cdt.managedbuilder.core.buildDefinitions"> - etc... -</pre> + [Enter examples here.] </documentation> </annotation> diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IAdditionalInput.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IAdditionalInput.java index 62b0050d647..f8b82373dd8 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IAdditionalInput.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IAdditionalInput.java @@ -39,15 +39,15 @@ public interface IAdditionalInput { public IInputType getParent(); /** - * Returns a semi-colon separated list of the relative or absolute paths of the resources + * Returns an array of the relative or absolute paths of the resources * to which this element applies. * The resources must be a member of the project, the output from another tool in the * tool-chain, or an external file. The file name of the path can use GNU Make pattern * rule syntax (in order to generate the name from the input file name). * - * @return String + * @return String[] */ - public String getPaths(); + public String[] getPaths(); /** * Sets semi-colon separated list of the relative or absolute paths of the resources to diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IOutputType.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IOutputType.java index 470042d5bb5..9965d7cd7b3 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IOutputType.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IOutputType.java @@ -189,18 +189,18 @@ public interface IOutputType extends IBuildObject { public void setOutputPrefix(String prefix); /** - * Returns the paths of the complete set of output files for this outputType + * Returns the file names of the complete set of output files for this outputType * - * @return String + * @return String[] */ - public String getOutputNames(); + public String[] getOutputNames(); /** - * Sets the complete set of output files for this outputType + * Sets the complete set of output file names for this outputType * * @param names */ - public void getOutputNames(String names); + public void setOutputNames(String names); /** * Returns the pattern, using the Gnu pattern rule syntax, for deriving the diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ITool.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ITool.java index 6a44e523ac8..81d8efe4de8 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ITool.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ITool.java @@ -102,6 +102,20 @@ public interface ITool extends IBuildObject { * @since 2.0 */ public IOption getOptionById(String id); + + /** + * Get the <code>IOption</code> in the receiver with the specified + * ID, or an option with a superclass with this id. + * + * <p>If the receiver does not have an option with that ID, the method + * returns <code>null</code>. It is the responsibility of the caller to + * verify the return value. + * + * @param id unique identifier of the option to search for + * @return <code>IOption</code> + * @since 3.0 + */ + public IOption getOptionBySuperClassId(String id); /** * Returns the complete list of options that are available for this tool. @@ -187,7 +201,8 @@ public interface ITool extends IBuildObject { /** * Returns all of the additional input resources of all InputType children. - * Note: This does not include additional dependencies. + * Note: This does not include the primary InputType and does not include + * additional dependencies. * * @return IPath[] */ @@ -195,7 +210,8 @@ public interface ITool extends IBuildObject { /** * Returns all of the additional dependency resources of all InputType children. - * Note: This does not include additional inputs. + * Note: This does not include the primary InputType and does not include + * additional inputs. * * @return IPath[] */ diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IToolChain.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IToolChain.java index 399d9569fa0..ff6da2e3fcd 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IToolChain.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/IToolChain.java @@ -264,18 +264,37 @@ public interface IToolChain extends IBuildObject { public void setScannerConfigDiscoveryProfileId(String profileId); /** - * Returns the id in this tool-chain that creates the build artifact. + * Returns the sem-colon separated list of Tool ids containing each + * tool that can create the final build artifact (the end target of + * the build). MBS will use the first ID in the list that matches + * a Tool in the ToolChain. One reason for specifying a list, is + * that different versions of a tool can be selected based upon the + * project nature (e.g. different tool definitions for a linker for C vs. C++). * * @return String */ - public String getTargetToolId(); + public String getTargetToolIds(); /** - * Sets the tool in this tool-chain that creates the build artifact. + * Sets the sem-colon separated list of Tool ids containing each + * tool that can create the final build artifact (the end target of + * the build). * - * @param targetToolId + * @param targetToolIds */ - public void setTargetTool(String targetToolId); + public void setTargetToolIds(String targetToolIds); + + /** + * Returns the list of Tool ids containing each + * tool that can create the final build artifact (the end target of + * the build). MBS will use the first ID in the list that matches + * a Tool in the ToolChain. One reason for specifying a list, is + * that different versions of a tool can be selected based upon the + * project nature (e.g. different tool definitions for a linker for C vs. C++). + * + * @return String[] + */ + public String[] getTargetToolList(); /** * Returns the OutputTypes in this tool-chain, besides the primary diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java index 29858ecef50..1c54ebeacb3 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/core/ManagedBuildManager.java @@ -114,8 +114,8 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI public static final String MANIFEST_ERROR_DUPLICATE = "ManagedBuildManager.error.manifest.duplicate"; //$NON-NLS-1$ private static final String NEWLINE = System.getProperty("line.separator"); //$NON-NLS-1$ - // This is the version of the manifest and project files that - private static final PluginVersionIdentifier buildInfoVersion = new PluginVersionIdentifier(2, 1, 0); + // This is the version of the manifest and project files + private static final PluginVersionIdentifier buildInfoVersion = new PluginVersionIdentifier(3, 0, 0); private static Map depCalculatorsMap; private static boolean projectTypesLoaded = false; // Project types defined in the manifest files @@ -1291,11 +1291,7 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI // This is a 1.2 manifest and we are compatible for now return true; } - // isCompatibleWith will return FALSE, if: - // o The major versions are not equal - // o The major versions are equal, but the remainder of the manifest version # is - // greater than the MBS version # - return(buildInfoVersion.isCompatibleWith(version)); + return(buildInfoVersion.isGreaterOrEqualTo(version)); } /* (non-Javadoc) @@ -1322,20 +1318,21 @@ public class ManagedBuildManager extends AbstractCExtension implements IScannerI // Since 2.0 this will be a processing instruction containing version if (rootElement.getNodeType() != Node.PROCESSING_INSTRUCTION_NODE) { // This is a 1.2 project and it must be updated - } else { // Make sure that the version is compatible with the manager fileVersion = rootElement.getNodeValue(); PluginVersionIdentifier version = new PluginVersionIdentifier(fileVersion); - // isCompatibleWith will return FALSE, if: - // o The major versions are not equal - // o The major versions are equal, but the remainder of the .cdtbuild version # is - // greater than the MBS version # - if (!buildInfoVersion.isCompatibleWith(version)) { - throw new BuildException(ManagedMakeMessages.getFormattedString(PROJECT_VERSION_ERROR, project.getName())); - } if (buildInfoVersion.isGreaterThan(version)) { - // TODO Upgrade the project + // This is >= 2.0 project, but earlier than the current MBS version - it may need to be updated + } else { + // This is a + // isCompatibleWith will return FALSE, if: + // o The major versions are not equal + // o The major versions are equal, but the remainder of the .cdtbuild version # is + // greater than the MBS version # + if (!buildInfoVersion.isCompatibleWith(version)) { + throw new BuildException(ManagedMakeMessages.getFormattedString(PROJECT_VERSION_ERROR, project.getName())); + } } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/AdditionalInput.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/AdditionalInput.java index a33a4403667..c949d6ea3e6 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/AdditionalInput.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/AdditionalInput.java @@ -210,8 +210,12 @@ public class AdditionalInput implements IAdditionalInput { /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IAdditionalInput#getPaths() */ - public String getPaths() { - return paths; + public String[] getPaths() { + if (paths == null) { + return null; + } + String[] nameTokens = paths.split(";"); //$NON-NLS-1$ + return nameTokens; } /* (non-Javadoc) @@ -229,6 +233,9 @@ public class AdditionalInput implements IAdditionalInput { * @see org.eclipse.cdt.core.build.managed.IAdditionalInput#getKind() */ public int getKind() { + if (kind == null) { + return KIND_ADDITIONAL_INPUT_DEPENDENCY; + } return kind.intValue(); } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java index e2e6474568e..8b8a8a8d311 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Configuration.java @@ -642,22 +642,26 @@ public class Configuration extends BuildObject implements IConfiguration { * @see org.eclipse.cdt.managedbuilder.core.IConfiguration#getTargetTool() */ public ITool getTargetTool() { - String targetToolId = toolChain.getTargetToolId(); - if (targetToolId == null) return null; + String[] targetToolIds = toolChain.getTargetToolList(); + if (targetToolIds == null || targetToolIds.length == 0) return null; - // Look for a tool with this ID, or a tool with a superclass with this id + // For each target tool id, in list order, + // look for a tool with this ID, or a tool with a superclass with this id. + // Stop when we find a match ITool[] tools = getFilteredTools(); - for (int i = 0; i < tools.length; i++) { - ITool targetTool = tools[i]; - ITool tool = targetTool; - do { - if (targetToolId.equals(tool.getId())) { - return targetTool; - } - tool = tool.getSuperClass(); - } while (tool != null); + for (int i=0; i<targetToolIds.length; i++) { + String targetToolId = targetToolIds[i]; + for (int j=0; j<tools.length; j++) { + ITool targetTool = tools[j]; + ITool tool = targetTool; + do { + if (targetToolId.equals(tool.getId())) { + return targetTool; + } + tool = tool.getSuperClass(); + } while (tool != null); + } } - return null; } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/InputType.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/InputType.java index 015f080e8dd..d32325a5eb7 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/InputType.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/InputType.java @@ -595,7 +595,7 @@ public class InputType extends BuildObject implements IInputType { while (iter.hasNext()) { AdditionalInput ai = (AdditionalInput) iter.next(); boolean match = false; - String[] tokens = ai.getPaths().split(";"); //$NON-NLS-1$ + String[] tokens = ai.getPaths(); if (tokens.length == inputTokens.length) { match = true; for (int i = 0; i < tokens.length; i++) { @@ -637,11 +637,10 @@ public class InputType extends BuildObject implements IInputType { int kind = current.getKind(); if (kind == IAdditionalInput.KIND_ADDITIONAL_DEPENDENCY || kind == IAdditionalInput.KIND_ADDITIONAL_INPUT_DEPENDENCY) { - String paths = current.getPaths(); + String[] paths = current.getPaths(); if (paths != null) { - String[] pathTokens = paths.split(";"); //$NON-NLS-1$ - for (int i = 0; i < pathTokens.length; i++) { - deps.add(Path.fromOSString(pathTokens[i])); + for (int i = 0; i < paths.length; i++) { + deps.add(Path.fromOSString(paths[i])); } } } @@ -660,11 +659,10 @@ public class InputType extends BuildObject implements IInputType { int kind = current.getKind(); if (kind == IAdditionalInput.KIND_ADDITIONAL_INPUT || kind == IAdditionalInput.KIND_ADDITIONAL_INPUT_DEPENDENCY) { - String paths = current.getPaths(); + String[] paths = current.getPaths(); if (paths != null) { - String[] pathTokens = paths.split(";"); //$NON-NLS-1$ - for (int i = 0; i < pathTokens.length; i++) { - ins.add(Path.fromOSString(pathTokens[i])); + for (int i = 0; i < paths.length; i++) { + ins.add(Path.fromOSString(paths[i])); } } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ManagedBuildInfo.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ManagedBuildInfo.java index 571007d30ae..92fa003c498 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ManagedBuildInfo.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ManagedBuildInfo.java @@ -440,13 +440,12 @@ public class ManagedBuildInfo implements IManagedBuildInfo, IScannerInfo { } } } + //add paths specified in the environment + String envIncludePaths[] = ManagedBuildManager.getEnvironmentVariableProvider().getBuildPaths(config,IEnvVarBuildPath.BUILDPATH_INCLUDE); + if(envIncludePaths != null) + paths.addAll(Arrays.asList(envIncludePaths)); } - - //add paths specified in the environment - String envIncludePaths[] = ManagedBuildManager.getEnvironmentVariableProvider().getBuildPaths(config,IEnvVarBuildPath.BUILDPATH_INCLUDE); - if(envIncludePaths != null) - paths.addAll(Arrays.asList(envIncludePaths)); - + // Answer the results as an array return (String[])paths.toArray(new String[paths.size()]); } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/OutputType.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/OutputType.java index d7f9ed7b597..a5969f547dc 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/OutputType.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/OutputType.java @@ -685,7 +685,7 @@ public class OutputType extends BuildObject implements IOutputType { /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IOuputType#getOutputNames() */ - public String getOutputNames() { + public String[] getOutputNames() { if (outputNames == null) { // If I have a superClass, ask it if (superClass != null) { @@ -694,14 +694,15 @@ public class OutputType extends BuildObject implements IOutputType { return null; } } - return outputNames; + String[] nameTokens = outputNames.split(";"); //$NON-NLS-1$ + return nameTokens; } /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IOuputType#setOutputNames() */ - public void getOutputNames(String names) { + public void setOutputNames(String names) { if (names == null && outputNames == null) return; if (outputNames == null || names == null || !(names.equals(outputNames))) { outputNames = names; @@ -713,14 +714,16 @@ public class OutputType extends BuildObject implements IOutputType { * @see org.eclipse.cdt.core.build.managed.IOuputType#getPrimaryInputType() */ public IInputType getPrimaryInputType() { - if (primaryInputType == null) { + IInputType ret = primaryInputType; + if (ret == null) { if (superClass != null) { - return superClass.getPrimaryInputType(); - } else { - return null; + ret = superClass.getPrimaryInputType(); + } + if (ret == null) { + ret = getParent().getPrimaryInputType(); } } - return primaryInputType; + return ret; } /* (non-Javadoc) diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java index 4e8f53326a9..3e052ac304a 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/Tool.java @@ -242,9 +242,11 @@ public class Tool extends BuildObject implements ITool, IOptionCategory { } else if (toolElement.getNodeName().equals(ITool.OPTION_CAT)) { new OptionCategory(this, (Element)toolElement); } else if (toolElement.getNodeName().equals(ITool.INPUT_TYPE)) { - new InputType(this, (Element)toolElement); + InputType inputType = new InputType(this, (Element)toolElement); + addInputType(inputType); } else if (toolElement.getNodeName().equals(ITool.OUTPUT_TYPE)) { - new OutputType(this, (Element)toolElement); + OutputType outputType = new OutputType(this, (Element)toolElement); + addOutputType(outputType); } } } @@ -923,6 +925,28 @@ public class Tool extends BuildObject implements ITool, IOptionCategory { return opt; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.build.managed.ITool#getOptionBySuperClassId(java.lang.String) + */ + public IOption getOptionBySuperClassId(String optionId) { + if (optionId == null) return null; + + // Look for an option with this ID, or an option with a superclass with this id + IOption[] options = getOptions(); + for (int i = 0; i < options.length; i++) { + IOption targetOption = options[i]; + IOption option = targetOption; + do { + if (optionId.equals(option.getId())) { + return targetOption; + } + option = option.getSuperClass(); + } while (option != null); + } + + return null; + } + /* (non-Javadoc) * @see org.eclipse.cdt.core.build.managed.IOptionCategory#getChildCategories() */ @@ -973,7 +997,8 @@ public class Tool extends BuildObject implements ITool, IOptionCategory { IInputType ourType = (IInputType)ourTypes.get(i); int j; for (j = 0; j < types.length; j++) { - if (ourType.getSuperClass().getId().equals(types[j].getId())) { + if (ourType.getSuperClass() != null && + ourType.getSuperClass().getId().equals(types[j].getId())) { types[j] = ourType; break; } @@ -1045,7 +1070,8 @@ public class Tool extends BuildObject implements ITool, IOptionCategory { IOutputType ourType = (IOutputType)ourTypes.get(i); int j; for (j = 0; j < types.length; j++) { - if (ourType.getSuperClass().getId().equals(types[j].getId())) { + if (ourType.getSuperClass() != null && + ourType.getSuperClass().getId().equals(types[j].getId())) { types[j] = ourType; break; } @@ -1533,10 +1559,37 @@ public class Tool extends BuildObject implements ITool, IOptionCategory { List allDeps = new ArrayList(); IInputType[] types = getInputTypes(); for (int i=0; i<types.length; i++) { - IPath[] deps = types[i].getAdditionalDependencies(); + IInputType type = types[i]; + // Additional dependencies come from 2 places. + // 1. From AdditionalInput childen + IPath[] deps = type.getAdditionalDependencies(); for (int j=0; j<deps.length; j++) { allDeps.add(deps[j]); } + // 2. From InputTypes that other than the primary input type + if (!type.getPrimaryInput()) { + if (type.getOptionId() != null) { + IOption option = getOptionBySuperClassId(type.getOptionId()); + if (option != null) { + try { + List inputs = new ArrayList(); + int optType = option.getValueType(); + if (optType == IOption.STRING) { + inputs.add(option.getStringValue()); + } else if ( + optType == IOption.STRING_LIST || + optType == IOption.LIBRARIES || + optType == IOption.OBJECTS) { + inputs = (List)option.getValue(); + } + allDeps.addAll(inputs); + } catch( BuildException ex ) { + } + } + } else if (type.getBuildVariable() != null && type.getBuildVariable().length() > 0) { + allDeps.add("$(" + type.getBuildVariable() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ + } + } } return (IPath[])allDeps.toArray(new IPath[allDeps.size()]); } @@ -1548,10 +1601,20 @@ public class Tool extends BuildObject implements ITool, IOptionCategory { List allRes = new ArrayList(); IInputType[] types = getInputTypes(); for (int i=0; i<types.length; i++) { - IPath[] res = types[i].getAdditionalResources(); + IInputType type = types[i]; + // Additional dependencies come from 2 places. + // 1. From AdditionalInput childen + IPath[] res = type.getAdditionalResources(); for (int j=0; j<res.length; j++) { allRes.add(res[j]); } + // 2. From InputTypes that other than the primary input type + if (!type.getPrimaryInput()) { + String var = type.getBuildVariable(); + if (var != null && var.length() > 0) { + allRes.add("$(" + type.getBuildVariable() + ")"); //$NON-NLS-1$ //$NON-NLS-2$ + } + } } return (IPath[])allRes.toArray(new IPath[allRes.size()]); } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChain.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChain.java index 406cc3c76bc..aa76a5ff413 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChain.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolChain.java @@ -54,7 +54,7 @@ public class ToolChain extends BuildObject implements IToolChain { private String errorParserIds; private List osList; private List archList; - private String targetToolId; + private String targetToolIds; private String secondaryOutputIds; private Boolean isAbstract; private String scannerConfigDiscoveryProfileId; @@ -216,8 +216,8 @@ public class ToolChain extends BuildObject implements IToolChain { if (toolChain.archList != null) { archList = new ArrayList(toolChain.archList); } - if (toolChain.targetToolId != null) { - targetToolId = new String(toolChain.targetToolId); + if (toolChain.targetToolIds != null) { + targetToolIds = new String(toolChain.targetToolIds); } if (toolChain.secondaryOutputIds != null) { secondaryOutputIds = new String(toolChain.secondaryOutputIds); @@ -321,7 +321,7 @@ public class ToolChain extends BuildObject implements IToolChain { secondaryOutputIds = element.getAttribute(SECONDARY_OUTPUTS); // Get the target tool id - targetToolId = element.getAttribute(TARGET_TOOL); + targetToolIds = element.getAttribute(TARGET_TOOL); // Get the scanner config discovery profile id scannerConfigDiscoveryProfileId = element.getAttribute(SCANNER_CONFIG_PROFILE_ID); @@ -415,7 +415,7 @@ public class ToolChain extends BuildObject implements IToolChain { // Get the target tool id if (element.hasAttribute(TARGET_TOOL)) { - targetToolId = element.getAttribute(TARGET_TOOL); + targetToolIds = element.getAttribute(TARGET_TOOL); } // Get the scanner config discovery profile id @@ -490,8 +490,8 @@ public class ToolChain extends BuildObject implements IToolChain { element.setAttribute(SECONDARY_OUTPUTS, secondaryOutputIds); } - if (targetToolId != null) { - element.setAttribute(TARGET_TOOL, targetToolId); + if (targetToolIds != null) { + element.setAttribute(TARGET_TOOL, targetToolIds); } if (scannerConfigDiscoveryProfileId != null) { @@ -839,20 +839,45 @@ public class ToolChain extends BuildObject implements IToolChain { } /* (non-Javadoc) - * @see org.eclipse.cdt.managedbuilder.core.IToolChain#getTargetTool() + * @see org.eclipse.cdt.managedbuilder.core.IToolChain#getTargetToolIds() */ - public String getTargetToolId() { - if (targetToolId == null) { + public String getTargetToolIds() { + if (targetToolIds == null) { // Ask superClass for its list if (superClass != null) { - return superClass.getTargetToolId(); + return superClass.getTargetToolIds(); } else { return null; } } - return targetToolId; + return targetToolIds; } + /* (non-Javadoc) + * @see org.eclipse.cdt.managedbuilder.core.IToolChain#getTargetToolList() + */ + public String[] getTargetToolList() { + String IDs = getTargetToolIds(); + String[] targetTools; + if (IDs != null) { + // Check for an empty string + if (IDs.length() == 0) { + targetTools = new String[0]; + } else { + StringTokenizer tok = new StringTokenizer(IDs, ";"); //$NON-NLS-1$ + List list = new ArrayList(tok.countTokens()); + while (tok.hasMoreElements()) { + list.add(tok.nextToken()); + } + String[] strArr = {""}; //$NON-NLS-1$ + targetTools = (String[]) list.toArray(strArr); + } + } else { + targetTools = new String[0]; + } + return targetTools; + } + /* (non-Javadoc) * @see org.eclipse.cdt.managedbuilder.core.IToolChain#getErrorParserIds(IConfiguration) */ @@ -975,12 +1000,12 @@ public class ToolChain extends BuildObject implements IToolChain { } /* (non-Javadoc) - * @see org.eclipse.cdt.managedbuilder.core.IToolChain#setTargetTool() + * @see org.eclipse.cdt.managedbuilder.core.IToolChain#setTargetToolIds() */ - public void setTargetTool(String newId) { - if (targetToolId == null && newId == null) return; - if (targetToolId == null || newId == null || !newId.equals(targetToolId)) { - targetToolId = newId; + public void setTargetToolIds(String newIds) { + if (targetToolIds == null && newIds == null) return; + if (targetToolIds == null || newIds == null || !newIds.equals(targetToolIds)) { + targetToolIds = newIds; isDirty = true; } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolReference.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolReference.java index bbbc29f49b0..bdbe2e49916 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolReference.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/internal/core/ToolReference.java @@ -1061,6 +1061,10 @@ public class ToolReference implements IToolReference { public void setCustomBuildStep(boolean customBuildStep) { } + public IOption getOptionBySuperClassId(String id) { + return null; + } + /* * The following methods are added to allow the converter from ToolReference -> Tool * to retrieve the actual value of attributes. These routines do not go to the diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/GnuMakefileGenerator.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/GnuMakefileGenerator.java index 2d8175b8dbd..e6147f0de67 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/GnuMakefileGenerator.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/GnuMakefileGenerator.java @@ -240,11 +240,13 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { private static final String OBJS_MACRO = "OBJS"; //$NON-NLS-1$ private static final String DEPS_MACRO = "DEPS"; //$NON-NLS-1$ + private static final String MACRO_ADDITION_ADDPREFIX_HEADER = "${addprefix "; //$NON-NLS-1$ private static final String MACRO_ADDITION_ADDPREFIX_SUFFIX = "," + WHITESPACE + LINEBREAK; //$NON-NLS-1$ private static final String MACRO_ADDITION_PREFIX_SUFFIX = "+=" + WHITESPACE + LINEBREAK; //$NON-NLS-1$ private static final String PREBUILD = "pre-build"; //$NON-NLS-1$ private static final String MAINBUILD = "main-build"; //$NON-NLS-1$ private static final String POSTBUILD = "post-build"; //$NON-NLS-1$ + private static final String SECONDARY_OUTPUTS = "secondary-outputs"; //$NON-NLS-1$ // Local variables needed by generator private String buildTargetName; @@ -1144,6 +1146,13 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { if (buildTargetExt.length() > 0) { buffer.append(DOT + buildTargetExt); } + + // Add the Secondary Outputs to the all target, if any + IOutputType[] secondaryOutputs = config.getToolChain().getSecondaryOutputs(); + if (secondaryOutputs.length > 0) { + buffer.append(WHITESPACE + SECONDARY_OUTPUTS); + } + buffer.append(NEWLINE + NEWLINE); /* @@ -1218,6 +1227,17 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { buffer.append(TAB + DASH + AT + ECHO + WHITESPACE + SINGLE_QUOTE + WHITESPACE + SINGLE_QUOTE + NEWLINE + NEWLINE); } + + // Add the Secondary Outputs target, if needed + if (secondaryOutputs.length > 0) { + buffer.append(SECONDARY_OUTPUTS + COLON); + Vector outs2 = calculateSecondaryOutputs(secondaryOutputs); + for (int i=0; i<outs2.size(); i++) { + buffer.append(WHITESPACE + (String)outs2.get(i)); + } + buffer.append(NEWLINE + NEWLINE); + } + // Add all the needed dummy and phony targets buffer.append(".PHONY: all clean dependents" + NEWLINE); //$NON-NLS-1$ buffer.append(".SECONDARY:"); //$NON-NLS-1$ @@ -1340,14 +1360,23 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { Vector inputs = new Vector(); Vector dependencies = new Vector(); Vector outputs = new Vector(); - Vector enumeratedOutputs = new Vector(); + Vector enumeratedPrimaryOutputs = new Vector(); + Vector enumeratedSecondaryOutputs = new Vector(); Vector outputVariables = new Vector(); String outputPrefix = EMPTY_STRING; - if (!getToolInputsOutputs(tool, inputs, dependencies, outputs, enumeratedOutputs, outputVariables, - bTargetTool, managedProjectOutputs)) { + + if (!getToolInputsOutputs(tool, inputs, dependencies, outputs, + enumeratedPrimaryOutputs, enumeratedSecondaryOutputs, + outputVariables, bTargetTool, managedProjectOutputs)) { return false; } + // If we have no primary output, make all of the secondary outputs the primary output + if (enumeratedPrimaryOutputs.size() == 0) { + enumeratedPrimaryOutputs = enumeratedSecondaryOutputs; + enumeratedSecondaryOutputs.clear(); + } + // Add the output variables for this tool to our list outputVarsAdditionsList.addAll(outputVariables); @@ -1355,20 +1384,20 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { String buildRule = EMPTY_STRING; String outflag = tool.getOutputFlag(); - Iterator iter = enumeratedOutputs.listIterator(); + String primaryOutputs = EMPTY_STRING; boolean first = true; - while(iter.hasNext()) { - String output = (String)iter.next(); - if (!first) buildRule += WHITESPACE; + for (int i=0; i<enumeratedPrimaryOutputs.size(); i++) { + String output = (String)enumeratedPrimaryOutputs.get(i); + if (!first) primaryOutputs += WHITESPACE; first = false; - buildRule += output; + primaryOutputs += output; } - buildRule += (COLON + WHITESPACE); - iter = inputs.listIterator(); + + buildRule += (primaryOutputs + COLON + WHITESPACE); + first = true; - iter = dependencies.listIterator(); - while(iter.hasNext()) { - String input = (String)iter.next(); + for (int i=0; i<dependencies.size(); i++) { + String input = (String)dependencies.get(i); if (!first) buildRule += WHITESPACE; first = false; buildRule += input; @@ -1398,7 +1427,7 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { String[] cmdInputs = (String[])inputs.toArray(new String[inputs.size()]); IManagedCommandLineGenerator gen = tool.getCommandLineGenerator(); IManagedCommandLineInfo cmdLInfo = gen.generateCommandLineInfo( tool, tool.getToolCommand(), - flags, outflag, outputPrefix, OUT_MACRO, cmdInputs, tool.getCommandLinePattern() ); + flags, outflag, outputPrefix, primaryOutputs, cmdInputs, tool.getCommandLinePattern() ); // The command to build String buildCmd = null; if( cmdLInfo == null ) { @@ -1409,7 +1438,7 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { // TODO report error toolFlags = EMPTY_STRING; } - buildCmd = tool.getToolCommand() + WHITESPACE + toolFlags + WHITESPACE + outflag + WHITESPACE + outputPrefix + OUT_MACRO + WHITESPACE + IN_MACRO; + buildCmd = tool.getToolCommand() + WHITESPACE + toolFlags + WHITESPACE + outflag + WHITESPACE + outputPrefix + primaryOutputs + WHITESPACE + IN_MACRO; } else buildCmd = cmdLInfo.getCommandLine(); buffer.append(TAB + AT + ECHO + WHITESPACE + buildCmd + NEWLINE); @@ -1426,6 +1455,17 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { buffer.append(TAB + AT + ECHO + WHITESPACE + SINGLE_QUOTE + MESSAGE_FINISH_FILE + WHITESPACE + OUT_MACRO + SINGLE_QUOTE + NEWLINE); } buffer.append(TAB + AT + ECHO + WHITESPACE + SINGLE_QUOTE + WHITESPACE + SINGLE_QUOTE + NEWLINE + NEWLINE); + + // If we have secondary outputs, output dependency rules without commands + if (enumeratedSecondaryOutputs.size() > 0) { + String primaryOutput = (String)enumeratedPrimaryOutputs.get(0); + for (int i=0; i<enumeratedSecondaryOutputs.size(); i++) { + String output = (String)enumeratedSecondaryOutputs.get(0); + buffer.append(output + COLON + WHITESPACE + primaryOutput + NEWLINE); + } + buffer.append(NEWLINE); + } + return true; } @@ -1465,8 +1505,9 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { } protected boolean getToolInputsOutputs(ITool tool, - Vector inputs, Vector dependencies, Vector outputs, Vector enumeratedOutputs, Vector outputVariables, - boolean bTargetTool, Vector managedProjectOutputs) { + Vector inputs, Vector dependencies, Vector outputs, + Vector enumeratedPrimaryOutputs, Vector enumeratedSecondaryOutputs, + Vector outputVariables, boolean bTargetTool, Vector managedProjectOutputs) { // Get the information regarding the tool's inputs and outputs from the objects // created by calculateToolInputsOutputs @@ -1482,7 +1523,8 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { // Populate the output Vectors inputs.addAll(toolInfo.getCommandInputs()); outputs.addAll(toolInfo.getCommandOutputs()); - enumeratedOutputs.addAll(toolInfo.getEnumeratedOutputs()); + enumeratedPrimaryOutputs.addAll(toolInfo.getEnumeratedPrimaryOutputs()); + enumeratedSecondaryOutputs.addAll(toolInfo.getEnumeratedSecondaryOutputs()); outputVariables.addAll(toolInfo.getOutputVariables()); dependencies.addAll(toolInfo.getCommandDependencies()); @@ -1494,6 +1536,37 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { } return true; } + + /* (non-Javadoc) + * @param fileHandle + * @throws CoreException + */ + protected Vector calculateSecondaryOutputs(IOutputType[] secondaryOutputs) { + Vector buildVars = new Vector(); + for (int i=0; i<buildTools.length; i++) { + // Add the specified output build variables + IOutputType[] outTypes = buildTools[i].getOutputTypes(); + if (outTypes != null && outTypes.length > 0) { + for (int j=0; j<outTypes.length; j++) { + IOutputType outType = outTypes[j]; + // Is this one of the secondary outputs? + // Look for an outputType with this ID, or one with a superclass with this id + thisType: + for (int k = 0; k < secondaryOutputs.length; k++) { + IOutputType matchType = outType; + do { + if (matchType.getId().equals(secondaryOutputs[k].getId())) { + buildVars.add(outType.getBuildVariable()); + break thisType; + } + matchType = matchType.getSuperClass(); + } while (matchType != null); + } + } + } + } + return buildVars; + } /************************************************************************* @@ -1566,16 +1639,16 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { while (iterator.hasNext()) { Map.Entry entry = (Map.Entry)iterator.next(); String macroName = (String)entry.getKey(); - addMacroAdditionPrefix(buildVarToRuleStringMap, macroName, "$(ROOT)/" + relativePath, true); //$NON-NLS-1$ + addMacroAdditionPrefix(buildVarToRuleStringMap, macroName, null, false); } iterator = buildOutVars.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry entry = (Map.Entry)iterator.next(); String macroName = (String)entry.getKey(); - addMacroAdditionPrefix(buildVarToRuleStringMap, macroName, "./" + relativePath, true); + addMacroAdditionPrefix(buildVarToRuleStringMap, macroName, "./" + relativePath, true); //$NON-NLS-1$ } // Create an entry for the DEPS macro - addMacroAdditionPrefix(buildVarToRuleStringMap, DEPS_MACRO, "./" + relativePath, true); + addMacroAdditionPrefix(buildVarToRuleStringMap, DEPS_MACRO, "./" + relativePath, true); //$NON-NLS-1$ // String buffers StringBuffer buffer = new StringBuffer(); // Return buffer @@ -1601,7 +1674,7 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { } // Write out the macro addition entries to the buffer - buffer.append(writeAdditionMacros(buildVarToRuleStringMap, true)); + buffer.append(writeAdditionMacros(buildVarToRuleStringMap)); return buffer.append(ruleBuffer + NEWLINE); } @@ -1642,7 +1715,20 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { continue; } // Add the resource name to the makefile line that adds resources to the build variable - addMacroAdditionFile(buildVarToRuleStringMap, varName, resource.getName()); + String srcName; + if (generatedSource) { + srcName = resource.getName(); + } else { + String resourceLocation = resource.getLocation().toString(); + String projectLocation = project.getLocation().toString(); + //if (resource.isLinked()) { NOTE: we don't use this since children of linked resources return false + if(!resourceLocation.startsWith(projectLocation)) { + srcName = resourceLocation; + } else { + srcName = "$(ROOT)/" + relativePath + resource.getName(); //$NON-NLS-1$ + } + } + addMacroAdditionFile(buildVarToRuleStringMap, varName, srcName); // Generate the rule to build this source file IInputType inputType = tool.getInputType(ext); @@ -1670,7 +1756,7 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { // For support of pre-CDT 3.0 integrations. buildVariable = OBJS_MACRO; //$NON-NLS-1$ } - Vector generatedOutputs = calculateOutputsForSource(tool, relativePath, resource); + Vector generatedOutputs = calculateOutputsForSource(tool, relativePath, resource, false); for (int k=0; k<generatedOutputs.size(); k++) { // TODO - this will only work for outputs generated below the build output directory? // try an option that generates an output outside of the project @@ -1724,13 +1810,14 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { String outflag = null; String outputPrefix = null; IManagedDependencyGenerator depGen = info.getDependencyGenerator(inputExtension); - boolean doDepGen = (depGen != null && depGen.getCalculatorType() == IManagedDependencyGenerator.TYPE_COMMAND); + boolean doDepGen = (depGen != null && depGen.getCalculatorType() == IManagedDependencyGenerator.TYPE_COMMAND); + boolean patternRule = false; // If the tool creates a dependency file, add it to the list if (doDepGen) { String depFile = relativePath + resourceName + DOT + DEP_EXT; getDependencyMakefiles().add(depFile); - generatedDepFile.append(depFile); + generatedDepFile.append(resourceName + DOT + DEP_EXT); } /* @@ -1755,31 +1842,7 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { // We need to check whether we have any resource specific build information. IResourceConfiguration resConfig = null; if( config != null ) resConfig = config.getResourceConfiguration(resource.getFullPath().toString()); - - // figure out path to use to resource - if(!resourceLocation.toString().startsWith(projectLocation)) { - // it IS linked, so use the actual location - isItLinked = true; - resourcePath = resourceLocation.toString(); - // Need a hardcoded rule, not a pattern rule, as a linked file - // can reside in any path - buildRule = relativePath + resourceName + OptDotExt + COLON + WHITESPACE + resourcePath; - } else { - // use the relative path (not really needed to store per se but in the future someone may want this) - resourcePath = relativePath; - - // The rule and command to add to the makefile - String home = (generatedSource)? DOT : ROOT; - if( resConfig != null) { - buildRule = resourcePath + resourceName + OptDotExt + COLON + WHITESPACE + home + SEPARATOR + resourcePath + resourceName + DOT + inputExtension; - } else { - buildRule = relativePath + WILDCARD + OptDotExt + COLON + WHITESPACE + home + SEPARATOR + resourcePath + WILDCARD + DOT + inputExtension; - } - } // end fix for PR 70491 - // Add any additional dependencies specified: - // 1. in additionalInput elements - // 2. from a dependency calculator not of TYPE_COMMAND ITool tool; if( resConfig != null) { ITool[] tools = resConfig.getTools(); @@ -1787,17 +1850,55 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { } else { tool = info.getToolFromInputExtension(inputExtension); } - // Get any additional dependencies specified for the tool + + // figure out path to use to resource + String primaryOutputName = EMPTY_STRING; + String primaryDependencyName = EMPTY_STRING; + //if (resource.isLinked()) { NOTE: we don't use this since children of linked resources return false + if(!resourceLocation.toString().startsWith(projectLocation)) { + // it IS linked, so use the actual location + isItLinked = true; + resourcePath = resourceLocation.toString(); + // Need a hardcoded rule, not a pattern rule, as a linked file + // can reside in any path + primaryOutputName = relativePath + resourceName + OptDotExt; + primaryDependencyName = resourcePath; + } else { + // use the relative path (not really needed to store per se but in the future someone may want this) + resourcePath = relativePath; + + // The rule and command to add to the makefile + String home = (generatedSource)? DOT : ROOT; + if( resConfig != null) { + // Need a hardcoded rule, not a pattern rule + primaryOutputName = resourcePath + resourceName + OptDotExt; + primaryDependencyName = home + SEPARATOR + resourcePath + resourceName + DOT + inputExtension; + } else { + primaryOutputName = relativePath + WILDCARD + OptDotExt; + primaryDependencyName = home + SEPARATOR + resourcePath + WILDCARD + DOT + inputExtension; + patternRule = true; + } + } // end fix for PR 70491 + + buildRule = primaryOutputName; + + // If this is a pattern rule, add any additional outputs here + String otherPrimaryOutputs = EMPTY_STRING; + if (patternRule) { + Vector addlOutputs = calculateOutputsForSource(tool, relativePath, resource, true); + for (int i=0; i<addlOutputs.size(); i++) { + otherPrimaryOutputs += WHITESPACE + ((IPath)addlOutputs.get(i)).toString(); + } + } + + buildRule += otherPrimaryOutputs + COLON + WHITESPACE + primaryDependencyName; + + // Other additional inputs + // Get any additional dependencies specified for the tool in other InputType elements and AdditionalInput elements IPath[] addlDepPaths = tool.getAdditionalDependencies(); for (int i=0; i<addlDepPaths.length; i++) { buildRule += WHITESPACE + addlDepPaths[i].toString(); } - if (depGen != null && depGen.getCalculatorType() != IManagedDependencyGenerator.TYPE_COMMAND) { - Vector addlDepsVector = calculateDependenciesForSource(depGen, tool, relativePath, resource); - for (int i=0; i<addlDepsVector.size(); i++) { - buildRule += WHITESPACE + addlDepsVector.get(i).toString(); - } - } // No duplicates in a makefile if (getRuleList().contains(buildRule)) { @@ -1824,7 +1925,8 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { // TODO add some routines to catch this flags = EMPTY_STRING_ARRAY; } - // Get any additional dependencies specified for the tool + // Other additional inputs + // Get any additional dependencies specified for the tool in other InputType elements and AdditionalInput elements IPath[] addlInputPaths = tool.getAdditionalResources(); for (int i=0; i<addlInputPaths.length; i++) { inputs.add(addlDepPaths[i].toString()); @@ -1832,7 +1934,7 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { // Call the command line generator IManagedCommandLineGenerator cmdLGen = tool.getCommandLineGenerator(); cmdLInfo = cmdLGen.generateCommandLineInfo( tool, cmd, flags, outflag, outputPrefix, - OUT_MACRO, (String[])inputs.toArray(new String[inputs.size()]), tool.getCommandLinePattern() ); + OUT_MACRO + otherPrimaryOutputs, (String[])inputs.toArray(new String[inputs.size()]), tool.getCommandLinePattern() ); String buildCmd = cmdLInfo.getCommandLine(); buffer.append(TAB + AT + ECHO + WHITESPACE + buildCmd + NEWLINE); @@ -1847,17 +1949,19 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { outflag = info.getOutputFlag(outputExtension); outputPrefix = info.getOutputPrefix(outputExtension); String[] flags = buildFlags.split( "\\s" ); //$NON-NLS-1$ - // Get any additional dependencies specified for the tool + // Other additional inputs + // Get any additional dependencies specified for the tool in other InputType elements and AdditionalInput elements IPath[] addlInputPaths = tool.getAdditionalResources(); for (int i=0; i<addlInputPaths.length; i++) { inputs.add(addlDepPaths[i].toString()); } // Call the command line generator cmdLInfo = info.generateCommandLineInfo( inputExtension, flags, outflag, outputPrefix, - OUT_MACRO, (String[])inputs.toArray(new String[inputs.size()]) ); + OUT_MACRO + otherPrimaryOutputs, (String[])inputs.toArray(new String[inputs.size()]) ); // The command to build String buildCmd = null; - if( cmdLInfo == null ) buildCmd = cmd + WHITESPACE + buildFlags + WHITESPACE + outflag + WHITESPACE + outputPrefix + OUT_MACRO + WHITESPACE + IN_MACRO; + if( cmdLInfo == null ) buildCmd = cmd + WHITESPACE + buildFlags + WHITESPACE + + outflag + WHITESPACE + outputPrefix + OUT_MACRO + otherPrimaryOutputs + WHITESPACE + IN_MACRO; else buildCmd = cmdLInfo.getCommandLine(); buffer.append(TAB + AT + ECHO + WHITESPACE + buildCmd + NEWLINE); buffer.append(TAB + AT + buildCmd); @@ -1875,6 +1979,30 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { buffer.append(NEWLINE); buffer.append(TAB + AT + ECHO + WHITESPACE + SINGLE_QUOTE + MESSAGE_FINISH_FILE + WHITESPACE + IN_MACRO + SINGLE_QUOTE + NEWLINE); buffer.append(TAB + AT + ECHO + WHITESPACE + SINGLE_QUOTE + WHITESPACE + SINGLE_QUOTE + NEWLINE + NEWLINE); + + + // Add separate dependency lines per file if necessary + boolean addedDepLines = false; + if (depGen != null && depGen.getCalculatorType() != IManagedDependencyGenerator.TYPE_COMMAND) { + Vector addlDepsVector = calculateDependenciesForSource(depGen, tool, relativePath, resource); + for (int i=0; i<addlDepsVector.size(); i++) { + buffer.append(primaryOutputName + COLON + WHITESPACE + addlDepsVector.get(i).toString() + NEWLINE); + addedDepLines = true; + } + } + + // If this is NOT a pattern rule, add any additional outputs here using dependency lines + if (!patternRule) { + Vector addlOutputs = calculateOutputsForSource(tool, relativePath, resource, true); + for (int i=0; i<addlOutputs.size(); i++) { + buffer.append(((IPath)addlOutputs.get(i)).toString() + COLON + WHITESPACE + primaryOutputName + NEWLINE); + addedDepLines = true; + } + } + if (addedDepLines) { + buffer.append(NEWLINE); + } + } /* (non-Javadoc) @@ -1895,7 +2023,8 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { * @param resource * @return Vector of IPaths that are relative to the build directory */ - protected Vector calculateOutputsForSource(ITool tool, String relativePath, IResource resource) { + protected Vector calculateOutputsForSource(ITool tool, + String relativePath, IResource resource, boolean ignorePrimary) { Vector outputs = new Vector(); String inExt = resource.getFileExtension(); String outExt = tool.getOutputExtension(inExt); @@ -1904,13 +2033,14 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { if (outTypes != null && outTypes.length > 0) { for (int i=0; i<outTypes.length; i++) { IOutputType type = outTypes[i]; + boolean primaryOutput = (type == tool.getPrimaryOutputType()); + if (primaryOutput && ignorePrimary) continue; String outputPrefix = type.getOutputPrefix(); String variable = type.getBuildVariable(); boolean multOfType = type.getMultipleOfType(); - boolean primaryOutput = (type == tool.getPrimaryOutputType()); - IOption option = getOption(tool, type.getOptionId()); + IOption option = tool.getOptionBySuperClassId(type.getOptionId()); IManagedOutputNameProvider nameProvider = type.getNameProvider(); - String outputNames = type.getOutputNames(); + String[] outputNames = type.getOutputNames(); // 1. If the tool is the build target and this is the primary output, // use artifact name & extension @@ -1950,9 +2080,8 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { } else // 4. If outputNames is specified, use it if (outputNames != null) { - String[] pathTokens = outputNames.split(";"); //$NON-NLS-1$ - for (int j = 0; j < pathTokens.length; j++) { - outputs.add(Path.fromOSString(pathTokens[j])); + for (int j = 0; j < outputNames.length; j++) { + outputs.add(Path.fromOSString(outputNames[j])); } } else { // 4. Use the name pattern to generate a transformation macro @@ -1990,14 +2119,16 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { // In this case, the output file name is the input file name with // the output extension. - IPath outPath = resource.getFullPath().removeFileExtension(); - String outPrefix = tool.getOutputPrefix(); - if (outPrefix.length() > 0) { - String outName = outPrefix + outPath.lastSegment(); - outPath = outPath.removeLastSegments(1).append(outName); + if (!ignorePrimary) { + IPath outPath = Path.fromOSString(resource.getFullPath().removeFileExtension().lastSegment()); + String outPrefix = tool.getOutputPrefix(); + if (outPrefix.length() > 0) { + String outName = outPrefix + outPath.lastSegment(); + outPath = outPath.removeLastSegments(1).append(outName); + } + outPath = outPath.addFileExtension(outExt); + outputs.add(outPath); } - outPath = outPath.addFileExtension(outExt); - outputs.add(outPath); } return outputs; @@ -2143,9 +2274,9 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { protected void addMacroAdditionPrefix(HashMap map, String macroName, String relativePath, boolean addPrefix) { // there is no entry in the map, so create a buffer for this macro StringBuffer tempBuffer = new StringBuffer(); - tempBuffer.append(macroName + WHITESPACE + MACRO_ADDITION_PREFIX_SUFFIX); //$NON-NLS-1$ + tempBuffer.append(macroName + WHITESPACE + MACRO_ADDITION_PREFIX_SUFFIX); if (addPrefix) { - tempBuffer.append("${addprefix " + relativePath + MACRO_ADDITION_ADDPREFIX_SUFFIX); //$NON-NLS-1$ //$NON-NLS-2$ + tempBuffer.append(MACRO_ADDITION_ADDPREFIX_HEADER + relativePath + MACRO_ADDITION_ADDPREFIX_SUFFIX); } // have to store the buffer in String form as StringBuffer is not a sublcass of Object @@ -2186,7 +2317,7 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { /* (non-Javadoc) * Write all macro addition entries in a map to the buffer */ - protected StringBuffer writeAdditionMacros(HashMap map, boolean addPrefix) { + protected StringBuffer writeAdditionMacros(HashMap map) { StringBuffer buffer = new StringBuffer(); // Add the comment buffer.append(COMMENT_SYMBOL + WHITESPACE + ManagedMakeMessages.getResourceString(MOD_VARS) + NEWLINE); @@ -2199,12 +2330,17 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { // Check if we added any files to the rule // Currently, we do this by comparing the end of the rule buffer to MACRO_ADDITION_PREFIX_SUFFIX if (!(macroString.endsWith(MACRO_ADDITION_PREFIX_SUFFIX)) && - !(macroString.endsWith(MACRO_ADDITION_ADDPREFIX_SUFFIX))) { + !(macroString.endsWith(MACRO_ADDITION_ADDPREFIX_SUFFIX))) { StringBuffer currentBuffer = new StringBuffer(); - currentBuffer.append( macroString); // Close off the rule - if (addPrefix) { - currentBuffer.append("}"); //$NON-NLS-1$ + if (macroString.indexOf(MACRO_ADDITION_ADDPREFIX_HEADER) >= 0) { + currentBuffer.append(macroString + "}" + NEWLINE); //$NON-NLS-1$ + } else { + // Remove the final "/" + if (macroString.endsWith(LINEBREAK)) { + macroString = macroString.substring(0, (macroString.length() - 2)) + NEWLINE; + } + currentBuffer.append(macroString); } currentBuffer.append(NEWLINE); @@ -2404,28 +2540,6 @@ public class GnuMakefileGenerator implements IManagedBuilderMakefileGenerator { } return ruleList; } - - /* (non-Javadoc) - * Returns the option that matches the option ID in this tool - */ - public IOption getOption(ITool tool, String optionId) { - if (optionId == null) return null; - - // Look for an option with this ID, or an option with a superclass with this id - IOption[] options = tool.getOptions(); - for (int i = 0; i < options.length; i++) { - IOption targetOption = options[i]; - IOption option = targetOption; - do { - if (optionId.equals(option.getId())) { - return targetOption; - } - option = option.getSuperClass(); - } while (option != null); - } - - return null; - } /************************************************************************* * R E S O U R C E V I S I T O R M E T H O D S diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/IManagedBuildGnuToolInfo.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/IManagedBuildGnuToolInfo.java index c883f6bf50b..654b263c23c 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/IManagedBuildGnuToolInfo.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/IManagedBuildGnuToolInfo.java @@ -59,11 +59,18 @@ public interface IManagedBuildGnuToolInfo { public Vector getCommandOutputs(); /** - * Returns the raw list of tool's output file names. + * Returns the raw list of tool's primary output file names. * * @return Vector */ - public Vector getEnumeratedOutputs(); + public Vector getEnumeratedPrimaryOutputs(); + + /** + * Returns the raw list of tool's secondary output file names. + * + * @return Vector + */ + public Vector getEnumeratedSecondaryOutputs(); /** * Returns the raw list of tool's output variable names. diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/ManagedBuildGnuToolInfo.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/ManagedBuildGnuToolInfo.java index eb5de96fcde..71f933b9831 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/ManagedBuildGnuToolInfo.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/makegen/gnu/ManagedBuildGnuToolInfo.java @@ -61,7 +61,8 @@ public class ManagedBuildGnuToolInfo implements IManagedBuildGnuToolInfo { private Vector commandInputs = new Vector(); private Vector enumeratedInputs = new Vector(); private Vector commandOutputs = new Vector(); - private Vector enumeratedOutputs = new Vector(); + private Vector enumeratedPrimaryOutputs = new Vector(); + private Vector enumeratedSecondaryOutputs = new Vector(); private Vector outputVariables = new Vector(); private Vector commandDependencies = new Vector(); //private Vector enumeratedDependencies = new Vector(); @@ -103,8 +104,12 @@ public class ManagedBuildGnuToolInfo implements IManagedBuildGnuToolInfo { return commandOutputs; } - public Vector getEnumeratedOutputs() { - return enumeratedOutputs; + public Vector getEnumeratedPrimaryOutputs() { + return enumeratedPrimaryOutputs; + } + + public Vector getEnumeratedSecondaryOutputs() { + return enumeratedSecondaryOutputs; } public Vector getOutputVariables() { @@ -138,61 +143,110 @@ public class ManagedBuildGnuToolInfo implements IManagedBuildGnuToolInfo { public boolean calculateInputs(GnuMakefileGenerator makeGen, IResource[] projResources, boolean lastChance) { // Get the inputs for this tool invocation // Note that command inputs that are also dependencies are also added to the command dependencies list + + /* The priorities for determining the names of the inputs of a tool are: + * 1. If an option is specified, use the value of the option. + * 2. If a build variable is specified, use the files that have been added to the build variable as + * the output(s) of other build steps. + * 3. Use the file extensions and the resources in the project + */ boolean done = true; - Vector myCommandInputs = new Vector(); - Vector myCommandDependencies = new Vector(); - Vector myEnumeratedInputs = new Vector(); + Vector myCommandInputs = new Vector(); // Inputs for the tool command line + Vector myCommandDependencies = new Vector(); // Dependencies for the make rule + Vector myEnumeratedInputs = new Vector(); // Complete list of individual inputs IInputType[] inTypes = tool.getInputTypes(); if (inTypes != null && inTypes.length > 0) { for (int i=0; i<inTypes.length; i++) { IInputType type = inTypes[i]; String variable = type.getBuildVariable(); + boolean primaryInput = type.getPrimaryInput(); boolean useFileExts = false; - if (variable.length() > 0) { - String cmdVariable = variable = "$(" + variable + ")"; //$NON-NLS-1$ //$NON-NLS-2$ - myCommandInputs.add(cmdVariable); - myCommandDependencies.add(cmdVariable); - // If there is an output variable with the same name, get - // the files associated with it. - List outMacroList = makeGen.getBuildVariableList(variable, true); - if (outMacroList != null) { - myEnumeratedInputs.addAll(outMacroList); - } else { - // If "last chance", then calculate using file extensions below - if (lastChance) { - useFileExts = true; + IOption option = tool.getOptionBySuperClassId(type.getOptionId()); + + // Option? + if (option != null) { + try { + List inputs = new ArrayList(); + int optType = option.getValueType(); + if (optType == IOption.STRING) { + inputs.add(option.getStringValue()); + } else if ( + optType == IOption.STRING_LIST || + optType == IOption.LIBRARIES || + optType == IOption.OBJECTS) { + inputs = (List)option.getValue(); + } + //myCommandInputs.add(inputs); + if (primaryInput) { + myCommandDependencies.add(0, inputs); } else { - done = false; - break; + myCommandDependencies.add(inputs); + } + //myEnumeratedInputs.add(inputs); + } catch( BuildException ex ) { + } + + } else { + + // Build Variable? + if (variable.length() > 0) { + String cmdVariable = variable = "$(" + variable + ")"; //$NON-NLS-1$ //$NON-NLS-2$ + myCommandInputs.add(cmdVariable); + if (primaryInput) { + myCommandDependencies.add(0, cmdVariable); + } else { + myCommandDependencies.add(cmdVariable); + } + // If there is an output variable with the same name, get + // the files associated with it. + List outMacroList = makeGen.getBuildVariableList(variable, true); + if (outMacroList != null) { + myEnumeratedInputs.addAll(outMacroList); + } else { + // If "last chance", then calculate using file extensions below + if (lastChance) { + useFileExts = true; + } else { + done = false; + break; + } } } - } - if (variable.length() == 0 || useFileExts) { - if (type.getMultipleOfType()) { - // Calculate myEnumeratedInputs using the file extensions and the resources in the project - String[] exts = tool.getAllInputExtensions(); - if (projResources != null) { - for (int j=0; j<projResources.length; j++) { - if (projResources[i].getType() == IResource.FILE) { - String fileExt = projResources[i].getFileExtension(); - for (int k=0; k<exts.length; k++) { - if (fileExt.equals(exts[k])) { - // TODO - is project relative correct? - if (!useFileExts) { - myCommandInputs.add(projResources[i].getProjectRelativePath()); + + // Use file extensions + if (variable.length() == 0 || useFileExts) { + if (type.getMultipleOfType()) { + // Calculate myEnumeratedInputs using the file extensions and the resources in the project + String[] exts = tool.getAllInputExtensions(); + if (projResources != null) { + for (int j=0; j<projResources.length; j++) { + if (projResources[i].getType() == IResource.FILE) { + String fileExt = projResources[i].getFileExtension(); + for (int k=0; k<exts.length; k++) { + if (fileExt.equals(exts[k])) { + // TODO - is project relative correct? + if (!useFileExts) { + myCommandInputs.add(projResources[i].getProjectRelativePath()); + if (primaryInput) { + myCommandDependencies.add(0, projResources[i].getProjectRelativePath()); + } else { + myCommandDependencies.add(projResources[i].getProjectRelativePath()); + } + } + myEnumeratedInputs.add(projResources[i].getProjectRelativePath()); + break; } - myEnumeratedInputs.add(projResources[i].getProjectRelativePath()); - break; } } } } + } else { + // Rule will be generated by addRuleForSource } - } else { - // Rule will be generated by addRuleForSource } } + // Get any additional inputs specified in the manifest file or the project file IAdditionalInput[] addlInputs = type.getAdditionalInputs(); if (addlInputs != null) { @@ -201,12 +255,11 @@ public class ManagedBuildGnuToolInfo implements IManagedBuildGnuToolInfo { int kind = addlInput.getKind(); if (kind == IAdditionalInput.KIND_ADDITIONAL_INPUT || kind == IAdditionalInput.KIND_ADDITIONAL_INPUT_DEPENDENCY) { - String paths = addlInput.getPaths(); + String[] paths = addlInput.getPaths(); if (paths != null) { - String[] pathTokens = paths.split(";"); //$NON-NLS-1$ - for (int k = 0; k < pathTokens.length; k++) { - myCommandInputs.add(pathTokens[k]); - myEnumeratedInputs.add(pathTokens[k]); + for (int k = 0; k < paths.length; k++) { + myCommandInputs.add(paths[k]); + myEnumeratedInputs.add(paths[k]); } } } @@ -233,7 +286,7 @@ public class ManagedBuildGnuToolInfo implements IManagedBuildGnuToolInfo { if (done) { commandInputs.addAll(myCommandInputs); - commandDependencies.addAll(myCommandDependencies); + commandDependencies.addAll(0, myCommandDependencies); enumeratedInputs.addAll(myEnumeratedInputs); inputsCalculated = true; return true; @@ -243,7 +296,7 @@ public class ManagedBuildGnuToolInfo implements IManagedBuildGnuToolInfo { } /* - * The priorities for determining the names of the ouputs of a tool are: + * The priorities for determining the names of the outputs of a tool are: * 1. If the tool is the build target and primary output, use artifact name & extension * 2. If an option is specified, use the value of the option * 3. If a nameProvider is specified, call it @@ -251,12 +304,16 @@ public class ManagedBuildGnuToolInfo implements IManagedBuildGnuToolInfo { * 5. Use the name pattern to generate a transformation macro * so that the source names can be transformed into the target names * using the built-in string substitution functions of <code>make</code>. + * + * NOTE: If an option is not specified and this is not the primary output type, the outputs + * from the type are not added to the command line */ public boolean calculateOutputs(GnuMakefileGenerator makeGen, HashSet handledInputExtensions, boolean lastChance) { boolean done = true; Vector myCommandOutputs = new Vector(); - Vector myEnumeratedOutputs = new Vector(); + Vector myEnumeratedPrimaryOutputs = new Vector(); + Vector myEnumeratedSecondaryOutputs = new Vector(); HashMap myOutputMacros = new HashMap(); // The next two fields are used together Vector myBuildVars = new Vector(); @@ -272,9 +329,9 @@ public class ManagedBuildGnuToolInfo implements IManagedBuildGnuToolInfo { String variable = type.getBuildVariable(); boolean multOfType = type.getMultipleOfType(); boolean primaryOutput = (type == tool.getPrimaryOutputType()); - IOption option = makeGen.getOption(tool, type.getOptionId()); + IOption option = tool.getOptionBySuperClassId(type.getOptionId()); IManagedOutputNameProvider nameProvider = type.getNameProvider(); - String outputNames = type.getOutputNames(); + String[] outputNames = type.getOutputNames(); // 1. If the tool is the build target and this is the primary output, // use artifact name & extension @@ -306,7 +363,7 @@ public class ManagedBuildGnuToolInfo implements IManagedBuildGnuToolInfo { } } } - myCommandOutputs.addAll(outputs); + //myCommandOutputs.addAll(outputs); typeEnumeratedOutputs.addAll(outputs); if (variable.length() > 0) { if (myOutputMacros.containsKey(variable)) { @@ -334,7 +391,9 @@ public class ManagedBuildGnuToolInfo implements IManagedBuildGnuToolInfo { } outNames = nameProvider.getOutputNames(tool, inputPaths); if (outNames != null) { - myCommandOutputs.addAll(Arrays.asList(outNames)); + if (primaryOutput) { + myCommandOutputs.addAll(Arrays.asList(outNames)); + } typeEnumeratedOutputs.addAll(Arrays.asList(outNames)); } } @@ -350,10 +409,11 @@ public class ManagedBuildGnuToolInfo implements IManagedBuildGnuToolInfo { } else // 4. If outputNames is specified, use it if (outputNames != null) { - String[] pathTokens = outputNames.split(";"); //$NON-NLS-1$ - if (pathTokens.length > 0) { - List namesList = Arrays.asList(pathTokens); - myCommandOutputs.addAll(namesList); + if (outputNames.length > 0) { + List namesList = Arrays.asList(outputNames); + if (primaryOutput) { + myCommandOutputs.addAll(namesList); + } typeEnumeratedOutputs.addAll(namesList); if (variable.length() > 0) { if (myOutputMacros.containsKey(variable)) { @@ -405,7 +465,9 @@ public class ManagedBuildGnuToolInfo implements IManagedBuildGnuToolInfo { fileName = "default"; //$NON-NLS-1$ } // Replace the % with the file name - myCommandOutputs.add(namePattern.replaceAll("%", fileName)); //$NON-NLS-1$ + if (primaryOutput) { + myCommandOutputs.add(namePattern.replaceAll("%", fileName)); //$NON-NLS-1$ + } typeEnumeratedOutputs.add(namePattern.replaceAll("%", fileName)); //$NON-NLS-1$ if (variable.length() > 0) { List outputs = new ArrayList(); @@ -425,7 +487,11 @@ public class ManagedBuildGnuToolInfo implements IManagedBuildGnuToolInfo { myBuildVars.add(variable); myBuildVarsValues.add(typeEnumeratedOutputs); } - myEnumeratedOutputs.addAll(typeEnumeratedOutputs); + if (primaryOutput) { + myEnumeratedPrimaryOutputs.addAll(typeEnumeratedOutputs); + } else { + myEnumeratedSecondaryOutputs.addAll(typeEnumeratedOutputs); + } } } else { if (bIsTargetTool) { @@ -435,7 +501,7 @@ public class ManagedBuildGnuToolInfo implements IManagedBuildGnuToolInfo { outputName += (DOT + targetExt); } myCommandOutputs.add(outputName); - myEnumeratedOutputs.add(outputName); + myEnumeratedPrimaryOutputs.add(outputName); } else { // For support of pre-CDT 3.0 integrations. // NOTE WELL: This only supports the case of a single "target tool" @@ -463,7 +529,8 @@ public class ManagedBuildGnuToolInfo implements IManagedBuildGnuToolInfo { if (done) { commandOutputs.addAll(myCommandOutputs); - enumeratedOutputs.addAll(myEnumeratedOutputs); + enumeratedPrimaryOutputs.addAll(myEnumeratedPrimaryOutputs); + enumeratedSecondaryOutputs.addAll(myEnumeratedSecondaryOutputs); outputVariables.addAll(myOutputMacros.keySet()); outputsCalculated = true; for (int i=0; i<myBuildVars.size(); i++) { @@ -548,11 +615,10 @@ public class ManagedBuildGnuToolInfo implements IManagedBuildGnuToolInfo { int kind = addlInput.getKind(); if (kind == IAdditionalInput.KIND_ADDITIONAL_DEPENDENCY || kind == IAdditionalInput.KIND_ADDITIONAL_INPUT_DEPENDENCY) { - String paths = addlInput.getPaths(); + String[] paths = addlInput.getPaths(); if (paths != null) { - String[] pathTokens = paths.split(";"); //$NON-NLS-1$ - for (int k = 0; k < pathTokens.length; k++) { - myCommandDependencies.add(pathTokens[k]); + for (int k = 0; k < paths.length; k++) { + myCommandDependencies.add(paths[k]); //myEnumeratedInputs.add(pathTokens[k]); } } diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProject21.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProject21.java new file mode 100644 index 00000000000..04da0a2d011 --- /dev/null +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProject21.java @@ -0,0 +1,73 @@ +/********************************************************************** + * Copyright (c) 2005 Intel Corporation and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Common Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: + * Intel Corporation - Initial API and implementation + **********************************************************************/ +package org.eclipse.cdt.managedbuilder.projectconverter; + + +import java.io.File; + +import org.eclipse.cdt.managedbuilder.core.IManagedBuildInfo; +import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; +import org.eclipse.cdt.managedbuilder.internal.core.ManagedBuildInfo; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IWorkspace; +import org.eclipse.core.resources.WorkspaceJob; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Status; +import org.eclipse.core.runtime.jobs.ISchedulingRule; + +class UpdateManagedProject21 { + + /** + * @param monitor the monitor to allow users to cancel the long-running operation + * @param project the <code>IProject</code> that needs to be upgraded + * @throws CoreException + */ + static void doProjectUpdate(IProgressMonitor monitor, final IProject project) throws CoreException { + String[] projectName = new String[]{project.getName()}; + IFile file = project.getFile(ManagedBuildManager.SETTINGS_FILE_NAME); + File settingsFile = file.getLocation().toFile(); + if (!settingsFile.exists()) { + monitor.done(); + return; + } + + // Backup the file + monitor.beginTask(ConverterMessages.getFormattedString("UpdateManagedProject20.0", projectName), 1); //$NON-NLS-1$ + IManagedBuildInfo info = ManagedBuildManager.getBuildInfo(project); + UpdateManagedProjectManager.backupFile(file, "_21backup", monitor, project); //$NON-NLS-1$ + // No physical conversion is need since the 3.0 model is a superset of the 2.1 model + // Just upgrade the version + ((ManagedBuildInfo)info).setVersion(ManagedBuildManager.getBuildInfoVersion().toString()); + info.setValid(true); + + // Save the updated file + // If the tree is locked spawn a job to this. + IWorkspace workspace = project.getWorkspace(); + boolean treeLock = workspace.isTreeLocked(); + ISchedulingRule rule = workspace.getRuleFactory().createRule(project); + if (treeLock) { + WorkspaceJob job = new WorkspaceJob("Updating managed Project") { + public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException { + ManagedBuildManager.saveBuildInfo(project, true); + return Status.OK_STATUS; + } + }; + job.setRule(rule); + job.schedule(); + } else { + ManagedBuildManager.saveBuildInfo(project, true); + } + monitor.done(); + } +} diff --git a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProjectManager.java b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProjectManager.java index 6cb433cf7c3..3726ecdad8b 100644 --- a/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProjectManager.java +++ b/build/org.eclipse.cdt.managedbuilder.core/src/org/eclipse/cdt/managedbuilder/projectconverter/UpdateManagedProjectManager.java @@ -1,5 +1,5 @@ /********************************************************************** - * Copyright (c) 2004 Intel Corporation and others. + * Copyright (c) 2004, 2005 Intel Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at @@ -112,7 +112,7 @@ public class UpdateManagedProjectManager { PluginVersionIdentifier compVersion = ManagedBuildManager.getBuildInfoVersion(); - if(projVersion.isEquivalentTo(compVersion)) + if(compVersion.isEquivalentTo(projVersion)) return true; return false; } @@ -291,6 +291,10 @@ public class UpdateManagedProjectManager { UpdateManagedProject20.doProjectUpdate(monitor, fProject); version = getManagedBuildInfoVersion(info.getVersion()); } + if(version.isEquivalentTo(new PluginVersionIdentifier(2,1,0))){ + UpdateManagedProject21.doProjectUpdate(monitor, fProject); + version = getManagedBuildInfoVersion(info.getVersion()); + } if(!isCompatibleProject(info)){ throw new CoreException(new Status(IStatus.ERROR, ManagedBuilderCorePlugin.getUniqueIdentifier(), -1, diff --git a/build/org.eclipse.cdt.managedbuilder.ui/plugin.xml b/build/org.eclipse.cdt.managedbuilder.ui/plugin.xml index 587086b25e6..7d9c205c958 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/plugin.xml +++ b/build/org.eclipse.cdt.managedbuilder.ui/plugin.xml @@ -118,12 +118,9 @@ </managedBuildRevision> <tool natureFilter="cnature" - sources="o" - outputs="" name="%ToolName.linker.gnu.c" outputFlag="-o" command="gcc" - dependencyCalculator="org.eclipse.cdt.managedbuilder.makegen.internal.DefaultNoDependencyCalculator" id="cdt.managedbuild.tool.gnu.c.linker"> <envVarBuildPath pathType="buildpathLibrary" @@ -255,15 +252,32 @@ id="gnu.c.link.option.defname" valueType="string"> </option> + <inputType + sources="o" + multipleOfType="true" + dependencyCalculator="org.eclipse.cdt.managedbuilder.makegen.internal.DefaultNoDependencyCalculator" + buildVariable="OBJS" + id="cdt.managedbuild.tool.gnu.c.linker.input"> + <additionalInput + paths="$(USER_OBJS)" + kind="additionalinputdependency"> + </additionalInput> + <additionalInput + paths="$(LIBS)" + kind="additionalinput"> + </additionalInput> + </inputType> + <outputType + outputs="" + buildVariable="EXECUTABLES" + id="cdt.managedbuild.tool.gnu.c.linker.output"> + </outputType> </tool> <tool natureFilter="ccnature" - sources="o" - outputs="" name="%ToolName.linker.gnu.cpp" outputFlag="-o" command="g++" - dependencyCalculator="org.eclipse.cdt.managedbuilder.makegen.internal.DefaultNoDependencyCalculator" id="cdt.managedbuild.tool.gnu.cpp.linker"> <envVarBuildPath pathType="buildpathLibrary" @@ -386,16 +400,32 @@ valueType="string" id="gnu.cpp.link.option.defname"> </option> + <inputType + sources="o" + multipleOfType="true" + dependencyCalculator="org.eclipse.cdt.managedbuilder.makegen.internal.DefaultNoDependencyCalculator" + buildVariable="OBJS" + id="cdt.managedbuild.tool.gnu.cpp.linker.input"> + <additionalInput + paths="$(USER_OBJS)" + kind="additionalinputdependency"> + </additionalInput> + <additionalInput + paths="$(LIBS)" + kind="additionalinput"> + </additionalInput> + </inputType> + <outputType + outputs="" + buildVariable="EXECUTABLES" + id="cdt.managedbuild.tool.gnu.cpp.linker.output"> + </outputType> </tool> <tool natureFilter="both" isAbstract="true" - sources="o" name="%ToolName.archiver.gnu" - outputs="a" command="ar" - outputPrefix="lib" - dependencyCalculator="org.eclipse.cdt.managedbuilder.makegen.internal.DefaultNoDependencyCalculator" id="cdt.managedbuild.tool.gnu.archiver"> <optionCategory owner="cdt.managedbuild.tool.gnu.archiver" @@ -409,6 +439,27 @@ valueType="string" id="gnu.both.lib.option.flags"> </option> + <inputType + sources="o" + multipleOfType="true" + dependencyCalculator="org.eclipse.cdt.managedbuilder.makegen.internal.DefaultNoDependencyCalculator" + buildVariable="OBJS" + id="cdt.managedbuild.tool.gnu.archiver.input"> + <additionalInput + paths="$(USER_OBJS)" + kind="additionalinputdependency"> + </additionalInput> + <additionalInput + paths="$(LIBS)" + kind="additionalinput"> + </additionalInput> + </inputType> + <outputType + outputs="a" + outputPrefix="lib" + buildVariable="ARCHIVES" + id="cdt.managedbuild.tool.gnu.archiver.output"> + </outputType> </tool> <!--tool command="windres" @@ -475,8 +526,6 @@ </tool--> <tool command="as" - sources="s,S" - outputs="o" name="%ToolName.assembler.gnu" outputFlag="-o" id="cdt.managedbuild.tool.gnu.assembler" @@ -513,15 +562,21 @@ category="gnu.asm.category.general" name="%Option.Gnu.Assembler.version" id="gnu.both.asm.option.version"/> + <inputType + sources="s,S" + id="cdt.managedbuild.tool.gnu.assembler.input"> + </inputType> + <outputType + outputs="o" + buildVariable="OBJS" + id="cdt.managedbuild.tool.gnu.assembler.output"> + </outputType> </tool> <tool natureFilter="cnature" - sources="o" - outputs="" name="%ToolName.linker.macosx.c" outputFlag="-o" command="gcc" - dependencyCalculator="org.eclipse.cdt.managedbuilder.makegen.internal.DefaultNoDependencyCalculator" id="cdt.managedbuild.tool.macosx.c.linker"> <envVarBuildPath pathType="buildpathLibrary" @@ -632,15 +687,32 @@ id="macosx.c.link.option.shared" valueType="boolean"> </option> + <inputType + sources="o" + multipleOfType="true" + dependencyCalculator="org.eclipse.cdt.managedbuilder.makegen.internal.DefaultNoDependencyCalculator" + buildVariable="OBJS" + id="cdt.managedbuild.tool.macosx.c.linker.input"> + <additionalInput + paths="$(USER_OBJS)" + kind="additionalinputdependency"> + </additionalInput> + <additionalInput + paths="$(LIBS)" + kind="additionalinput"> + </additionalInput> + </inputType> + <outputType + outputs="" + buildVariable="EXECUTABLES" + id="cdt.managedbuild.tool.macosx.c.linker.output"> + </outputType> </tool> <tool natureFilter="ccnature" - sources="o" - outputs="" name="%ToolName.linker.macosx.cpp" outputFlag="-o" command="g++" - dependencyCalculator="org.eclipse.cdt.managedbuilder.makegen.internal.DefaultNoDependencyCalculator" id="cdt.managedbuild.tool.macosx.cpp.linker"> <envVarBuildPath pathType="buildpathLibrary" @@ -742,18 +814,34 @@ valueType="boolean" id="macosx.cpp.link.option.shared"> </option> + <inputType + sources="o" + multipleOfType="true" + dependencyCalculator="org.eclipse.cdt.managedbuilder.makegen.internal.DefaultNoDependencyCalculator" + buildVariable="OBJS" + id="cdt.managedbuild.tool.macosx.cpp.linker.input"> + <additionalInput + paths="$(USER_OBJS)" + kind="additionalinputdependency"> + </additionalInput> + <additionalInput + paths="$(LIBS)" + kind="additionalinput"> + </additionalInput> + </inputType> + <outputType + outputs="" + buildVariable="EXECUTABLES" + id="cdt.managedbuild.tool.macosx.cpp.linker.output"> + </outputType> </tool> <tool name="%ToolName.compiler.gnu.c" id="cdt.managedbuild.tool.gnu.c.compiler" isAbstract="true" - sources="c" command="gcc" - dependencyCalculator="org.eclipse.cdt.managedbuilder.makegen.gnu.DefaultGCCDependencyCalculator" - headerExtensions="h" natureFilter="cnature" - outputs="o" outputFlag="-o"> <envVarBuildPath pathType="buildpathInclude" @@ -987,17 +1075,24 @@ id="gnu.c.compiler.option.misc.ansi" valueType="boolean"> </option> + <inputType + sources="c" + dependencyExtensions="h" + dependencyCalculator="org.eclipse.cdt.managedbuilder.makegen.gnu.DefaultGCCDependencyCalculator" + id="cdt.managedbuild.tool.gnu.c.compiler.input"> + </inputType> + <outputType + outputs="o" + buildVariable="OBJS" + id="cdt.managedbuild.tool.gnu.c.compiler.output"> + </outputType> </tool> <tool name="%ToolName.compiler.gnu.cpp" id="cdt.managedbuild.tool.gnu.cpp.compiler" isAbstract="true" - sources="c,C,cc,cxx,cpp" command="g++" - dependencyCalculator="org.eclipse.cdt.managedbuilder.makegen.gnu.DefaultGCCDependencyCalculator" - headerExtensions="h,H,hpp" natureFilter="ccnature" - outputs="o" outputFlag="-o"> <envVarBuildPath pathType="buildpathInclude" @@ -1217,6 +1312,17 @@ id="gnu.cpp.compiler.option.other.verbose" valueType="boolean"> </option> + <inputType + sources="c,C,cc,cxx,cpp" + dependencyExtensions="h,H,hpp" + dependencyCalculator="org.eclipse.cdt.managedbuilder.makegen.gnu.DefaultGCCDependencyCalculator" + id="cdt.managedbuild.tool.gnu.cpp.compiler.input"> + </inputType> + <outputType + outputs="o" + buildVariable="OBJS" + id="cdt.managedbuild.tool.gnu.cpp.compiler.output"> + </outputType> </tool> <tool @@ -1227,6 +1333,11 @@ variableList="LIBRARY_PATH" buildPathResolver="org.eclipse.cdt.managedbuilder.toolchain.gnu.cygwin.CygwinPathResolver"> </envVarBuildPath> + <outputType + outputs="exe" + superClass="cdt.managedbuild.tool.gnu.c.linker.output" + id="cdt.managedbuild.tool.gnu.c.linker.cygwin.output"> + </outputType> </tool> <tool id="cdt.managedbuild.tool.gnu.cpp.linker.cygwin" @@ -1236,6 +1347,11 @@ variableList="LIBRARY_PATH" buildPathResolver="org.eclipse.cdt.managedbuilder.toolchain.gnu.cygwin.CygwinPathResolver"> </envVarBuildPath> + <outputType + outputs="exe" + superClass="cdt.managedbuild.tool.gnu.cpp.linker.output" + id="cdt.managedbuild.tool.gnu.cpp.linker.cygwin.output"> + </outputType> </tool> <tool id="cdt.managedbuild.tool.gnu.c.compiler.cygwin" @@ -1271,6 +1387,7 @@ archList="all" osList="solaris,linux,hpux,aix,qnx" name="%ToolChainName.Dbg" + targetTool="cdt.managedbuild.tool.gnu.c.linker.exe.debug;cdt.managedbuild.tool.gnu.cpp.linker.exe.debug" scannerConfigDiscoveryProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile" id="cdt.managedbuild.toolchain.gnu.exe.debug"> <targetPlatform @@ -1338,6 +1455,7 @@ archList="all" osList="solaris,linux,hpux,aix,qnx" name="%ToolChainName.Rel" + targetTool="cdt.managedbuild.tool.gnu.c.linker.exe.release;cdt.managedbuild.tool.gnu.cpp.linker.exe.release" scannerConfigDiscoveryProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile" id="cdt.managedbuild.toolchain.gnu.exe.release"> <targetPlatform @@ -1413,6 +1531,7 @@ archList="all" osList="solaris,linux,hpux,aix,qnx" name="%ToolChainName.Dbg" + targetTool="cdt.managedbuild.tool.gnu.c.linker.so.debug;cdt.managedbuild.tool.gnu.cpp.linker.so.debug" scannerConfigDiscoveryProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile" id="cdt.managedbuild.toolchain.gnu.so.debug"> <targetPlatform @@ -1459,25 +1578,35 @@ </tool> <tool id="cdt.managedbuild.tool.gnu.c.linker.so.debug" - outputs="so" - outputPrefix="lib" superClass="cdt.managedbuild.tool.gnu.c.linker"> <option id="gnu.c.link.so.debug.option.shared" defaultValue="true" superClass="gnu.c.link.option.shared"> </option> + <outputType + outputs="so" + outputPrefix="lib" + buildVariable="LIBRARIES" + superClass="cdt.managedbuild.tool.gnu.c.linker.output" + id="cdt.managedbuild.tool.gnu.c.linker.so.debug.output"> + </outputType> </tool> <tool id="cdt.managedbuild.tool.gnu.cpp.linker.so.debug" - outputs="so" - outputPrefix="lib" superClass="cdt.managedbuild.tool.gnu.cpp.linker"> <option id="gnu.cpp.link.so.debug.option.shared" defaultValue="true" superClass="gnu.cpp.link.option.shared"> </option> + <outputType + outputs="so" + outputPrefix="lib" + buildVariable="LIBRARIES" + superClass="cdt.managedbuild.tool.gnu.cpp.linker.output" + id="cdt.managedbuild.tool.gnu.cpp.linker.so.debug.output"> + </outputType> </tool> <tool id="cdt.managedbuild.tool.gnu.assembler.so.debug" @@ -1495,6 +1624,7 @@ archList="all" osList="solaris,linux,hpux,aix,qnx" name="%ToolChainName.Rel" + targetTool="cdt.managedbuild.tool.gnu.c.linker.so.release;cdt.managedbuild.tool.gnu.cpp.linker.so.release" scannerConfigDiscoveryProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile" id="cdt.managedbuild.toolchain.gnu.so.release"> <targetPlatform @@ -1541,25 +1671,35 @@ </tool> <tool id="cdt.managedbuild.tool.gnu.c.linker.so.release" - outputs="so" - outputPrefix="lib" superClass="cdt.managedbuild.tool.gnu.c.linker"> <option id="gnu.c.link.so.release.option.shared" defaultValue="true" superClass="gnu.c.link.option.shared"> </option> + <outputType + outputs="so" + outputPrefix="lib" + buildVariable="LIBRARIES" + superClass="cdt.managedbuild.tool.gnu.c.linker.output" + id="cdt.managedbuild.tool.gnu.c.linker.so.release.output"> + </outputType> </tool> <tool id="cdt.managedbuild.tool.gnu.cpp.linker.so.release" - outputs="so" - outputPrefix="lib" superClass="cdt.managedbuild.tool.gnu.cpp.linker"> <option id="gnu.cpp.link.so.release.option.shared" defaultValue="true" superClass="gnu.cpp.link.option.shared"> </option> + <outputType + outputs="so" + outputPrefix="lib" + buildVariable="LIBRARIES" + superClass="cdt.managedbuild.tool.gnu.cpp.linker.output" + id="cdt.managedbuild.tool.gnu.cpp.linker.so.release.output"> + </outputType> </tool> <tool id="cdt.managedbuild.tool.gnu.assembler.so.release" @@ -1584,6 +1724,7 @@ archList="all" osList="solaris,linux,hpux,aix,qnx" name="%ToolChainName.Dbg" + targetTool="cdt.managedbuild.tool.gnu.archiver.lib.debug" scannerConfigDiscoveryProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile" id="cdt.managedbuild.toolchain.gnu.lib.debug"> <targetPlatform @@ -1630,8 +1771,6 @@ </tool> <tool id="cdt.managedbuild.tool.gnu.archiver.lib.debug" - outputs="a" - outputPrefix="lib" superClass="cdt.managedbuild.tool.gnu.archiver"> </tool> <tool @@ -1650,6 +1789,7 @@ archList="all" osList="solaris,linux,hpux,aix,qnx" name="%ToolChainName.Rel" + targetTool="cdt.managedbuild.tool.gnu.archiver.lib.release" scannerConfigDiscoveryProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile" id="cdt.managedbuild.toolchain.gnu.lib.release"> <targetPlatform @@ -1696,8 +1836,6 @@ </tool> <tool id="cdt.managedbuild.tool.gnu.archiver.lib.release" - outputs="a" - outputPrefix="lib" superClass="cdt.managedbuild.tool.gnu.archiver"> </tool> <tool @@ -1723,6 +1861,7 @@ archList="all" osList="win32" name="%ToolChainName.Dbg" + targetTool="cdt.managedbuild.tool.gnu.c.linker.cygwin.exe.debug;cdt.managedbuild.tool.gnu.cpp.linker.cygwin.exe.debug" scannerConfigDiscoveryProfileId="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile" isToolChainSupported="org.eclipse.cdt.managedbuilder.toolchain.gnu.cygwin.IsGnuCygwinToolChainSupported" configurationEnvironmentSupplier="org.eclipse.cdt.managedbuilder.toolchain.gnu.cygwin.GnuCygwinConfigurationEnvironmentSupplier" @@ -1771,12 +1910,10 @@ </tool> <tool id="cdt.managedbuild.tool.gnu.c.linker.cygwin.exe.debug" - outputs="exe" superClass="cdt.managedbuild.tool.gnu.c.linker.cygwin"> </tool> <tool id="cdt.managedbuild.tool.gnu.cpp.linker.cygwin.exe.debug" - outputs="exe" superClass="cdt.managedbuild.tool.gnu.cpp.linker.cygwin"> </tool> <tool @@ -1795,6 +1932,7 @@ archList="all" osList="win32" name="%ToolChainName.Rel" + targetTool="cdt.managedbuild.tool.gnu.c.linker.cygwin.exe.release;cdt.managedbuild.tool.gnu.cpp.linker.cygwin.exe.release" scannerConfigDiscoveryProfileId="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile" isToolChainSupported="org.eclipse.cdt.managedbuilder.toolchain.gnu.cygwin.IsGnuCygwinToolChainSupported" configurationEnvironmentSupplier="org.eclipse.cdt.managedbuilder.toolchain.gnu.cygwin.GnuCygwinConfigurationEnvironmentSupplier" @@ -1843,12 +1981,10 @@ </tool> <tool id="cdt.managedbuild.tool.gnu.c.linker.cygwin.exe.release" - outputs="exe" superClass="cdt.managedbuild.tool.gnu.c.linker.cygwin"> </tool> <tool id="cdt.managedbuild.tool.gnu.cpp.linker.cygwin.exe.release" - outputs="exe" superClass="cdt.managedbuild.tool.gnu.cpp.linker.cygwin"> </tool> <tool @@ -1874,6 +2010,7 @@ archList="all" osList="win32" name="%ToolChainName.Dbg" + targetTool="cdt.managedbuild.tool.gnu.c.linker.cygwin.so.debug;cdt.managedbuild.tool.gnu.cpp.linker.cygwin.so.debug" scannerConfigDiscoveryProfileId="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile" isToolChainSupported="org.eclipse.cdt.managedbuilder.toolchain.gnu.cygwin.IsGnuCygwinToolChainSupported" configurationEnvironmentSupplier="org.eclipse.cdt.managedbuilder.toolchain.gnu.cygwin.GnuCygwinConfigurationEnvironmentSupplier" @@ -1922,23 +2059,33 @@ </tool> <tool id="cdt.managedbuild.tool.gnu.c.linker.cygwin.so.debug" - outputs="dll,a.dll" superClass="cdt.managedbuild.tool.gnu.c.linker.cygwin"> <option id="gnu.c.link.cygwin.so.debug.option.shared" defaultValue="true" superClass="gnu.c.link.option.shared"> </option> + <outputType + outputs="dll,a.dll" + buildVariable="LIBRARIES" + superClass="cdt.managedbuild.tool.gnu.c.linker.cygwin.output" + id="cdt.managedbuild.tool.gnu.c.linker.cygwin.so.debug.output"> + </outputType> </tool> <tool id="cdt.managedbuild.tool.gnu.cpp.linker.cygwin.so.debug" - outputs="dll,a.dll" superClass="cdt.managedbuild.tool.gnu.cpp.linker.cygwin"> <option id="gnu.cpp.link.cygwin.so.debug.option.shared" defaultValue="true" superClass="gnu.cpp.link.option.shared"> </option> + <outputType + outputs="dll,a.dll" + buildVariable="LIBRARIES" + superClass="cdt.managedbuild.tool.gnu.cpp.linker.cygwin.output" + id="cdt.managedbuild.tool.gnu.cpp.linker.cygwin.so.debug.output"> + </outputType> </tool> <tool id="cdt.managedbuild.tool.gnu.assembler.cygwin.so.debug" @@ -1956,6 +2103,7 @@ archList="all" osList="win32" name="%ToolChainName.Rel" + targetTool="cdt.managedbuild.tool.gnu.c.linker.cygwin.so.release;cdt.managedbuild.tool.gnu.cpp.linker.cygwin.so.release" scannerConfigDiscoveryProfileId="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile" isToolChainSupported="org.eclipse.cdt.managedbuilder.toolchain.gnu.cygwin.IsGnuCygwinToolChainSupported" configurationEnvironmentSupplier="org.eclipse.cdt.managedbuilder.toolchain.gnu.cygwin.GnuCygwinConfigurationEnvironmentSupplier" @@ -2004,23 +2152,33 @@ </tool> <tool id="cdt.managedbuild.tool.gnu.c.linker.cygwin.so.release" - outputs="dll,a.dll" superClass="cdt.managedbuild.tool.gnu.c.linker.cygwin"> <option id="gnu.c.link.cygwin.so.release.option.shared" defaultValue="true" superClass="gnu.c.link.option.shared"> </option> + <outputType + outputs="dll,a.dll" + buildVariable="LIBRARIES" + superClass="cdt.managedbuild.tool.gnu.c.linker.cygwin.output" + id="cdt.managedbuild.tool.gnu.c.linker.cygwin.so.release.output"> + </outputType> </tool> <tool id="cdt.managedbuild.tool.gnu.cpp.linker.cygwin.so.release" - outputs="dll,a.dll" superClass="cdt.managedbuild.tool.gnu.cpp.linker.cygwin"> <option id="gnu.cpp.link.cygwin.so.release.option.shared" defaultValue="true" superClass="gnu.cpp.link.option.shared"> </option> + <outputType + outputs="dll,a.dll" + buildVariable="LIBRARIES" + superClass="cdt.managedbuild.tool.gnu.cpp.linker.cygwin.output" + id="cdt.managedbuild.tool.gnu.cpp.linker.cygwin.so.release.output"> + </outputType> </tool> <tool id="cdt.managedbuild.tool.gnu.assembler.cygwin.so.release" @@ -2045,6 +2203,7 @@ archList="all" osList="win32" name="%ToolChainName.Dbg" + targetTool="cdt.managedbuild.tool.gnu.archiver.cygwin.lib.debug" scannerConfigDiscoveryProfileId="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile" isToolChainSupported="org.eclipse.cdt.managedbuilder.toolchain.gnu.cygwin.IsGnuCygwinToolChainSupported" configurationEnvironmentSupplier="org.eclipse.cdt.managedbuilder.toolchain.gnu.cygwin.GnuCygwinConfigurationEnvironmentSupplier" @@ -2093,8 +2252,6 @@ </tool> <tool id="cdt.managedbuild.tool.gnu.archiver.cygwin.lib.debug" - outputPrefix="lib" - outputs="a" superClass="cdt.managedbuild.tool.gnu.archiver"> </tool> <tool @@ -2113,6 +2270,7 @@ archList="all" osList="win32" name="%ToolChainName.Rel" + targetTool="cdt.managedbuild.tool.gnu.archiver.cygwin.lib.release" scannerConfigDiscoveryProfileId="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile" isToolChainSupported="org.eclipse.cdt.managedbuilder.toolchain.gnu.cygwin.IsGnuCygwinToolChainSupported" configurationEnvironmentSupplier="org.eclipse.cdt.managedbuilder.toolchain.gnu.cygwin.GnuCygwinConfigurationEnvironmentSupplier" @@ -2160,15 +2318,13 @@ </option> </tool> <tool - id="cdt.managedbuild.tool.gnu.archiver.cygwin.lib.release" - outputPrefix="lib" - outputs="a" - superClass="cdt.managedbuild.tool.gnu.archiver"> + id="cdt.managedbuild.tool.gnu.archiver.cygwin.lib.release" + superClass="cdt.managedbuild.tool.gnu.archiver"> </tool> - <tool + <tool id="cdt.managedbuild.tool.gnu.assembler.cygwin.lib.release" superClass="cdt.managedbuild.tool.gnu.assembler"> - </tool> + </tool> </toolChain> </configuration> </projectType> @@ -2187,6 +2343,7 @@ archList="all" osList="macosx" name="%ToolChainName.Dbg" + targetTool="cdt.managedbuild.tool.macosx.c.linker.macosx.exe.debug;cdt.managedbuild.tool.macosx.cpp.linker.macosx.exe.debug" scannerConfigDiscoveryProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile" id="cdt.managedbuild.toolchain.gnu.macosx.exe.debug"> <targetPlatform @@ -2254,6 +2411,7 @@ archList="all" osList="macosx" name="%ToolChainName.Rel" + targetTool="cdt.managedbuild.tool.macosx.c.linker.macosx.exe.release;cdt.managedbuild.tool.macosx.cpp.linker.macosx.exe.release" scannerConfigDiscoveryProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile" id="cdt.managedbuild.toolchain.gnu.macosx.exe.release"> <targetPlatform @@ -2329,6 +2487,7 @@ archList="all" osList="macosx" name="%ToolChainName.Dbg" + targetTool="cdt.managedbuild.tool.macosx.c.linker.macosx.so.debug;cdt.managedbuild.tool.macosx.cpp.linker.macosx.so.debug" scannerConfigDiscoveryProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile" id="cdt.managedbuild.toolchain.gnu.macosx.so.debug"> <targetPlatform @@ -2375,8 +2534,6 @@ </tool> <tool id="cdt.managedbuild.tool.macosx.c.linker.macosx.so.debug" - outputs="dylib" - outputPrefix="lib" superClass="cdt.managedbuild.tool.macosx.c.linker"> <option id="macosx.c.link.macosx.so.debug.option.shared" @@ -2393,16 +2550,28 @@ defaultValue="true" superClass="macosx.c.link.option.nodeflibs"> </option> + <outputType + outputs="dylib" + outputPrefix="lib" + buildVariable="LIBRARIES" + superClass="cdt.managedbuild.tool.macosx.c.linker.output" + id="cdt.managedbuild.tool.macosx.c.linker.macosx.so.debug.output"> + </outputType> </tool> <tool id="cdt.managedbuild.tool.macosx.cpp.linker.macosx.so.debug" - outputs="dylib" superClass="cdt.managedbuild.tool.macosx.cpp.linker"> <option id="macosx.cpp.link.macosx.so.debug.option.shared" defaultValue="true" superClass="macosx.cpp.link.option.shared"> </option> + <outputType + outputs="dylib" + buildVariable="LIBRARIES" + superClass="cdt.managedbuild.tool.macosx.cpp.linker.output" + id="cdt.managedbuild.tool.macosx.cpp.linker.macosx.so.debug.output"> + </outputType> </tool> <tool id="cdt.managedbuild.tool.gnu.assembler.macosx.so.debug" @@ -2420,6 +2589,7 @@ archList="all" osList="macosx" name="%ToolChainName.Rel" + targetTool="cdt.managedbuild.tool.macosx.c.linker.macosx.so.release;cdt.managedbuild.tool.macosx.cpp.linker.macosx.so.release" scannerConfigDiscoveryProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile" id="cdt.managedbuild.toolchain.gnu.macosx.so.release"> <targetPlatform @@ -2466,8 +2636,6 @@ </tool> <tool id="cdt.managedbuild.tool.macosx.c.linker.macosx.so.release" - outputs="dylib" - outputPrefix="lib" superClass="cdt.managedbuild.tool.macosx.c.linker"> <option id="macosx.c.link.macosx.so.release.option.shared" @@ -2484,16 +2652,28 @@ defaultValue="true" superClass="macosx.c.link.option.nodeflibs"> </option> + <outputType + outputs="dylib" + outputPrefix="lib" + buildVariable="LIBRARIES" + superClass="cdt.managedbuild.tool.macosx.c.linker.output" + id="cdt.managedbuild.tool.macosx.c.linker.macosx.so.release.output"> + </outputType> </tool> <tool id="cdt.managedbuild.tool.macosx.cpp.linker.macosx.so.release" - outputs="dylib" superClass="cdt.managedbuild.tool.macosx.cpp.linker"> <option id="macosx.cpp.link.macosx.so.release.option.shared" defaultValue="true" superClass="macosx.cpp.link.option.shared"> </option> + <outputType + outputs="dylib" + buildVariable="LIBRARIES" + superClass="cdt.managedbuild.tool.macosx.cpp.linker.output" + id="cdt.managedbuild.tool.macosx.cpp.linker.macosx.so.release.output"> + </outputType> </tool> <tool id="cdt.managedbuild.tool.gnu.assembler.macosx.so.release" @@ -2518,6 +2698,7 @@ archList="all" osList="macosx" name="%ToolChainName.Dbg" + targetTool="cdt.managedbuild.toolmacosx.lib.debug.gnu.archiver" scannerConfigDiscoveryProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile" id="cdt.managedbuild.toolchain.gnu.macosx.lib.debug"> <targetPlatform @@ -2564,8 +2745,6 @@ </tool> <tool id="cdt.managedbuild.toolmacosx.lib.debug.gnu.archiver" - outputPrefix="lib" - outputs="a" superClass="cdt.managedbuild.tool.gnu.archiver"> </tool> <tool @@ -2584,6 +2763,7 @@ archList="all" osList="macosx" name="%ToolChainName.Rel" + targetTool="cdt.managedbuild.toolmacosx.lib.release.gnu.archiver" scannerConfigDiscoveryProfileId="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile" id="cdt.managedbuild.toolchain.gnu.macosx.lib.release"> <targetPlatform @@ -2630,8 +2810,6 @@ </tool> <tool id="cdt.managedbuild.toolmacosx.lib.release.gnu.archiver" - outputPrefix="lib" - outputs="a" superClass="cdt.managedbuild.tool.gnu.archiver"> </tool> <tool diff --git a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/ToolsSettingsBlock.java b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/ToolsSettingsBlock.java index 85ebe279ebf..e8e8daf0b9e 100644 --- a/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/ToolsSettingsBlock.java +++ b/build/org.eclipse.cdt.managedbuilder.ui/src/org/eclipse/cdt/managedbuilder/internal/ui/ToolsSettingsBlock.java @@ -1,5 +1,5 @@ /********************************************************************** - * Copyright (c) 2002,2004 IBM Corporation and others. + * Copyright (c) 2002, 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v0.5 * which accompanies this distribution, and is available at @@ -17,7 +17,10 @@ import java.util.List; import java.util.ListIterator; import java.util.Map; +import org.eclipse.cdt.managedbuilder.core.IBuildObject; import org.eclipse.cdt.managedbuilder.core.IOptionCategory; +import org.eclipse.cdt.managedbuilder.core.IConfiguration; +import org.eclipse.cdt.managedbuilder.core.IResourceConfiguration; import org.eclipse.cdt.managedbuilder.core.ITool; import org.eclipse.cdt.managedbuilder.core.ManagedBuildManager; import org.eclipse.cdt.managedbuilder.ui.properties.BuildOptionSettingsPage; @@ -67,6 +70,8 @@ public class ToolsSettingsBlock extends AbstractCOptionPage { private static final String TREE_LABEL = LABEL + ".ToolTree"; //$NON-NLS-1$ private static final String OPTIONS_LABEL = LABEL + ".ToolOptions"; //$NON-NLS-1$ private static final int[] DEFAULT_SASH_WEIGHTS = new int[] { 20, 30 }; + + private static final String EMPTY_STRING = new String(); /* * Dialog widgets @@ -365,6 +370,9 @@ public class ToolsSettingsBlock extends AbstractCOptionPage { protected void setValues() { + IConfiguration config = null; + IResourceConfiguration resConfig = null; + if (provider == null) { // IResource element = parent.getProject(); IResource resource = (IResource) element; @@ -372,9 +380,11 @@ public class ToolsSettingsBlock extends AbstractCOptionPage { optionList.setContentProvider(provider); } if ( element instanceof IProject ) { - optionList.setInput(parent.getSelectedConfiguration()); + config = parent.getSelectedConfiguration(); + optionList.setInput(config); } else if ( element instanceof IFile){ - optionList.setInput(resParent.getCurrentResourceConfig()); + resConfig = resParent.getCurrentResourceConfig(); + optionList.setInput(resConfig); } optionList.expandAll(); @@ -399,11 +409,58 @@ public class ToolsSettingsBlock extends AbstractCOptionPage { // Determine what the selection in the tree should be Object primary = null; if (selectedTool != null) { - // There is a selected tool defined - primary = selectedTool; + // There is a selected tool defined. See if it matches any current tool (by name) + ITool[] tools = null; + if ( element instanceof IProject ) { + tools = config.getFilteredTools(); + } else if ( element instanceof IFile){ + tools = resConfig.getTools(); + } + String matchName = selectedTool.getName(); + for (int i=0; i<tools.length; i++) { + ITool tool = tools[i]; + if (tool.getName().equals(matchName)) { + primary = tool; + break; + } + } } else if (selectedCategory != null) { - // There is a selected option or category - primary = selectedCategory; + // There is a selected option or category. + // See if it matches any category in the current config (by name) + ITool[] tools = null; + if ( element instanceof IProject ) { + tools = config.getFilteredTools(); + } else if ( element instanceof IFile){ + tools = resConfig.getTools(); + } + String matchName = EMPTY_STRING; + IBuildObject catOrTool = selectedCategory; + do { + matchName = catOrTool.getName() + matchName; + if (catOrTool instanceof ITool) break; + else if (catOrTool instanceof IOptionCategory) { + catOrTool = ((IOptionCategory)catOrTool).getOwner(); + } else break; + } while (catOrTool != null); + for (int i=0; i<tools.length && primary == null; i++) { + ITool tool = tools[i]; + IOptionCategory[] cats = tool.getChildCategories(); + for (int j=0; j<cats.length; j++) { + String catName = EMPTY_STRING; + catOrTool = cats[j]; + do { + catName = catOrTool.getName() + catName; + if (catOrTool instanceof ITool) break; + else if (catOrTool instanceof IOptionCategory) { + catOrTool = ((IOptionCategory)catOrTool).getOwner(); + } else break; + } while (catOrTool != null); + if (catName.equals(matchName)) { + primary = cats[j]; + break; + } + } + } } if (primary == null) {