Question

My company is switching from make to scons. Part of our make process is to call xmllint on a number of xml files to validate them against a schema.

I've got the following in my SConstruct:

import os;
Env = DefaultEnvironment()
pwd = Dir('.').path
xmlValidator = Builder(action = 'xmllint --noout  --schema '+pwd+'/path/schema.xsd '+pwd+'file.xml')
Env.Append(BUILDERS = {'ValidateXML' : xmlValidator})
Env.ValidateXML()

When I run:

scons -Q

I get:

scons: `.' is up to date.

But no validation is run.

What am I doing wrong?

I'm completely new to scons, and moderately familiar with Python.

Was it helpful?

Solution

You need to provide scons with an input file. You currently have the source file hard-coded into the builder "recipe". It is better to use the SOURCE placeholder in the action string and then specify the input file when you call the builder.

xmlValidator = Builder(action='xmllint --noout --schema '+
                               pwd+'/path/schema.xsd $SOURCE')
Env.Append(BUILDERS = {'ValidateXML' : xmlValidator})
Env.ValidateXML(source='file.xml')

This will always run the validation, so you might want to have it output the result to a file. To do that you would use the TARGET placeholder, for example:

xmlValidator = Builder(action='xmllint --schema '+
                       pwd+'/path/schema.xsd $SOURCE --output $TARGET')
Env.ValidateXML(source='file.xml', target="out.txt")
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top