Re: SCons misses a dependency which results in incorrect output.
Tal Dayan <[email protected]> Wed, 16 Jul 2025 10:33:50 -0700
| Newsgroups | gmane.comp.programming.tools.scons.user |
|---|---|
| Message-ID | <CAM+zu_6d4Q+=sDXrB1rYmDcYm9BO4dTdYUgp3WXJ4Hmhs7VOgg@mail.gmail.com> |
--===============5229094423632623214== Content-Type: multipart/alternative; boundary="000000000000b869ad063a0f4c65" --000000000000b869ad063a0f4c65 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Keith, I updated the example files here https://github.com/FPGAwars/apio/issues/676 They now include the md5 of the files and a dump of .sconsign.dblite On Wed, Jul 16, 2025 at 10:08=E2=80=AFAM Keith Prussing <kprussing74@gmail.= com> wrote: > I suspect it's because `file1` has the same hash in the > .sconsign.dblite as the last "good" build (i.e. the first one). Thus > you get the line "scons: `file2' is up to date." on the third run. > However, I am not an expert in the specifics of SCons' hashing > methods. > > On Wed, Jul 16, 2025 at 12:38=E2=80=AFPM Tal Dayan <[email protected]> wrote: > > > > Hi all, > > > > We encountered this problem with the nextpnr tool and created here a > small and independent example that demonstrates it. > > > > In the example below, a shell script 'command.sh' reads the source file > 'file1' and writes it to the target file 'file2'. However, if the > > source file starts with 'bad' it exits with an error code, *after* > creating the target file. > > > > The script `run.sh', runs scons three times with these values of the > source file file1 'good', 'bad', and 'good'. The expectation is that aft= er > the third scons run, file2 should contain the value 'good' but it contain= s > the value 'bad'. > > > > Do we miss anything or is it simply a bug? > > > > SConstruct: > > > > ---------------------------------------------- > > > > # SCons environment > > > > env =3D Environment() > > > > > > # Copy file1 =E2=86=92 file2 using command.sh > > > > # Inject an error if file1 starts with 'bad" > > > > file2 =3D env.Command( > > > > target=3D'file2', > > > > source=3D'file1', > > > > action=3D'./command.sh $SOURCE > $TARGET' > > > > ) > > > > > > # Make 'file2' the default target > > > > Default(file2) > > > > ---------------------------------------------- > > > > > > command.sh: > > > > ---------------------------------------------- > > > > #!/bin/bash > > > > # Usage: ./command input > output > > > > > > # Read from the first argument and copy to stdout > > > > cat "$1" > > > > > > # If the input file starts with 'bad', inject an error AFTER creating > the output file. > > > > > > first_line=3D$(head -n 1 "$1") > > > > > > if [[ "$first_line" =3D=3D bad* ]]; then > > > > exit 1 > > > > fi > > > > > > exit 0 > > > > ---------------------------------------------- > > > > > > > > run.sh > > > > ---------------------------------------------- > > > > #!/bin/bash > > > > > > # Clean up. > > > > rm -f .sconsign.dblite > > > > rm -f file[12] > > > > > > echo > > > > echo "---- Iteration 1: file1 =3D 'good'" > > > > echo "good" > file1 > > > > scons > > > > echo > > > > > > echo "File1" > > > > cat -n file1 > > > > > > echo "File2" > > > > cat -n file2 > > > > > > > > echo > > > > echo "---- Iteration 2: file1 =3D 'bad'" > > > > echo "bad" > file1 > > > > cat -n file1 > > > > scons > > > > echo > > > > > > echo "File1" > > > > cat -n file1 > > > > > > echo "File2" > > > > cat -n file2 > > > > > > echo > > > > echo "---- Iteration 3: file1 =3D 'good'" > > > > echo "good" > file1 > > > > cat -n file1 > > > > scons > > > > echo > > > > > > echo "File1" > > > > cat -n file1 > > > > > > echo "File2" > > > > cat -n file2 > > > > ---------------------------------------------- > > > > > > > > Run log: > > > > ---------------------------------------------- > > > > $ ./run.sh > > > > > > ---- Iteration 1: file1 =3D 'good' > > > > scons: Reading SConscript files ... > > > > scons: done reading SConscript files. > > > > scons: Building targets ... > > > > ./command.sh file1 > file2 > > > > scons: done building targets. > > > > > > File1 > > > > 1 good > > > > File2 > > > > 1 good > > > > > > ---- Iteration 2: file1 =3D 'bad' > > > > 1 bad > > > > scons: Reading SConscript files ... > > > > scons: done reading SConscript files. > > > > scons: Building targets ... > > > > ./command.sh file1 > file2 > > > > scons: *** [file2] Error 1 > > > > scons: building terminated because of errors. > > > > > > File1 > > > > 1 bad > > > > File2 > > > > 1 bad > > > > > > ---- Iteration 1: file1 =3D 'good' > > > > 1 good > > > > scons: Reading SConscript files ... > > > > scons: done reading SConscript files. > > > > scons: Building targets ... > > > > scons: `file2' is up to date. > > > > scons: done building targets. > > > > > > File1 > > > > 1 good > > > > File2 > > > > 1 bad > > > > ---------------------------------------------- > > > > _______________________________________________ > > Scons-users mailing list > > [email protected] > > https://pairlist4.pair.net/mailman/listinfo/scons-users > > > > -- > Keith Prussing > _______________________________________________ > Scons-users mailing list > [email protected] > https://pairlist4.pair.net/mailman/listinfo/scons-users > --000000000000b869ad063a0f4c65 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr">Hi Keith, I updated the example files here=C2=A0<a href=3D= "https://github.com/FPGAwars/apio/issues/676">https://github.com/FPGAwars/a= pio/issues/676</a><div><br></div><div>They now include the md5 of the files= and a dump of=C2=A0<span style=3D"font-variant-ligatures:no-common-ligatur= es;color:rgb(0,0,0);font-family:Menlo;font-size:12px">.sconsign.dblite</spa= n></div> </div><br><div class=3D"gmail_quote gmail_quote_container"><div dir=3D"ltr"= class=3D"gmail_attr">On Wed, Jul 16, 2025 at 10:08=E2=80=AFAM Keith Prussi= ng <<a href=3D"mailto:[email protected]">[email protected]</a>&g= t; wrote:<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0p= x 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I susp= ect it's because `file1` has the same hash in the<br> .sconsign.dblite as the last "good" build (i.e. the first one). T= hus<br> you get the line "scons: `file2' is up to date." on the third= run.<br> However, I am not an expert in the specifics of SCons' hashing<br> methods.<br> <br> On Wed, Jul 16, 2025 at 12:38=E2=80=AFPM Tal Dayan <<a href=3D"mailto:ta= [email protected]" target=3D"_blank">[email protected]</a>> wrote:<br> ><br> > Hi all,<br> ><br> > We encountered this problem with the nextpnr tool and created here a s= mall and independent example that demonstrates it.<br> ><br> > In the example below, a shell script 'command.sh' reads the so= urce file 'file1' and writes it to the target file 'file2'.= However, if the<br> > source file starts with 'bad' it exits with an error code, *af= ter* creating the target file.<br> ><br> > The script `run.sh', runs scons three times with these values of t= he source file file1 'good', 'bad', and 'good'.=C2= =A0 The expectation is that after the third scons run, file2 should contain= the value 'good' but it contains the value 'bad'.<br> ><br> > Do we miss anything or is it simply a bug?<br> ><br> > SConstruct:<br> ><br> > ----------------------------------------------<br> ><br> > # SCons environment<br> ><br> > env =3D Environment()<br> ><br> ><br> > # Copy file1 =E2=86=92 file2 using command.sh<br> ><br> > # Inject an error if file1 starts with 'bad"<br> ><br> > file2 =3D env.Command(<br> ><br> >=C2=A0 =C2=A0 =C2=A0target=3D'file2',<br> ><br> >=C2=A0 =C2=A0 =C2=A0source=3D'file1',<br> ><br> >=C2=A0 =C2=A0 =C2=A0action=3D'./command.sh $SOURCE > $TARGET'= ;<br> ><br> > )<br> ><br> ><br> > # Make 'file2' the default target<br> ><br> > Default(file2)<br> ><br> > ----------------------------------------------<br> ><br> ><br> > command.sh:<br> ><br> > ----------------------------------------------<br> ><br> > #!/bin/bash<br> ><br> > # Usage: ./command input > output<br> ><br> ><br> > # Read from the first argument and copy to stdout<br> ><br> > cat "$1"<br> ><br> ><br> > # If the input file starts with 'bad', inject an error AFTER c= reating the output file.<br> ><br> ><br> > first_line=3D$(head -n 1 "$1")<br> ><br> ><br> > if [[ "$first_line" =3D=3D bad* ]]; then<br> ><br> >=C2=A0 =C2=A0exit 1<br> ><br> > fi<br> ><br> ><br> > exit 0<br> ><br> > ----------------------------------------------<br> ><br> ><br> ><br> > run.sh<br> ><br> > ----------------------------------------------<br> ><br> > #!/bin/bash<br> ><br> ><br> > # Clean up.<br> ><br> > rm -f .sconsign.dblite<br> ><br> > rm -f file[12]<br> ><br> ><br> > echo<br> ><br> > echo "---- Iteration 1: file1 =3D 'good'"<br> ><br> > echo "good" > file1<br> ><br> > scons<br> ><br> > echo<br> ><br> ><br> > echo "File1"<br> ><br> > cat -n file1<br> ><br> ><br> > echo "File2"<br> ><br> > cat -n file2<br> ><br> ><br> ><br> > echo<br> ><br> > echo "---- Iteration 2: file1 =3D 'bad'"<br> ><br> > echo "bad" > file1<br> ><br> > cat -n file1<br> ><br> > scons<br> ><br> > echo<br> ><br> ><br> > echo "File1"<br> ><br> > cat -n file1<br> ><br> ><br> > echo "File2"<br> ><br> > cat -n file2<br> ><br> ><br> > echo<br> ><br> > echo "---- Iteration 3: file1 =3D 'good'"<br> ><br> > echo "good" > file1<br> ><br> > cat -n file1<br> ><br> > scons<br> ><br> > echo<br> ><br> ><br> > echo "File1"<br> ><br> > cat -n file1<br> ><br> ><br> > echo "File2"<br> ><br> > cat -n file2<br> ><br> > ----------------------------------------------<br> ><br> ><br> ><br> > Run log:<br> ><br> > ----------------------------------------------<br> ><br> > $ ./run.sh<br> ><br> ><br> > ---- Iteration 1: file1 =3D 'good'<br> ><br> > scons: Reading SConscript files ...<br> ><br> > scons: done reading SConscript files.<br> ><br> > scons: Building targets ...<br> ><br> > ./command.sh file1 > file2<br> ><br> > scons: done building targets.<br> ><br> ><br> > File1<br> ><br> >=C2=A0 =C2=A0 =C2=A0 1 good<br> ><br> > File2<br> ><br> >=C2=A0 =C2=A0 =C2=A0 1 good<br> ><br> ><br> > ---- Iteration 2: file1 =3D 'bad'<br> ><br> >=C2=A0 =C2=A0 =C2=A0 1 bad<br> ><br> > scons: Reading SConscript files ...<br> ><br> > scons: done reading SConscript files.<br> ><br> > scons: Building targets ...<br> ><br> > ./command.sh file1 > file2<br> ><br> > scons: *** [file2] Error 1<br> ><br> > scons: building terminated because of errors.<br> ><br> ><br> > File1<br> ><br> >=C2=A0 =C2=A0 =C2=A0 1 bad<br> ><br> > File2<br> ><br> >=C2=A0 =C2=A0 =C2=A0 1 bad<br> ><br> ><br> > ---- Iteration 1: file1 =3D 'good'<br> ><br> >=C2=A0 =C2=A0 =C2=A0 1 good<br> ><br> > scons: Reading SConscript files ...<br> ><br> > scons: done reading SConscript files.<br> ><br> > scons: Building targets ...<br> ><br> > scons: `file2' is up to date.<br> ><br> > scons: done building targets.<br> ><br> ><br> > File1<br> ><br> >=C2=A0 =C2=A0 =C2=A0 1 good<br> ><br> > File2<br> ><br> >=C2=A0 =C2=A0 =C2=A0 1 bad<br> ><br> > ----------------------------------------------<br> ><br> > _______________________________________________<br> > Scons-users mailing list<br> > <a href=3D"mailto:[email protected]" target=3D"_blank">Scons-users= @scons.org</a><br> > <a href=3D"https://pairlist4.pair.net/mailman/listinfo/scons-users" re= l=3D"noreferrer" target=3D"_blank">https://pairlist4.pair.net/mailman/listi= nfo/scons-users</a><br> <br> <br> <br> -- <br> Keith Prussing<br> _______________________________________________<br> Scons-users mailing list<br> <a href=3D"mailto:[email protected]" target=3D"_blank">Scons-users@scon= s.org</a><br> <a href=3D"https://pairlist4.pair.net/mailman/listinfo/scons-users" rel=3D"= noreferrer" target=3D"_blank">https://pairlist4.pair.net/mailman/listinfo/s= cons-users</a><br> </blockquote></div> --000000000000b869ad063a0f4c65-- --===============5229094423632623214== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Scons-users mailing list [email protected] https://pairlist4.pair.net/mailman/listinfo/scons-users --===============5229094423632623214==--