[Scons-dev] SCons missing dependencies (not rebuilding files when they need to be)
Bill Deegan
bill at baddogconsulting.com
Mon Jun 27 12:09:32 EDT 2016
Did you ever try running both variants with --debug=explain?
I don't see any info on such in the thread
-Bill
On Mon, Jun 27, 2016 at 2:00 AM, Krzysztof Trzciński <
christopher.trzcinski at gmail.com> wrote:
> Any updates on this? That's quite a nasty bug.
>
> On 6 May 2016 at 22:48, Krzysztof Trzciński <
> christopher.trzcinski at gmail.com> wrote:
>
>> First:
>>
>> $ scons use_task=0 --tree=prune
>> scons: Reading SConscript files ...
>> scons: done reading SConscript files.
>> scons: Building targets ...
>> scons: `1/print' is up to date.
>> +-1/print
>> +-1/print.o
>> | +-1/print.cc
>> | | +-#include <iostream>
>> #include <fstream>
>> int main(int argc, char **argv)
>> {
>> std::cout << "Printing " << 1 << std::endl;
>> std::ofstream f(argv[2]);
>> f << 1 << "\n";
>> return 0;
>> }
>>
>> | +-/usr/bin/g++
>> +-/usr/bin/g++
>> scons: `2/print' is up to date.
>> +-2/print
>> +-2/print.o
>> | +-2/print.cc
>> | | +-#include <iostream>
>> #include <fstream>
>> int main(int argc, char **argv)
>> {
>> std::cout << "Printing " << 2 << std::endl;
>> std::ofstream f(argv[2]);
>> f << 2 << "\n";
>> return 0;
>> }
>>
>> | +-/usr/bin/g++
>> +-/usr/bin/g++
>> scons: `2/print.os' is up to date.
>> +-2/print.os
>> +-[2/print.cc]
>> scons: done building targets.
>>
>> Second
>>
>> $ scons use_task=1 --tree=prune
>> scons: Reading SConscript files ...
>> scons: done reading SConscript files.
>> scons: Building targets ...
>> scons: `1/print' is up to date.
>> +-1/print
>> +-1/print.o
>> | +-1/print.cc
>> | | +-#include <iostream>
>> #include <fstream>
>> int main(int argc, char **argv)
>> {
>> std::cout << "Printing " << 1 << std::endl;
>> std::ofstream f(argv[2]);
>> f << 1 << "\n";
>> return 0;
>> }
>>
>> | +-/usr/bin/g++
>> +-/usr/bin/g++
>> scons: `2/print' is up to date.
>> +-2/print
>> +-2/print.o
>> | +-2/print.cc
>> | | +-#include <iostream>
>> #include <fstream>
>> int main(int argc, char **argv)
>> {
>> std::cout << "Printing " << 2 << std::endl;
>> std::ofstream f(argv[2]);
>> f << 2 << "\n";
>> return 0;
>> }
>>
>> | +-/usr/bin/g++
>> +-/usr/bin/g++
>> scons: `2/print.os' is up to date.
>> +-2/print.os
>> +-[2/print.cc]
>> scons: done building targets.
>>
>>
>>
>>
>> One more test. Oddly enough if I change:
>>
>> prints.extend(env.Program(
>> '{0}/print'.format(num),
>> printcc
>> ))
>>
>> To:
>>
>> prints.extend(env.Program(
>> '{0}/print{0}'.format(num), # <-- change here, added `num` to
>> name, not only path
>> printcc
>> ))
>>
>> It starts working as expected (rebuilding when I switch use_task):
>>
>> $ scons use_task=0
>> scons: Reading SConscript files ...
>> scons: done reading SConscript files.
>> scons: Building targets ...
>> g++ -o 1/print1 1/print.o
>> g++ -o 2/print2 2/print.o
>> 1/print1 -o 2/print.os -c -fPIC 2/print.cc
>> Printing 1
>> scons: done building targets.
>>
>> $ scons use_task=0 # rerun same
>> scons: Reading SConscript files ...
>> scons: done reading SConscript files.
>> scons: Building targets ...
>> scons: `1/print1' is up to date.
>> scons: `2/print2' is up to date.
>> scons: `2/print.os' is up to date.
>> scons: done building targets.
>>
>> $ scons use_task=1 # switched to new
>> scons: Reading SConscript files ...
>> scons: done reading SConscript files.
>> scons: Building targets ...
>> scons: `1/print1' is up to date.
>> scons: `2/print2' is up to date.
>> 2/print2 -o 2/print.os -c -fPIC 2/print.cc # <-- builds as expected
>> Printing 2
>> scons: done building targets.
>>
>> $ scons use_task=1
>> scons: Reading SConscript files ...
>> scons: done reading SConscript files.
>> scons: Building targets ...
>> scons: `1/print1' is up to date.
>> scons: `2/print2' is up to date
>> scons: `2/print.os' is up to date.
>> scons: done building targets.
>>
>> Even though --tree=prune looks almost exactly the same!
>> The only difference are:
>> - +-1/print vs +-1/print1
>> - +-2/print vs +-2/print2
>>
>> $ scons use_task=1 --tree=prune
>> scons: Reading SConscript files ...
>> scons: done reading SConscript files.
>> scons: Building targets ...
>> scons: `1/print1' is up to date.
>> +-1/print1
>> +-1/print.o
>> | +-1/print.cc
>> | | +-#include <iostream>
>> #include <fstream>
>> int main(int argc, char **argv)
>> {
>> std::cout << "Printing " << 1 << std::endl;
>> std::ofstream f(argv[2]);
>> f << 1 << "\n";
>> return 0;
>> }
>>
>> | +-/usr/bin/g++
>> +-/usr/bin/g++
>> scons: `2/print2' is up to date.
>> +-2/print2
>> +-2/print.o
>> | +-2/print.cc
>> | | +-#include <iostream>
>> #include <fstream>
>> int main(int argc, char **argv)
>> {
>> std::cout << "Printing " << 2 << std::endl;
>> std::ofstream f(argv[2]);
>> f << 2 << "\n";
>> return 0;
>> }
>>
>> | +-/usr/bin/g++
>> +-/usr/bin/g++
>> scons: `2/print.os' is up to date.
>> +-2/print.os
>> +-[2/print.cc]
>> scons: done building targets.
>>
>> But dependencies of 2/print.os are the same. Yet it rebuilds now if I
>> change `use_task`.
>> It looks like when given an FS.Node SCons takes into account only
>> node.name instead of node.path when calculating signature.
>>
>>
>> On 6 May 2016 at 19:37, Bill Deegan <bill at baddogconsulting.com> wrote:
>>
>>>
>>>
>>> On Fri, May 6, 2016 at 1:09 PM, Krzysztof Trzciński <
>>> christopher.trzcinski at gmail.com> wrote:
>>>
>>>> New SConstruct:
>>>>
>>>> env = Environment(tools=['default', 'textfile'])
>>>>
>>>> prints = []
>>>> for num in (1,2):
>>>> printcc = env.Textfile(
>>>> '{0}/print.cc'.format(num),
>>>> [(
>>>> '#include <iostream>\n'
>>>> '#include <fstream>\n'
>>>> 'int main(int argc, char **argv)\n'
>>>> '{{\n'
>>>> ' std::cout << "Printing " << {0} << std::endl;\n'
>>>> ' std::ofstream f(argv[2]);\n'
>>>> ' f << {0} << "\\n";\n'
>>>> ' return 0;\n'
>>>> '}}\n'
>>>> ).format(num),],
>>>> )
>>>>
>>>>
>>>> prints.extend(env.Program(
>>>> '{0}/print'.format(num),
>>>> printcc
>>>> ))
>>>>
>>>> env['SHCXX'] = prints[int(ARGUMENTS['use_task'])]
>>>>
>>>> result = env.SharedObject(printcc)
>>>>
>>>> Default(prints+result)
>>>>
>>>> Results:
>>>>
>>>> $ scons use_task=0
>>>> scons: Reading SConscript files ...
>>>> scons: done reading SConscript files.
>>>> scons: Building targets ...
>>>> Creating '1/print.cc'
>>>> g++ -o 1/print.o -c 1/print.cc
>>>> g++ -o 1/print 1/print.o
>>>> Creating '2/print.cc'
>>>> g++ -o 2/print.o -c 2/print.cc
>>>> g++ -o 2/print 2/print.o
>>>> 1/print -o 2/print.os -c -fPIC 2/print.cc
>>>> Printing 1
>>>> scons: done building targets.
>>>>
>>>> $ cat 2/print.os
>>>> 1
>>>>
>>>> # Build with different compiler
>>>>
>>>> $ scons use_task=1
>>>> scons: Reading SConscript files ...
>>>> scons: done reading SConscript files.
>>>> scons: Building targets ...
>>>> scons: `1/print' is up to date.
>>>> scons: `2/print' is up to date.
>>>> scons: `2/print.os' is up to date.
>>>> scons: done building targets.
>>>>
>>>> $ cat 2/print.os
>>>> 1
>>>>
>>>> # Did not refresh!
>>>>
>>>> # Just to double check from clean:
>>>>
>>>> $ rm 2/print.os
>>>>
>>>> $ scons use_task=1
>>>> scons: Reading SConscript files ...
>>>> scons: done reading SConscript files.
>>>> scons: Building targets ...
>>>> scons: `1/print' is up to date.
>>>> scons: `2/print' is up to date.
>>>> 2/print -o 2/print.os -c -fPIC 2/print.cc
>>>> Printing 2
>>>> scons: done building targets.
>>>>
>>>> $ cat 2/print.os
>>>> 2
>>>>
>>>>
>>>> I don't think I should be putting compiler as "source" in
>>>> `SharedObject`.
>>>>
>>>
>>> You don't have to, it's automatically added.
>>> Try running --tree=prune.
>>>
>>>
>>>>
>>>> Note that all Textfile/Program builders do here is make this self
>>>> contained.
>>>> The actual issues is with last three lines.
>>>>
>>>> In my case it was just that "prints" was populated using operating
>>>> system provided paths/binaries to compilers.
>>>>
>>>> So I take this is a bug and it needs fixing? (if someone could point me
>>>> in right direction I could try that, but I am not quite sure where
>>>> substitions take place and why $SHXCC would behave differently to
>>>> $SHCXX.path in a command).
>>>>
>>>
>>> Don't file a bug yet. Let me dig into this a little bit and get back to
>>> you.
>>> May take a couple days.
>>>
>>> -Bill
>>>
>>> _______________________________________________
>>> Scons-dev mailing list
>>> Scons-dev at scons.org
>>> https://pairlist2.pair.net/mailman/listinfo/scons-dev
>>>
>>>
>>
>
> _______________________________________________
> Scons-dev mailing list
> Scons-dev at scons.org
> https://pairlist2.pair.net/mailman/listinfo/scons-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://pairlist2.pair.net/pipermail/scons-dev/attachments/20160627/054515b7/attachment-0001.html>
More information about the Scons-dev
mailing list