1mod apple_base;
2mod apple_sdk_base;
3mod linux_base;
4mod windows_msvc_base;
5
6use crate::{abi::Endian, host_triple};
7
8#[derive(Debug, Clone, Copy, Eq, Ord, PartialOrd, PartialEq, Hash)]
9pub enum LinkerFlavor {
10 Ld,
11 Ld64,
12 Msvc,
13}
14
15#[derive(Clone, Debug, Eq, PartialEq)]
18pub struct Target {
19 pub llvm_target: String,
21
22 pub pointer_width: u32,
24
25 pub arch: String,
27
28 pub data_layout: String,
30
31 pub options: TargetOptions,
33}
34
35#[derive(Clone, Debug, Eq, PartialEq)]
37pub struct TargetOptions {
38 pub is_builtin: bool,
40
41 pub endian: Endian,
43
44 pub c_int_width: String,
46
47 pub os: String,
49
50 pub min_os_version: Option<(u32, u32, u32)>,
52
53 pub env: String,
55
56 pub abi: String,
59
60 pub vendor: String,
62
63 pub linker_flavor: LinkerFlavor,
65
66 pub pre_link_args: Vec<String>,
68
69 pub cpu: String,
71
72 pub features: String,
75
76 pub dll_prefix: String,
78
79 pub is_like_windows: bool,
81 pub is_like_msvc: bool,
82
83 pub is_like_osx: bool,
86}
87
88impl Default for TargetOptions {
89 fn default() -> Self {
90 TargetOptions {
91 is_builtin: false,
92 endian: Endian::Little,
93 c_int_width: "32".into(),
94 os: "none".into(),
95 min_os_version: None,
96 env: "".into(),
97 abi: "".into(),
98 vendor: "unknown".into(),
99 linker_flavor: LinkerFlavor::Ld,
100 pre_link_args: vec![],
101 cpu: "generic".to_string(),
102 features: "".to_string(),
103 dll_prefix: "lib".to_string(),
104 is_like_windows: false,
105 is_like_msvc: false,
106 is_like_osx: false,
107 }
108 }
109}
110
111macro_rules! supported_targets {
112 ( $(($( $triple:literal, )+ $module:ident ),)+ ) => {
113 $ ( mod $ module; ) +
114
115 const TARGETS: &[&str] = &[$($($triple),+),+];
117
118 fn load_specific(target: &str) -> Option<Target> {
119 let mut t = match target {
120 $( $($triple)|+ => $module::target(), )+
121 _ => return None,
122 };
123 t.options.is_builtin = true;
124 log::debug!("got builtin target: {:?}", t);
125 Some(t)
126 }
127
128 pub fn get_targets() -> impl Iterator<Item = &'static str> {
129 TARGETS.iter().copied()
130 }
131 }
132}
133
134supported_targets!(
135 ("x86_64-apple-darwin", x86_64_apple_darwin),
136 ("x86_64-apple-ios", x86_64_apple_ios),
137 ("x86_64-pc-windows-msvc", x86_64_pc_windows_msvc),
138 ("x86_64-unknown-linux-gnu", x86_64_unknown_linux_gnu),
139 ("aarch64-apple-darwin", aarch64_apple_darwin),
140 ("aarch64-apple-ios", aarch64_apple_ios),
141 ("aarch64-apple-ios-sim", aarch64_apple_ios_sim),
142);
143
144impl Target {
145 pub fn search(target_triple: &str) -> Option<Target> {
146 load_specific(target_triple)
147 }
148
149 pub fn host_target() -> Option<Target> {
150 Self::search(host_triple())
151 }
152}