使用 CMake、conan 和 Vulkan SDK 的 Github 操作失败,因为找不到 conanfile.py

Posted

技术标签:

【中文标题】使用 CMake、conan 和 Vulkan SDK 的 Github 操作失败,因为找不到 conanfile.py【英文标题】:Github Actions using CMake, conan and Vulkan SDK fail because conanfile.py cannot be found 【发布时间】:2020-07-31 04:52:26 【问题描述】:

我正在尝试使用 Github 操作、CMake 和 conan 包管理器构建一个 Vulkan 项目。

这是我的 Github 设置:https://github.com/inexorgame/vulkan-renderer/blob/hanni/github_actions/.github/workflows/build_cmake.yml

name: CMake Build Matrix

on: [push]

jobs:
  build:
    name: $ matrix.config.name 
    runs-on: $ matrix.config.os 
    strategy:
      fail-fast: false
      matrix:
        config:
        - 
            name: "Windows Latest MSVC", artifact: "Windows-MSVC.tar.xz",
            os: windows-latest,
            build_type: "Release", cc: "cl", cxx: "cl",
            environment_script: "C:/Program Files (x86)/Microsoft Visual Studio/2019/Enterprise/VC/Auxiliary/Build/vcvars64.bat"
          
        - 
            name: "Windows Latest MinGW", artifact: "Windows-MinGW.tar.xz",
            os: windows-latest,
            build_type: "Release", cc: "gcc", cxx: "g++"
          
        - 
            name: "Ubuntu Latest GCC", artifact: "Linux.tar.xz",
            os: ubuntu-latest,
            build_type: "Release", cc: "gcc", cxx: "g++"
          
        - 
            name: "Ubuntu Latest clang", artifact: "Linux.tar.xz",
            os: ubuntu-latest,
            build_type: "Release", cc: "clang", cxx: "clang"
          

    steps:
    - uses: actions/checkout@v1

    - name: Download Vulkan SDK.
      run: |
           wget https://github.com/premake/premake-core/releases/download/v5.0.0-alpha11/premake-5.0.0-alpha11-linux.tar.gz?Human=true -O premake-5.0.0-alpha11-linux.tar.gz
           tar -xzvf premake-5.0.0-alpha11-linux.tar.gz
           sudo apt-get update -qq
           sudo apt-get install -y libassimp-dev libglm-dev graphviz libxcb-dri3-0 libxcb-present0 libpciaccess0 cmake ninja-build libpng-dev libxcb-dri3-dev libx11-dev libx11-xcb-dev libmirclient-dev libwayland-dev libxrandr-dev
           export VK_VERSION=1.2.131.1
           wget -O vulkansdk-linux-x86_64-$VK_VERSION.tar.gz https://sdk.lunarg.com/sdk/download/$VK_VERSION/linux/vulkansdk-linux-x86_64-$VK_VERSION.tar.gz
           tar zxf vulkansdk-linux-x86_64-$VK_VERSION.tar.gz
           export VULKAN_SDK=$TRAVIS_BUILD_DIR/$VK_VERSION/x86_64
           ls
    - name: Download Conan package manager.
      run: |
           pwd
           pip3 install wheel setuptools
           pip3 install conan
           export PATH=$PATH:/home/runner/.local/bin
           echo $PATH
           conan --version
           ls
    - name: Download Ninja and CMake
      id: cmake_and_ninja
      shell: cmake -P 0
      run: |
        set(ninja_version "1.9.0")
        set(cmake_version "3.16.2")
        message(STATUS "Using host CMake version: $CMAKE_VERSION")
        if ("$ runner.os " STREQUAL "Windows")
          set(ninja_suffix "win.zip")
          set(cmake_suffix "win64-x64.zip")
          set(cmake_dir "cmake-$cmake_version-win64-x64/bin")
        elseif ("$ runner.os " STREQUAL "Linux")
          set(ninja_suffix "linux.zip")
          set(cmake_suffix "Linux-x86_64.tar.gz")
          set(cmake_dir "cmake-$cmake_version-Linux-x86_64/bin")
        endif()
        set(ninja_url "https://github.com/ninja-build/ninja/releases/download/v$ninja_version/ninja-$ninja_suffix")
        file(DOWNLOAD "$ninja_url" ./ninja.zip SHOW_PROGRESS)
        execute_process(COMMAND $CMAKE_COMMAND -E tar xvf ./ninja.zip)
        set(cmake_url "https://github.com/Kitware/CMake/releases/download/v$cmake_version/cmake-$cmake_version-$cmake_suffix")
        file(DOWNLOAD "$cmake_url" ./cmake.zip SHOW_PROGRESS)
        execute_process(COMMAND $CMAKE_COMMAND -E tar xvf ./cmake.zip)
        # Save the path for other steps
        file(TO_CMAKE_PATH "$ENVGITHUB_WORKSPACE/$cmake_dir" cmake_dir)
        message("::set-output name=cmake_dir::$cmake_dir")
        if (NOT "$ runner.os " STREQUAL "Windows")
          execute_process(
            COMMAND chmod +x ninja
            COMMAND chmod +x $cmake_dir/cmake
          )
        endif()
    - name: Configure
      shell: cmake -P 0

      run: |
        set(ENVCC $ matrix.config.cc )
        set(ENVCXX $ matrix.config.cxx )
        if ("$ runner.os " STREQUAL "Windows" AND NOT "x$ matrix.config.environment_script " STREQUAL "x")
          execute_process(
            COMMAND "$ matrix.config.environment_script " && set
            OUTPUT_FILE environment_script_output.txt
          )
          file(STRINGS environment_script_output.txt output_lines)
          foreach(line IN LISTS output_lines)
            if (line MATCHES "^([a-zA-Z0-9_-]+)=(.*)$")
              set(ENV$CMAKE_MATCH_1 "$CMAKE_MATCH_2")
            endif()
          endforeach()
        endif()
        file(TO_CMAKE_PATH "$ENVGITHUB_WORKSPACE/ninja" ninja_program)
        execute_process(
          COMMAND $ steps.cmake_and_ninja.outputs.cmake_dir /cmake
            -S .
            -B build
            -D CMAKE_BUILD_TYPE=$ matrix.config.build_type 
            -G Ninja
            -DVULKAN_SDK_INCLUDES=$VULKAN_SDK/includes
            -DVULKAN_SDK_LIBRARIES=$VULKAN_SDK/Lib
            -D CMAKE_MAKE_PROGRAM=$ninja_program
          RESULT_VARIABLE result
        )
        if (NOT result EQUAL 0)
          message(FATAL_ERROR "Bad exit status")
        endif()
    - name: Build
      shell: cmake -P 0
      run: |
        set(ENVNINJA_STATUS "[%f/%t %o/sec] ")
        if ("$ runner.os " STREQUAL "Windows" AND NOT "x$ matrix.config.environment_script " STREQUAL "x")
          file(STRINGS environment_script_output.txt output_lines)
          foreach(line IN LISTS output_lines)
            if (line MATCHES "^([a-zA-Z0-9_-]+)=(.*)$")
              set(ENV$CMAKE_MATCH_1 "$CMAKE_MATCH_2")
            endif()
          endforeach()
        endif()
        execute_process(
          COMMAND $ steps.cmake_and_ninja.outputs.cmake_dir /cmake --build build
          RESULT_VARIABLE result
        )
        if (NOT result EQUAL 0)
          message(FATAL_ERROR "Bad exit status")
        endif()
    - name: Run tests
      shell: cmake -P 0
      run: |
        include(ProcessorCount)
        ProcessorCount(N)
        execute_process(
          COMMAND $ steps.cmake_and_ninja.outputs.cmake_dir /ctest -j $N
          WORKING_DIRECTORY build
          RESULT_VARIABLE result
        )
        if (NOT result EQUAL 0)
          message(FATAL_ERROR "Running tests failed!")
        endif()
    - name: Install Strip
      run: $ steps.cmake_and_ninja.outputs.cmake_dir /cmake --install build --prefix instdir --strip


    - name: Pack
      working-directory: instdir
      run: $ steps.cmake_and_ninja.outputs.cmake_dir /cmake -E tar cJfv ../$ matrix.config.artifact  .


    - name: Upload
      uses: actions/upload-artifact@v1
      with:
        path: ./$ matrix.config.artifact 
        name: $ matrix.config.artifact 

  release:
    if: contains(github.ref, 'tags/v')
    runs-on: ubuntu-latest
    needs: build

    steps:
    - name: Create Release
      id: create_release
      uses: actions/create-release@v1.0.0
      env:
        GITHUB_TOKEN: $ secrets.GITHUB_TOKEN 
      with:
        tag_name: $ github.ref 
        release_name: Release $ github.ref 
        draft: false
        prerelease: false

    - name: Store Release url
      run: |
        echo "$ steps.create_release.outputs.upload_url " > ./upload_url
    - uses: actions/upload-artifact@v1
      with:
        path: ./upload_url
        name: upload_url

  publish:
    if: contains(github.ref, 'tags/v')
    name: $ matrix.config.name 
    runs-on: $ matrix.config.os 
    strategy:
      fail-fast: false
      matrix:
        config:
        - 
            name: "Windows Latest MSVC", artifact: "Windows-MSVC.tar.xz",
            os: ubuntu-latest
          
        - 
            name: "Windows Latest MinGW", artifact: "Windows-MinGW.tar.xz",
            os: ubuntu-latest
          
        - 
            name: "Ubuntu Latest GCC", artifact: "Linux.tar.xz",
            os: ubuntu-latest
          
        - 
            name: "Ubuntu Latest clang", artifact: "Linux.tar.xz",
            os: ubuntu-latest
          
    needs: release

    steps:
    - name: Download artifact
      uses: actions/download-artifact@v1
      with:
        name: $ matrix.config.artifact 
        path: ./

    - name: Download URL
      uses: actions/download-artifact@v1
      with:
        name: upload_url
        path: ./
    - id: set_upload_url
      run: |
        upload_url=`cat ./upload_url`
        echo ::set-output name=upload_url::$upload_url
    - name: Upload to Release
      id: upload_to_release
      uses: actions/upload-release-asset@v1.0.1
      env:
        GITHUB_TOKEN: $ secrets.GITHUB_TOKEN 
      with:
        upload_url: $ steps.set_upload_url.outputs.upload_url 
        asset_path: ./$ matrix.config.artifact 
        asset_name: $ matrix.config.artifact 
        asset_content_type: application/x-gtar

这是我的 Github 操作日志:https://github.com/inexorgame/vulkan-renderer/runs/595870693?check_suite_focus=true。

-- Detecting CXX compile features - done
-- CMAKE_VERSION = 3.16.2
-- CMAKE_GENERATOR = Ninja
-- C Compiler executable: /usr/bin/gcc
-- CXX Compiler executable: /usr/bin/g++
-- Linker executable: /usr/bin/ld
-- Build type: Release
-- Downloading conan.cmake from https://github.com/conan-io/cmake-conan
-- Conan: Adding bincrafters remote repositoy (https://api.bintray.com/conan/bincrafters/public-conan)
-- Conan: Automatic detection of conan settings from cmake
-- Conan: Settings= -s;build_type=Release;-s;compiler=gcc;-s;compiler.version=7;-s;compiler.libcxx=libstdc++11
-- Conan executing: conan install /home/runner/work/vulkan-renderer/vulkan-renderer/conanfile.py -s build_type=Release -s compiler=gcc -s compiler.version=7 -s compiler.libcxx=libstdc++11 -g=cmake --build=outdated
CMake Error at build/conan.cmake:399 (message):
  Conan install failed='No such file or directory'
Call Stack (most recent call first):
  build/conan.cmake:485 (conan_cmake_install)
  cmake/conan_setup.cmake:20 (conan_cmake_run)
  CMakeLists.txt:64 (include)


-- Configuring incomplete, errors occurred!
See also "/home/runner/work/vulkan-renderer/vulkan-renderer/build/CMakeFiles/CMakeOutput.log".
CMake Error at /home/runner/work/_temp/4108ad3e-7358-4e0e-b25f-e6ffb6745416:31 (message):
  Bad exit status


##[error]Process completed with exit code 1.

这是安装柯南后的ls

/usr/share/rust/.cargo/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/home/runner/.dotnet/tools:/home/runner/.config/composer/vendor/bin:/home/runner/.local/bin
Conan version 1.24.0
1.2.131.1
BUILDING.md
CMakeLists.txt
CODEDESIGN.md
CODE_OF_CONDUCT.md
CONTRIBUTING.md
Doxyfile
LICENSE.md
README.md
assets
benchmarks
cmake
conanfile.py
configuration
documentation
generate_documentation.bat
illustrations
premake-5.0.0-alpha11-linux.tar.gz
premake5
shaders
src
tests
third_party
vma-dumps
vma-replays
vulkansdk-linux-x86_64-1.2.131.1.tar.gz

为什么找不到conanfile.py?是在同一个目录吗?

现在我只想让 gcc 在 Linux 上工作。

感谢您的帮助, 约翰内斯。

【问题讨论】:

在运行Configure 步骤时,您确定柯南在您PATH 中吗?您是否可以尝试手动运行conan install 步骤(不是来自 CMake)? 我在安装步骤后立即打电话给柯南,它成功了。我不知道为什么我不能在以后的任何步骤中使用它,但它现在可以工作了。谢谢。 是的,但是您正在修改PATH 中的Download Conan package manager 步骤.. 不确定这是否相关。我会尝试在Configure 步骤中至少打电话给conan --version 【参考方案1】:

要将条目添加到 PATH 环境变量中,以便在任何后续步骤中使用,您需要使用 add-path 命令,例如:

- run: |
    echo "::add-path::/home/runner/.local/bin"

【讨论】:

以上是关于使用 CMake、conan 和 Vulkan SDK 的 Github 操作失败,因为找不到 conanfile.py的主要内容,如果未能解决你的问题,请参考以下文章

SDL2 简明教程:使用 Cmake 和 Conan 构建 SDL2 编程环境

SDL2 简明教程:使用 Cmake 和 Conan 构建 SDL2 编程环境

conan入门(十五):AttributeError: ‘CMake‘ object has no attribute ‘definitions‘

Windows + VS2019 + CMake + CLion + Conan:如何启用C++20?

柯南和 Cmake:目标已经存在

CLion CMake ld: library not found + Vulkan 和 OpenGL 问题