[Scons-users] Question about scons
William Blevins
wblevins001 at gmail.com
Mon Feb 22 08:15:51 EST 2016
Guillaume,
I recently discovered HG badness when I forked the scons-contrib repo.
There was not initially a default branch, and creating my own was a bad
idea. Since HG treats branches in a strange way, I was getting an error
when trying to pull and/or create pull requests: "abort: repository not
related". If you have already created your own default, you are going to
run into this issue. I manually migrated my few commits...
Sorry,
William
On Thu, Feb 11, 2016 at 9:48 PM, Gary Granger <granger at ucar.edu> wrote:
> Hi Guillaume,
>
> I have attached a modified version of your tool and SConstruct file.
> Below is some explanation of my changes and my answers to your questions.
>
> I used env.SetDefault() to set default tool variables rather than the
> 'if <var> not in env' pattern.
>
> I added FFTW_INCLUDE_DIR to CPPPATH rather than adding the -I flag
> directly to CFLAGS and CXXFLAGS. SCons will generate the correct
> compiler flags from CPPPATH.
>
> I changed the tool to raise SCons exceptions rather than just exiting.
>
> You can run this file to test it with 'scons -f SConsFFTW
> --config=force'. I suggest the config=force option in case you change
> the FFTW_LIBRARY_WISH or FFTW_VERSION variables. There is probably a
> way to trigger rebuilds of the configure targets when those variables
> change, but I didn't look up how to do that.
>
> I believe the SCons convention is that once you have added a tool to the
> Environment, then the Environment is ready to build software which
> requires that tool without requiring an extra Configure step. Thus I
> commented that part out. If you want to build software with different
> tools, then you can create different Environments for each set of
> tools. At least, that is the approach we've used, and I think it works
> well. As an example, I create two Environments in the SConstruct file,
> one for each version.
>
> In testing on Fedora 22, I found that fftw2 requires libm, and so I add
> it directly to the Environment before creating the Configure instance.
> I didn't think it was necessary to loop over all the libraries. Instead
> I add them directly to the Environment and just test for the header.
> The link check will still fail if any of the libraries cannot be found.
> I think the tool is the right place to run the Configure check, since
> it's up to the tool to find the libraries and headers and customize the
> Environment appropriately.
>
> The fftw tool can explicitly apply the 'default' tool using the Tool()
> method. However, I do not think that is the usual approach. I think
> typically the 'default' tool is loaded explicitly when the Environment
> is created, but others may know better. I do frequently load
> non-default tools inside other tools. For example, we have a logging
> library which has its own tool, but that tool in turn loads a log4cpp tool.
>
> If you really want to defer adding the fftw libraries to the
> Environment, then you can use the tool to cache the settings in the
> Environment and then add a method which will apply the settings. eg,
> use env.AddMethod(FFTW) in the tool, and then call env.FFTW() in the
> SConstruct. I don't recommend that, though, if you can get the same
> effect with Environment(tools=['default',fftw]).
>
> Finally, we already had a simple fftw tool, but it was "hardcoded" for
> version 3 with threads. If you really need to support all the different
> combinations, you might consider providing different tools rather than
> one more complicated tool which has to be configured: eg, fftw3_threads,
> fftw3, and fftw2. The tool paradigm is really very powerful and
> flexible. It is even possible to define a tool which in turn defines
> other tools. For Qt4 we use a tool to define more tools for all the
> various Qt4 modules. I have been maintaining a custom library of tools
> for our particular set of software for a long time, so maybe my own
> experience will be helpful to you.
>
> Thanks,
> gary
>
> On 02/11/2016 04:15 AM, Guillaume Anciaux wrote:
> > Dear all,
> >
> > This is a follow-up on my progression.
> >
> > Before even working on the repo to place the tools (and other stuff) I
> > needed to do a few tests for my knowledge and be sure I go in the right
> > direction.
> >
> > What I did is I made a tool in a site_scons/site_init.py as a start.
> > It aims at 'detecting' FFTW with a few options like the required version
> > for instance. This is what I wrote:
> >
> > *******************************************************
> > def fftw(env):
> > """A Tool to search for fftw headers and libraries"""
> >
> > if env.GetOption('clean'): return
> > if 'FFTW_VERSION' not in env: env['FFTW_VERSION'] = "3"
> > env['FFTW_VERSION'] = str(env['FFTW_VERSION'])
> >
> > if 'FFTW_INCLUDE_DIR' in env:
> > env['CXXFLAGS'].append('-I{0}'.format(env['FFTW_INCLUDE_DIR']))
> > env['CFLAGS'].append('-I{0}'.format(env['FFTW_INCLUDE_DIR']))
> >
> > if 'FFTW_LIBRARY_WISH' not in env:
> > env['FFTW_LIBRARY_WISH'] = ['main']
> >
> > if 'FFTW_LIBRARY_DIR' in env:
> > if 'LIBPATH' not in env: env['LIBPATH'] = []
> > env['LIBPATH'] += [env['FFTW_LIBRARY_DIR']]
> >
> > version = env['FFTW_VERSION']
> > if version == "2":
> > lib_names = {'main':'fftw'}
> > inc_names = ['fftw.h']
> > else:
> > lib_names =
> > {'main':'fftw3','thread':'fftw3_threads','omp':'fftw3_omp'}
> > inc_names = ['fftw3.h']
> >
> > conf = Configure(env)
> >
> > try:
> > lib_names = [lib_names[i] for i in
> env['FFTW_LIBRARY_WISH']+['main']]
> > except:
> > print 'Incompatible wishlist {0} from version
> > {1}'.format(env['FFTW_WISH_LIST'],
> >
> > env['FFTW_VERSION'])
> > Exit(1)
> >
> > for l in lib_names:
> > if not conf.CheckLibWithHeader(l, inc_names, 'c'):
> > print 'Did not find FFTW, exiting!'
> > Exit(1)
> > print env['LIBS']
> >
> >
> > env['FFTW_LIBRARIES'] = lib_names
> > env = conf.Finish()
> > *******************************************************
> >
> > Thus I have some questions:
> >
> > - What I wrote also has a configure sequence. But I think this is not
> > what a tool should do. Correct ?
> >
> > From what I read you can also make your own configure checks.
> >
> > - I think the environment extension, which defines a few variables based
> > on some others, and the 'configure' stage which actually verify that
> > everything can be accessed are close related pieces of code: can we make
> > a tool that registers specific configure checks ?
> >
> > - The configure stage is adding directly what he found to the $LIBS
> > option. However if I just want to know that everything is here and
> > manually add to LIBS: can I do that ?
> >
> >
> > I guess that in the end I would like to be able to write a sequence of
> > code like:
> > *********************************
> > env = Environment(
> > tools=['defatult','fftw'],
> > FFTW_LIBRARY_WISH = ['thread','omp']
> > FFTW_VERSION = ['thread','omp']
> > )
> >
> > conf = Configure(env)
> > conf.CheckFFTW()
> > conf.Finish()
> > **********************************
> >
> >
> > - how to make it explicit that the FFTW tool depends on the 'default'
> > (since it needs a C/C++ compiler to be used) ?
> >
> > Thanks for your help.
> >
> > Best
> >
> > Guillaume
> >
>
>
> _______________________________________________
> Scons-users mailing list
> Scons-users at scons.org
> https://pairlist4.pair.net/mailman/listinfo/scons-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://pairlist4.pair.net/pipermail/scons-users/attachments/20160222/f80090c9/attachment.html>
More information about the Scons-users
mailing list