This SConstruct file is an example of using nestly with the SCons build system:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | # -*- python -*-
#
# This example takes every file in the inputs directory and performs the
# following operations. First, it cuts out a column range from every line in
# the file, in this case either 1-5 or 3-40. After it does this it optionally
# filters out every line that has an "o" or "O". Then it runs wc on every such
# file. These word counts then get aggregated together by the prep_tab.sh
# script.
#
# Assuming that SCons is installed, you should be able to run this example by
# simply typing `scons` in this directory. That should build a series of things
# in the `build` directory. Because this is a build system, deleting a file or
# directory in the build directory and then running scons will simply rerun the
# needed parts.
from os.path import join
import os
from nestly.scons import SConsWrap
from nestly import Nest
nest = Nest()
w = SConsWrap(nest, 'build')
# Initialize an aggregator that runs prep_tab.sh on all of its arguments. The
# `list` argument specifies that this aggregator will be a list of functions.
# This aggregator is then populated below with `append`.
@w.add_aggregate(list)
def all_counts(outdir, c, inputs):
return Command(join(outdir, 'all_counts.tab'),
inputs,
'./prep_tab.sh $SOURCES | column -t >$TARGET')
# Initialize an aggregator that concatenates all of the cut files into one.
@w.add_aggregate(list)
def all_cut(outdir, c, inputs):
return Command(join(outdir, 'all_cut.txt'),
inputs,
'cat $SOURCES >$TARGET')
# Add a nest with the name 'input_file' that the files in the inputs directory
# as its nestable list. Make its label function just the basename.
w.add('input_file', [join('inputs', f) for f in os.listdir('inputs')],
label_func=os.path.basename)
# This determines the column range we will cut out of the file.
w.add('cut_range', ['1-5', '3-40'])
# This adds a nest with the name 'cut', but also makes an SCons target out of
# the result.
@w.add_target()
def cut(outdir, c):
cut, = Command(join(outdir, 'cut'),
c['input_file'],
'cut -c {0[cut_range]} <$SOURCE >$TARGET'.format(c))
# Here we add this cut file to the all_cut aggregator.
c['all_cut'].append(cut)
return cut
# This determines if we remove the lines with o's.
w.add('o_choice', ['remove_o', 'leave_o'])
@w.add_target()
def o_choice(outdir, c):
# If we leave the o lines, then we don't have to do anything.
if c['o_choice'] == 'leave_o':
return c['cut']
# If we want to remove the o lines, then we have to make an SCons Command
# that does so with sed.
return Command(join(outdir, 'o_removed'),
c['cut'],
'sed "/[oO]/d" <$SOURCE >$TARGET')[0]
# Add a target for the word counts.
@w.add_target()
def counts(outdir, c):
counts, = Command(join(outdir, 'counts'),
c['o_choice'],
'wc <$SOURCE >$TARGET')
c['all_counts'].append(counts)
return counts
# When we finalize all of the aggregates, all of the aggregate functions are
# called, creating the corresponding dependencies.
w.finalize_all_aggregates()
|