File: FindRust.cmake

package info (click to toggle)
fish 4.2.1-3.1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 35,980 kB
  • sloc: python: 6,972; javascript: 1,407; sh: 1,009; xml: 411; ansic: 230; objc: 78; makefile: 20
file content (87 lines) | stat: -rw-r--r-- 2,972 bytes parent folder | download
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#[=======================================================================[.rst:
Imported from Corrosion https://github.com/corrosion-rs/corrosion/

Copyright (c) 2018 Andrew Gaspar

Licensed under the MIT license

However this is absolutely gutted and reduced to the bare minimum.
#]=======================================================================]
include(FindPackageHandleStandardArgs)

cmake_minimum_required(VERSION 3.12)

# List of user variables that will override any toolchain-provided setting
set(_Rust_USER_VARS Rust_COMPILER Rust_CARGO Rust_CARGO_TARGET)
foreach(_VAR ${_Rust_USER_VARS})
    if (DEFINED "${_VAR}")
        set(${_VAR}_CACHED "${${_VAR}}" CACHE INTERNAL "Internal cache of ${_VAR}")
    else()
        unset(${_VAR}_CACHED CACHE)
    endif()
endforeach()

if (NOT DEFINED Rust_CARGO_CACHED)
  find_program(Rust_CARGO_CACHED cargo PATHS "$ENV{HOME}/.cargo/bin")
endif()

if (NOT EXISTS "${Rust_CARGO_CACHED}")
  message(FATAL_ERROR "The cargo executable ${Rust_CARGO_CACHED} was not found. "
    "Consider setting `Rust_CARGO_CACHED` to the absolute path of `cargo`."
  )
endif()

if (NOT DEFINED Rust_COMPILER_CACHED)
  find_program(Rust_COMPILER_CACHED rustc PATHS "$ENV{HOME}/.cargo/bin")
endif()


if (NOT EXISTS "${Rust_COMPILER_CACHED}")
    message(FATAL_ERROR "The rustc executable ${Rust_COMPILER} was not found. "
        "Consider setting `Rust_COMPILER` to the absolute path of `rustc`."
    )
endif()

# Figure out the target by just using the host target.
# If you want to cross-compile, you'll have to set Rust_CARGO_TARGET
if(NOT Rust_CARGO_TARGET_CACHED)
  execute_process(
    COMMAND "${Rust_COMPILER_CACHED}" --version --verbose
    OUTPUT_VARIABLE _RUSTC_VERSION_RAW
    RESULT_VARIABLE _RUSTC_VERSION_RESULT
  )

  if(NOT ( "${_RUSTC_VERSION_RESULT}" EQUAL "0" ))
    message(FATAL_ERROR "Failed to get rustc version.\n"
      "${Rust_COMPILER} --version failed with error: `${_RUSTC_VERSION_RESULT}`")
  endif()

  if (_RUSTC_VERSION_RAW MATCHES "host: ([a-zA-Z0-9_\\-]*)\n")
    set(Rust_DEFAULT_HOST_TARGET "${CMAKE_MATCH_1}")
  else()
    message(FATAL_ERROR
      "Failed to parse rustc host target. `rustc --version --verbose` evaluated to:\n${_RUSTC_VERSION_RAW}"
    )
  endif()

  if(CMAKE_CROSSCOMPILING)
    message(FATAL_ERROR "CMake is in cross-compiling mode."
      "Manually set `Rust_CARGO_TARGET`."
    )
  endif()
  set(Rust_CARGO_TARGET_CACHED "${Rust_DEFAULT_HOST_TARGET}" CACHE STRING "Target triple")
endif()

# Set the input variables as non-cache variables so that the variables are available after
# `find_package`, even if the values were evaluated to defaults.
foreach(_VAR ${_Rust_USER_VARS})
    set(${_VAR} "${${_VAR}_CACHED}")
    # Ensure cached variables have type INTERNAL
    set(${_VAR}_CACHED "${${_VAR}_CACHED}" CACHE INTERNAL "Internal cache of ${_VAR}")
endforeach()

find_package_handle_standard_args(
    Rust
    REQUIRED_VARS Rust_COMPILER Rust_CARGO Rust_CARGO_TARGET
)