Skip to content

GitLab

  • Menu
Projects Groups Snippets
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • CMake CMake
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 3,818
    • Issues 3,818
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 8
    • Merge requests 8
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Releases
  • Packages & Registries
    • Packages & Registries
    • Container Registry
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • External wiki
    • External wiki
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • CMake
  • CMakeCMake
  • Issues
  • #20676
Closed
Open
Created May 05, 2020 by Xavier Lacoste@XL64

check_language (CUDA) does not respect `CUDA_HOST_COMPILER` reborn

As I wrote in #19013 (closed) there is still a different behaviour in enable_language() and check_language(). I don't know how to reopen a closed issue so I create a new one. With CMAKE 3.16.2, this code called with cmake .. -DCMAKE_CUDA_HOST_COMPILER=/usr/bin/gcc fails to find a CUDA compiler whereas an enable_language(CUDA) succeeds.

    cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
    
    cmake_policy(SET CMP0074 NEW)
    
    set (LANGUAGES "Fortran;C")
    project(p LANGUAGES ${LANGUAGES})
    include(CheckLanguage)
    
    check_language(CUDA)
    if (CMAKE_CUDA_COMPILER)
      message(STATUS "CUDA detected, enabling language")
      list(APPEND LANGUAGES "CUDA")
      enable_language(CUDA)
      message(STATUS "CUDA enabled (version ${CMAKE_CUDA_COMPILER_VERSION})")
      set(HAVE_CUDA TRUE)
    else ()
      message(STATUS "CUDA not detected")
      set(HAVE_CUDA FALSE)
    endif ()

It can be fixed by copying check_language() macro and changing the if(lang STREQUAL CUDA) into if(${lang} STREQUAL CUDA):

    cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
    
    cmake_policy(SET CMP0074 NEW)
    
    set (LANGUAGES "Fortran;C")
    project(p LANGUAGES ${LANGUAGES})
    #include(CheckLanguage)
    
    macro(check_language lang)
      if(NOT DEFINED CMAKE_${lang}_COMPILER)
        set(_desc "Looking for a ${lang} compiler")
        message(STATUS ${_desc})
        file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang})
    
        set(extra_compiler_variables)
        message(STATUS "lang: ${lang}")
        if(${lang} STREQUAL CUDA)
          set(extra_compiler_variables "set(CMAKE_CUDA_HOST_COMPILER \\\"\${CMAKE_CUDA_HOST_COMPILER}\\\")")
          message(STATUS "extra_compiler_variables: ${extra_compiler_variables}")
        endif()
    
        set(content
          "cmake_minimum_required(VERSION ${CMAKE_VERSION})
    project(Check${lang} ${lang})
    file(WRITE \"\${CMAKE_CURRENT_BINARY_DIR}/result.cmake\"
      \"set(CMAKE_${lang}_COMPILER \\\"\${CMAKE_${lang}_COMPILER}\\\")\\n\"
      \"${extra_compiler_variables}\\n\"
      )"
        )
    
        file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang}/CMakeLists.txt"
          "${content}")
        if(CMAKE_GENERATOR_INSTANCE)
          set(_D_CMAKE_GENERATOR_INSTANCE "-DCMAKE_GENERATOR_INSTANCE:INTERNAL=${CMAKE_GENERATOR_INSTANCE}")
        else()
          set(_D_CMAKE_GENERATOR_INSTANCE "")
        endif()
        execute_process(
          WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang}
          COMMAND ${CMAKE_COMMAND} . -G ${CMAKE_GENERATOR}
                                     -A "${CMAKE_GENERATOR_PLATFORM}"
                                     -T "${CMAKE_GENERATOR_TOOLSET}"
                                     ${_D_CMAKE_GENERATOR_INSTANCE}
          OUTPUT_VARIABLE output
          ERROR_VARIABLE output
          RESULT_VARIABLE result
          )
        include(${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang}/result.cmake OPTIONAL)
        if(CMAKE_${lang}_COMPILER AND "${result}" STREQUAL "0")
          file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
            "${_desc} passed with the following output:\n"
            "${output}\n")
        else()
          set(CMAKE_${lang}_COMPILER NOTFOUND)
          file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
            "${_desc} failed with the following output:\n"
            "${output}\n")
        endif()
        message(STATUS "${_desc} - ${CMAKE_${lang}_COMPILER}")
        set(CMAKE_${lang}_COMPILER "${CMAKE_${lang}_COMPILER}" CACHE FILEPATH "${lang} compiler")
        mark_as_advanced(CMAKE_${lang}_COMPILER)
    
        if(CMAKE_${lang}_HOST_COMPILER)
          message(STATUS "Looking for a ${lang} host compiler - ${CMAKE_${lang}_HOST_COMPILER}")
          set(CMAKE_${lang}_HOST_COMPILER "${CMAKE_${lang}_HOST_COMPILER}" CACHE FILEPATH "${lang} host compiler")
          mark_as_advanced(CMAKE_${lang}_HOST_COMPILER)
        endif()
    
      endif()
    endmacro()
    
    check_language(CUDA)
    if (CMAKE_CUDA_COMPILER)
      message(STATUS "CUDA detected, enabling language")
      list(APPEND LANGUAGES "CUDA")
      enable_language(CUDA)
      message(STATUS "CUDA enabled (version ${CMAKE_CUDA_COMPILER_VERSION})")
      set(HAVE_CUDA TRUE)
    else ()
      message(STATUS "CUDA not detected")
      set(HAVE_CUDA FALSE)
    endif ()

Regards,

XL

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information
Assignee
Assign to
Time tracking