Re: SCons misses a dependency which results in incorrect output.
Tal Dayan <[email protected]> Wed, 16 Jul 2025 10:44:27 -0700
| Newsgroups | gmane.comp.programming.tools.scons.user |
|---|---|
| Message-ID | <CAM+zu_7N+h2o3vOd9a7JmHwLBb5oJ+1yZN-Pqg8yO42BcL0BiQ@mail.gmail.com> |
--===============5204060821128622508== Content-Type: multipart/alternative; boundary="000000000000b80c80063a0f7286" --000000000000b80c80063a0f7286 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Looking at the end state of scons after invocation #3, the actual md5 of file2 doesn't match its md5 in the dblite. https://i.imgur.com/NGco3yQ.png On Wed, Jul 16, 2025 at 10:33=E2=80=AFAM Tal Dayan <[email protected]> wrote: > 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@gmai= l.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 fil= e >> '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 af= ter >> the third scons run, file2 should contain the value 'good' but it contai= ns >> 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 >> > --000000000000b80c80063a0f7286 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable <div dir=3D"ltr">Looking at the end state of scons after invocation #3, the= actual md5 of file2 doesn't match its md5 in the dblite.<div><br></div= ><div><a href=3D"https://i.imgur.com/NGco3yQ.png">https://i.imgur.com/NGco3= yQ.png</a></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:33=E2=80= =AFAM Tal Dayan <<a href=3D"mailto:[email protected]">[email protected]</a>> = wrote:<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0= px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir= =3D"ltr">Hi Keith, I updated the example files here=C2=A0<a href=3D"https:/= /github.com/FPGAwars/apio/issues/676" target=3D"_blank">https://github.com/= FPGAwars/apio/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-comm= on-ligatures;color:rgb(0,0,0);font-family:Menlo;font-size:12px">.sconsign.d= blite</span></div> </div><br><div class=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr">= On Wed, Jul 16, 2025 at 10:08=E2=80=AFAM Keith Prussing <<a href=3D"mail= to:[email protected]" target=3D"_blank">[email protected]</a>> w= rote:<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0p= x 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I suspect = 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> </blockquote></div> --000000000000b80c80063a0f7286-- --===============5204060821128622508== 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 --===============5204060821128622508==--