我有一个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可能如下所示:
我想应用一个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
我试图理解输出和返回参数背后的逻辑.在使用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) 我们去年一直在使用Gradle作为我们的C++项目,但随着项目复杂性的增加以及我们对库的使用/创建的增加,我发现自己处理的是Gradle的知识不足的情况.
该网络为Gradle提供了大量有用的资源,但它非常注重Java.此外,我还没有看到很多使用Gradle的C++项目.出于这些原因,我正在考虑转向CMake,因为我需要大量编辑我们的构建脚本.
迁移到CMake,一个更具战斗性的测试和无处不在的C/C++构建系统,值得吗?或者坚持最近进入C++游戏的Gradle值得麻烦?
注意:我知道它们是其他C++ 选项,但CMake似乎是最能取代我们当前解决方案的选项.
场景:
我现在有以下设置,也可以在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) 我想知道我如何制作一个可移植的构建系统(一步一步),我目前使用cmake,因为它很容易设置,只有一个拱目标,但现在我必须打包我正在开发的库我想知道如何使它成为我正在测试的可移植的最佳方法.
我知道我需要一个config.h来定义取决于arch的东西,但我不知道它是多么自动化.
任何其他方式有一个构建系统是热烈欢迎!
我正在玩OCaml.我想知道如何做的第一件事是建立一个OCaml项目.现在,我只是想要一些简单的东西,因为我刚学习.任何人都可以指向构建系统以及使用该构建系统的"hello world"类型示例吗?
我试图找出如何使用Gradle构建Android应用程序.令我惊讶的是,我找到了两个引用,一个来自jvoegele,另一个来自Android Tools Project站点.他们似乎表面上看起来不同.所以我的问题是为什么有两种变体?这两者之间有什么关系吗?他们目前的状况如何?我应该使用哪一个 - 它们的优点和缺点?似乎Android的一个刚刚开始.
我期待有一些宝贵的意见,他们拥有使用Gradle构建Android应用程序的第一手经验.
感谢致敬
Santanu
使用该声明的目的是什么:
add_library(<tgt> [SHARED|STATIC] IMPORTED)
Run Code Online (Sandbox Code Playgroud)
根据我的发现,即使您在上面创建导入的库目标,您仍然需要指定实际的.so或.a的具体位置.这将需要至少3个cmake命令链接到可执行文件,编译器仍然不会自动搜索操作系统上的公共包含目录.
从我理解的CMake文档中,有三种方法可以链接未在整个应用程序/库的子项目中构建为目标的库.
CMake target_link_libraries()文档
使用链接器标志:
target_link_libraries(<tgt> [SHARED|STATIC|...] -lncursesw)
Run Code Online (Sandbox Code Playgroud)使用第二种方法时的一个主要区别是它只需要一行代码,并将搜索您操作系统上所有编译器的预定义包含目录.任何人都可以帮我理解为什么使用add_library()方法?
其他相关的SO帖子:
我想在BUILD文件中引用一个 DirectX SDK 。问题是(据我所知)Bazel 仅支持通过 Bazel 的--action_env=DXSDK_DIR参数传递环境变量,并且它旨在用于必须在插件(.bzl文件)中定义的操作。
有没有更简单的方法来引用环境变量,将其用作 Make 变量 ( includes = [ "$(DXSDK_DIR)/Include" ]) 或者我是否需要编写插件?