你如何在BJAM中创建规则?

时间:2010-03-07 20:38:23

标签: bjam boost-bjam

我想用boost不支持的特定编译器编译文件。我制定了一个规则:

rule my_rule ( source : target )
{
    compile_specially source target ;
}

actions compile_specially
{
    my_compile_command $(my_parameters) $(1) -o $(2)
}

现在这段代码将文件构建到Jamroot目录中(显然)。但是,我希望它在常规目标路径中构建(bin / gcc-4.4 / release / threading-multi / ...)。那么如何在my_rule中获取/生成标准路径?

提前谢谢你。

2 个答案:

答案 0 :(得分:1)

使用“make”目标(请参阅BBv2 Custom Commands)。当然,这并不能让你真正理解我的想法。你想要的是创建一个相当复杂的新工具集。您需要阅读文档的extender chapter。特别是tools and generators部分。并加入我们的Boost Build邮件列表,了解详细的问题和调试。

答案 1 :(得分:0)

不完全是你问的问题,但看起来有点类似于帮助。在下面的示例中,我使用gdc编译D语言源文件,并最终将它们与C库链接(编写我自己的C函数需要定义接口d模块,因为d name mangling与C库不同,并且会引发链接问题)。我按照tools and generators部分中描述的内容(请参阅@GrafikRobot的回答)来实现这一点并且非常简单。

以下是示例卡纸文件和代码。

<强> gdc.jam

import type ;
type.register D : d ;

import generators ;
generators.register-standard gdc.compile : D : OBJ ;

actions compile
{
#    "echo" $(>) $(<)
    "gdc" -c -o $(<) $(>)
}

<强> Jamroot中

import gdc ;

project hello
    : requirements
    <cflags>-O3
    : default-build release

;

lib gphobos2 : : <file>/usr/lib/gcc/x86_64-linux-gnu/4.6/libgphobos2.a <name>gphobos2 ;
lib m : : <name>m ;
lib z : : <name>z ;
lib rt : : <name>rt ;
lib pthread : : <name>pthread <link>shared ;

exe hello
    :
        hello.d
        bye.d

        gphobos2 m z rt pthread
    :
        <link>static
    ;

<强> hello.d的

import std.stdio;

void main()
{
  writeln("Hello World!");

    static import bye ;

    bye.bye();
}

<强> Bye.d     模块再见;

import std.stdio;

void bye()
{
  writeln("Good bye");
}