Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Boost';s bjam正在生成完成之前运行测试_Boost_Boost Python_Bjam_Boost Build - Fatal编程技术网

Boost';s bjam正在生成完成之前运行测试

Boost';s bjam正在生成完成之前运行测试,boost,boost-python,bjam,boost-build,Boost,Boost Python,Bjam,Boost Build,我有一个相当简单的Boost.Python扩展,我正在用bjam构建它。问题是事情发生的顺序对我来说没有意义,我也不知道如何解决它 我的项目由根目录,带有JAMROOT,以及一个带有Jamfile、C++文件、头文件和Python脚本的项目子目录。 在根目录中,我有一个类似这样的Jamroot文件,主要是从示例和文档中拼凑而成的。它与项目的Jamfile是分开的,因为我实际上想在其他子目录中存在的几个项目之间共享它 import python ; if ! [ python.configure

我有一个相当简单的Boost.Python扩展,我正在用bjam构建它。问题是事情发生的顺序对我来说没有意义,我也不知道如何解决它

我的项目由根目录,带有JAMROOT,以及一个带有Jamfile、C++文件、头文件和Python脚本的项目子目录。 在根目录中,我有一个类似这样的Jamroot文件,主要是从示例和文档中拼凑而成的。它与项目的Jamfile是分开的,因为我实际上想在其他子目录中存在的几个项目之间共享它

import python ;

if ! [ python.configured ]
{
    ECHO "notice: no Python configured in user-config.jam" ;
    ECHO "notice: will use default configuration" ;
    using python ;
}

use-project boost
  : ./boost ;

project
  : requirements <library>/boost/python//boost_python ;

# A little "rule" (function) to clean up the syntax of declaring tests
# of these extension modules.
rule run-test ( test-name : sources + )
{
    import testing ;
    testing.make-test run-pyd : $(sources) : : $(test-name) ;
}

build-project hello_world ;
# build-project [[other projects]]... ;
导入python;
如果![python.configured]
{
ECHO“注意:在user config.jam中没有配置Python”;
ECHO“注意:将使用默认配置”;
使用python;
}
使用projectboost
:/促进;
项目
:requirements/boost/python//boost\u python;
#一个小“规则”(函数),用于清理声明测试的语法
#这些扩展模块的一部分。
规则运行测试(测试名称:sources+)
{
进口测试;
testing.make-test运行pyd:$(源代码):$(测试名称);
}
建立项目hello_world;
#建设项目[[其他项目]];
然后,我有一个子目录,其中包含我的“hello_world”项目(名称更改为保护无辜者),其中包含一个Jamfile:

PROJECT_NAME = hello_world ;

import python ;

python-extension interpolation_ext :
  $(PROJECT_NAME).cpp
:
  <define>FOO
;

# Put the extension and Boost.Python DLL in the current directory, so that running script by hand works.
install convenient_copy
  : $(PROJECT_NAME)_ext
  : <install-dependencies>on <install-type>SHARED_LIB <install-type>PYTHON_EXTENSION
    <location>.
  ;

# Declare test targets
run-test $(PROJECT_NAME) : $(PROJECT_NAME)_ext test_$(PROJECT_NAME)_ext.py ;
PROJECT\u NAME=hello\u world;
导入python;
python扩展插件(ext)
$(项目名称).cpp
:
福
;
#将扩展名和Boost.pythondll放在当前目录中,以便手动运行脚本。
安装方便的拷贝
:$(项目名称)\分机
:在共享的\u库PYTHON\u扩展上
.
;
#宣布测试目标
运行测试$(项目名称):$(项目名称)\外部测试$(项目名称)\外部.py;
“方便拷贝”确实很方便,但不幸的是,我没有找到太多关于它的文档

无论如何,我的想法是,当我在“hello_world”项目目录中时,我会定期修改代码并键入“bjam”。其效果是构建Python扩展,然后运行test_hello_world_ext.py文件,该文件执行“import hello_world_ext”以测试扩展是否已正确构建,然后执行一系列相当简单的单元测试。如果他们都通过了,那么bjam报告成功

问题似乎是,有时候bjam在运行“方便复制”规则之前运行Python测试,这意味着它在扩展的早期版本上执行测试,然后用新版本覆盖它。这意味着我经常要运行bjam两次。事实上,bjam第二次知道某些东西过时了,因为它确实做了一些事情。第三次也是随后的一次,在我进一步更改源代码之前,它什么也不做。这就像依赖项不正确时的典型双重制造问题

这样做的主要问题是,它经常会失败一个成功的构建(因为现有的扩展是坏的),而其他时候它会将一个坏的构建显示为成功的。事实上,我花了几个星期才注意到这种行为,大约在同一时间,我觉得自己疯了,也许不是巧合

它似乎在Linux上比在OSX上更经常这样做,但我不完全确定。但我感觉是这样的,我在这两种环境中平均分配时间


另外,我是唯一一个发现bjam的“jamfile”语法完全混乱的人吗?有很多事情在幕后进行,我只是不明白,或者可以找到足够的文档。我很乐意使用make或SCons来代替,但由于这里和那里的示例不完整,我也无法让它们工作。真正让我困惑的是,bjam是如何在进入我的文件之前构建许多其他目标的,我认为这会使编写makefile变得相当棘手?由于我对GNU Make和SCons非常熟悉,我是否值得花时间放弃bjam而改用其中一个呢?

在jamfile中声明目标的顺序并不决定构建目标的顺序。使用依赖项控制生成顺序。 这里是这样做的:

runtest
规则更改为accept requirements参数:

rule run-test ( test-name : sources + : requirements * )
{
    import testing ;
    testing.make-test run-pyd : $(sources) : $(requirements) : $(test-name) ;
}
修改
$(项目名称)
目标声明,以在
方便的副本上添加依赖项要求

run-test $(PROJECT_NAME) : $(PROJECT_NAME)_ext test_$(PROJECT_NAME)_ext.py : <dependency>convenient_copy ;
runtest$(PROJECT\u NAME):$(PROJECT\u NAME)\u ext test\u$(PROJECT\u NAME)\u ext.py:方便复制;
关于jamfile语法等部分:

如果你用Boost.Build做任何事情,除了一些非常琐碎的事情,你一定要阅读它。我个人的经验是,在从头到尾阅读它之后,我选择Boost.Build而不是其他构建系统。YMMV