From faf541e536028f091207a79fa5ae9ac96931d618 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Forment?= Date: Tue, 17 Mar 2026 13:51:47 +0100 Subject: [PATCH] Feat: try again --- Cargo.toml | 2 +- plugins/cagire-plugins/src/editor.rs | 2 +- scripts/__pycache__/build.cpython-314.pyc | Bin 51628 -> 62173 bytes scripts/build.py | 81 ++++++++++++++++++++-- 4 files changed, 78 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index a858059..8e93a29 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -92,7 +92,7 @@ winres = "0.1" [profile.release] opt-level = 3 -lto = "fat" +lto = "thin" codegen-units = 1 panic = "abort" strip = true diff --git a/plugins/cagire-plugins/src/editor.rs b/plugins/cagire-plugins/src/editor.rs index 8289074..0c9e760 100644 --- a/plugins/cagire-plugins/src/editor.rs +++ b/plugins/cagire-plugins/src/editor.rs @@ -234,7 +234,7 @@ pub fn create_editor( // Read live snapshot from the audio thread let shared = editor.bridge.shared_state.load(); editor.snapshot = SequencerSnapshot::from(shared.as_ref()); - editor.app.playback.playing = editor.snapshot.playing; + editor.app.playback.playing = editor.playing.load(std::sync::atomic::Ordering::Relaxed); // Sync host tempo into LinkState so title bar shows real tempo if shared.tempo > 0.0 { diff --git a/scripts/__pycache__/build.cpython-314.pyc b/scripts/__pycache__/build.cpython-314.pyc index e3c11191b869c03bf85cb51e7264e0f71dd76066..a4c4da34a7534b81c48643024a9dd473954c3f04 100644 GIT binary patch delta 25937 zcmb7s3qVxYnee?ccizJ=Ff+U#!$WWsP!t6fpCE!f#0w5SAY_CACJxMaXNWpUGbFoh zv}q%Hl1Q4QV$;9DCT+;thql>`woQ{hc6SIQ;Ej#;Z@Ss;<6n$%ZQO46|GsnQrPY|d z%6HE_@5gt(^S#czLgc^sz1*Uwu@!7MuDDCzO3JM!l2EN}@!OU#{zZI3*J9pK1R2U0e+i!mUq<}mlTsNz zIhAo6{iPNrkKs-5ZSE?okcaD9!dv`H`4oRSpXy)Ml}w&uZNcSy7UasNr7HLw21K3{F`lf_Q5lG(1S0oA%Y=<1$ z)}NESM03`CkHsRhX;m&}jXaxiv9<%`*YdF>nW(Dq4Ea26r>NK>c!s^?AXl!jv7(~Q zf5`15r@4!)kvyZwRb)eBRpdvCcPkSiWRnXfcnKB+DFA%9J&KBoge-WA3EjiqUWeb= z?HzFVoI*atRgs@7_pob8zUuqM$?z?eH)ALRfQ=P0;pM{}n@=kdvdN!S8SDmJ{?fLogy(gsF02 zF@~2QC;lq-PQhGwd?EoR`z> z1BX-=W0&z-`USbN7+%xNw#&R4yIjxktX-pLmdU+ZA~)6~>N*o>jQ~1y9WRm{#;+?k z!-r5yJ~eL7$6?s?0uD}8cpZY@Cv3v7%H!)Eatt~ln>#756-$WRpr_X?1}6RsM6=`mexzy3z_JY)RR!sKj&u`PN-(GmrT~4ZJ4Rpd@S|t z+L5hui7AI&qx;7)#`Gcm0`iZ^n*b|e4eBJ^7CaumpoD4!#O<2~x69|>)9QBk`#i#6 z*Jq+Ru7{tDnE=htyl#4uU4y-`aY8S=M7B@lU=uq;*6-sW0*4|E!Ql2ddb_>hCVYaI zR`W&6*Vu=MHD${KHCSBU<93OvUZ-!L-{TckUiWanYsg2t(_+)y2_*#|loRR@_z?^v zxD!?in1J9RGL>SJuu?dlx{!U0*i!#WN6~O6=BXh+Om*(07^%Bsi?lHXWJMC;^9x_V zQjZ`QL2#$W4`2d<$A~|zMr!;3F2`!RC2;Cut08TUdu@qhq%vLF*F7w`sxT9O`fu0) z!eus2Ectx>Izhgii4^d=nJp`7u@8>}IL!(ehSwADq69lk^>urZ5Ico#Ks@0nB%UDU zSviQSS+(nLn;a|~*PVOK&~s!uYZ276|3ErP&HhFO-L1GmZ8B*_XkUOXz!@ars7`RY zopAVc_qqh(X-IgE{CoBqY2!#Mbz2u6#va|PAE(HRIXELmYdX1-)3NX=Ec7IR_<7L# zVPRk$`rM9wpD+fgr$~41LfZD)V&Ti5r=gd~zvW5|HLYld0s*efdC)21v~R@nx3{VF z4fplA4$`TA0W!Qqj#=|KB(r4n$rWVses!jbSMwTP%j=dX3y{81q>%Rv_6iRZLte?I zAY_JJd!RRi4#mm2@Fy%hUvx{ z$Iu%HaQ%EpV}U&^3ZEc)N-Dbdx`rIWA>mC(qyxDh&~^KwPSr&FEVm3gc&dK$_R|`Q zsZ!PSn2T-PaVRLzjr;j$Y>Lz`E{C;vy(XQI#XV{()B$w0mi&3~it=0ge=AdK*gHJb z>js`Se3D_0r$}!JZfxl2F5xZg&AqT_4l?_x`DWq+qFn+D zai)672xp;~(gbyia<^-5Kwjqa2+d?_`Fgg2BvtIS;0P$52q6q1K?k~VxT1RDCM=}% z4GjBTZXg^U@1bR)VsIajec&>BF`tBwmcqsynj z{RUvHeI8%q1N1eyi@wfR&@{keSU&c7a=!AbxMnigX4|W51-LXe6+Kaff5Z;qg5A`X zmi9Rv{$auC6a3_bs_d<`m_|oGhN0+^2~+SX@nz9nl^n*#00YirS(-(vkr5P6(KereJvGE+Q8$q`6zDGs3w0X7*Uy5vV& zGZf1pzMWj$+8NKx7|A1z>b5&feGF&As|OXvjp1I)&`B;fZiHpXY^vvA6uqr`$`?TU z0bOaStH(1`+UIgRg-q;eE&`l(ArC=5f&v7EWWF_3Cj5*Tx8Dy6i~ZYE^zqyQA=_7G z1|XvkH3uWi+5K-kc<#X;ADms^`p)`RAQm5PUkx*t%jX4gJP)G%t0O#G7AR#$Loj4?iB$Ow52Am=?PJY**lf1zj zjEG$lMWEa86!{Hr%cGmY0xS;f2EZ!UprhXjg0bHPjkH36&NIbrFSEC-SBV0dPO751 z=U(_C*|Gx{;mD35xp5^9vl2lSg4IN|i&wVe@OF^yT}SgSKrjGQGa`%zWTpFW%1Zr0 z1CEvzUL=XTGgu{Av^y9SvDjv;W)%QYc3^LdkOLu5cWDP*KA&r-zuU7JFgx|AL z*^I$$(2^gaa}lqL`R zyB#~Ek`5O-ik%p{3&Cy#xRwGo3XESbM%)2wg!>@Dhtq`IU4*?$xCJ)^C)DvO{Q366 zv17WwHy$<8cHXv)Kf;#2gn(kVM1=7(Mv6Yyne#faI`GVKIQGlf56E=S>1KK`C=Lv` zKutqe5nBL+cY*>GaF?D2C^u46#^d65kPb6M2OsNK_+0o!?*a?m3K}}vA)gC0Au!6< z&&Zt|auvTWt|d)GoV2O?OM{I#k;ra{a*ywz@L!lSy$m+7Rbm~ipb)h7 zd4SQiI{a4Q&zR0(dLS9=tD*JL{8%RnrUEi;!f^niN~)t*cn_my5zHa@4T28<*n+7N z=Z5ntpqNT^6q4R&BYskngv%ry($Pht3L#PH@=+FqlDFStt^^#f4gns?bowc_NxGw2 z%!2%)%_6N~0iAmRvyNjLUDH26NR+{BP^9|;aS97q7kL6m!@rPk3(GR-8XJ(E00p1l z)#vB|h2UdQ$LyK^6yB1<8nk9rlMTmAhJW@!!j&YC3N?|()lH=yH9u=`dCat2m7Flr|Rol?uLiA zcl5yL>F5gb_lGJa;vy&PE9Nsffs1nXi{y`AC}L+w?jt*c|AE!e-p^y`D)v5!>anSg zROIlK5jBGzz&X#5t4BhEe9Vgip;VL({A2vY(F?yqK(PWBfU4m{&E|tWPA_V)DaD9z z{ms#NqH8V6{7b2&LelXCpdyiV`ZVxHx<#L`c2nY)A}5M43N5WTQxp6Xy9j4c)I?Hz zf)l$FU1m|!;~4}UJe*Ag*BZuOgUB z%$}FS`-(nwUIFiUC1bSBt1zTylJn;^7}7H4)Oj6-^o&w>H334PMdug>$p6MO=At?U zR@w=}ksjX4v%HL#SIVVtufncqm6O-g0L;BN(QAw~Xiwx*@7$nW zV>d!q(<1BWP3VlyPAk&2xQ8rBG;nr#Yc6^1byI>mJ|ox?v&iqiXlaObF+0{gpU!98 zt@-c{@FPj!vnGR zCf$xFJClmTnRq*JMv7Q^(DEKFh9#h0V5`T5YiM8RX^1 z6N^h}YfRj5aw16CiR=M=S{I=?mE&_-OR?uuhqcm^gYtZQ3s?od>;+p+OXT z%RM|eB;;WP*X!!>3yBbvtZ0u1A-ix8ljLsakVLr?Fj%A@?oHB=mH&`af&=X-TZ2J-B69bcwJXSPeK5LoLuOHbw$7yCc^Au+u z-97%`q(8)&XSnKEWXE_fjanRw+C5>WQDw0x`*_EslyA*Pn$#zAE@fH2nLC|T9#W^@ zkTWFk6_?UJv0^5zoc!S{=M*<87;PGP^Q$(Zd@?sEXR`7?G^LJlWc4?>S?khwtV<`& zKTLlu{p^bA@{QBhP4AjE9Z^G$P+B?k*|h$!`a_*@)H0@?*5!q`yc^qDsP1Ua;hdW{ zR@2Z;A5z2%i;WG{innrgTaAieRO_}TXntwbZMABsMHr@^K1zm!9$Y4wqI)4m5|rs; z(vz7Uy6Kp3uS54Z9=dsu6A#^NcF9!)sFj7+WEp*(Z>N!xT{?XJ(O!`6XjD0hYsnDj zU>xcZ#?Bg<9kO9r88a-agFfuf2j3$+gVeSCaMWfojVTNmt6OAfp9fOMc;#N1T^^xh zQXZZyVA?=kSc0e?e!QHWg9F+@7Md}+6V7w#v2(nl7OL#7i zxXreXp2%4YE-SaU1pOSA<-(s=<|5-}D?11TudoyQAEtTg04P43rIhQk)_QvOIRz`# zDflP}=@C3WUnz1{pnU1IO13qh)iq=VrIN$#cDl=20@@nPRp$2$x`hES#+t!P#>A2FO zHf(FcKr2SvHx(J$(ywG4~gNG>F`1yJCTk+98JT6DVH;^KQ@L0o2v1Sg=%KY~fb zk~eEvFlAXVJ}@bpwk)3wS}Lb3m1o&E)aTUa^QSGF4{PTvxhL*BcHel@w59y8_HttS zMSb#|F?-B$a^Ts4F(Bn3L)l^ZyiBP{x};Az+VbU=xuo>5%JJHXf(ifk+RmEKYu{b9 zb$UhPuiHY~cl>Hs$k;KLTQJdfLm^Kv{P7btV@&^qVKqsj-Z(E0Lg1zkMVAX1t2SAf zpICI83gtg3U;zdy>G2)ie{i;2!>dF$9CZ%5byLD&4rl#oR@4nT4t5{#2(Vv$HmxM0 z{uWvhfDeoFSrCINm~+X+%qzG+3yk81a0XUPln*+*5qXW0ZMuMo(n>|eEKw^((A_O}ObKu1O(fy}vBilkLm6vrH7uALawPES+lyFcXT z@B?Fovzpu)P40O4rPQ1g4-GAIvlg*t}0=Q6=T9dE%DVtogLh;jlUClDhPgj6f8J?GfJh}C@Gg354 z>e@IT9(rI>7D&JurhL#-FjWF&hMvI?9;Y|Wx40MaP9Io_@9kt1{2L^bwNL?)Ndud4 z6~Ua=FfWJqm6XDH1-wD3O-P$pVF*yzHm|{u7Uf$VhCr&#xS9YViJnGJKd2QIkbqW- zYj4vgKnPIaDO|S;cynbZFmiw8$R>%^>XjXJtsG>z?J0uqPE{nbLur>q&PuPU!w1LQ zu|zYu`J!2k89{#0p%f5QRluy^lgl*jkxp{E0$eNDK>a54gt1DKY>gta)#uzl47{NW zj;%x1h5iBOA**iyOe0nZg0c?WdBW%05-ZTgeYP^BX*l)B;7U9(Y9oZ5(5MhZJ%~*$ zX|~?QXu5n+4puaT7a6#JSR|jMI64OzeaQAkxKL@kq=gyJaFJL?g^N&tuHJ4aG{Vdq znUu7VmiH5~+YYmratlsA^0h~%bC(>}o!D}0%al6nl0IXsV!UozzxXgaS5!QjcVf}8 zMYGBIQ}AD1FsDwLRcBABfz-XHwqDgRh8$R6eMX2&r;7?k$>!T|RbtL>L(eba1R&)X zRiL=ti_Ri77)3e0_i!%m#qs?V5we;N=>}8HnywR9m_U1we-HCAh9 zb|lUo-5B?=@lx`AEbyq$9WO}LF9DT_T^ZqDdUKF@usm)RW zlZ%hnz^ghwpgT|nTN?_&CZ~l~c491jIuvcPh&BNVsHFmp*07Xs3uj~O39XB%4q)j{ zwb`3!PmFfv7ql~pWE*K*Vgzl45!%{|t#^D7uZHm^*^_t`bvK2{fbOeXmr$*Sf$V?W zOssp2>RhHd7owNn8m$D~R$}W4j7&AeQIOs+1<|!uV%mzhX^-WK^)rkWXMu3VR=x_= z6c6y4Sb@e618(Ku^#%VTGz}QI+rI5;7$k80-sH|T(HTm%b1}ZY5%gv#s&uZ6rZb(u zUM@9f@w#{!#jcJOva1REbT%rs7wY>iQEsdtj+)aZgPhM5aEi(SCu(JoA38`mBLO*e z$|!+r%kbVom!HyMs*4uoK2UUU`<#bBr_&2AdZ;1tqeprob{0mzl< z2PKi)>GX;w;EI3+i=O-Ix?upK5fn$@b{9SZa7ZcAsX}=&I+{=AR%Q)!AGHzAh% z`-$}66`VV8p9Mnv4hB_y!;%9FvTC5lf}R0eDf|l-ehUE}LDD+WC8DbX5;0TM*B8;m zN7N!4HiX$ZExPm3DfbEg3FRsI9t0ZxC-TTxbJbNfQ&>8kT77EOnB#|AzQ5%pJI0<` z1&WSPYW2mtF?d%Bi%4ip2!5hu4Axg_z9*mDHodg={Qh^B*1w%MUD7n0(EM&fGcee5 zDQSnde3Y0wXHGlOc&zb~xn!dEeBYcod+ecW3b`eDlm&hzr)X4lO#3@a;V2u<_f5kj zcQ$3(ya8ge3rAH%dsV@tECBXAHDj#!WXZE7&y`K5*n)?*Tux5ESg>e1wenQunB&#H z(|xZF&=FLQa-r19_tUdSH_m0`y|8GsW)6xDJQbWv%ROm$)-b;RrGuvqz8H8nZP}Gu zV`kEp&6zV#Y&*7XeB*oOqN@o^M$Wu}NwS>K9n(GA^jyn~aq(qS#<9vv=3v^1t;e^H z`QI}a&Zjb_j2pR(p@qGnVzistYwH+;1D}Xt z-?fxZ9GKxMujrCTT0Z?47|yh{pNc7!pMI=n7PPUSe!P-NtGbbgb;5++lp&xHPp%qkmhk zM3}ru0a3rqN<+9p4S9d9!I)ngbWJ%4zfPwydAg=@4Y}~(M#@=$+|x6kp1? zlvl?k9g~tkF982y$4aLmGSb#0l6Tr{w!?UN-Lk0e2u>aiIcd%dE{+@oB6~oTZEF-x z!*m3=wQJW}Z_2EDZpyl>H|1sJeF3G<3Xxg?-3M9%Syn5RS0(lu2$dBH7tlVd-vb3e zE(K|lik}CeC)6QB;*~exX8^$?2!cp_g?|754E7%}OfiAVmPnm|=)%32VM%)%_HICu zM0sUl9t$9#s4xK)jxd)%6zm0V7XADOPOZS!%iwE zdqT;p-{aQYNQA_rxi{&Zl&3doQ)&!~pBi*EIk9~qk>vw8J(SMJ`03BJEsVG=^5|Tk zfTuzMPc;VH0bY}}^o1H!__}>pfOMvRMI+lPBa5vWXsILDpWBamEb`UwBy+&ya%71$ z1=Xhw{o5(4#YUL5{s#Px*Mmlov=jF?eX5=U+u#b!$19>aNn&m)`QUkVFqW?*s?Ne) z$}5-2%UC-XO9ulK!!q%E#mmJEnXRbNyX}ctEA3pQ$LMVdJyEqvI#%+7*9`_P(rMV> zYWwj5OMWYAYi@g>Ptsi`t(|E#qm@>tgFUWa2GS~@KsLOPy4}zsd=qi=+X(&(0o_(A zs}+>;vbJ(y#txvlBxb5a1>SHjeTL6c0<$E+sHPMTNhGP}sdOx*7iiQxQ-E{MX}OFAw6*Xgtz5 ztIrPUv&WW!l|-jMy6Whv!>dkqykeTz@p8t@$}KatEpw)f=a-M|Kl#wJ4^3w-o+(@Z zZsz(>#)i;_p-_@1Wb}r72S0&3Mr@O89*9%q)r?<$wncWGVUk*8hZP@kI@Ietwcv7A z-eK;jMtejvx?o0~7Ajs%c6@yWIA7$Rs~*4=rQ)e5cMKi6E0c@4P>?Fd?Sw`rJY_gG z`6`038v2qp5DYo`KxXMw+0BpyLk376YOu%XNWM9jjE?JrcF?v9R>%Z)MLBwj%YDc^ zIuE+g5~zf`6N6qbyy5iXX%%tf(sx7NZjaE78HEH$qTR}eETHF1Fdf}}WcL%DBXx7C zgvTDaq}Cl(e_1`6^cCHlE@`AW)=QS`%36*NG8UW!F#)t6Q3e!zD2Vv=!XTc%fqefk zxKHf4MZ?rpVx`o+hPq1KThmmA6IV!kc!SAev#%nUGv&?8@m;o&zON{XuPWd>N{YzN zlgZ{+V1Qt~0mp-=^=37hJlP7Wc5-T&rGSZOz(I5e%|XO+(;40RAP^nN&l-SBQxW~(}VQZgx|WzY=BMzF`PafuBg~(WI9~S!I%*<8~x9CN~0c0&Vvs3 zFj%_5O%<#}y#Z}&cw9YTaz%n6%4?b$s7Fz|sH&ANAySW`fT@*S{iZ26 z49y1A?ewOWZ}n-p5m4zSavfvMg7p&j<88fVQ#@0g1~#yD{5z@+1c{jc?(-~ZOZ3kPS- zt&nA;DP$VBlv?o3#@WKEcM7ZK)aEhw_ewsI%N8iFF|srjNMARUj6UmP>FVjsHK)5K z*ppkH-*UPu1f(%DxaMMU<+QPCs;=8)@T+4M;b!LDv&NT=2>;dJL-(F6%&d{ z|BSl&lG+rGSvApc7Gi3nF`>+*XEkqE%&1%ERa}a4q~#MWlU5k(Rq|NN9eUNDC1zGZ zPc9{-&FPauV6f3Im@}q_vP-9orP07AD$bxBsry9FC`_ZPX1E1&I&(;u72>i!{dhTJ zc7b%GWwNS26^&KY!1Be7%w`pLVU>Bap8JU@X>$?>V#m7RX_a(^={QXEZ9Zd?#`1G< zSj|Y;@?drGNKmk5yk24+8^X&b=E;5Zb-tHIM#&mvhKKz7xAa;+U1T1N(`bz5!1BwI z{n;tIApqjWos{CsWy|GA3U|nd<3e_mu z$cI8h8p&K6ZmaI9WpydhHR-iR1VPx6RR_}fiR&8 zQwgwjf_WL0;XcSAc@E+RzbPxRQjY#+f z6rjzAa|*}7GX=~Fxr-I7kQ-D?Fg)h8Oq7)^r91bQvr<#t?;HY89buiAck7lXuU#+& zx8dU9@%IO4GL%+v+BUxZWa`&bU$%XEjf3dN(lXe9B`n@V4F;>xt0o#9-sUtCFHtIQ z8?D4j#fvr+;RIOupx}WKfq%qlbJPiVF9l<^ZxBXhs$e!C?Lu zdu|8$)yqr49rsT!PsxIEm=RG&*36u?l1CL>+H-pZSjVEjJh>7iePzUiwF&Cjai;FIjp$z=?{*EB!yE@BUjTZt zCSf;_sg&q#283V*&;;UxzC?dw1T!GJ?IFf9i(#Fs&wPUo;{1ai!H$V)?0IxcNjvNh z7^lSsbO_2JAN*!QErw~^bk`xR2w%^O+{CiLDDa{|H~ca}90R-s3VM({dWB zOpj5|xN%2E3;yTWAGjwD-W5nwZvFiMQ~VGkY)K;&cnAkL0{KBzqP2`In6R8x%xKBC z&-$gIy6Kkf#r7#~He%jQ#iK{-3~RaFr$HTpp_7^2Q2LDVG;2fZLkz z2D8D)4^lbBwVyNOVMn1ESXcQra9g66God^_sA5AYO6FyOxwc{+?rwR4sIQAzkHL0~ z7zWRMOjSK>TwrBwia<6`uPj;@f)}UYx3<-9EV06M2DB6m*~;2sAEP3PUTg;^OnJY{ ze^VnkA1nnYC!aH*DlMhuM6Q1G##&f}7Ff<{8sFKAMW z6xZAw4g!ZFJ!{zQ+*YPH3*{GJCRnhAGUW2#6(q}=lj!j;Z%#m24&sr6$(7x;D7w?# zsVK%{Q5Lkg*{ILb7D=io;B_LsU~cOMION^2E{vz$;O<&fd6%LXk44iJd{PgPebXCy~{Sf#%;b9Kf5V5S--wp9Qp61dd`u8=?y zeO7cIaXbizsbjC(Sz_&j5CEUw>gvPWTxGX#60oyAi~nu>4E|U6DwGv$NHnmPu#SlG z8Dfz{IKXX^cFqUJL?5!fTgPyhB59{=uX*Vy*Lc#2j%PYvbbTt6LN)Dmw{#Dw?{Z|% z`ydcy&tWzt_8d2msu#F**ssK!of_mRg$;KaZ2NTAg02ghcA%(DP)o~c88zJs8{y;5 z-4{BbC(mL}7eF4`Q_JRat0o;M`j7R`rj&E;>g{`Q}!3*X~gjeyP&t9F_5p}KwvJUfh_Et z;`hA0{nd`s9j|20+Ui5LdN4GY&zaAsp39xF)lc(#!h^|N$(DRQZRK4Cvo3xxrtn}= zgK)luXW#M{y=|tweIDRv^!7RIEncjl({5UI`p`t)iP~eeV-4?_7rcDvQ_4a;mYK~4 zQupljxO=<6RWXKRL6n7B0*PVvnOI!V(be40*4EIn1tYTe9CEtdo&#Osd%o6% z9(rTU;kIG2%xVqDR$Bu(TB)FP85lev;kE;~{7O4*wUu(_0Z7;S>QS_Z&2p=!CeIxccy`XcX@v_kr zB=RZ5nQ7Ci6Y>-C8 z$XIq*aXHa^5>!fAv-*N5eZhF`jNW!xXPmPX9jUvVV4?3TmWso5m(+>aqcPc7#aPj} zY<%VT!cfZM_tYg8C#08Xqips)S*;)A9?b`|K&Cp8O}~mDlwCfL@3Uar zgBRNN;1$z6MaUb2Y8$9PaSiS4BX~bchRW``@vwP2d^JKJc4z`xAlbaFkO!o7FtUMy zS$e=B3F^QHuPT!A(JbPAKtm=Q6o$qkaD>99=!4eWwX?iD-qi^&Cbp(hMHNSu4w-{7 z)}QBq;76ZGub~RiSb;EL>p*`S6atp5SZS5E>F}U*-vLw=aHfav8J7jr;Yj0K^^>o9GZC##%czf2YX%p_)8y@ z5}_hN{W0dD7m}wH!{Kw zrf4#c5RgR4#VFc)!3z~r%=$je(+G1VHGO3B`w3?78cj4FJ#_TY;X@boW;CMjd4A8~ z=1WHNXxFr{0PO0JeDKJ@qk%66E*jG=8BI%IRTCAH?1V3rzWhCX#Wfw1W4o#Xf0p@VMxlLt>!Vx$x(S?S zLODy{H7^}$p5u~cxvVKJYpng`u4i|R4^L;8PIB*Nql#)ymlopE;!Iq))}-Xzl9-+E z^ZoG4-{anb^OWwbr6|S#I1FlBcuCb`&5;Ln`%r+rrdAR6$%W)!&z;cd;b+|vcrE;_ zkmEf%XigtezRX+~bNl2|?68~oRJ%$KTsVZ%mMQUWXeBH(K5@Gs zW;_DE0(f?oj1JKYQpSGRH^4E+w_&kl#)@`YX*HM=yoSz=(JDTOwFOme z!U-$ve}E3RHj?Q!aTR{_+Ma+?b8d22YR;ijGmSS!f0ny~C6jJT!j?!a9q)A3qxWd! zIxJjizID;dbM1+ML)Libq0YN?A}`Vj)2*G5;w^9FX{?ck!)Rkj;q&3X6#RwFj2xH` z3Ii!*N)B@R8-Gah1J(vKQRfKwX{m|xtAnVBfqShz&OqTtNz!3mAS=w-*HBItkH|QOFW|(nkEHTK z(*j&y;Siox0RXqQg|QC-_!D{aLNVA)!rHTK5EV$IinRl!@Ef&m=YvkSZ2>X;WOeWr ztZq9NqzYgZKG!x(DAgqTtosWP(AfEF>eF!))x-NK`oohn%=BfkU-qP|x^ohY@y z3Qi17!vw|o1_%EWzp48RYP>}~-0hAckt9dp@hSa2jgkJm7TkakIk4>bB+p%HWX983 zQb~UaLp)YReUpbo4Mo&$xEL1`F@z_vRXp`q2vm*lfdW1dPZ@fS#{tQz%ngFZQ8)~l z=qdIB+4)jDZ( zAGz|=`?`~?E1gh{ADUE5_Dt?LyXx%X(B|Et zv^}97*G%#QGu*z9bjC6B$&8a3V;K?NIc4{ZdQTjeO!oZDm6cUC@rCKE`YCn#Vawx8x&n%8rpx*P7I zgT1IbP@|2=rwwQ;5{A9t0Dv3O+KT)ZNT3n6%V!;Qpb7{J;vLxVuiW~Ul-X41A+aBv z4EEjB_w}#FUk3oKxw{vl)!@nyq`nM+1W1BkKmzVFoTl=^Z?IycPryP#Uflq=qPx)@ z9Sk?&ICaD+A)toh)K-N#;rE>V!Z5fKc!q9b0<9MWUP{4^VRiDBmKMPZ7-VDRb+%qI z`eqJWNnU-^vg!+vEVvMCMBLno;6ns->roL{1DGgkz*iT3Q42lDpFs57NB;O`JK6Q~ z`-ACN7(Gr!<#zgO_0pEif@qOzg6mU49@Yo8>F|$ABPI*^2p&aHh#-XEGJ@YBKs5*b zNpAX^*3!;BfN^x+AH~qq2*&8O))z2%4#D3dcoV^|5d0FsFA#i;AQd}qL$DaZG6by% z_9Ad1@FJkUY4bRSMiJnR28l9U#1N$k^B7X#$b;1L4INMQz)*65 zTb2F{wwToDJhayX7X+gCCVAxPAO{ft#pf{;f9Y3EPP3 zw~3aI8Fi}c8lyJKNA&YqWZm1nO8hnW>t$r(?aq|t*YzA*dffm&V|!h1WfxzsW8oJz zNyaZ~gYdI9*S#!U%)h>Yh0B09^5GuV^+#Cnx1LX7EU6(T>4p;AOs|)L$J})TczIo4 z2ObjFjj61gy`xe(Vr9x)ST0ZLoKbhph27pvM-%21GDV7X)Ap@uRlSONTeYZu Lh5YRb7U2H}4W*0K delta 17111 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 None: + """Pre-build Docker images for cross-compiled targets in parallel.""" + cross_platforms = [p for p in platforms if p.cross] + if not cross_platforms: + return + + cross_toml = root / "Cross.toml" + if not cross_toml.exists(): + return + + with open(cross_toml, "rb") as f: + cross_config = tomllib.load(f) + + def build_image(p: Platform) -> None: + target_cfg = cross_config.get("target", {}).get(p.triple, {}) + dockerfile = target_cfg.get("dockerfile") + if not dockerfile: + return + tag = f"cross-custom-{p.triple}:local" + try: + subprocess.run( + ["docker", "build", "-t", tag, "-f", str(root / dockerfile), str(root)], + capture_output=True, timeout=600, + ) + except Exception: + pass # non-critical, cross will build if needed + + console.print("[dim]Pre-building cross-compilation Docker images...[/]") + with ThreadPoolExecutor(max_workers=len(cross_platforms)) as pool: + pool.map(build_image, cross_platforms) + + +def _build_native_sequential( + root: Path, + native_platforms: list[Platform], + config: BuildConfig, + completed: dict[str, PlatformResult], + start_times: dict[str, float], +) -> list[PlatformResult]: + """Build native platforms sequentially (they share the cargo target/ lock).""" + native_results = [] + for p in native_platforms: + start_times[p.alias] = time.monotonic() + r = build_platform(root, p, config) + completed[r.platform.alias] = r + native_results.append(r) + return native_results + + def run_builds( root: Path, platforms: list[Platform], config: BuildConfig, version: str, verbose: bool = False, ) -> list[PlatformResult]: @@ -665,6 +714,10 @@ def run_builds( for p in platforms: _update_phase(p.alias, "waiting", 0) + # Split into native (share cargo lock) and cross (independent Docker builds) + native_platforms = [p for p in platforms if not p.cross] + cross_platforms = [p for p in platforms if p.cross] + results: list[PlatformResult] = [] completed: dict[str, PlatformResult] = {} start_times: dict[str, float] = {p.alias: time.monotonic() for p in platforms} @@ -676,15 +729,31 @@ def run_builds( return _build_display(platforms, config, completed, start_times, log_max_lines) with Live(make_display(), console=console, refresh_per_second=4) as live: - with ThreadPoolExecutor(max_workers=len(platforms)) as pool: - futures = {pool.submit(build_platform, root, p, config): p for p in platforms} + # Native builds run sequentially in one thread (they contend on cargo lock). + # Cross builds run in parallel (each in its own Docker container). + with ThreadPoolExecutor(max_workers=max(len(cross_platforms) + 1, 1)) as pool: + futures = {} + + if native_platforms: + f = pool.submit( + _build_native_sequential, root, native_platforms, config, + completed, start_times, + ) + futures[f] = "native" + + for p in cross_platforms: + f = pool.submit(build_platform, root, p, config) + futures[f] = "cross" + pending = set(futures.keys()) while pending: done = {f for f in pending if f.done()} for f in done: - r = f.result() - completed[r.platform.alias] = r - results.append(r) + tag = futures[f] + if tag == "native": + results.extend(f.result()) + else: + results.append(f.result()) pending.discard(f) live.update(make_display()) if pending: @@ -936,6 +1005,8 @@ def main() -> None: check_prerequisites(platforms, config) + _prebuild_cross_images(root, platforms) + t0 = time.monotonic() results = run_builds(root, platforms, config, version, verbose=args.verbose) wall_time = time.monotonic() - t0