From 3748006c6bc9056fb208db04ee75173a607dfbd3 Mon Sep 17 00:00:00 2001 From: softworkz Date: Wed, 11 Jun 2025 04:27:05 +0200 Subject: [PATCH 1/3] Add bin2c.exe tool It was simply compiled by cl.exe ffbuild/bin2c.c (no params) Signed-off-by: softworkz --- .gitignore | 3 ++- bin2c.exe | Bin 0 -> 152064 bytes project_generate.vcxproj | 3 +++ project_generate.vcxproj.filters | 3 +++ source/Templates.rc | Bin 1028 -> 1074 bytes source/projectGenerator.cpp | 1 + 6 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 bin2c.exe diff --git a/.gitignore b/.gitignore index f281046..cbdec96 100644 --- a/.gitignore +++ b/.gitignore @@ -27,4 +27,5 @@ *.ilk [Bb]in/* !smp_* -*Caches/ \ No newline at end of file +*Caches/ +!bin2c.exe diff --git a/bin2c.exe b/bin2c.exe new file mode 100644 index 0000000000000000000000000000000000000000..093eb1dad5ecd676d1ef13a987b480b160c5af6e GIT binary patch literal 152064 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%0DS&{oTvEKSDk%?o6g)>VQ^cBL;g64ik_}NpE-f zxf<*tqDj2OI`U>-iO*j;4#yq*+EM?!5Q!prszdMfs?KY)5ku~2VKaiNSmCric673l zDS-Jj_eGHHu`;IqWzCcBM!Sw#y!toL$jot`*m>g4QOo958w z^z>h-PikzgSFC*c+F;r3h<8YXp=HxDGmb0#I~Q5{^@c%Y@J>}h6;^cm-AQiU8d=O5>k7xS!0dJsnpbrN;j9hmR4emjfoo5FP(#gT@u zr3_aq=t-~}H%j!kCU*gkSbCBk{TlfuRBK987pL^a{m&XL=$|$e{qmvckJRXUatPoU z%Ql(TRbW384B?t#`-;7wa2`{@H3)~9BWt-&(kkUgbErzm9MoLPOy8?-pHn{(CiM%N zHWq}3h%Ak=F)6%g9sIOki%rhg#_-DId>^f;-*0M-RvX5laWRa~{sWRH)kY2>Fjiikeq@9egd)h+se03NG-EAs5jf2u1JE8`1~s8N*qOVSKt37{3ySL8c+T zwq~jtC+jZ@y>;rF@wsz_&CQq4GUlTa1rEiB>q}Ead^paYIpU|w6)H_-pM7x!9URXu z@?FqLPC1B%b!<6u>2HRzUTm?l>G=%JwGL&^r%O7NIEXNR^!}{R#$^P!aOP&4a)CTJ ze}xS=Sl#cd^*v30N91gM^cWob4xM-mj=g>RBhE}MxY+$XbRNmwDiG@K*_u$Ha>%J= z9aMQB=fJ91a+T1-;AYhq=3&14db_-Vio)c%9^p$iopzEsv~+%)k5PYvUEa2=S+H$v zD#O(1Je;rpx8ZnfICeWy(hiwYCl9ew9EUk&Dr1G)M7&6u+kEzfd6btL5Wg@Kr`F4$GRzayTh~jm`*cE}^yi=%9|Iw-qGF-?5y=(YhwfHS%q3gu ze!JYOveIo+V{F1oFqHnxJGrFH+N*grUd^ zS|)umTzyN(QP>|qYP!^gHjtpSp=xkPAJH;coeS1X$)ZEW&$ddR{#70-_W~BF!#DOr zWp5H!7d2U+!eMK3<-b2H+JRM?&X?fob1CxFK#@|r$S}Kz?416FBKq@aqCT^`Jg@6m z_+SF6eieJ=04804y?FpEw>C=qej{W>`-Yphye`DSXJiJPQ8Z}juS)eQ{ldh*4S{T( zyNE`rQXr+=FaMHuitLQvcDeea-C2oY(1U0Q*-XE+5*SwLFD0}7rsm!o5K~HjK)m0| zo2QLIzZ2^@Hk}rKEqSp(^oiAnXsXAvbqjRKNRC~ zt={zX_mYQ4E%R+C739wmvV509&jq}kzwVZ9`n?r&Wy|!=ZMr=y3jX1d>4p!DOK}qw zwFe0u;Rd&v{%?-)d0cT8=0o8X>O}IREy&*25CdYrUHTPKwotURj~GXHySWsI(bYz5 zJqGv4P+{Imm+zzF@NZ==T-@@xGELhSWSp7?@;qYa@g14xNF9hB5Zu6IgJNGQpjba>5=i@Eb*jacoYIpyUPb?xb9CK=7 z2!LDTkf2{I_;G722%Z#C!f#5Txz8rq~Sj zhC1Vt!m}9?6I$`RmT6pxYz0vnenW<)c+g4}3!0>(x=F}QbCjG&dvSoWDX*uJ(s^0I zIb`!jkS?+fud$VFuuwN%7n_qB*3isDg#@g| zf4`A#dtMYg<%{0%rS?Kzb@dj)7x9vCJB$RO@aiQem1pw9V}N3#LvPGmtNLG!zx)>yCuJKAS=sh zp3&%SE`7=!%JyV$oYBB_d=Rtcx4(tzU*GXn)G@n%d3Mcd4b%sX0%re3!NIU9$2y z>FT)O?-4c*7l(sd_z)M3Sv3b)^H;dkqm^kj2XjLs{H`5~ol=FYczT;XJD$;iWS~WC zw_VMPUWqkR8obX&SjOs-d19ejT5B~n3%l)1o|}5#5a>EDet8Y>!%KAT!F{x(=+alswKWL#G^x*ZprSD2=?r8EfT-tmd-AG?_Vk5k?d@5jOeNDFR>ExfXrc&Nbq1 zZ7zdGA^0Ri9iGUa^9dhxnC0;Hv7ziF=^Xm$t08vqk+v(XIGoy~dV)8X@fLP`m`$g$Oz^)64={nyT!SyDUO^}3dc)7i!SA81p z>kE~bhY{n2oi=j}U23-pWhwGz2rgZ)Z>1!wK+9m6m3XddMKZ3r&i*|cd~qhED&z?g zRK_;ed_Gyxc7Cmj%su1A=FLD zY9gu{Wybdc=02-t(XlNUHDnY~0|>p>`V_U$HAfmOu|AG#Dp2ohd^emf!UAkHuhO|_ zjh#p{)>(p>^-|>M1M(9hrVD^njLkmdfG2#ok4zT(5kgMsj+B^(xUfb=STe=_ZPFUv zfdufnCO`NrsawLYbK^HQMlVYfD5P$k6pd`WWiUa0VkSsJLpP$nCh&LbjJiv^O0~M* z@{Olf)L$!?j5Zh122I_qnv#*n?&CfAtF*cx7Yw+olz=A-xE9atZL^I)R}qKS1=_kx zyUNznEtt1JVJT);-iG@NALqV!bMQ=@r%v)18+x|m>2jQzYc+COe7%o-WriEZ@ocSh3CGEBxnl%5c zF0;6d&7@X|uly>X62anUP@GnS5>WG%liq9fahHO?EPE~!RR>?48Rs1Ka z6RJYcw72Z{>T~VRe{*MlN!?f~{^x0tLH_5W&)7E$eCgD+gqz6_)X4AM>Hu%?Rw%aM01a) zr_BA188rbmhQIibz9V5z#CCv6WH6O<&TIqDV^#Djk-sel3c(d|oH-e1^dySvL)zDF z6Pi5sAm4?1Z_?`T;KJyOMfgFmGuC{QGVIG9Ra7vfX_MS5f+inPNrJ$S^N*odplO9+ z1&)(>C`5~c9=q85tExyD>Ab)mQmczRRixC*kvb^KTre&=Tjet>N{ctG%N*1<+xj&V znO$K&(ZAQpPntYc!P}96Tq+i{#%-L-TaBxodStq}iiRXRi?N&I=PiPR5^)UOJ92=f zqkB};g)B@ox&~h`GF+W!Q?6+S*V_{JJT)jZUkomT)Zl6lo-fx6q}#oH!L#J%3U2f& zEZxtJJ}C>bRd4=kkm-{m{Yvb8;(sQ&_wa7bxZ{yDTcf+Q@b>cCLx|lk9Ox-XX*tua z&L~~;b|ON#?KLHBKS}n|&P&zi9D@S;l)s{aFY^QVyEA=E1=DIleE=C zM9el+`1K(Eh)n_L8zL}l_ZRP=jHXOwApX^pEfu22YNob8ac983rvmNgaT`DVWYfkk zgV`Go?{2Pd+St2Ph|m@%ABX;h7-d)-+7`b5W%@z11bi|=pTwT!1}i-6u3yN-+nS1x ztrs`rWUlw@v3gkH+EqahsbUCzg5TN0(DnVj)4tCkKpmao1KN=ej54iUFwHbT)mNlBkssuHugn)s`3O@B0Z`XGm(q)n6QdLECBp7XrUcALx zB9aT}_RVAw*8?sxwa7AUXby!2u9Kg2;$`SvW@27EyV@u9^DrH`Scn{iJ7e9ch1z!1 z=;$jw(&~2ew10G)xk+{IBNfnVz{>u=A6@8HMkRw|WY!9^yhjEX&sXc~(L((T%n0&i zSpQbT8Y;um>P{E@pB&mpF(-GjOx8ex!;^zJc6KfKUQ26g|7O^q5KQu>UX~slWz>o$ zq&{QiZ?LUFFAO1vCOEYvQ?{qkjBUSD-#{BS9rfKT>$`?;{|>w7KOWoG2c5>SMt-zU$XzCUyJ$vCByI!%_Z}THw9)P2PsF9^T3mnXjG~aqkPCx9n(LaH1R};)Fg4iWoatWqPKwqilYo+jTf_&Ch7)F zX0_REu?M(bd!4Fuiy3dFav?KT@U-zRbvo93n%4AoMon{N1M&9w;77cwC_8?|ptkhM zu+EKE3coB1m53bevCPb zZ_3^yb^4++OGK%!8x6g*$m})RJPnS*iu$429gRF8+R=9ZTImfm3{=c!G|iJ#^DWYY zU1qh%-c%j#En8x*wr^}0l-Q;x+9V8Yb-3m0TeigsSanxn6CV>~22`|_&2M(HKJ)?u z-+&&yFwr>0uE5!M?Cx(Ox z-D(RJo=;5YsADt+%lc1R3dFv|E|41<#A$r(@+tc2A-kVgI4yhk6Y`Z^MK<}yhq$~q z={K}IGT_7P<;D8yA6HxdSNwS;I1(C4t|}(D5SdD-3VmtCxIKCfQi6h#DNTfa!E4gj2v5ue z9Mmq_7;YM@Kg_|pv_h~^1GOs?bVA@BV8H%xRVT3AG!Pq&e_gPV2o#vu8^!#Durktz z1z_-`)S?w8qlUT|1p?pTX{79!K3TiJMYr#!{o9BzK_G)f(~O$(bj!C~kIqgr@7~DC zK7BHB<4|T>=43s3O4Bg=uB)i`Q1NV1U!w^YE zE3IQXwg7>R9{w~7kJ|ut&s-xtJisY)1SY*zn{H`3;2dF{Zf7p>~Bb z{>B=Mc69)V_a>)GDU4Gf&JqfI8*d1NTj0HKF-QyE-ODl$0BHq`@R)2AfjI$ffn%Zx zm3ZxK3Lu$21?T=~&KQ6j3q1krk8etXwVf0$QXU&5o}&=~oSgsyb#5^WWSRjT0Hz;& zlj?wD?1NN%3gXxx0iDlBd;C>?hu^@Cx+^#iC8tOfN8o}QE(5ZVE4Eg*d(#pnQ0--t zLqzwGqsU+7aY$xB!qK}!xqf2Iv8Ex(@_~8F(CPkPb6aCR&xtqNQ{*Q9xINU#IgAPKLkoe71DnS0i}k| zLGWZGh3MkWB6=m__I zy?i>^=w+@~ob7e>uE=Rb0oKY=^)$@vOVy-mk@i56uY)HA(9+C*pwNn+cNAhxeLyjV zW394cpi4goV%L|&>UjWovPs2<*21nzXQkw@NCF1rMd^>NqZ?!VFQv#Ced3!wZGD%2 z;y*#O9`VFT=)2+=yO9-G=I#<;jk7Fw}FCUkUVjtf8qwAKEl0O zOEQ%>Eq>8r$e!JC0_n;;;h29wFNR2I^4D*W+`WAz!7)fB9jPo>fZ@cA0bcJik*%!e z8~*EB8K`gapdIzwi$e7r8Sq}mt*~5du zFcx*B*Mh206lAYcx`9(EQhH4h{&$=i6QALf)n1Uaj+`8Zo>O~Jlux0v;aGNvb?*WR zZ%S_#$YD^1+Dd9qC$4a>L;J-uEKcb)B|*D!%_O2fovW8UTuSYsD^@3XQ|%>(B*_`O zgTr-X7iTtm30h_%9 zKMyf8-_paUU$EKMohUtAItju>gt2hVLZ8xIxrcQ&Z`}+YX^Ty#3jJH~wU}??x6`d0 z?KuHI13|NBTHQnj!oq2FW4Z8_o`ut|tRPkyOj+bi717^U`ZE=cd5c;57peY|0)p}qzN3zY|^F&*P?mRR0 zD|HD3q$9POs;~H=*O;B~Y1GpDba7>QU0PtrfAgAaY}~>^fy^VD4jPI7rZt z!tz#;F4`4aq= zYJ(ds_2A$@r$PyQNaHXu##!c|uGYqu!UN?^p+U;|TJE~a4{*nv*jnjH z%{#p{hq|JA24Sa=7g_o{D`X`{PR41sGo4e2UL_VO(6*2B8Hlp=o-|M$)}GV;{7+dm zM3^lwHCV6VG`iChy|EChAIw}e-ytPO=nhOoSpQKdM{jR}xK6~Ts8ubi8Wg%nmPo=K z1*)2~RhdG5A!J>`1n7O?gX!9x>^lhIRomBaNT7i8HFl^oc-K3L%@eoB%LGjAo(SxA zQ|v8DcpGOrj1fdb9VDq6%c$U=XWipOfn``AP*QPJJl72DYB z0b>Vi(YZz>LH3rg%NCkdjrN(DZ=~OcM=m53Hu21M2g5*(2%?+mtiIJ zSA7Ju#F_(p|7(TWhE*vM5ObP82Pb3Giot`7w3Y*j1fdyg4)Y_fIri!ZVVX9$#UGAM zjyj05!1C`IAOi$a&m#`MinEAv9t=Zndr%1~J36#SA(`j64kS+kZ|NDKEK3d%A5Xyd zG`WKe!f3E@R(dybFwsKz!%g-I;}tJW&KJ)p*__hz`Q}EE%^(ODTij)$@3@}M&rf!~ z3@Jp~l3BIQ5|D=Y$DNRm&4?T4H=EgdVr#W$NK-YrHf43HCwAa>lD^u;o~jo~O*2(ilYTD1ES zTMDIzFmhjCq3~CDQ<`3u+i(}!{`;F+!`J7fX$_|RdCISht~30?H?Bm8cz&@fZ8b{mGDk};_p~Y zK+3X^SPP}f)xekm@%v`8Irtt_d`?kUFb%_Bu{^z2vX{bDPC8Wu$sC@T+JWD+OJoBr z6IosDhe8#K3%uTdfx!avWe6F8aP;VFAH| z=vZ%aa&6yNR;mR`LF|770lB7a_yucx(X^NOA#>_{kMXe{b|r$d_}drsbPvLmwtG+( z5zUMtiTs;iQS`}anC}Fl8IeZOCcG-Hhp0cr^AHcjCUGf?cy|;v4r;&;5$9dx!j=~; ze!EYI2fGXfVPzh|$^wLy%+0MuBCu4xR^LUJIHzzt<=ZWcQt44w4oah!4G zsFc0?@u_NJOL9nM*97*L*2E0jYV+bRXfJHzh~%>>NV?9qI0G|T~Dw{ink zD3I8|MoVmu>@@r;LHQ-|UwWWwy&`}?8m4G_<5kGUY;!JhK0;PPi;hX;7j=kI!W@I7 z)vV)>ff>Q4}~b8cd$gF>OcnPWm`*r#|rwdg>e3VrM%4 zM}ii)>vye>TT*I&*ZOQ(`z`C^VSPYkXNImhW`Ta4EN>kLhxh%*3-o?+fxHc@kCJxD zB*;Yxv!E7h%1+}|ixZnB6Ome{8aNZy>1Rk`%zug~#ul@%thG*;4Opiy5t68Nf@!?` zs6PIu%j8Nelj>>`j7qT2V%6A-iX?jo_Bgp*mwj`&Dh0316TC7%rGtP`O~wZqU&oaHb z-KU>+J_GbNte9=?TuP_#BL>FH#s5rkp=J}`tC+&mbz{W=G#R>Ug{jpE13+Q(<<+dG zASBmSX6WPCA9#%48s)Z|*^poIr4^-972=4Y_ByG_AASX78#1xb3J~2aGPg2N+#?)8 zb05;9Hl0)K#DKwh^9p_fzS8n63Au}}OH-EUu{cjOz3!W2&b;Xlw3%a!dCFz!jx zFX?QbWHB6K=J)q=U+5E$@r7_mX*`3ghU{l3{bM7D5#`@Q4|8N(@$E>gA$xmpGMpE{ zdYftkdU3lR@nJ$a$d5qY4+C0Lj&F81no4f`#jjN$&#=!$zxRqc)bf6~8V5)nU&DD9 zMu<^ke_sxjfU7(7B8sWVRW|cxX>~xauj%gvy_POt$OGBc)?v(%Q#sJ6>lh)=IIxfG zb2(Rpu7|jnfJ8^p^#nEc6EZnLv@{?|2AA0AE-gPb)T4MpvAVZ^KtOKYWiD|>XTUmr zQ`s?q7_GoJC15`+I)cS88Z3zLU?jQPilwPo`mr6;gL1}b^7ineu{)|e%n{TtwBR7Ki~~$UtAQwI=#dMu z01_v^dGV_P#pk4?$BC5!Spiqq(&Kew=$z=JbC8`^811GpnRulD4)DE zo7C=2q@QVB#2L5Ed_(P7)}}qQ&r1TFn%?t5gh!o)ck6b^)@6kvm6E+Q7$e63Y`b}e z;CC`SF3nNNFRAU>v_*DLW1C(~=qY^Tk>swfq^$619|b0UAaX8<9W#Mo$C7!ug@|1! zC{C9@mGWnv{F(1XZo0s{iLZs4U8XF|%k-SkXm4q#K|F5ZQj-CRyvC+@srh%i_islLP{;>d(SEC83z0LLB(1A;;Dr?03@RiJ2y+j?R_#bIj?z zV%!`;R9N2x284UuTvK*>XhNeW4YiV1I=3@;o?ynY3?*JtetIaQ^y2iO$-vo*@S^5> zaH3wrWbT8dzD|t(DE!girBWemC9t2ko6c!cY>I43BENzw9EE;NSF?1i&YBMq2=g=i zbc+%7gCOz4{1W(&UXW$h-6%7`_g}3S(rv)hHqr#rkK&pYoi?k{Wjs-3w^0`5;R3?l zTFY=XZ#>f5sB8?8(v&~SZ|w%zI4SQNvW4{HxTL?^hgt|;o!sFbf*B1pH z?uP4&^vLz#>+4}9uXn~;=~i{wsiCQQ+4TjXla7=!?J&}7PULkY%V>5t+`xA?6vQ5o zVHh*=+zmzXb%Od!g=mrsA)5Gs76E3saGHaMQnqTl;J`$F;AKTKO@r?@pAzQZM&Nr% zL*?4BB*$HPLs2j)jl}OvkvXbz>Qr@4*(p|EQn5&$p3S9Vp-O{K9z~H>4j^%mJSoN{ zDSN^cd9L8c`G6Yu@o|MlGJ5cLv+yHAQY@}|nJ~}l4B2eaxiyLWQ|L6^ADPIHLYS~# zw`~v@i-E3Sm#zh%1YN=5&`aD#EHbQ8Iyqk+%tOz*&}JeMW0Aos9<_bFg0=DiN4E{O zn&(By9ULz+`zBgAs}vEPh0{_mllym+^_@a@saK#OL0V41SUOv{#*EV<6)yn3Wnco| zS3;qx1k;QhW*bKPRwqoh6%Rqq@%}gzZWXXa;!<_sLUNB45+)f3gCh{Qkzjg8?(c46 z@>mw9u!A?tYFuTB;(UaMjaJ@U!T+8N4I(6P8n^_3~rP-tV zn=wYlPmfuo++KuP(&G~8@zv7f!2ds;H0fk~ymSy5tj#Qu4z{-Rckq?J2>=kq$Kd~A zNb(61Dv7Q{acez|X1w%M`c{@Efd>Yg>y^d?r%I4S^0V6;1m+^(0UlGRKP-u6hKBJ5 z>Zwx1tpfCx+}7A5EIR9hnE7Tu0>{*AO7laXk>fF zyZw(}<}uO5Mu)%pIy77XX?w=T@Q?FB`pumr3c%1Q|HvPAoiUq>*_rKE$_N}iCAQ6tl7s!9 z#w>^I=!Ht;?#0U=_*GQ19<5)<;DkOEL>PxFP0I9XnXih-%|3Tg-CvM zXCUG(u!4|2wahvWWDMR$0*<0+@q^}F+#6fW=b_(d;&GZJl!LY9JT5XwW^xAf@pMfQ z1f&!5Y><2+(R|FMFf2mkah$_z^TI=uyz5 zphrQIf*u7;3VIYYDdzhm8?lOq#Eop{T%TgC&Z5^oB8_x zdpjxw?{~CgY&!u}>MrwKrURbU=z?z;Yc{_u^Rgw0rQ=U=Cbh@f8M=?`Q5ohrzm?b4 z{8&_x(Js-G?d=jgdEj$)`lCN#cj7XUVLm}U?RF-$e{v%aE8J*(Vl*g|`P{(GSb|*2 zeo^z!UQpq_3VEQMBxG|aN?*nEk^PA%4P?giLjDz*CZrYp6fWQT0;C(s{o{{Ohioz@ z$XMD0+yrs}Hz#syOJ*(6SCe?=NQ_=loRe1tY*nuaI>KCq*9b*u6Mgfqr2Fw}RftgY z(jn^1eau4lvUOd@2d9fd?L_O~u*<|h~zf&fcC~pd(qsP*UQ6< z=jCA}_fdXK8;mH({I^__mFMqiLhvNaJJ>yK84vML(q)E|IVj8*kdEN^8e}t}dvKTz#A#y^V9Lbqy%T#vvv7U6>IJnI$~Yuak9b;3d}V1^wj8 zi4U?VP(Y?fZcEjt)!(m51qx3ty|VD+;H1*a(}JgHt2`VG!!R)(S=D%du8f#@_BaN$`eI4%%9&h2l0*HK~L0zUPWjtNdL{Xtrg zl&7mu6wXNVx|)_2`Uow6F^C-Hi${AJGrjhWo-FTK1z!8>$udh0$YD`BHUt&eoQ3o! zQ2b@+uS_C6to=j{_SEnvj^McPC%M5~VmUI-@f){W;~f9ITrke@Psj!19REu$0>oRe zmQ;^kmZKJOPPBZY_JVhGZ*?SHkA5#*<`bFNR&y(?e;i6{t2v1)AqWC+UK};U?v^oP z(Z$B+-wk@ox*p}eB~MlUk3s;s;V0l0nFS111;3b2;{mCd0d3VTcir;zF`)t^S#%Vn z17WAV;JCQHO@)ohQ2LZ_p|mVo4?a*V3x(jL`ZY4~$|)xHa~AKFS5`m04>0andQs53 zdI~Vf<%D1vu4LwE!Luf(^MsHyW?JxM`Evq_tN2)>dGguve8l7`2>+lyd3Y8-8G>)p zIj9pSH9gBg*gW|!)ExX+zKhA9f61Ty^5;$Y^Sb=mKKbkk6v9(5Ez}l%Co7I-M08Nm z+JbcOD#ir8*z0zxPI|NlTc#xFpC`ENNLO#Nx>{{@^%|-42l8jGbQK3QtE;oDuDVrM z|=dFHcBz#a)A)_S;62Uuk{SS+CV+WEJQJdf}R z>5)<~*VCa>g->$(I9Q>$^R8i5{{D=L37w)b2H3lb{ggYA|0@chsnQRbJUj>W?If z^XM@UXrQVKK?~gK5GC@MM5FQh%=cimi9^L0RQRlF&fNHZRV|gMYNbA^r#7J~#fs@- zYNI@&l5OVM@<`K{tPzE!JW@c>p%s+4$AnN*id=@yShrJc(& zA49llkq5EQK|gD!F)@B4VeXb4hUQhUdOI)tu6C_XB1Q#_v&Vtn1Fo|t@#E$QBvcDA zT84{^>1|b@i^Hi$aM4Sk7VMq6wR&`n690CtUUv3-ya@)(JATQuFvjD}b?tGTE7faYH2C$wBzxwXHQdwCXLK*mn3u7I|bMpK0HJKh0ZFqat%DPVs7 zm`J|PzLsl|S^tVo%$LfnpxRRYx2f{Fly9XxWy-nM>K3q<`S=v;W36r;_qZ@s81GdS zzwbBp#ZRpO?r^51-@mC=vI9_w9jkc9wBR&P=~PGX+yNSroqq72WSQw9AH&{d^ZjM# z1g}6*zt60oRYnp#z9Le-PsuluMdO6h@$SPbWU313q7- z`)!)Dwx7h1`yo}vFF{7{k6xAzK%4U(wXA{-sRhHSXhoX8xE-IW?kh2k8Mkvr!_*>u zqB6m{*qY=M%zs(3MJsxXIg~1mFJ;3x zAGJ%38o-7lDi31+D0x2{JSFe{16weqb2-YtzC6uM@4|ue3$G zFwl{OE@V=%#(}~m&q@^ofq9WFw@Xif*HyZxyFIZBN2mDGSsPBh~akV^vANi~Gc z$1{{mYPB$DUmB^|Z`h25S^qS3PR-wvQbJRQC z@HnwI#WN~t<1uBgFy7{FHV3kRY#|#;%!sCl$dWYefmS7H5i2QmrV7mrvzKBv*6Oqr zo!x8B*~bzkPo3Zudh{t9GbKrepzN2Gz;}*Pqu1Ei-IwWC@59+S1SXc`c?R!$XLIbY8(8scep8v1@s`~}sN2-zotH3%~ zj8DmE=frm9R8z+!{6#VQMO|Gf`%&>b-`p10v`$GxFUmCEIV@3c_Zu0T1fwwbPFL6R zbD(I~Tt_&Nvhw}G^!SP9J$-l;h^sSn+_#uGp{z;d zk6^~t*Ac!3ON}xI|5Z+9nLqPQ1d(B9DlQVsE6Zvv@DbA__JNGE@!J1koY$ejPr++H z?n?Osl~~huISiv8d^2S)TwFP|$y(HYRYOO#=x+Y%RbTmysb6CUA3D!WNa=`!JBS2v zHwkBC!lAmG-yHW7y@^=$`@KiP5@6R0(kp0-vuCxH23* zN*86pz0j8eBLK)E*Z6E?6N|660Hp6nM*~Q?0+4QRFQdYgZ+UM~B6z-enAf7kzc z{6a=>mMd4UW(23{Rj4yE${B&gnGl;kQ&Jg7(ut;Sg0-bVk{jObMe*ZISF)<__g7`k z7knXyDuM;3?3M7e6+ne8l--{3Gr4d>ttcBZu`(86qB71DLl?u3GAj43D^>R1X%7n8 znd9Wi?befG>q!w$mRV26SWl3@q#C@F1MZxx1P-7$=%iyoAqQq zPwK5FAK#y9P2p}!HxMm{q}rpqwppe$n^hSx`PnZFxSS@*1BCNKs}qSw67h53DbRlz zSua4c$9UbuN{7>HPAQiFKq4B-K@(s;wX&AKaL-J^5AGH;e!!*FwJ z&XMK~LznCGt?Np;o+8&#V?NhZKFzA&Ve9UUWaV=AhIvA=au@{eM25n5_i!goIpo$b z9_Q9PaG$z{XXS{KVN|lZi(&JhriTx7nFTczDyBCwEO5?E?eygtzQKV4VL+K^o;+`C(4a9#A$h@~U~t3V|dDG<%Srj9yK}rh%rK22y^bFw%9HFNu8}n(Sr1?S1K1PzNR1+@wpFvpGI8G z!JBj=d?4Ae9||vUC9r9AoZNt6!d(tC&%0MasnlR@J*2L!vGkWH7*Jw0#}{=-rKWAb z^Dpj^=i$__XGvo-D3~SlP#cq7ZEja(j65E#ui=4Syv=;cdM1pu-2TP7m1@l2TGujm zQw#(3=yOF}zidt9t(cf(43d3NHmgfghl??PaJY;q*Q{2b4mGcq-|$N27HRlJ%q^DC zQX<3jsyA(LNbOEN{83uyZ@^xXw(Tc=1TV$LQqsbm2!=BPh<`;8pSPN>*wACtf@cZm z*(z-AN@#VOIMc$h(ToXFSWsU_u)t6S?_q=Gnj_RCZZX&2E!|T-IP%?C>i_WXR{cXc z+xlzoNYze1IA1AivBF}L(dA7;33LQH9Xvpq*$1B*kredop$lY2 zJ$Rt&t~W!-$J^uQ=#et1b}|&D)D#zN^E3ox_*PN_yv5{S6p(Gx8B`*GUs5dIZn4_^ zM-()C?xzt-Nzi|suv(=R2Lue{dhWw*Nv{>?nmVr8?e+Y`7{-7jO{h`lKpRTnuLDD> zw<`=nWnn~lh=?*;-HUt_h)!NU7;HY>Z#;6i^;|y_u!}_~D>GMkUu)_Sqh2~ z?;{^zd&>vQ)d#^#Y2YdvNLmCb$fy*~Wr6Ige&bf2xAu3HQK5}PzS;G#%pM|Pu0Q0O z!No41P4jMJfJ}npww-RvJ{Gqt+$owuC$ievOcV>9*uaO;{IB_m>SN83!jRAcJjE`C z06w*Lc&rttzSSqC+nTHmul6x{`|cE2qS`a0+7qbuTq+VnpN!M2ii`O%*THE@tpsgD zkG4#zViNgM5x+;srGEJUks(!*8Z?qIQ%`=4tmpp1$N3IZgMeXqtdlk9E)`ZHfPpyz z@%vR=0J%|;aAoZk5S7JUg*AL>83F+wU;LZ{{VWA@<^uX6+2OZPX9I=ALd;uOB=&H1 z$*;WPv9w*y@i)zXRp@i9v`?z#wfx?j{Jll}8X5QA!5k$Hu*VZ8-IRP6Qopk2kCuy6 zlEiusRuMNPY!MmsQ9~v$sJZ2qBNKH#wfY0b=9hC8W0qX?<&I?)U z{uuEoJeQHE7u%T>WKIzf63Cp_qQ>awhcV9PC#sJ$e=dg(gO!(EFPsBF5Dwd$mZ=6+Vkv?}wfM1CKFShni}0?b7i1aT%A88Hed<5&l5!JzVK_k5q0W9O9ZVqqeal{O`cW~6g(UvY1TX|<`yHAVYo`5C;cjzS8G7vz-}`Ly z$?wUG^b+_P{PWCPARMuJcw0T~k~thjuJ*;l^y2-9cS_N$klJSAGWkaF^}xbWB!uv% zssCbEfDuwR{4#G5M%!OR<}#7LN(PJ1a3teKUZ&=Gz-RrJq@>g-g0EtK75(qzg8EOD z`jhk0FP5{M{9T)a-xKgrjupYd=JD8r6Q&I`16A(Y7y7rv#4nK`?5FUkR}bIXYYS@0 z;+aSUKUyNIf&!L&;$lVqR?@xG5)$@H@{;Rf@q?DJDou~U>P=KuL8@sY7* z275|!xT8w$nFo+f=_ENk9qgunoJ$tHma6io{!nVURZV`KRMVn_cW>%b#{Y$y49Rc5 z#!Z)tx!R^rIiyFX-Omd?`&F{?V|op}QASlUxKm|2am0QTus(?K=8$B+M-1rq_xt-z zcDw1vR871r0W%eFfS^WsRo6@E4+A3b@R_Gb9kX9#Tqvxf(!3^@NAxjB!^29$EpHX4l3EyJ27|&W zqM)8HF3C-Kap>ZVjpxgHXA+)T^+1im%A5YlzXdM(h*^w=`&U9e)5b`%0{}HD^Mr?L zGj}iIY{|B+w{R^3*r5inr6O{3mVD7-J}6%h&LyJf#h;f3vZ5E-&3mZcYUr=ags>Ob zQfbLcl(53eIXap`_q=FlfV?eqjeo2HDb`OB8`JY&bB#_$@Jc8>KG$$36Nd`6$-Paz z%sFWO)`ml(x}jv+=$saMnnDvxVQ_&L%1+XvDr zYN=;YlTX>pc*aAgMj;_O%~Jt&v>q4mV~OysoWMUY>CREO57Go4_rp?T_u)f*!h80A z62B2~>^xWg8kp$C5Y3zE%3t7s6z)UNEiTq72QcDT$pK9KL68HKVI}|O32jg*R#Ec= zhB)bE7I>zchXD#?J^w9WXsH*T6GerR)s`xJVQd(flpwm`PnhR!XEpV9Uk@LH=;kp) z8SZJ!x0rt zE+*+EW*gpKTpE1u`(Uu_I4@rJ7795&r5ii9=vmZ;f80U& z2DjoWf=PcGOJ|A*@N=QI?rEnQAFB9(QNh5rqHHDpy>|Bp6rsImkb3Sn+9jEn)l}Dj zrkBpn16kdUmr9wJiD zGh8J|3rsAZOB}kIf=76yK*wM=RJ<7b5H5;PF1Ho?iwV`3+tk~am=hh@N0J@27iTm& z&S~&wPsh8JkyjDAr)l|qZ`w>p{4#+{aZ0DQc0M7M#a*w-T6r2BC83r8kvQs?#9JI5sJHY*O!Y68waue<)m6l%p%G(78|W9n5!PG zD?FbzU~U%e=FF2=JfK}mR<9Vc;!Z)kZp1a1&?NGI#84rChjR>-q|I{Ri-1u6%S8{$ zG^~S063?`DVO6E)G8JXjvLzlVlrdu3$oX_biI_I3tjFr?5}ta%Jm?Ej^YGVm|F?O# z5i8vPeIB%M9ShJu7pH445J9;uo#>9)q1^DStaO!Z3zj3DKs@pzvobw7E3ba*tl%G_ zriDN}OpARl)04=*fboCJ+}t5^^Se8~Wp2h__kW!mrPN-%kUp730$U1BesNC!{LJT# zf)nI0Ek1Zp3r+$)Ykn&1T@_^d5LYzGMJAwftpzG_-c-2SwD3;ZU2@9$U44ruX)k0V ztG1>nyV}#9mTSXamQ-z#H2IYY>K()fu8u|91XxNH+*Hb?F!K1d1d2NZ$;=h6I!fCz zS^gadVTa}XRxWGi^f#a%OlIt2$^IHFpYX>Al5m3R~=}SMxm1 zj!g)#*TLaX+|E{{=i2S1oai#)XHqD+C+{kh=@DRjy2_exnMi;UK$J+Kp09_mYqEu>{YV6$ZNBaNGx^uWzg{w%^z6;0+v%w)|9Gu`MF ztI3L{q$^X+iY~ZWKl|Bo>rs5+r@f)I#Js{i>#`lewpg zz$HiLo|^IHrkopD@8Y|1Inh z#QH0m@hpXSD|x4Q8_Ji+c!b51?qX|~7Ot9#3t7O}BKg>iOA8n9bw2Mnm$=$5^$-r> zWL6uVaDcx$b~`HA#DXbU1b2~tiV4D|pTHzq-KRpnAeuW@4G>wgCvwYFOzLH-rfibQ z8bu4rLQY01XP)_&TNE`JdqGZmx)ROp@u<;ZE-9H2E%GntZL%pHENk#}^mUY{EgekX zdbU567JQJ=9V~T9U>g*Ncq65owh?0Cj+yL=1Lj>?QvCV^bxIG%0cMzU9GFoW=q=Tv zIoy`cDGCh}$=Tgkig_G_(-I0J%qY;y8aOFzAuaVqnO65E1Bg^~ak6%i0qOuLtqv9? z@*QF8l>P^AwRII8qS65&!Pyd<5Uy6Mhbp&S7%fC=v0}R{r0WYUtm4=hq1OogmZ`l! zI5J;{+2$7ShKdeCzlF*?U{P-*^cq=*vP0w7u+`C>Q9xZuiP4@!n-t&-2Afp4zFzcP z?4OiM5945xPs@%n8vFyF=$n{r0pimBGul7V@Lc+Y46Ch`wqY0 zmA%9tST4MQ5!g&5?TXh#GxLUi0=SD*Xi%hN9`8)#U&<)plm;jATWZvJj1`@9+qa!$ zp2RMRW^578)*!@4v+1PZja-81CSmdx8vPA`kIbAJyARp9K}ZASfA==f1!6a226@z& zm66vb;gQ_IjGF0VgA-(@B2|FqF1CxJ?rt1^G5wR$gTHkvoN?H6P@iOcb+zDb8&NM2r-m{#1TPVyy4io zR%J_UU9u7$Q;i=(%I~bHP4Q|7io(;rgcGxc&OsoHzt;{VAxYELH^EqLmYQojO8baB^Zicrb_v4j4iPuJA2Vmk`1s_2AnqE`u%K@(Q%cD# zySIWAXANV7WCM}@wOn>|JDNz@(c;Wvd~gxOi4Z9>O0V1w0!%Q$>uv5#o439_bb^Qq zK@^qdrL+XPtpAGFEJfwS_Rw@~?Z-ontrNGc2T|KF8gb()a(=WHWRqB%SWo$u;PG58|kNwZU3+r(xtSC*%NtiPUy<9pg{&@NhCh^D%IHn&!f zRW9tMV-3wTO>ADrPt7#`xPy7nQ3|a}S{NuVn^BP^*r-7M5Z5^^c$WN`tdP@5yeG-@ zP#F(TwYq)Oq23JP&FVxS3fI?pL{bttJGPmV&>D#Bd9%`y%9FA31dcb9WBwVL2LYpm zh^r4Fzij8i%4s0=3#p2ZZku`OFDyaSHWH7Gk+^b~uKwi3^|msmFf>>uB8IF2{0) zQw;)Xm6B}*TT1Dgx44y5CsNz3-ARu2G|JmMU0<#2l$MBkAX<+3DP5}~Vy>}l**Q2= zgUGe_ECT+H<|)`qB;G)bgO{Ii2rpJVSo0u|VWkao9gQT`(y5y8+xDPW7RSjF1V@@z zkYyo>b*`mSZ10O!Q?4m~LJw05JUr0s?rzUQS8`%U_nvW06I<9pHa9*$EfAt>gxWRQ zCpHJKR`J|}l`7JEaK<`%AX_A=r#|Pgo5& z*y3ZAE-XGmd6vd=R#Sm3o}q;5Q1Ic8@`AJF&vf~7mi#$6eApcvZvOH}g}@m!a6`~P z1rJL62;U(d3F0V6kDNlmr9h%>p%91y6PUBZXIe@jETE&gX9$}O283-Ff&!ET-Vw2A zV_=Ph|n@a8a`9Mw!EF6N%c=FoOwJn5S|>_>l`d zYQ3sOYA&!{!dLqm)zplx2Dz4uCE*B31Gktjoy&elD7;a1l?QXAa(VKc1@fgbL^nf| zs4R>j4*;KC)nq1RkLaFe;h!?K6Hg#3Y~cJDR1bc%O?2Vy+Rs?iA=w z5e~Qc&aj!ctdV2P_sM|pAtP#5BmhgEzMl#na<K8ipjo;DZZK1zYK-~PfHJRf-EJ$O8}V(BmHPw6iie;^pF})s#eHu!GYQJ7Yqz!d zn?G@Shpc$0XM44_xHBt!08EE}pHQpKA2?YJFYHVaa%jZfPfCrE(2GbrpCQ0rd$o3( zFU%k2Kat;rRu(rob-XFWUXREJPk-Njsn|g=6rSpgbbGotqy^72d|~Mmi*=2*_VWp; zW+PV_x-s`oY29jC)&3)^cC~}f(W^*8I_*i~T%?S$`?Ub=io!_bUms%CJIpIqKn-u| zW5%vBAczzBvz78Sba5hIS0&I=oJ$$KYBV*@RW)vwElt>1OVg3Ft>)StrG4t-_xPlK zuU0RC8q9@!)@~EtCANTjZ)51rFws{Bd1|)0iZLgkiyqd#H*pVJOFHJf>7d3Q`JOe^7Ux9>4MCWWGL;> zltlgws0&#BD{ocPe(X$Ibf{*YyAAmG69QqYyZs!ZwGv29IuMKs7CE4LCz7AVrQnc$ zFYBv3S6X;P`4i-tKcGcRpA?^g;_7r)t_^A1;*;?sfExbd%p)Kxegqa#tgV783mcm~okqoy!o{=azVA}w^(II%_u*|w!4rE*e!ucUkHCFnWqz(4W8fS-rLHPfIku?Wht1`B z&O2Lsv`N{zniXRd=#=0%isPBikV6x`qug7R3qBZs z17}k;41f=k5VUU%=v&4ERy&xKZk%OhZ34m9S%vut1SxUL#Y{cOh1uFNRA-Q8K%2VOq+9U-UIK*lVVr z8Olh^a>S4KvzJFBQwVZ{Lgxo)D1_$YE0Zp%cc&YYbBf z7eDn$nwd&K#yC$Bzg)nTC$TwtbAp_a_3tnRUgJj&VjPCQP79rET&}`pc`?#(L{4WC zA?e*~Utz_}-y(`((z5uTDnsX_ibhVAxt8+%MVC+%rE06E=ZpHCk;@!z?SYMv(_^nf z^?B9{`>7iQU-;7J+8r!HxiQ1=KIkADQ1ic?KKpL}5Qw+;oqErwD7+!Np@vv zK-4VW$myy}#D;O0*|Y^g?TsvPkm!be&|bfZNU+jmLK>YXjk-S2?yTU#XSDdMc6y69 z`bd*q)rklFa=&z4k2)S@CQvr-50EY!*ZyeEy+)d+%rPW1%#+xpCrAJiLnXUwMJzrV zqT5r9s&u=*s@VwK;qa6N9&#+UdlF4b;QlXW-)97#aYSeJ`HU;?l*!dzZuUm37)Oz( z3+GcJc>IgR^&rlRlfT8C-r~=_k>}ML?9VTZYcI<4WLdBArL-x2I9qppU~JiS08y4_ z*Sp>!9jRKwiS#7}(OHKn;W4~-I(C`fA)Tq0zUX`m3SiCx##_Gne`yVAbO336axnl= zVI%^yRv>+kPAV6LRgpHKhCbMQt`C-G&M+?hs{>B|^~n8&%j9cp6x7(GK62w-c?a=$ z;5ks%6w>`ED!_|RRKpxLWP^h(+I1i>q=`Oz!iVjPM)SFJ)$rb7^)#LlQ0Edn4B;~* z9bM0-1adVxtV?2jRk*e-8LcZmQy_@QT@t)md!{*HCr4TP(&@(iDufhVAdAfNYHdQD zbRX#Gzy{6fAF>52tR+MJEN5{`g}sfhmb~jFU5G3P+HtL}nbHAF=8d=5^w&y~!3DhX zk}ySz5DMC%O>i@DgDRp+9MVR>zI|rYF%ht$r_lT|9#W2pEZ9ZdlbJh#6HlTw;{Aog z>)O8vuVPiGB}KduQ2=4?04FBBR** zANh%eBr^8e4T5TvnB7XpqhohuMNt+3X!NO0VLfX<>_Rl8ow{%}dj72iP?0J);C3WH z0plN)yn~th>8B!6Spff7LkgQfq@qD&wjcmglB@_u^{kh(GJIe{`2=#cN<7fGroJ)% zixS?3CK2pDiM*O{BjhEd9p+ht~yo7?)J6)$*qwN z$bXtmpV&eSB;+_ldl1@DCnSC=KOU-apz6)I|2J@_^L1B?R*!#&)Iu&kazx_;a~f^l zGHO8DJ_M_omgowus2!!q6cG!xhda`J5GoGTxIwS{IY<5!c`)(4f)*~M1>JaH9n7mS!t97g;FV0z#9s4)B7uBw;gvF1G)B43oX}`~A;3|8qX)Jo9uyKU3yTGS}n231(wQCoDiIA*L| z?b61N+K($fx;SQ3tVSsIn}-~v=E5=rBJ17e1INvQ`(w+YhxUxz@pH_qbgh?#3Zg@Z ztAb1BSFBdd+I=`f(~joIUb#br7+h6KUKQ+=r(;>lKcyIfq#};Z4PdyNWuO0F&$2$< z{x-{Ifn^8WEZc(W*v&Ge7qM*TWm$%S7g*M04r~C+o&d{GPagPhunZhgn(I*6qFXga zU)mpR`cGN%caiqqS@IOAdS*%er#q0vaJ$o}YRV~xVvfpOX4XHx-3(bHvJB;y#aI7n zj)M@-c?dHol;d1Cn=2;aO5<8vEUp%}RG36wn&e1)LNdleSu55-d_tbCX&!)Vjis@Q z5?F`JPGZYpE*_ReKH5yVW%C&16l+BV6}Je8;m`%VRP&P`ZV~#FtYH&}Gj$TO%J&0N zPnsUud!Vtrv_Bbk-Pd}|dPTL!LnV#A`cEx>RF*m-YK}SP6-WJpG}iIi2jIwr(B>fwZSsgD4WrM=}Uh>0id2{sf#`!g>vAGoSm_bhXpHH=?WyML&|r5&=(_6W z`^d+bQ~FhJQ>33G<5-59P}ArGskWuOg3<|#0Bol9R6%p%CgLE)Za9LMa-;L!n~){@ z;oK4IIeIq^3b7Cp?NA28J?E6!#3R8x2vY^ikU90GTJn`5d;yM%2p{CNrdYpPNE$^ z`qDfb1+h2Wi*<~C3`e~TijVn1zw$id5j*IECwyTbzG9w+%{DhdJ$}>?bY`*C0f)o^ znjIHfkKyFtLL5l$I20eV)!w7zmFLJJa*at-zLGpKSNKMwnsW4dz)>pn&@2B+Ol^t@ zPUvDvqI|W`0_(_1LXFF4#@t_5TI6JMJr|EbLlXI;FD(_(uV=qRAU*tYJS>B)h4>b( z*Og1m&e8zT;=my;_J5%hjPvx#LArF4#v`f1FAOkIlj~QWMs|f%nX(0!g+I*`6kX?n z_>MgBj2Q|eGTnLNhMDd>VSZ>wDYEWoU=aFFI4IX|z~`6RBXHiKs0XNG(69VAnn
    UR?}cr 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

    n4-WNYZ4+=$s_DdVW*hE@ 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 + + + {FA1D2C31-D809-4021-9DE4-7552704175EE} ffmpeg_generate diff --git a/project_generate.vcxproj.filters b/project_generate.vcxproj.filters index b6203bd..4f648f9 100644 --- a/project_generate.vcxproj.filters +++ b/project_generate.vcxproj.filters @@ -62,4 +62,7 @@ Resource Files + + + \ No newline at end of file diff --git a/source/Templates.rc b/source/Templates.rc index e32aca537cad5b3e2a21fabb41a35490f7fd7610..36fa6066b8b3c628a1e35fee942a06aabaa0f78a 100644 GIT binary patch delta 37 rcmZqS*u=4cg@xIW!Ej={s8|w1CPN;B5koSA9z!Za1rRGSa4`S?nkokA delta 7 OcmdnQ(ZaETg#`c! Date: Wed, 11 Jun 2025 04:28:14 +0200 Subject: [PATCH 2/3] Add support for CUDA compilation via NVCC Signed-off-by: softworkz --- include/projectGenerator.h | 16 +++ source/projectGenerator.cpp | 201 ++++++++++++++++++++++++++++++++++-- 2 files changed, 208 insertions(+), 9 deletions(-) diff --git a/include/projectGenerator.h b/include/projectGenerator.h index e394163..d831df2 100644 --- a/include/projectGenerator.h +++ b/include/projectGenerator.h @@ -445,6 +445,22 @@ class ProjectGenerator */ void outputCUDATools(string& projectTemplate) const; + /** + * Output CUDA source files with custom build steps. + * @param [in,out] fileList The list of CUDA files to process. + * @param [in,out] projectTemplate The project template. + * @param [in,out] filterTemplate The filter template. + * @param [in,out] foundObjects The list of found object files. + * @param [in,out] foundFilters The set of found filters. + * @param staticOnly True to only include in static builds. + * @param sharedOnly True to only include in shared builds. + * @param bit32Only True to only include in 32-bit builds. + * @param bit64Only True to only include in 64-bit builds. + */ + void outputCUDASourceFiles(StaticList& fileList, string& projectTemplate, string& filterTemplate, + StaticList& foundObjects, set& foundFilters, bool staticOnly = false, bool sharedOnly = false, + bool bit32Only = false, bool bit64Only = false) const; + bool outputDependencyLibs(string& projectTemplate, bool winrt, bool program); /** diff --git a/source/projectGenerator.cpp b/source/projectGenerator.cpp index f461db9..07468ec 100644 --- a/source/projectGenerator.cpp +++ b/source/projectGenerator.cpp @@ -1050,16 +1050,15 @@ void ProjectGenerator::outputSourceFiles(string& projectTemplate, string& filter // Output CUDA files if (!m_includesCU.empty()) { if (m_configHelper.isCUDAEnabled()) { - // outputSourceFileType( - // m_includesCU, "CudaCompile", "Source", projectTemplate, filterTemplate, foundObjects, foundFilters, - // true); - /*for (auto& i : m_includesConditionalCU) { + outputCUDASourceFiles(m_includesCU, projectTemplate, filterTemplate, foundObjects, foundFilters); + + // Process conditional CUDA files + for (auto& i : m_includesConditionalCU) { fileList.clear(); fileList.emplace_back(i.first); - outputSourceFileType(fileList, "CudaCompile", "Source", projectTemplate, filterTemplate, foundObjects, - foundFilters, true, i.second.isStatic, i.second.isShared, i.second.is32, i.second.is64); - }*/ - outputError("CUDA files detected in project. CUDA compilation is not currently supported"); + outputCUDASourceFiles(fileList, projectTemplate, filterTemplate, foundObjects, foundFilters, + i.second.isStatic, i.second.isShared, i.second.is32, i.second.is64); + } } else { outputError("CUDA files found in project but CUDA is disabled"); } @@ -1632,10 +1631,194 @@ void ProjectGenerator::outputASMTools(string& projectTemplate) const } } +void ProjectGenerator::outputCUDASourceFiles(StaticList& fileList, string& projectTemplate, string& filterTemplate, + StaticList& foundObjects, set& foundFilters, bool staticOnly, bool sharedOnly, bool bit32Only, bool bit64Only) const +{ + // Constants for CUDA build + const string itemGroup = "\r\n "; + const string itemGroupEnd = "\r\n "; + const string includeClose = "\">"; + const string includeEnd = "\" />"; + const string typeInclude = "\r\n true"; + const string buildConfigsStatic[] = {"Release", "Debug", "ReleaseWinRT", "DebugWinRT"}; + const string buildConfigsShared[] = {"ReleaseDLL", "ReleaseDLLStaticDeps", "DebugDLL", "ReleaseDLLWinRT", + "ReleaseDLLWinRTStaticDeps", "DebugDLLWinRT"}; + + if (fileList.size() > 0) { + string cudaFiles = itemGroup; + string cudaFilesFilt = itemGroup; + string cudaFilesTemp, cudaFilesFiltTemp; + + for (const auto& i : fileList) { + // CUDA custom build entry + cudaFilesTemp = typeInclude; + cudaFilesFiltTemp = typeInclude; + + // Add the fileName + string file = i; + replace(file.begin(), file.end(), '/', '\\'); + cudaFilesTemp += file; + cudaFilesFiltTemp += file; + + // Get object name without path or extension for generated .c file + uint pos = i.rfind('/') + 1; + string objectName = i.substr(pos); + uint pos2 = objectName.rfind('.'); + objectName.resize(pos2); + string outputCFile = "$(IntDir)\\" + objectName + ".ptx.c"; + + // Add the filters Filter + string sourceDir; + m_configHelper.makeFileProjectRelative(m_configHelper.m_rootDirectory, sourceDir); + pos = i.rfind(sourceDir); + pos = (pos == string::npos) ? 0 : pos + sourceDir.length(); + cudaFilesFiltTemp += includeClose; + cudaFilesFiltTemp += filterSource; + uint folderLength = i.rfind('/') - pos; + if (static_cast(folderLength) != -1) { + string folderName = file.substr(pos, folderLength); + folderName = '\\' + folderName; + foundFilters.insert("Source Files" + folderName); + cudaFilesFiltTemp += folderName; + } + cudaFilesFiltTemp += filterEnd; + cudaFilesFiltTemp += typeIncludeEnd; + + // Add CUDA compilation commands + cudaFilesTemp += includeClose; + + // CUDA compilation command: .cu -> .ptx -> .c + cudaFilesTemp += "\r\n \"%CUDA_PATH%\\bin\\nvcc\" -gencode arch=compute_60,code=sm_60 -O2 -m64 -ptx -c -o \"$(IntDir)\\" + objectName + ".ptx\" \"%(FullPath)\" && \"$(ProjectDir)bin2c.exe\" \"$(IntDir)\\" + objectName + ".ptx\" \"" + outputCFile + "\" " + objectName + "_ptx"; + cudaFilesTemp += "\r\n " + outputCFile + ""; + cudaFilesTemp += "\r\n Compiling CUDA file %(Filename)%(Extension)"; + + // Check if this file should be disabled under certain configurations + if (staticOnly || sharedOnly) { + const string* buildConfig = nullptr; + uint configs = 0; + if (staticOnly) { + buildConfig = buildConfigsShared; + configs = sizeof(buildConfigsShared) / sizeof(buildConfigsShared[0]); + } else { + buildConfig = buildConfigsStatic; + configs = sizeof(buildConfigsStatic) / sizeof(buildConfigsStatic[0]); + } + for (uint j = 0; j < configs; j++) { + cudaFilesTemp += excludeConfig; + cudaFilesTemp += buildConfig[j]; + cudaFilesTemp += excludeConfigEnd; + } + } else if (bit32Only || bit64Only) { + cudaFilesTemp += excludeConfigPlatform; + if (bit32Only) { + cudaFilesTemp += "x64"; + } else { + cudaFilesTemp += "Win32"; + } + cudaFilesTemp += excludeConfigEnd; + } + + cudaFilesTemp += typeIncludeEnd; + + // Add to output + cudaFiles += cudaFilesTemp; + cudaFilesFilt += cudaFilesFiltTemp; + } + + cudaFiles += itemGroupEnd; + cudaFilesFilt += itemGroupEnd; + + // Add generated .c files for compilation with explicit dependencies + string cFiles = itemGroup; + string cFilesFilt = itemGroup; + for (const auto& i : fileList) { + uint pos = i.rfind('/') + 1; + string objectName = i.substr(pos); + uint pos2 = objectName.rfind('.'); + objectName.resize(pos2); + string outputCFile = "$(IntDir)\\" + objectName + ".ptx.c"; + string origCuFile = i; + replace(origCuFile.begin(), origCuFile.end(), '/', '\\'); + + // ClCompile entry with explicit dependency + cFiles += "\r\n "; + cFiles += "\r\n " + origCuFile + ""; + + // Check if this file should be disabled under certain configurations + if (staticOnly || sharedOnly) { + const string* buildConfig = nullptr; + uint configs = 0; + if (staticOnly) { + buildConfig = buildConfigsShared; + configs = sizeof(buildConfigsShared) / sizeof(buildConfigsShared[0]); + } else { + buildConfig = buildConfigsStatic; + configs = sizeof(buildConfigsStatic) / sizeof(buildConfigsStatic[0]); + } + for (uint j = 0; j < configs; j++) { + cFiles += "\r\n " + "true"; + } + } else if (bit32Only || bit64Only) { + cFiles += "\r\n " + string("true"); + } + + cFiles += "\r\n "; + + // Filter entry for generated .c file + cFilesFilt += "\r\n "; + cFilesFilt += "\r\n Source Files\\Generated"; + cFilesFilt += "\r\n "; + } + cFiles += itemGroupEnd; + cFilesFilt += itemGroupEnd; + + // Add the Generated filter + foundFilters.insert("Source Files\\Generated"); + + // After add the item groups for CUDA files + string endTag = ""; + uint findPos = projectTemplate.rfind(endTag); + findPos += endTag.length(); + uint findPosFilt = filterTemplate.rfind(endTag); + findPosFilt += endTag.length(); + + // Insert into output file + projectTemplate.insert(findPos, cudaFiles + cFiles); + filterTemplate.insert(findPosFilt, cudaFilesFilt + cFilesFilt); + } +} + void ProjectGenerator::outputCUDATools(string& projectTemplate) const { if (m_configHelper.isCUDAEnabled() && (m_includesCU.size() > 0)) { - // TODO: Add cuda tools + // Copy bin2c.exe to project directory for CUDA compilation + string bin2cContent; + if (!loadFromResourceFile(BIN2C_EXE_ID, bin2cContent)) { + outputError("Failed to load bin2c.exe from resources"); + return; + } + + string bin2cPath = m_configHelper.m_solutionDirectory + "bin2c.exe"; + if (!writeToFile(bin2cPath, bin2cContent, true)) { + outputError("Failed to copy bin2c.exe to project directory"); + return; + } + + // Add CUDA custom build targets for each .cu file + // This will be handled in the modified outputSourceFiles function + // The custom build rules will be added per-file rather than as global tools } } From c0db1ec4f36bd4d399d370577affead96e408f06 Mon Sep 17 00:00:00 2001 From: softworkz Date: Wed, 11 Jun 2025 09:22:36 +0200 Subject: [PATCH 3/3] Add support for fftools/resources Latest FFmpeg has resources which need similar treatment like .cu files. Signed-off-by: softworkz --- include/projectGenerator.h | 16 +++ source/projectGenerator.cpp | 233 ++++++++++++++++++++++++++++++- source/projectGenerator_pass.cpp | 147 ++++++++++++++++++- 3 files changed, 393 insertions(+), 3 deletions(-) diff --git a/include/projectGenerator.h b/include/projectGenerator.h index d831df2..a8c61e3 100644 --- a/include/projectGenerator.h +++ b/include/projectGenerator.h @@ -461,6 +461,22 @@ class ProjectGenerator StaticList& foundObjects, set& foundFilters, bool staticOnly = false, bool sharedOnly = false, bool bit32Only = false, bool bit64Only = false) const; + /** + * Output resource source files (HTML/CSS) with custom build steps. + * @param [in,out] fileList The list of resource files to process. + * @param [in,out] projectTemplate The project template. + * @param [in,out] filterTemplate The filter template. + * @param [in,out] foundObjects The list of found object files. + * @param [in,out] foundFilters The set of found filters. + * @param staticOnly True to only include in static builds. + * @param sharedOnly True to only include in shared builds. + * @param bit32Only True to only include in 32-bit builds. + * @param bit64Only True to only include in 64-bit builds. + */ + void outputResourceSourceFiles(StaticList& fileList, string& projectTemplate, string& filterTemplate, + StaticList& foundObjects, set& foundFilters, bool staticOnly = false, bool sharedOnly = false, + bool bit32Only = false, bool bit64Only = false) const; + bool outputDependencyLibs(string& projectTemplate, bool winrt, bool program); /** diff --git a/source/projectGenerator.cpp b/source/projectGenerator.cpp index 07468ec..67659f3 100644 --- a/source/projectGenerator.cpp +++ b/source/projectGenerator.cpp @@ -1085,6 +1085,40 @@ void ProjectGenerator::outputSourceFiles(string& projectTemplate, string& filter } } + // Process resource files (HTML/CSS) from OBJS-resman + StaticList resourceFiles; + auto resmanIt = m_unknowns.find("OBJS-resman"); + if (resmanIt != m_unknowns.end()) { + for (const auto& resFile : resmanIt->second) { + // Convert .o extension back to source file + string sourceFile = resFile; + if (sourceFile.length() > 2 && sourceFile.substr(sourceFile.length() - 2) == ".o") { + sourceFile = sourceFile.substr(0, sourceFile.length() - 2); + // Check if this is a resource file we can process + if (sourceFile.find(".html") != string::npos || sourceFile.find(".css") != string::npos) { + resourceFiles.push_back(sourceFile); + + // Copy bin2c.exe if needed for resource processing + static bool bin2cCopied = false; + if (!bin2cCopied) { + string bin2cContent; + if (loadFromResourceFile(BIN2C_EXE_ID, bin2cContent)) { + string bin2cPath = m_configHelper.m_solutionDirectory + "bin2c.exe"; + if (writeToFile(bin2cPath, bin2cContent, true)) { + bin2cCopied = true; + } + } + } + } + } + } + + // Process resource files if any were found + if (!resourceFiles.empty()) { + outputResourceSourceFiles(resourceFiles, projectTemplate, filterTemplate, foundObjects, foundFilters); + } + } + // Output header files in new item group outputSourceFileType( m_includesH, "ClInclude", "Header", projectTemplate, filterTemplate, foundObjects, foundFilters, false); @@ -1388,7 +1422,7 @@ mkdir \"$(OutDir)\"\\include\\"; const string copyEnd = " \"$(OutDir)\"\\include\\"; const string license = "\r\nmkdir \"$(OutDir)\"\\licenses"; string licenseName = m_configHelper.m_projectName; - transform(licenseName.begin(), licenseName.end(), licenseName.begin(), tolower); + transform(licenseName.begin(), licenseName.end(), licenseName.begin(), ::tolower); const string licenseEnd = " \"$(OutDir)\"\\licenses\\" + licenseName + ".txt"; const string prebuild = "\r\n \r\n\ if exist template_rootdirconfig.h (\r\n\ @@ -1800,6 +1834,203 @@ void ProjectGenerator::outputCUDASourceFiles(StaticList& fileList, string& proje } } +void ProjectGenerator::outputResourceSourceFiles(StaticList& fileList, string& projectTemplate, string& filterTemplate, + StaticList& foundObjects, set& foundFilters, bool staticOnly, bool sharedOnly, bool bit32Only, bool bit64Only) const +{ + // Constants for resource build + const string itemGroup = "\r\n "; + const string itemGroupEnd = "\r\n "; + const string includeClose = "\">"; + const string includeEnd = "\" />"; + const string typeInclude = "\r\n true"; + const string buildConfigsStatic[] = {"Release", "Debug", "ReleaseWinRT", "DebugWinRT"}; + const string buildConfigsShared[] = {"ReleaseDLL", "ReleaseDLLStaticDeps", "DebugDLL", "ReleaseDLLWinRT", + "ReleaseDLLWinRTStaticDeps", "DebugDLLWinRT"}; + + if (fileList.size() > 0) { + string resourceFiles = itemGroup; + string resourceFilesFilt = itemGroup; + string resourceFilesTemp, resourceFilesFiltTemp; + + for (const auto& i : fileList) { + // Resource custom build entry + resourceFilesTemp = typeInclude; + resourceFilesFiltTemp = typeInclude; + + // Add the fileName with full project-relative path + string file = i; + string fullPath; + if (findSourceFile(file.substr(0, file.rfind('.')), file.substr(file.rfind('.')), fullPath)) { + m_configHelper.makeFileProjectRelative(fullPath, file); + } + replace(file.begin(), file.end(), '/', '\\'); + resourceFilesTemp += file; + resourceFilesFiltTemp += file; + + // Get resource name without path or extension for generated .c file + uint pos = i.rfind('/') + 1; + string resourceName = i.substr(pos); + uint pos2 = resourceName.rfind('.'); + string extension = resourceName.substr(pos2); + resourceName.resize(pos2); + string outputCFile = "$(IntDir)\\" + resourceName + extension + ".c"; + + // Add the filters Filter + string sourceDir; + m_configHelper.makeFileProjectRelative(m_configHelper.m_rootDirectory, sourceDir); + pos = i.rfind(sourceDir); + pos = (pos == string::npos) ? 0 : pos + sourceDir.length(); + resourceFilesFiltTemp += includeClose; + resourceFilesFiltTemp += filterSource; + uint folderLength = i.rfind('/') - pos; + if (static_cast(folderLength) != -1) { + string folderName = file.substr(pos, folderLength); + folderName = '\\' + folderName; + foundFilters.insert("Source Files" + folderName); + resourceFilesFiltTemp += folderName; + } + resourceFilesFiltTemp += filterEnd; + resourceFilesFiltTemp += typeIncludeEnd; + + // Add resource compilation commands + resourceFilesTemp += includeClose; + + if (extension == ".css") { + // CSS processing: minify then convert to C array + string minFile = "$(IntDir)\\" + resourceName + ".css.min"; + string varName = resourceName; + replace(varName.begin(), varName.end(), '.', '_'); + varName += "_css"; + + resourceFilesTemp += "\r\n powershell -Command \"(Get-Content '%(FullPath)' -Raw) -replace '/\\*.*?\\*/', '' -replace '\\r?\\n', ' ' -replace '\\s+', ' ' -replace '^\\s+|\\s+$', '' | Out-File '" + minFile + "' -NoNewline -Encoding ASCII\" && \"$(ProjectDir)bin2c.exe\" \"" + minFile + "\" \"" + outputCFile + "\" " + varName + ""; + } else if (extension == ".html") { + // HTML processing: direct conversion to C array + string varName = resourceName; + replace(varName.begin(), varName.end(), '.', '_'); + varName += "_html"; + + resourceFilesTemp += "\r\n \"$(ProjectDir)bin2c.exe\" \"%(FullPath)\" \"" + outputCFile + "\" " + varName + ""; + } else { + // Generic resource processing + string varName = resourceName; + replace(varName.begin(), varName.end(), '.', '_'); + varName += "_" + extension.substr(1); // Remove the dot from extension + + resourceFilesTemp += "\r\n \"$(ProjectDir)bin2c.exe\" \"%(FullPath)\" \"" + outputCFile + "\" " + varName + ""; + } + + resourceFilesTemp += "\r\n " + outputCFile + ""; + resourceFilesTemp += "\r\n Converting resource file %(Filename)%(Extension)"; + + // Check if this file should be disabled under certain configurations + if (staticOnly || sharedOnly) { + const string* buildConfig = nullptr; + uint configs = 0; + if (staticOnly) { + buildConfig = buildConfigsShared; + configs = sizeof(buildConfigsShared) / sizeof(buildConfigsShared[0]); + } else { + buildConfig = buildConfigsStatic; + configs = sizeof(buildConfigsStatic) / sizeof(buildConfigsStatic[0]); + } + for (uint j = 0; j < configs; j++) { + resourceFilesTemp += excludeConfig; + resourceFilesTemp += buildConfig[j]; + resourceFilesTemp += excludeConfigEnd; + } + } else if (bit32Only || bit64Only) { + resourceFilesTemp += excludeConfigPlatform; + if (bit32Only) { + resourceFilesTemp += "x64"; + } else { + resourceFilesTemp += "Win32"; + } + resourceFilesTemp += excludeConfigEnd; + } + + resourceFilesTemp += typeIncludeEnd; + + // Add to output + resourceFiles += resourceFilesTemp; + resourceFilesFilt += resourceFilesFiltTemp; + } + + resourceFiles += itemGroupEnd; + resourceFilesFilt += itemGroupEnd; + + // Add generated .c files for compilation with explicit dependencies + string cFiles = itemGroup; + string cFilesFilt = itemGroup; + for (const auto& i : fileList) { + uint pos = i.rfind('/') + 1; + string resourceName = i.substr(pos); + uint pos2 = resourceName.rfind('.'); + string extension = resourceName.substr(pos2); + resourceName.resize(pos2); + string outputCFile = "$(IntDir)\\" + resourceName + extension + ".c"; + string origResourceFile = i; + replace(origResourceFile.begin(), origResourceFile.end(), '/', '\\'); + + // ClCompile entry with explicit dependency + cFiles += "\r\n "; + cFiles += "\r\n " + origResourceFile + ""; + + // Check if this file should be disabled under certain configurations + if (staticOnly || sharedOnly) { + const string* buildConfig = nullptr; + uint configs = 0; + if (staticOnly) { + buildConfig = buildConfigsShared; + configs = sizeof(buildConfigsShared) / sizeof(buildConfigsShared[0]); + } else { + buildConfig = buildConfigsStatic; + configs = sizeof(buildConfigsStatic) / sizeof(buildConfigsStatic[0]); + } + for (uint j = 0; j < configs; j++) { + cFiles += "\r\n " + "true"; + } + } else if (bit32Only || bit64Only) { + cFiles += "\r\n " + string("true"); + } + + cFiles += "\r\n "; + + // Filter entry for generated .c file + cFilesFilt += "\r\n "; + cFilesFilt += "\r\n Source Files\\Generated"; + cFilesFilt += "\r\n "; + } + cFiles += itemGroupEnd; + cFilesFilt += itemGroupEnd; + + // Add the Generated filter + foundFilters.insert("Source Files\\Generated"); + + // After add the item groups for resource files + string endTag = ""; + uint findPos = projectTemplate.rfind(endTag); + findPos += endTag.length(); + uint findPosFilt = filterTemplate.rfind(endTag); + findPosFilt += endTag.length(); + + // Insert into output file + projectTemplate.insert(findPos, resourceFiles + cFiles); + filterTemplate.insert(findPosFilt, resourceFilesFilt + cFilesFilt); + } +} + void ProjectGenerator::outputCUDATools(string& projectTemplate) const { if (m_configHelper.isCUDAEnabled() && (m_includesCU.size() > 0)) { diff --git a/source/projectGenerator_pass.cpp b/source/projectGenerator_pass.cpp index 0a5c365..83ea1e2 100644 --- a/source/projectGenerator_pass.cpp +++ b/source/projectGenerator_pass.cpp @@ -525,6 +525,17 @@ bool ProjectGenerator::passMake() return false; } } + } else if (m_inLine.substr(0, 11) == "OBJS-resman") { + // Find position after "+=" + uint startPos = m_inLine.find("+="); + if (startPos != string::npos) { + startPos += 2; // Skip past "+=" + // Found resource manager objects - store for later resolution + if (!passStaticInclude(startPos, m_unknowns["OBJS-resman"])) { + m_inputFile.close(); + return false; + } + } } else if (m_inLine.substr(0, 7) == "HEADERS") { // Found some headers if (m_inLine.at(7) == '-') { @@ -681,7 +692,7 @@ bool ProjectGenerator::passMake() } makeFiles.push_back(newMake); // Add to internal list of known subdirectories - const uint rootPos = newMake.find(m_configHelper.m_rootDirectory); + const uint rootPos = newMake.find(m_configHelper.m_rootDirectory); if (rootPos != string::npos) { newMake.erase(rootPos, m_configHelper.m_rootDirectory.length()); } @@ -720,6 +731,8 @@ bool ProjectGenerator::passMake() bool ProjectGenerator::passProgramMake() { uint checks = 2; + vector makeFiles; // Track additional includes + while (checks >= 1) { // Open the input Makefile string makeFile = m_projectDir + "MakeFile"; @@ -810,9 +823,133 @@ bool ProjectGenerator::passProgramMake() return false; } } + } else if (m_inLine.substr(0, 11) == "OBJS-resman") { + // Find position after "+=" + uint startPos = m_inLine.find("+="); + if (startPos != string::npos) { + startPos += 2; // Skip past "+=" + // Found resource manager objects - store for later resolution + if (!passStaticInclude(startPos, m_unknowns["OBJS-resman"])) { + m_inputFile.close(); + return false; + } + } + } else if (m_inLine.substr(0, 7) == "include" || m_inLine.substr(0, 8) == "-include") { + // Need to append the included file to makefile list + uint startPos = m_inLine.find_first_not_of(" \t", 7 + (m_inLine[0] == '-' ? 1 : 0)); + uint endPos = m_inLine.find_first_of(" \t\n\r", startPos + 1); + endPos = (endPos == string::npos) ? endPos : endPos - startPos; + string newMake = m_inLine.substr(startPos, endPos); + + // Check if this include contains function parameters (like $(1), $(2), etc.) and skip it + if (newMake.find("$(1)") != string::npos || newMake.find("$(2)") != string::npos || + newMake.find("$(3)") != string::npos || newMake.find("$(prog)") != string::npos || + newMake.find("$(P)") != string::npos) { + continue; // Skip this include as it's part of a Make function definition + } + + // Perform token substitution + startPos = newMake.find('$'); + while (startPos != string::npos) { + endPos = newMake.find(')', startPos + 1); + if (endPos == string::npos) { + outputError("Invalid token in include (" + newMake + ")"); + return false; + } + ++endPos; + string token = newMake.substr(startPos, endPos - startPos); + if (token == "$(SRC_PATH)") { + newMake.replace(startPos, endPos - startPos, m_configHelper.m_rootDirectory); + } else if (token == "$(ARCH)") { + newMake.replace(startPos, endPos - startPos, "x86"); + } else { + outputError("Unknown token in include (" + token + ")"); + return false; + } + startPos = newMake.find('$', startPos); + } + + makeFiles.push_back(newMake); } } m_inputFile.close(); + + // Process any included makefiles + while (!makeFiles.empty()) { + const string includedMakeFile = makeFiles.back(); + makeFiles.pop_back(); + outputLine(" Generating from Makefile (" + includedMakeFile + ")..."); + + // Open the included Makefile + ifstream includedFile(includedMakeFile); + if (includedFile.is_open()) { + string includedLine; + while (getline(includedFile, includedLine)) { + // Process OBJS-resman lines in included files + if (includedLine.length() >= 11 && includedLine.substr(0, 11) == "OBJS-resman") { + // Only process OBJS-resman for ffmpeg project + if (m_projectName == "ffmpeg") { + // Handle multi-line declarations directly here instead of using passStaticInclude + // to avoid file context mismatch + string fullLine = includedLine; + + // Read continuation lines from the included file + while (fullLine.back() == '\\') { + string nextLine; + if (getline(includedFile, nextLine)) { + fullLine += " " + nextLine; // Append with space + } else { + break; // No more lines + } + } + + // Now parse the complete line manually + uint startPos = fullLine.find("+="); + if (startPos != string::npos) { + startPos += 2; // Skip past "+=" + + // Parse files from the line + uint pos = fullLine.find_first_not_of("+=: \t", startPos); + while (pos != string::npos && pos < fullLine.length()) { + // Skip backslashes and whitespace + if (fullLine[pos] == '\\' || fullLine[pos] == ' ' || fullLine[pos] == '\t') { + pos = fullLine.find_first_not_of(" \t\\", pos + 1); + continue; + } + + // Find end of current file + uint endPos = fullLine.find_first_of(" \t\\", pos); + if (endPos == string::npos) { + endPos = fullLine.length(); + } + + string file = fullLine.substr(pos, endPos - pos); + if (!file.empty() && file != "+=" && file != "OBJS-resman") { + // Special handling for resman.o - convert to resman since it's a real source file + if (file == "fftools/resources/resman.o") { + string sourceFile = "fftools/resources/resman"; + m_includes.push_back(sourceFile); + outputInfo("Found Static: '" + sourceFile + ".c' (converted from resman.o)"); + } + + // Store in unknowns for $(OBJS-resman) resolution + // These are object files that will be resolved when $(OBJS-resman) is encountered + m_unknowns["OBJS-resman"].push_back(file); + outputInfo("Found Static: '" + file + "' (stored for $(OBJS-resman) resolution)"); + } + + pos = fullLine.find_first_not_of(" \t\\", endPos); + } + } + } + } + } + includedFile.close(); + } else { + outputInfo("Could not open included MakeFile (" + includedMakeFile + ")"); + } + } + if (checks == 2) { string ignored; const string makeFolder = "fftools/"; @@ -829,9 +966,15 @@ bool ProjectGenerator::passProgramMake() uint uiPos; for (auto i = m_includes.begin(); i < m_includes.end(); ++i) { if ((uiPos = i->find(makeFolder)) != string::npos) { - i->erase(uiPos, makeFolder.length()); + // Don't strip fftools/ prefix from resman as it's a real source file in that location + if (*i != "fftools/resources/resman") { + i->erase(uiPos, makeFolder.length()); + } else { + // Keep full path for resman.c + } } } + --checks; }