[Scons-users] Provide default Import to SConscript

Hua Yanghao huayanghao at gmail.com
Sat Feb 17 17:31:02 EST 2018


Hi Bill,
I do not create a SConscript for every directory, only for directly
which either provide a set of include file or having source code to
build.
I will try to create a minimal version of the build system to show the idea.

Not sure if the below tree will give you some idea what I am trying to
implement, at least you should be able to see where I am having a
SConscript file.
build/configs/riscv_example/riscv32-qemu-virt-main/
├── cmdlist.txt
├── config
│   └── config.h
├── firmware
│   ├── arch
│   │   ├── include
│   │   │   └── arch
│   │   │       ├── cache.h
│   │   │       ├── irq.h
│   │   │       ├── misc.h
│   │   │       ├── mmu.h
│   │   │       ├── smp.h
│   │   │       ├── spinlock.h
│   │   │       └── timer.h
│   │   ├── riscv
│   │   │   ├── helper.c
│   │   │   ├── helper.o
│   │   │   ├── libdefault.o
│   │   │   ├── main.c
│   │   │   ├── main.o
│   │   │   ├── SConscript
│   │   │   ├── start.o
│   │   │   └── start.S
│   │   ├── SConscript
│   │   ├── weak.c
│   │   └── weak.o
│   ├── boards
│   │   ├── include
│   │   │   └── board.h
│   │   ├── qemu-riscv32-virt
│   │   │   ├── board.c
│   │   │   ├── board.o
│   │   │   ├── SConscript
│   │   │   ├── uart16550_device.c
│   │   │   └── uart16550_device.o
│   │   └── SConscript
│   ├── common
│   │   ├── cpu.c
│   │   ├── cpu.o
│   │   ├── include
│   │   │   └── common
│   │   │       ├── common.h
│   │   │       ├── cpu.h
│   │   │       └── log.h
│   │   ├── libdefault.o
│   │   ├── log.c
│   │   ├── log.o
│   │   ├── main.c
│   │   ├── main.o
│   │   ├── SConscript
│   │   ├── weak.c
│   │   └── weak.o
│   ├── drivers
│   │   └── uart16550
│   │       ├── fd_ops.c
│   │       ├── fd_ops.o
│   │       ├── include
│   │       │   ├── uart16550_api.h
│   │       │   └── uart16550_device.h
│   │       ├── libdefault.o
│   │       ├── SConscript
│   │       ├── uart16550.c
│   │       └── uart16550.o
│   ├── include
│   │   ├── bootstage.h
│   │   ├── compiler.h
│   │   ├── debug.h
│   │   └── linux
│   │       └── typecheck.h
│   ├── lib
│   │   ├── cmd
│   │   │   ├── cmd.c
│   │   │   ├── cmd.o
│   │   │   ├── include
│   │   │   │   └── cmd
│   │   │   │       └── cmd.h
│   │   │   ├── SConscript
│   │   │   ├── test.c
│   │   │   └── test.o
│   │   ├── fio
│   │   │   ├── cmd.c
│   │   │   ├── cmd.o
│   │   │   ├── include
│   │   │   │   └── usw_device_public.h
│   │   │   ├── libdefault.o
│   │   │   ├── newlib.c
│   │   │   ├── newlib.o
│   │   │   ├── SConscript
│   │   │   ├── usw_device.c
│   │   │   ├── usw_device.o
│   │   │   └── usw_device_private.h
│   │   ├── pipe
│   │   │   ├── include
│   │   │   │   └── pipe
│   │   │   │       ├── pipe.h
│   │   │   │       └── status.h
│   │   │   ├── libdefault.o
│   │   │   ├── pipe.c
│   │   │   ├── pipe.o
│   │   │   └── SConscript
│   │   └── simple_console
│   │       ├── include
│   │       │   └── simple_console.h
│   │       ├── libdefault.o
│   │       ├── print_color.h
│   │       ├── SConscript
│   │       ├── simple_console.c
│   │       └── simple_console.o
│   ├── SConscript
│   └── test
│       ├── common
│       │   ├── SConscript
│       │   ├── test.c
│       │   └── test.o
│       ├── console
│       │   ├── hello.c
│       │   ├── hello.o
│       │   ├── SConscript
│       │   ├── test.c
│       │   └── test.o
│       ├── example
│       │   ├── SConscript
│       │   ├── test.c
│       │   └── test.o
│       ├── libc
│       │   ├── SConscript
│       │   ├── test.c
│       │   └── test.o
│       ├── linker
│       │   ├── SConscript
│       │   ├── test.c
│       │   └── test.o
│       ├── log
│       │   ├── SConscript
│       │   ├── test.c
│       │   └── test.o
│       └── setjmp
│           ├── SConscript
│           ├── test2.c
│           ├── test2.o
│           ├── test.c
│           └── test.o
├── libriscv_example.a
├── link.ld
├── riscv_example.bin
├── riscv_example.elf
├── riscv_example.ibi_bin
├── riscv_example.map
└── riscv_example.S

36 directories, 113 files




On Sat, Feb 17, 2018 at 10:15 PM, Bill Deegan <bill at baddogconsulting.com> wrote:
> Likely you don't need a SConscript for every directory in your case?
> Are you wrapping a complete linux build tree?
>
> Is this a build tree you can share for us to look at?
>
> -Bill
>
> On Sat, Feb 17, 2018 at 3:30 PM, Hua Yanghao <huayanghao at gmail.com> wrote:
>>
>> I see everything passed into env.SConscript(default_import=some_obj),
>> if some_obj is a string it can pass through but if some_obj is a
>> function object it end up as None in Script/SConscript.py/SConscript()
>> function.
>>
>> I could have used a string and then import the right function however
>> my function to be passed is a dynamically generated partial function
>> ...
>>
>> Could anyone please give me some hint how could this be best implemented?
>>
>> Best Regards,
>> Yanghao
>>
>> On Sat, Feb 17, 2018 at 7:53 PM, Hua Yanghao <huayanghao at gmail.com> wrote:
>> > @Bill, I have managed to hack the Frame class and the
>> > BuildDefaultGlobals() function to have some thing imported into
>> > SConscript by default.
>> > However I don't quite understand when the "default_import" keyword
>> > argument passed down, somewhere somehow it end up as a set.
>> >
>> > Any documentation to explain what is going on from Base class into
>> > SConscript() calls regarding parameter handling?
>> >
>> > Thanks,
>> > Yanghao
>> >
>> > On Sat, Feb 17, 2018 at 7:45 PM, Hua Yanghao <huayanghao at gmail.com>
>> > wrote:
>> >> It varies a lot, ranging from 0 (yes, no source files at all) to a few
>> >> dozen (didn't really count, see statistics below).
>> >>
>> >> Here is an example Linux kernel driver sub-module Makefile:
>> >>
>> >> linux/drivers/sn/Makefile:
>> >>   1 #
>> >>   2 # Makefile for the Altix device drivers.
>> >>   3 #
>> >>   4 #
>> >>   5
>> >>   6 obj-$(CONFIG_SGI_IOC3) += ioc3.o
>> >>
>> >> I want to replicate this kind of simplicity in scons.
>> >>
>> >> I actually have implemented almost the same thing in scons, but all
>> >> those SConscript files have to start with Import("my_func") ... which
>> >> is pretty annoying. I know I need it in every single SConscript, and I
>> >> have to repeat it ... and this is so anti-pattern.
>> >> I have get rid of the Return() part already, but getting rid of the
>> >> Import() part seems not that straightforward.
>> >>
>> >> hua at huyangha-mobl:~/git/usw $ find . -iname "SConscript" | wc
>> >>     121     121    5953
>> >>
>> >> At the moment the project supports 4 different CPU architectures, a
>> >> little less than 1000 C files, 400K+ lines of code.
>> >>
>> >> And this is no small problem (at least for me). If I start working
>> >> around it with too much python code, I might end up bypassing a
>> >> significant portion of core scons and eventually might find it easier
>> >> to just wrap around Makefiles.
>> >>
>> >> Someone thought I was criticizing scons, I actually love scons, but
>> >> that doesn't stop me criticizing scons. ;-) Just don't see me as an
>> >> enemy I am a serious user of scons since 10 years ago when I was still
>> >> in college.
>> >>
>> >> Best Regards,
>> >> Yanghao
>> >>
>> >> On Sat, Feb 17, 2018 at 4:46 PM, Bill Deegan
>> >> <bill at baddogconsulting.com> wrote:
>> >>> How many source files per SConscript?
>> >>> That's a lot of sconscripts.
>> >>> Is this all one project?
>> >>> Are all the SConscripts identical?
>> >>>
>> >>> On Sat, Feb 17, 2018 at 3:05 AM, Hua Yanghao <huayanghao at gmail.com>
>> >>> wrote:
>> >>>>
>> >>>> Actually I have one and only one import for hundreds of SConscript :)
>> >>>>
>> >>>> On Sat, Feb 17, 2018 at 01:19 Jonathon Reinhart
>> >>>> <jonathon.reinhart at gmail.com> wrote:
>> >>>>>
>> >>>>> Hua,
>> >>>>>
>> >>>>> If you are importing lots of variables into SConscripts, then you're
>> >>>>> using SCons wrong. Most of your variables should probably be
>> >>>>> construction
>> >>>>> variables (in the environment).
>> >>>>>
>> >>>>> I've written many, many SConscripts and I've never used more than 3
>> >>>>> or 4
>> >>>>> Import() statements in a single SConscript. Before you critique a
>> >>>>> long-established framework, you might want to consider if you're
>> >>>>> using it
>> >>>>> inappropriately.
>> >>>>>
>> >>>>> Jonathon
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>> On Fri, Feb 16, 2018 at 6:02 PM, Hua Yanghao <huayanghao at gmail.com>
>> >>>>> wrote:
>> >>>>>>
>> >>>>>> Will do. It is really not good if a particular framework force user
>> >>>>>> to
>> >>>>>> create repeated code. In comparison kbuild can easily create a one
>> >>>>>> line make
>> >>>>>> file for a module.
>> >>>>>>
>> >>>>>> I am using localized scons anyway if not accepted will just use it
>> >>>>>> on my
>> >>>>>> own.
>> >>>>>>
>> >>>>>> On Fri, Feb 16, 2018 at 22:46 Bill Deegan
>> >>>>>> <bill at baddogconsulting.com>
>> >>>>>> wrote:
>> >>>>>>>
>> >>>>>>> Feel free to make a pull request, though I can't promise that it
>> >>>>>>> will
>> >>>>>>> be accepted.
>> >>>>>>>
>> >>>>>>> Is it really that much of an inconvenience?
>> >>>>>>> -Bill
>> >>>>>>>
>> >>>>>>>
>> >>>>>>> On Fri, Feb 16, 2018 at 3:20 PM, Hua Yanghao
>> >>>>>>> <huayanghao at gmail.com>
>> >>>>>>> wrote:
>> >>>>>>>>
>> >>>>>>>> Hi Bill,
>> >>>>>>>> Do you think if it is useful to add a new keyword for
>> >>>>>>>> env.SConscript(default_imports=[xyz,abc,...])?
>> >>>>>>>> For return I think I can abuse some global variables. This can
>> >>>>>>>> really
>> >>>>>>>> make the SConscript clean/minimal.
>> >>>>>>>>
>> >>>>>>>> Best Regards,
>> >>>>>>>> Yanghao
>> >>>>>>>>
>> >>>>>>>> On Fri, Feb 16, 2018 at 9:09 PM, Bill Deegan
>> >>>>>>>> <bill at baddogconsulting.com> wrote:
>> >>>>>>>> > No, there is no way without hacking the core code.
>> >>>>>>>> >
>> >>>>>>>> > It is the way it is by design.
>> >>>>>>>> >
>> >>>>>>>> > -Bill
>> >>>>>>>> > SCons Project Co-Manager
>> >>>>>>>> >
>> >>>>>>>> > On Fri, Feb 16, 2018 at 2:28 PM, Hua Yanghao
>> >>>>>>>> > <huayanghao at gmail.com>
>> >>>>>>>> > wrote:
>> >>>>>>>> >>
>> >>>>>>>> >> Does anyone know in scons there are ways to implicitly make a
>> >>>>>>>> >> object
>> >>>>>>>> >> (e.g. xyz) available for SConscript without explicity
>> >>>>>>>> >> Import(xyz)?
>> >>>>>>>> >>
>> >>>>>>>> >> Just want to eliminate the annoying repeated Import(xyz) in
>> >>>>>>>> >> every
>> >>>>>>>> >> single SConscript.
>> >>>>>>>> >>
>> >>>>>>>> >> And what about implicit Return()? e.g. xyz() returns a list of
>> >>>>>>>> >> object,
>> >>>>>>>> >> then in every SConscript if the top level SConstruct want to
>> >>>>>>>> >> collect
>> >>>>>>>> >> the complete list of object returned from every single
>> >>>>>>>> >> SConscript.
>> >>>>>>>> >>
>> >>>>>>>> >> For example:
>> >>>>>>>> >> SConscript-1:
>> >>>>>>>> >> Import("xyz")
>> >>>>>>>> >>
>> >>>>>>>> >> ret = xyz(...)
>> >>>>>>>> >>
>> >>>>>>>> >> Return("ret")
>> >>>>>>>> >>
>> >>>>>>>> >> Would ideally become:
>> >>>>>>>> >> SConscript-2:
>> >>>>>>>> >> xyz(...)
>> >>>>>>>> >>
>> >>>>>>>> >> Thanks,
>> >>>>>>>> >> Yanghao
>> >>>>>>>> >> _______________________________________________
>> >>>>>>>> >> Scons-users mailing list
>> >>>>>>>> >> Scons-users at scons.org
>> >>>>>>>> >> https://pairlist4.pair.net/mailman/listinfo/scons-users
>> >>>>>>>> >
>> >>>>>>>> >
>> >>>>>>>> >
>> >>>>>>>> > _______________________________________________
>> >>>>>>>> > Scons-users mailing list
>> >>>>>>>> > Scons-users at scons.org
>> >>>>>>>> > https://pairlist4.pair.net/mailman/listinfo/scons-users
>> >>>>>>>> >
>> >>>>>>>> _______________________________________________
>> >>>>>>>> Scons-users mailing list
>> >>>>>>>> Scons-users at scons.org
>> >>>>>>>> https://pairlist4.pair.net/mailman/listinfo/scons-users
>> >>>>>>>
>> >>>>>>>
>> >>>>>>> _______________________________________________
>> >>>>>>> Scons-users mailing list
>> >>>>>>> Scons-users at scons.org
>> >>>>>>> https://pairlist4.pair.net/mailman/listinfo/scons-users
>> >>>>>>
>> >>>>>>
>> >>>>>> _______________________________________________
>> >>>>>> Scons-users mailing list
>> >>>>>> Scons-users at scons.org
>> >>>>>> https://pairlist4.pair.net/mailman/listinfo/scons-users
>> >>>>>>
>> >>>>>
>> >>>>> _______________________________________________
>> >>>>> Scons-users mailing list
>> >>>>> Scons-users at scons.org
>> >>>>> https://pairlist4.pair.net/mailman/listinfo/scons-users
>> >>>>
>> >>>>
>> >>>> _______________________________________________
>> >>>> Scons-users mailing list
>> >>>> Scons-users at scons.org
>> >>>> https://pairlist4.pair.net/mailman/listinfo/scons-users
>> >>>>
>> >>>
>> >>>
>> >>> _______________________________________________
>> >>> Scons-users mailing list
>> >>> Scons-users at scons.org
>> >>> https://pairlist4.pair.net/mailman/listinfo/scons-users
>> >>>
>> _______________________________________________
>> Scons-users mailing list
>> Scons-users at scons.org
>> https://pairlist4.pair.net/mailman/listinfo/scons-users
>
>
>
> _______________________________________________
> Scons-users mailing list
> Scons-users at scons.org
> https://pairlist4.pair.net/mailman/listinfo/scons-users
>


More information about the Scons-users mailing list