[Scons-dev] SCons missing dependencies (not rebuilding files when they need to be)
Krzysztof Trzciński
christopher.trzcinski at gmail.com
Fri May 6 11:26:16 EDT 2016
No. I am saying it behaves the same way in both versions.
$ scons use_task=0 --tree=prune
scons: Reading SConscript files ...
1/print
2/print
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>
int main()
{
std::cout << "Printing " << 1 << std::endl;
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>
int main()
{
std::cout << "Printing " << 2 << std::endl;
return 0;
}
| +-/usr/bin/g++
+-/usr/bin/g++
scons: `result.txt' is up to date.
+-result.txt
scons: done building targets.
$ scons use_task=1 --tree=prune
scons: Reading SConscript files ...
1/print
2/print
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>
int main()
{
std::cout << "Printing " << 1 << std::endl;
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>
int main()
{
std::cout << "Printing " << 2 << std::endl;
return 0;
}
| +-/usr/bin/g++
+-/usr/bin/g++
scons: `result.txt' is up to date.
+-result.txt
scons: done building targets.
P.S. Yes, I noticed I've broadcasted my password as soon as I saw it come
back to me from list. Already have changed it.
On 6 May 2016 at 13:43, Bill Deegan <bill at baddogconsulting.com> wrote:
>
>
> On Fri, May 6, 2016 at 8:36 AM, Bill Deegan <bill at baddogconsulting.com>
> wrote:
>
>> Greetings,
>>
>> The scons dev mailing list is intended for discussion development of
>> scons itself.
>>
>> Bugs should be initially discussed on the users mailing list. Thus I'm
>> cc'ing that list. Please move the discussion there.
>>
>> Thanks,
>> Bill
>>
>> On Fri, May 6, 2016 at 3:30 AM, Krzysztof Trzciński <
>> christopher.trzcinski at gmail.com> wrote:
>>
>>> Below is fully self contained SConstruct showing (I think) a bug
>>> (interesting bits at the end):
>>>
>>> env = Environment(tools=['default', 'textfile'])
>>>
>>> # That bit is not that important.
>>> # It just creates to programs, one of which
>>> # prints "1" and the other prints "2".
>>> # It just emulates having i.e. two versions of compiler
>>> # (in different directories).
>>> prints = []
>>> for num in (1,2):
>>> printcc = env.Textfile(
>>> '{0}/print.cc'.format(num),
>>> [(
>>> '#include <iostream>\n'
>>> 'int main()\n'
>>> '{{\n'
>>> ' std::cout << "Printing " << {0} << std::endl;\n'
>>> ' return 0;\n'
>>> '}}\n'
>>> ).format(num),],
>>> )
>>>
>>> prints.extend(env.Program(
>>> '{0}/print'.format(num),
>>> printcc
>>> ))
>>>
>>> for p in prints:
>>> print p.path
>>>
>>>
>>> # Here starts the important bit.
>>> # This is not actual use case, actual use case for me was
>>> # changing compiler version (by changing base directory
>>> # of all my tools to newer version).
>>> # For ease of use this takes `use_task` argument to select
>>> # which "compiler version" to use.
>>>
>>> env['PRINT_TASK'] = prints[int(ARGUMENTS['use_task'])]
>>>
>>> # And now the build command dependent on
>>> # on "compiler".
>>>
>>> result = env.Command(
>>> 'result.txt',
>>> [],
>>> '$PRINT_TASK > $TARGET'
>>> )
>>>
>>> Default(prints+result)
>>>
>>> Now let's see how it works:
>>>
>>> # Let's use "older compiler":
>>>
>>> $ scons use_task=0
>>> scons: Reading SConscript files ...
>>> 1/print
>>> 2/print
>>> 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 > result.txt
>>> scons: done building targets.
>>>
>>> $ cat result.txt
>>> Printing 1
>>>
>>> # All built fine and looking good.
>>>
>>> # Now let's use "newer compiler".
>>> # This one should produce "2" in result.txt
>>>
>>> $ scons use_task=1
>>> scons: Reading SConscript files ...
>>> 1/print
>>> 2/print
>>> scons: done reading SConscript files.
>>> scons: Building targets ...
>>> scons: `1/print' is up to date.
>>> scons: `2/print' is up to date.
>>> scons: `result.txt' is up to date.
>>> scons: done building targets.
>>>
>>> $ cat result.txt
>>> Printing 1
>>>
>>> # Yet it doesn't! It says it is already up to date!
>>> # HERE it went wrong.
>>>
>>> # Some sanity checks to verify it is incorrectly
>>> # reporting state.
>>> # Let's just check if building that file first with
>>> # use_task=1 gives us "2" in file.
>>> # First remove result.txt to force build.
>>>
>>> $ rm result.txt
>>>
>>> # Then build with "new compiler".
>>>
>>> $ scons use_task=1
>>> scons: Reading SConscript files ...
>>> 1/print
>>> 2/print
>>> scons: done reading SConscript files.
>>> scons: Building targets ...
>>> scons: `1/print' is up to date.
>>> scons: `2/print' is up to date.
>>> 2/print > result.txt
>>> scons: done building targets.
>>>
>>> $ cat result.txt
>>> Printing 2
>>>
>>> # And this time it executed new compiler
>>> # which gave expected result of "2".
>>>
>>> # If I switch back to old one it again reports
>>> # result to up to date incorrectly:
>>>
>>> $ scons use_task=0
>>> scons: Reading SConscript files ...
>>> 1/print
>>> 2/print
>>> scons: done reading SConscript files.
>>> scons: Building targets ...
>>> scons: `1/print' is up to date.
>>> scons: `2/print' is up to date.
>>> scons: `result.txt' is up to date.
>>> scons: done building targets.
>>>
>>> So bottom line seems to be that SCons is missing out on dependencies.
>>> When a substition value is a file node it seems to only look at `
>>> node.name`, not whole `node.path`, causing incorrect rebuilds.
>>>
>>> I have checked and it seems to behave that way on 2.5.0 version
>>> (everyday we got stuck on 2.1.0).
>>>
>>> Is this a bug? If not what is the explanation of this behaviour?
>>>
>>
> So you're saying this works on 2.1.0 and not on 2.5.0?
> Can you paste the output of:
> scons --tree=prune
> For each argument value?
>
> -Bill
> p.s. posting your mailman password publically as you did in you initial
> posting at the end is not a god idea. If you can change it, I'd recommend
> you do.
>
> _______________________________________________
> 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/20160506/2affdf45/attachment-0001.html>
More information about the Scons-dev
mailing list