记录一下自己配置Doop环境的过程

环境

ARM架构(M2 Pro)
Ubuntu 22.04(Docker容器)

Souffle

在安装Doop之前,需要先编译Souffle(因为官方只有X86的包)。先安装必要的包

apt install \
  bison \
  build-essential \
  clang \
  cmake \
  doxygen \
  flex \
  g++ \
  git \
  libffi-dev \
  libncurses5-dev \
  libsqlite3-dev \
  make \
  mcpp \
  python3 \
  sqlite \
  zlib1g-dev

编译:

git clone https://github.com/souffle-lang/souffle.git
cd souffle
cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/usr/local/
cmake --build build -j8 --target install

Doop

安装JDK,并且把Doop给clone下来:

apt-get install openjdk-8-jdk
git clone https://bitbucket.org/yanniss/doop.git

进入Doop的目录,修改gradle/wrapper/gradle-wrapper.properties文件,把“services.gradle.org/distributions”改为“mirrors.cloud.tencent.com/gradle”(国内镜像),然后修改build.gradle文件,把jfrog.io那两行注释掉(因为现在失效了),同时取消centauri.di.uoa.gr那几行的注释。(后来我发现GitHub上的版本是有这样的修改的,不知道为啥bitbucket上没有)

运行./doop,开始编译。

在运行的时候可以加上指定的jre(–use-local-java-platform /usr/lib/jvm/java-8-openjdk-arm64/jre),这样可以节省不少下载的时间。

Doop运行新版Souffle的问题

参照 https://bitbucket.org/yanniss/doop/src/master/docs/doop-101.md 的例子:

./doop -a micro -i docs/doop-101-examples/Example.jar \
--use-local-java-platform /usr/lib/jvm/java-8-openjdk-arm64/jre \
-L debug

发现会报错:

直接运行上面显示出错的souffle命令也是这样,这个问题发生在Doop的compile()方法里,后来发现需要加上-F指定fact的所在目录(out/xxx/database/)才能正常运行。

删除新版Souffle,编译2.1版本(需要apt install lsb-core,2.1编译会调用lsb_release命令),再次运行Doop,这次没有出错。

原因

抛出错误的位置是在生成的analysis-binary.cpp中:

if (op == "input") {
    out << "try {";
    out << "std::map<std::string, std::string> directiveMap(";
    printDirectives(directives);
    out << ");\n";
    out << R"_(if (!inputDirectory.empty()) {)_";
    out << R"_(directiveMap["fact-dir"] = inputDirectory;)_";
    out << "}\n";
    out << "IOSystem::getInstance().getReader(";
    out << "directiveMap, symTable, recordTable";
    out << ")->readAll(*" << synthesiser.getRelationName(synthesiser.lookup(io.getRelation()));
    out << ");\n";
    out << "} catch (std::exception& e) {std::cerr << \"Error loading " << io.getRelation()
        << " data: \" << e.what() "
        "<< "
        "'\\n';\nexit(1);\n}\n";
}

对比两个版本Souffle的运行,发现在2.1里,Doop是在run()里面才运行这个程序(这一阶段里面有加-F),compile()阶段只进行编译;而在2.4.1里,在Doop的compile()阶段,Souffle在编译好之后就直接自己运行这个程序了,而compile()阶段并没有传入-F,导致程序直接在当前目录(.)运行,找不到对应的fact。

在Doop的compile()阶段,souffle直接运行了analysis-binary

在Doop的run()阶段,Doop又运行了一次这个程序
代码区别

在2.1中,Souffle通过判断参数中是否包含dl-program和swig来决定是否运行程序,其中dl-program就是“-o”,也就是输出的程序文件名,这个参数是存在的,所以不会运行:

if (!Global::config().has("dl-program") && !Global::config().has("swig")) {
    executeBinary(baseFilename);
}

而在2.4.1中,Souffle直接判断是否包含compile参数(-c),这就导致了程序的运行:

const bool execute_mode = glb.config().has("compile") || glb.config().has("compile-many");
const bool compile_mode = glb.config().has("dl-program");
const bool generate_mode = glb.config().has("generate");
const bool generate_many_mode = glb.config().has("generate-many");
const bool must_interpret = !execute_mode && !compile_mode && !generate_mode && !generate_many_mode &&
                            !glb.config().has("swig");
const bool must_execute = execute_mode;
const bool must_compile = must_execute || compile_mode || glb.config().has("swig");
......
if (must_execute) {
    executeBinaryAndExit(glb, binaryFilename);
}
解决方法

1. 修改Doop的compile(),在原本的命令构建里加上-F参数:

String outputOpts = options.translateOnly ? outputCppOpts : "-F ${outDir}/database -c -o ${executablePath}"

2. 直接修改Souffle判断是否运行的条件。

至于是否还有其他兼容问题,暂时不确定。

参考

1. https://souffle-lang.github.io/build
2. https://bitbucket.org/yanniss/doop/src/master/

发表评论 取消回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

玻璃钢生产厂家宁波户内玻璃钢雕塑销售电话品牌玻璃钢雕塑销售玻璃钢酒店人物雕塑哪里好淮南景观玻璃钢雕塑订做价格禄丰市玻璃钢雕塑定制深圳玻璃钢莲花造型雕塑永城校园玻璃钢雕塑生产厂家河南超市商场美陈价钱重庆商场节日活动美陈布置界首玻璃钢牛雕塑供应兰州玻璃钢雕塑造型定制佛山玻璃钢卡通雕塑价格范围佛山禅城商场美陈四川中庭商场美陈报价张掖人物玻璃钢雕塑公司北京玻璃钢广场雕塑定制红色玻璃钢雕塑参考价玻璃钢卡通动物雕塑定制厂家信阳校园玻璃钢人物雕塑厂家玻璃钢造型雕塑施工伊春玻璃钢雕塑排名玻璃钢白鹭雕塑哪里找玻璃钢牛动物雕塑小猪摆件昆明商业广场玻璃钢卡通雕塑报价珠海卡通玻璃钢雕塑生产厂家新密玻璃钢雕塑雕刻加工杭州玻璃钢彩绘雕塑江苏季节性商场美陈销售上海大型商场创意商业美陈步骤潼南广场玻璃钢雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化