标签: build-system

使用XSLT/XPath查找有向无环图(DAG)最小元素(顶点)?

我有一个XML文件,它编码一个表示部分顺序的向无环图(DAG).这些图对于指定依赖关系和查找关键路径等内容非常有用.对于好奇,我当前的应用程序是为构建系统指定组件依赖项,因此顶点是组件,而边缘指定编译时依赖项.这是一个简单的例子:

<?xml version="1.0"?>
<dag>
    <vertex name="A">
        <directed-edge-to vertex="C"/>
    </vertex>
    <vertex name="B">
        <directed-edge-to vertex="C"/>
        <directed-edge-to vertex="D"/>
    </vertex>
    <vertex name="C">
        <directed-edge-to vertex="E"/>
    </vertex>
    <vertex name="D">
        <directed-edge-to vertex="E"/>
    </vertex>
    <vertex name="E">
        <directed-edge-to vertex="G"/>
    </vertex>
    <vertex name="F">
        <directed-edge-to vertex="G"/>
    </vertex>
    <vertex name="G"/>
</dag>
Run Code Online (Sandbox Code Playgroud)

此DAG可能如下所示:

http://iparelan.com/dag.png

我想应用一个XSLT 样式表来生成另一个XML文档,该文档只包含与偏序的最小元素对应的顶点.也就是说,那些没有传入边的顶点.示例图的最小顶点集是{A, B, F}.对于我的构建依赖项应用程序,找到这个集合是有价值的,因为我知道如果我构建这个集合的成员,那么我的项目中的所有内容都将被构建.

这是我当前的样式表解决方案(我使用Apache Ant的xslt任务在Java上运行Xalan ).一个关键的观察是,在任何directed-edge-to元素中都不会引用最小顶点:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xalan="http://xml.apache.org/xslt"
                exclude-result-prefixes="xalan">
    <xsl:output method="xml" indent="yes" xalan:indent-amount="4"/>

    <xsl:template match="dag">
        <minimal-vertices> …
Run Code Online (Sandbox Code Playgroud)

xslt xpath graph-theory build-system directed-acyclic-graphs

7
推荐指数
2
解决办法
2427
查看次数

MSBuild与目标输出和返回混淆行为

我试图理解输出和返回参数背后的逻辑.在使用Outputs&Returns属性的情况下,我发现了非常令人困惑的行为.

我创建了一个包含2个目标"Build"和"InternalTarget"的项目.第一个目标通过Outputs属性定义其输出,第二个目标通过Returns属性定义输出.所以,如果我通过MSBuild任务调用Build target,我就无法获得任何输出 - 它总是空的!但是如果我注释掉第二个目标(无论如何都是未使用的),输出会神奇地出现.

为什么会这样?

example.proj

<Project ToolsVersion="4.0"
         DefaultTargets="Build"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">    
    <Target Name="Build" 
            Outputs="Build executed">
        <Message Text="Build executing ..." />
    </Target>

    <Target Name="_InternalTarget"
            Returns="_InternalTarget executed">
        <Message Text="_InternalTarget executing ..." />
    </Target>
</Project>
Run Code Online (Sandbox Code Playgroud)

build.proj

<Project ToolsVersion="4.0"
         DefaultTargets="Build"
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <_ProjectsToBuild Include="example.proj" />
    </ItemGroup>

    <PropertyGroup>
        <_ProjectsToBuildProperties>
            Configuration=Debug;
        </_ProjectsToBuildProperties>
    </PropertyGroup>

    <Target Name="Build">
        <MSBuild Targets="Build"
                 Projects="@(_ProjectsToBuild)"
                 Properties="$(_ProjectsToBuildProperties)">
            <Output TaskParameter="TargetOutputs"
                    ItemName="_ProjectsToBuildOutput" />
        </MSBuild>

        <Message Text="Output: @(_ProjectsToBuildOutput)." />
    </Target>    
</Project>
Run Code Online (Sandbox Code Playgroud)

产量

Build started 3/4/2015 12:41:21 PM.
Project "C:\Development\Sources\MSBuildReturnsExample\build.proj" on node 1 (default targets).
Project "C:\Development\Sources\MSBuildReturnsExample\build.proj" (1) …
Run Code Online (Sandbox Code Playgroud)

.net msbuild automation build build-system

7
推荐指数
1
解决办法
2459
查看次数

从Gradle转到CMake for C++项目

我们去年一直在使用Gradle作为我们的C++项目,但随着项目复杂性的增加以及我们对库的使用/创建的增加,我发现自己处理的是Gradle的知识不足的情况.

该网络为Gradle提供了大量有用的资源,但它非常注重Java.此外,我还没有看到很多使用Gradle的C++项目.出于这些原因,我正在考虑转向CMake,因为我需要大量编辑我们的构建脚本.

迁移到CMake,一个更具战斗性的测试和无处不在的C/C++构建系统,值得吗?或者坚持最近进入C++游戏的Gradle值得麻烦?

注意:我知道它们是其他C++ 选项,但CMake似乎是最能取代我们当前解决方案的选项.

c++ build-process cmake build-system gradle

7
推荐指数
1
解决办法
5164
查看次数

SBT多项目设置,其中子项目的生成文件依赖于非托管JAR

场景:

  • 我想开发一个用Scala编写的projectA,它依赖于也用Scala编写的projectB。
  • 通常,我也需要修改projectB。因此,我将有一个projectB的本地Git克隆(如在我的存储库中作为子模块)。
  • 现在,projectA应该直接从克隆的projectB的Git存储库中直接提取对projectB的依赖关系。

我现在有以下设置,也可以在GitHub上使用:https : //github.com/ComFreek/sbt-multi-project-question

| - .git
|
| - projectA
| | - src
| | - build.sbt
|
| - projectB (Git submodule)
| | - src
| | | - build.sbt
| | | - project
| | | - project.sbt
| | | - ...
Run Code Online (Sandbox Code Playgroud)

projectA/build.sbt尝试中:

| - .git
|
| - projectA
| | - src
| | - build.sbt
|
| - projectB (Git submodule)
| …
Run Code Online (Sandbox Code Playgroud)

scala build-system sbt

7
推荐指数
1
解决办法
268
查看次数

构建系统和可移植性

我想知道我如何制作一个可移植的构建系统(一步一步),我目前使用cmake,因为它很容易设置,只有一个拱目标,但现在我必须打包我正在开发的库我想知道如何使它成为我正在测试的可移植的最佳方法.

我知道我需要一个config.h来定义取决于arch的东西,但我不知道它是多么自动化.

任何其他方式有一个构建系统是热烈欢迎!

cmake build-system

6
推荐指数
1
解决办法
1016
查看次数

嵌入式开发/交叉编译的最佳构建系统

我现在正在使用dsPIC进行一些开发,而我并不完全爱上MPLAB.我实际上正在使用带有makefile项目的Visual Studio.目前,在找到设置使用备用编译器有用指南之后,我正在使用SCons,它似乎工作得相当好.不过,我不禁想知道,有没有更好的构建系统呢?而且,有没有更好的方法让Scons这样做?

embedded build-process makefile build-system scons

6
推荐指数
1
解决办法
3211
查看次数

编译OCaml项目的简单方法是什么?

我正在玩OCaml.我想知道如何做的第一件事是建立一个OCaml项目.现在,我只是想要一些简单的东西,因为我刚学习.任何人都可以指向构建系统以及使用该构建系统的"hello world"类型示例吗?

compiler-construction ocaml build-system ocamlbuild

6
推荐指数
2
解决办法
2446
查看次数

我发现两个gradle android插件 - 两者之间有什么关系吗?

我试图找出如何使用Gradle构建Android应用程序.令我惊讶的是,我找到了两个引用,一个来自jvoegele,另一个来自Android Tools Project站点.他们似乎表面上看起来不同.所以我的问题是为什么有两种变体?这两者之间有什么关系吗?他们目前的状况如何?我应该使用哪一个 - 它们的优点和缺点?似乎Android的一个刚刚开始.

我期待有一些宝贵的意见,他们拥有使用Gradle构建Android应用程序的第一手经验.

感谢致敬

Santanu

android build-system gradle

6
推荐指数
1
解决办法
680
查看次数

为什么使用add_library({tgt} IMPORTED)与target_link_libraries(-l {.so | .a})?

使用该声明的目的是什么:

add_library(<tgt> [SHARED|STATIC] IMPORTED)
Run Code Online (Sandbox Code Playgroud)

根据我的发现,即使您在上面创建导入的库目标,您仍然需要指定实际的.so或.a的具体位置.这将需要至少3个cmake命令链接到可执行文件,编译器仍然不会自动搜索操作系统上的公共包含目录.

示例: 用于链接IMPORTED lib的cmake代码

从我理解的CMake文档中,有三种方法可以链接未在整个应用程序/库的子项目中构建为目标的库.

CMake target_link_libraries()文档

  1. 将CMake软件包用于其中一个随附的软件包脚本.
  2. 使用链接器标志:

    target_link_libraries(<tgt> [SHARED|STATIC|...] -lncursesw)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 或者使用IMPORTED库方法(在顶部的代码中展示).

使用第二种方法时的一个主要区别是它只需要一行代码,并将搜索您操作系统上所有编译器的预定义包含目录.任何人都可以帮我理解为什么使用add_library()方法?


其他相关的SO帖子:

包含IMPORTED库的目录

CMake导入的库行为

cmake build-system libraries

6
推荐指数
1
解决办法
3049
查看次数

构建规则中的 Bazel 环境变量

我想在BUILD文件中引用一个 DirectX SDK 。问题是(据我所知)Bazel 仅支持通过 Bazel 的--action_env=DXSDK_DIR参数传递环境变量,并且它旨在用于必须在插件(.bzl文件)中定义的操作。

有没有更简单的方法来引用环境变量,将其用作 Make 变量 ( includes = [ "$(DXSDK_DIR)/Include" ]) 或者我是否需要编写插件?

windows environment-variables build-system bazel

5
推荐指数
1
解决办法
3904
查看次数