Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.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
詹金斯&x2B;Windows+;CMake+;多种生成类型(调试、发布)_Windows_Jenkins_Cmake - Fatal编程技术网

詹金斯&x2B;Windows+;CMake+;多种生成类型(调试、发布)

詹金斯&x2B;Windows+;CMake+;多种生成类型(调试、发布),windows,jenkins,cmake,Windows,Jenkins,Cmake,我怎样才能让詹金斯做到以下几点 从SVN签出trunk/然后使用CMake调试和发布构建配置,而不必为配置创建重复作业。使用。使用值Debug和Release将其中一个轴定义为build_模式。然后运行CMake,为将要使用的编译工具(XCode、gcc、VisualStudio等)创建两种配置。然后,您可以像使用环境变量一样使用build_模式,并将其传递给执行实际编译的构建步骤。我花了一段时间才弄明白这一点。下面是我如何做到这一点的 创建一个自由风格的作业“签出”。此作业将完成所有不依赖于配

我怎样才能让詹金斯做到以下几点


从SVN签出trunk/然后使用CMake调试和发布构建配置,而不必为配置创建重复作业。

使用。使用值Debug和Release将其中一个轴定义为build_模式。然后运行CMake,为将要使用的编译工具(XCode、gcc、VisualStudio等)创建两种配置。然后,您可以像使用环境变量一样使用build_模式,并将其传递给执行实际编译的构建步骤。

我花了一段时间才弄明白这一点。下面是我如何做到这一点的

  • 创建一个自由风格的作业“签出”。此作业将完成所有不依赖于配置类型(调试/发布)的工作
  • 在“源代码管理”下选择Subversion
  • 填写存储库URL。可能是一个好主意,让它指向/trunk
  • 将本地模块目录设置为“”(无引号)
  • 正如检查策略“模仿清洁”是好的
  • 构建触发器轮询SCM,将计划设置为“5****”以每5分钟检查一次
  • 现在,在“高级项目选项”下选中“使用自定义工作区”,并将目录设置为例如“c:/src”。我们不希望Jenkins使用其内部工作区,因为我们希望其他作业能够访问源代码
  • 在“生成”下添加以下Windows批处理命令,该命令用于清除生成目录。出于某种原因,CMake没有提供实现这一点的方法

    cd c:\
    rmdir /S /Q build
    mkdir build
    cd build
    
    cmake --version
    rem optionally: svn info c:\src
    cmake -G "Visual Studio 10" c:\src
    
  • 创建另一个“构建”作业,这次将其设置为“多配置”作业。此作业将针对每个配置(调试/发布)运行

  • 首先,将生成触发器设置为在作业“签出”后生成
  • 现在在配置矩阵下添加一个轴“配置”,其值为“Debug Release”(空格=分隔符)。不幸的是,Jenkins的CMake builder插件不能用于多配置作业。我们甚至不能使用cmake--build,因为它总是构建调试配置。要构建,我们必须使用另一个批处理脚本:

    cd c:\build
    call "%ProgramFiles(x86)%\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"
    msbuild ALL_BUILD.vcxproj /verbosity:minimal /maxcpucount:1 /property:Configuration=%configuration%
    
  • 如果要生成整个解决方案,请指定.sln文件,而不是所有_build.vcxproj。如果只想构建特定项目,请使用

        msbuild <solution>.sln /target:<project>
    
    msbuild.sln/目标:
    
    在使用Jenkins一段时间后,我发现如果要重用源目录,应该使用尽可能少的作业

    Jenkins中的默认设置是每个构建使用不同的目录作为其工作区。这意味着您要对每个构建进行完整的SVN签出。这需要永远

    如果您希望对每个构建使用相同的源目录,那么您必须担心同步问题:一次只能使用一个构建。据我所知,詹金斯没有内置的同步方法。唯一的方法是只使用一个执行器。即使这样,你也无法控制执行人选择下一份工作的方式

    假设作业“SVN更新”触发作业“构建”。有人启动了“SVN更新#33”,这应该会触发“构建#33”。然而,如果Jenkins的“Poll SCM”功能同时安排“SVN update”34,我还没有找到一种方法告诉它“Build”33必须在“SVN update”34之前运行。因此,您可能会在“Build#33”之前运行“SVN update#34”,而所有操作都会失败。除非手动禁用轮询作业。当然,提醒自己以后重新启用它


    无论如何。使用Jenkins两年后,我将答案改为:永远不要使用共享资源的多个作业(如source dir),并将所有逻辑烘焙到shell脚本中(用于循环配置)。

    使用Visual Studio generator时,可以将要构建的配置传递到
    cmake--build
    -命令:

    cmake --build . --config Release
    cmake --build . --config Debug
    

    另请参见。

    谢谢您的回答。我想了很多,但我花了很长时间才把细节搞定。如果答案真的很有帮助的话,请考虑一下。我把$build_type放在“Other build type”中,但它没有扩展它。据我所知,“camke--build.”将始终生成调试版本。您必须执行msbuild Project.sln/m/p:Configuration=Release for Release您可以在“Build”作业运行时使用-plugin阻止“SVN update”作业。这取决于您使用的生成器。这对Makefile之类的生成器没有影响。您不需要忘记传递CMAKE_BUILD_TYPE选项以生成步骤:
    CMAKE-DCMAKE_BUILD_TYPE=Release
    因为问题是关于Windows的,我假设是Visual Studio,所以我将编辑我的答案。