Search code examples
bjam

Boost-build/BJam language - checking the value of a flag


I need to edit a .jam file used by boost-build for a specific kind of projects. The official manual on BJAM language says:

  1. One of the toolsets that cares about DEF files is msvc. The following line should be added to it. flags msvc.link DEF_FILE ;
  2. Since the DEF_FILE variable is not used by the msvc.link action, we need to modify it to be: actions link bind DEF_FILE { $(.LD) .... /DEF:$(DEF_FILE) .... } Note the bind DEF_FILE part. It tells bjam to translate the internal target name in DEF_FILE to a corresponding filename in the link

So apparently just printing DEF_FILE with ECHO wouldn't work. How can it be expanded to a string variable or something that can actually be checked?

What I need to do is to print an error message and abort the build in case the flag is not set. I tried:

if ! $(DEF_FILE)
{
    errors.user-error "file not found" ;
    EXIT ;
}

but this "if" is always true

I also tried putting "if ! $_DEF_FILE {...}" inside the "actions" contained but apparently it is ignored.


Solution

  • I am not sure I understand the global task you have. However, if you wanted to add checking for non-empty DEF_FILE -- expanding on the documentation bit you quote, you need to add the check in msvc.link function.

    If you have a command line pattern (specified with 'actions') its content is what is passed to OS for execution. But, you can also have a function with the same name, that will be called before generating the actions. For example, here's what current codebase have:

    rule link.dll ( targets + : sources * : properties * )
    {
        DEPENDS $(<) : [ on $(<) return $(DEF_FILE) ] ;
        if <embed-manifest>on in $(properties)
        {
            msvc.manifest.dll $(targets) : $(sources) : $(properties) ;
        }
    }
    

    You can modify this code to additionally:

    if ! [ on $(<) return $(DEF_FILE) ] {
           ECHO "error" ;
    }