• d的dub构建配置


    影响传递给编译器与链接器壳选项.所有设置都是可选的.可用$环境变量,自身用$$表示.不匹配预定义的,就用环境变量.

    依赖

    //=== "dub.sdl"
    ...
    dependency "vibe-d" version="~>0.9.5"
    
    dependency "localdep" path="../localdep" optional=true default=true
    dependency "remote" repository="git+https://example.org/remote.git" version="a1b2c3d4"
    dependency "modified" version="~>1.2.3" {
        dflags "--special-flag" "-O4"
    }
    //=== "dub.json"
    ...
    "dependencies": {
        "vibe-d": "~>0.9.5",
    
        "localdep": {
            "path": "../localdep",
            "optional": true,
            "default": true
        },
        "remote": {
            "repository": "git+https://example.org/remote.git",
            "version": "a1b2c3d4"
        },
        "modified": {
            "version": "~>1.2.3",
            "dflags": ["--special-flag", "-O4"]
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    参数:"名":...
    对每个使用依赖添加依赖(dependency)指令.
    此设置不支持平台规范.
    版本细节

    系统依赖

    systemDependencies "OpenSSL (1.1.0 或 later, 1.0.0i also supported)"
    
    • 1

    目标类型

    targetType "executable"
    
    • 1
    意思
    "自动检测(autodetect)"自动检测目标类型.这是默认值,使dub生成两个"application""library"配置.用额外值只生成一个.配置块内禁止此值.
    "无(none)"不编译,也不输出文件.对应用"dependency"指令拖进额外包或子包的包很有用.
    "可执行(executable)"生成可执行二进制文件.(如,在Windows上为exe)
    "library"指定不限制实际类型的按库用包.这是大多数库默认值.
    "源库(sourceLibrary)"不生成二进制,而是强制dub直接添加所有源文件作依赖.
    "静态库(staticLibrary)"强制输出为静态库.(如lib/a文件)
    "动态库(dynamicLibrary)"强制输出为动态/共享库.(如.dll.dylib.so.)

    目标名

    targetName "cloudapp"
    
    • 1

    自动添加特定类型和平台的前后缀.

    targetName "cloudapp"
    targetType "library"
    = cloudapp.lib //Windows
    = libcloudapp.a //Linux
    //
    targetName "cloudapp"
    targetType "executable"
    = cloudapp.exe //Windows
    = cloudapp //Linux
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    目标路径

    targetPath "bin"
    
    • 1

    输出二进制文件的目标路径.

    工作目录

    workingDirectory "bin"
    
    • 1

    生成的可执行文件的固定工作目录.

    子配置

    subConfiguration "avrd" "atmega1284p"
    subConfiguration "vibe-d/tls" "botan"
    subConfiguration ":subpackage" "FromRoot"
    
    
    • 1
    • 2
    • 3
    • 4

    参数为"<依赖>" "<配置>",为特定配置,锁定依赖.

    构建要求

    buildRequirements "allowWarnings" "requireContracts"
    
    • 1

    参数:"要求" ....构建过程所需设置列表.
    细节在此

    构建选项

    buildOptions "allowWarnings" "requireContracts"
    
    • 1

    同样,细节在此
    细节2

    libs "mycommons"
    libs "advapi32" "wldap32" platform="windows"
    libs "ldap" "lber" platform="posix"
    //sdl对比json
    "libs": ["mycommons"],
    "libs-windows": ["advapi32", "wldap32"],
    "libs-posix": ["ldap", "lber"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    库名根据编译器转换为适当的链接器标志.如ssl=>-L-lssl.
    posix,先用pkg-config --exists 来检查标志.

    源文件

    sourceFiles "doc2.d" "latex.d" "cgi.d" "comment.d" "css/*.d"
    //
    "sourceFiles": ["doc2.d", "latex.d", "cgi.d", "comment.d", "css/*.d"]
    
    • 1
    • 2
    • 3

    支持全局匹配.
    添加普通源目录中不包含的某些配置或平台相关源文件很有用,用来给编译器传递附加文件.

    源路径

    sourcePaths "source"
    "sourcePaths": ["source"]
    
    • 1
    • 2

    自定义查找源文件的路径,未指定,则用"source"或"src"
    注意,一般还需要定义"importPaths",因为"sourcePaths"不会影响它,并且这是可相互导入源文件所必需.
    sourceFiles/sourcePaths非常重要.用来找要编译/导入源文件.

    排除源文件

    excludedSourceFiles "source/server/*.d" "source/main.d"
    
    • 1

    sourceFiles/sourcePaths中要排除的源文件.

    主源文件

    mainSourceFile "source/vibe/appmain.d"
    
    
    • 1
    • 2

    确定包含main()函数的文件.在定义了不同的main函数时(如"dub test"),dub可用此设置来排除文件.

    复制文件

    copyFiles "LICENSE_MYDEP.txt"
    copyFiles "libs/win64/*.dll" platform="windows-x86_64"
    copyFiles "libs/win32/*.dll" platform="windows-x86"
    
    • 1
    • 2
    • 3

    复制文件,到targetPath.默认递归复制

    "copyFiles": ["path/to/dir"]
    //递归复制
    "copyFiles": ["path/to/dir/*"]
    //仅复制一层
    
    • 1
    • 2
    • 3
    • 4

    支持全局匹配.

    额外依赖文件

    extraDependencyFiles "libs/*"
    
    • 1

    重新生成dub项目的匹配文件.
    不必此设置,因为已检查所有源文件,导入文件与串导入文件是否更新.但是,在重复更新静态库时,可能有用.支持全局匹配.

    版本

    条件编译版本

    versions "NoNetwork" "DemoMode"
    
    • 1

    示例:

    void draw()
    {
        version (DemoMode)
        {
            drawText("DEMO MODE");
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意:(可选)存在依赖项已定义Have_*版本.

    调试版本

    debugVersions "SQLTests"
    
    • 1

    示例:

    // 避免使用sourceLibrary依赖项污染依赖项的单元测试
    debug (SQLTests)
    {
        unittest
        {
            assert(everythingWorks());
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    导入路径

    importPaths "source" "extern"
    
    • 1

    搜索D模块的额外导入路径(默认,用source/目录).
    建议把所有源路径放入导入路径中,以便可相互导入源.
    如对外部链接的库代码,可定义额外导入路径.如果仅使用导入路径中代码,而不链接包含实际定义目标文件,则可能会有链接错误.
    等价于dmd中的-I.

    串导入路径

    importPaths "views"
    
    • 1

    搜索串导入的额外导入路径,默认为views/.
    import("filename.ext")语句用他们.相当于-J路径.
    示例:

    //example.d
    //加载要嵌入到`可执行`文件中的文件
    static immutable string[] mirrors = import("mirrors.txt").split("\n");
    
    //嵌入二进制文件到可执行文件中
    //(如,加载`GTK`资源,加载嵌入DLL等)
    static immutable ubyte[] resources = cast(immutable(ubyte)[])import("resources.gresource");
    
    //views/mirrors.txt
    https://example.org
    https://example.com
    
    //views/resources.gresource
    <二进制内容>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    预生成命令

    ...
    // 特殊条件下重建
    preGenerateCommands `if [ -f some_condition ]; then touch source/app.d; fi`
    
    
    • 1
    • 2
    • 3
    • 4

    生成项目前执行的命令列表
    dub build,dub rundub generate上运行.

    即使不需要重新编译包,或生成makefile等文件时,也会执行此命令.
    如果写入由源文件,导入路径,串导入路径extraDependencyFiles观察的文件,则重新生成此包.
    如果要在重新生成更新源文件,可用(预生成命令)它.

    后生成命令

    类似.

    预构建命令

    preBuildCommands `$DUB --single update_git_version.d`
    
    • 1

    dub build和dub run前跑.

    后构建命令

    postBuildCommands `gpg --sign my_executable`
    
    • 1

    类似.

    运行前命令

    preRunCommands `echo "EXECUTABLE OUTPUT:"`
    
    • 1

    dub run前运行.

    运行后命令

    preRunCommands `./cleanup.sh`
    
    • 1

    dub run后运行.

    d标志

    ...
    dflags `--relocation-model=rwpi` platform="ldc"
    
    
    • 1
    • 2
    • 3

    传递给D编译器的额外标志
    标志通常特定于正在使用的编译器,但会自动从DMD转换一组标志到指定编译器.见构建选项.

    l标志

    ...
    lflags `-L$PACKAGE_DIR/libs/`
    
    • 1
    • 2

    传递给链接器的额外标志,一般与正在使用链接器相关.

    注入源文件

    injectSourceFiles `inject/*.d`
    
    • 1

    将编译源文件进依赖此包二进制文件.
    应在像Boost的宽松许可文件中用,否则有风险.

    示例:

    //=== "dep/dub.json"
    {
        "name": "toload",
        "description": "展示从依赖项注入源文件的示例.",
        "targetType": "library",
        "buildOptions": ["betterC"],
        "sourcePaths": ["source"],
        "importPaths": ["source"],
        "injectSourceFiles": ["ahook.d"]
    }
    //=== "dep/ahook.d"
    module ahook;
    
    version(D_BetterC) {
        pragma(crt_constructor)
        extern(C) void someInitializer() {
            import core.stdc.stdio;
            printf("跑勾挂!\n");
        }
    } else {
        shared static this() {
            import std.stdio;
            writeln("有运行时!!!!");
        }
    }
    //=== "dep/source/something.d"
    module something;
    
    void doSomething() {
        import core.stdc.stdio;
    
        version(D_BetterC) {
            printf("不在exe中");
        } else {
            printf("在exe中");
        }
    }
    //=== "app/dub.json"
    
    {
        "name": "runner",
        "description": "展示从依赖项运行器注入源文件的示例",
        "targetType": "executable",
        "dependencies": {
            "dep": "~>1.0.0"
        }
    }
    //=== "app/source/entry.d"
    void main() {
        import something;
        doSomething();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    注入源文件将从依赖定义它们的依赖项的项目上下文导入文件.

  • 相关阅读:
    【Linux系统管理】11 启动引导与修复
    Samba配置文件举例
    ARM端部署PP-OCR_V3
    【用文心一言学习】MongoDB查询问题
    蚁群优化算法解决TSP问题(Matlab代码实现)
    【后端面经-数据库】Redis数据结构和底层数据类型
    有哪些美股量化接口?
    CS:APP Lab1DataLab
    [附源码]计算机毕业设计JAVA后疫情下物业管理系统
    linux设置ssh免密登录
  • 原文地址:https://blog.csdn.net/fqbqrr/article/details/127890422