Re: File / Dir relative paths and SConscriptChdir

RW via Scons-users <[email protected]>
Newsgroups gmane.comp.programming.tools.scons.user
Message-ID <CAMMCZ5NDfd9WAFvPFmV2X0X0xA83i4PxZZesw4zQwe3azyvUsQ@mail.gmail.com>
I've sorted it out now so no worries, I've also removed the
SConscriptChdir() call

what I've basically got is
a SConscript within a directory such as
D:\Temp\micropython\ports\minimal
(there being multiple ports under different directories

This then pulls in a seperate common SConscript under a path such as
D:\Temp\micropython\tools\scons\micropy.py

via SConscript('../../tools/scons/micropy.py', {'env': env})

because the common script lives in a different directory I needed to make
sure the paths resolved correctly
Putting in a # at the beginning of the path seems to work best
this way it will resolve to D:\Temp\micropython\ports\minimal instead of
D:\Temp\micropython\tools\scons
which is where the top level script lives

As a simple extract
```
# TOP Resolves to D:\Temp\micropython
env.SetDefault(TOP=Dir('../..'))

env.SetDefault(BUILD='build')
env.Replace(HEADER_BUILD='${BUILD}/genhdr')

# Build the micropython version header
def build_mpversion(target, source, env):
    # Use File to make sure the directory seperator is the correct way round
    cmd = File(env.subst('${TOP}/py/makeversionhdr.py')).abspath
    cmd += ' ' + target[0].path
    env.Execute(cmd, chdir=env.GetLaunchDir())

tgt = env.Command('#${HEADER_BUILD}/mpversion.h', [], build_mpversion)
```

Note there's a lot more in this file than just this
and part of the initial exercise is to just try and keep the existing logic
/ if statements
from the old Makefile intact to make sure it works before I start to
re-arrange stuff to clean it up

One thing I have noticed is that if you provide a construction variable as
part of the name to a File or Dir
such as File('${TOP}/py/makeversionhdr.py') then run .abspath on it for the
full path
it doesn't look like it expands out the construction variable

but this does work
env.Replace(TEST1=Dir('../..'))
env.Replace(TEST2='$TEST1\\additionaldir')
test1 = env.subst('$TEST2')
# test1 now equals D:\Temp\micropython\additionaldir

On Thu, 6 Sep 2018 at 23:39, Bill Deegan <[email protected]> wrote:

> What command line are you seeing?
> Get rid of your SConscriptChdir() call.
> I never use it.
> You can add as an argument to SConscript, but generally the default
> behavior just works.
>
> Chdir generally breaks parallel builds.
> It's possible the default mentioned in the manpage is incorrect. As far as
> I know all paths are specified from dir and chdir is only done if
> explicitly specified to a builder..
>
> On Thu, Sep 6, 2018 at 5:58 PM Bill Deegan <[email protected]>
> wrote:
>
>> So you have two builders with empty sources?
>> Not good practice.
>>
>> Use Execute if you want it to always run..
>> -Bill
>>
>> On Thu, Sep 6, 2018 at 5:18 PM RW <[email protected]> wrote:
>>
>>> Hi Bill,
>>> I think I've figured it out
>>> basically I'm trying to use relative paths which are relative to the top
>>> level SConstruct file
>>> instead of being relative to a second called script in another directory
>>>
>>> the first way around this is to use the directory parameter
>>> tgt = env.Command(File('testfile.txt', directory ='../src1'), [],
>>> build_test)
>>>
>>> the second way around this is to prefix the path with #
>>> tgt = env.Command(File('#testfile.txt'), [], build_test)
>>>
>>>
>>> On Thu, 6 Sep 2018 at 22:10, Bill Deegan <[email protected]>
>>> wrote:
>>>
>>>> Perhaps you can explain what you're actually trying to do, rather than
>>>> providing a toy example?
>>>> That will help provide more context correct help.
>>>>
>>>> On Thu, Sep 6, 2018 at 4:23 PM RW via Scons-users <
>>>> [email protected]> wrote:
>>>>
>>>>> Hi,
>>>>> I've got another question, this is over the use of SConscriptChdir
>>>>> such as env.SConscriptChdir(0)
>>>>> from what I can gather when specifying a File or Dir object or making
>>>>> a call to a Command builder at least which will automatically convert a
>>>>> string target to a File object.
>>>>>
>>>>> The File / Dir object will always be relative to the current
>>>>> SConstruct file.
>>>>> Not relative to the originating SConstruct file (which is what I'm
>>>>> trying to do)
>>>>>
>>>>> To give an example
>>>>>
>>>>> src1\test1.txt - empty test file
>>>>> src1\test2.txt - empty test file
>>>>>
>>>>> src1\SConstruct
>>>>> ```
>>>>> import os
>>>>>
>>>>> EnsureSConsVersion(3, 0, 0)
>>>>>
>>>>> # Setup the construction env
>>>>> env = Environment(ENV={'PATH': os.environ['PATH']})
>>>>>
>>>>> # Set working directory to not change
>>>>> env.SConscriptChdir(0)
>>>>>
>>>>> # Load in an external script
>>>>> SConscript('../src2/testsubscript.py', {'env': env})
>>>>> ```
>>>>>
>>>>> src2\SConstruct
>>>>> ```
>>>>> # Import the scons environment from the calling script
>>>>> Import('env')
>>>>>
>>>>> def build_test(target, source, env):
>>>>>     # At this point the 'testfile.txt' will be automatically changed
>>>>> to a File class by SCons
>>>>>
>>>>>     # print the path scons thinks this file is located at
>>>>>     print(target[0].path)
>>>>>
>>>>> tgt = env.Command(File('testfile.txt'), [], build_test)
>>>>> env.Default(tgt)
>>>>>
>>>>> tgt2 = env.Command('testfile2.txt', [], build_test)
>>>>> env.Default(tgt2)
>>>>>
>>>>> # Even though SConscriptChdir is set to 0 in the originating env, File
>>>>> uses the current script as it's reference point
>>>>> # D:\Temp\testproject\src2\testfile.txt
>>>>> # D:\Temp\testproject\src2\testfile2.txt
>>>>> ```
>>>>>
>>>>> Is this expected behaviour?
>>>>> perhaps SConscriptChdir only influences when calling exe's rather than
>>>>> the use of File or Dir
>>>>> is there some public API way of setting the current directory for File
>>>>> / Dir calls?
>>>>> thats not the directory of the current SConsscript
>>>>> since builders wrap everything in a File automatically, it might mean
>>>>> I have to make sure all file paths are absolute before hand.
>>>>>
>>>>> Many Thanks
>>>>> Richard
>>>>>
>>>>> _______________________________________________
>>>>> Scons-users mailing list
>>>>> [email protected]
>>>>> https://pairlist4.pair.net/mailman/listinfo/scons-users
>>>>>
>>>>

_______________________________________________
Scons-users mailing list
[email protected]
https://pairlist4.pair.net/mailman/listinfo/scons-users
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.