wal-o-mat
wal-o-mat

Reputation: 7344

SCons: Forcing SCons to duplicate files

I have a header-only library consisting of a folder hierarchy and a bunch of .hpp files I'd like to install. My problem is, that scons does not copy the folder into the build folder.

Here is what my directory layout looks like:

root
  SConstruct
  subdir
    SConscript
    the_lib
       subdir_a
         header_a.hpp
       subdir_b
         header_b.hpp
  build
    (...)

Here is what I do in subdir/SConscript:

all_headers = []

for root, dirnames, filenames in os.walk('.'):
    for filename in fnmatch.filter(filenames, '*.hpp'):
        fn  = os.path.join(root, filename)
        all_headers.append((fn, root))

for f, d in all_headers:
    install.AddHeader( f, d )

I do this to get the filenames along with their relative paths and then, I use the installer I found in the scons wiki the other day.

Observation: all_headers remains empty because the the_lib folder does not get copied. I tired subdir_env.Dir('the_lib'), but did not change a thing.

After running the script, I have the_lib/SConscript in my build folder, but nothing else. Of course I can understand that my filesystem walk does nothing in that case.

Can anyone help me?

UPDATE

The only way out I found was to run a find -name "*.hpp" and paste the result into my SConscript. Works like a charm now, but since the library is an external one (and maybe some files are added or removed), I thought of a more generic solution without the need to know all headers by name.

Upvotes: 4

Views: 1823

Answers (2)

fraggy
fraggy

Reputation: 46

if build is a VariantDir then you don't need to copy the file yourself, scons will do it if the header is used in any Builder.

If you want to a list of the files you can use env.Glob('*/*.hpp') (but wildcards won't traverse directories, so you need to know the depth)

Upvotes: 0

Brady
Brady

Reputation: 10357

The first thing I thought of was to use the SCons Install() builder, but that is to install actual SCons targets in different locations, and since these header files are not targets, that wont work.

So, in this case, you can use what is called the SCons Copy Factory.

Upvotes: 2

Related Questions