Line data Source code
1 : use std::marker::PhantomData;
2 :
3 : use lief_ffi as ffi;
4 :
5 : use super::Command;
6 : use crate::common::FromFFI;
7 : use crate::declare_iterator;
8 :
9 : /// Tool used during the build
10 : #[allow(non_camel_case_types)]
11 0 : #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
12 : pub enum Tool {
13 : CLANG,
14 : SWIFT,
15 : LD,
16 : LLD,
17 : METAL,
18 : AIRLLD,
19 : AIRNT,
20 : AIRNT_PLUGIN,
21 : AIRPACK,
22 : GPUARCHIVER,
23 : METAL_FRAMEWORK,
24 : UNKNOWN(u32),
25 : }
26 :
27 : impl From<u32> for Tool {
28 0 : fn from(value: u32) -> Self {
29 0 : match value {
30 0 : 1 => Tool::CLANG,
31 0 : 2 => Tool::SWIFT,
32 0 : 3 => Tool::LD,
33 0 : 4 => Tool::LLD,
34 0 : 1024 => Tool::METAL,
35 0 : 1025 => Tool::AIRLLD,
36 0 : 1026 => Tool::AIRNT,
37 0 : 1027 => Tool::AIRNT_PLUGIN,
38 0 : 1028 => Tool::AIRPACK,
39 0 : 1031 => Tool::GPUARCHIVER,
40 0 : 1032 => Tool::METAL_FRAMEWORK,
41 0 : _ => Tool::UNKNOWN(value),
42 : }
43 0 : }
44 : }
45 :
46 : impl From<Tool> for u32 {
47 0 : fn from(value: Tool) -> u32 {
48 0 : match value {
49 0 : Tool::CLANG => 1,
50 0 : Tool::SWIFT => 2,
51 0 : Tool::LD => 3,
52 0 : Tool::LLD => 4,
53 0 : Tool::METAL => 1024,
54 0 : Tool::AIRLLD => 1025,
55 0 : Tool::AIRNT => 1026,
56 0 : Tool::AIRNT_PLUGIN => 1027,
57 0 : Tool::AIRPACK => 1028,
58 0 : Tool::GPUARCHIVER => 1031,
59 0 : Tool::METAL_FRAMEWORK => 1032,
60 0 : Tool::UNKNOWN(v) => v,
61 : }
62 0 : }
63 : }
64 :
65 : /// Represents a tool version used during the build
66 : pub struct BuildToolVersion<'a> {
67 : ptr: cxx::UniquePtr<ffi::MachO_BuildToolVersion>,
68 : _owner: PhantomData<&'a ffi::MachO_BuildVersion>,
69 : }
70 :
71 : impl BuildToolVersion<'_> {
72 : /// The tool used
73 0 : pub fn tool(&self) -> Tool {
74 0 : Tool::from(self.ptr.tool())
75 0 : }
76 :
77 : /// Version associated with the tool
78 0 : pub fn version(&self) -> (u64, u64, u64) {
79 0 : let vec = Vec::from(self.ptr.version().as_slice());
80 0 : if vec.len() != 3 {
81 0 : return (0, 0, 0);
82 0 : }
83 0 : (vec[0], vec[1], vec[2])
84 0 : }
85 : }
86 :
87 : impl std::fmt::Debug for BuildToolVersion<'_> {
88 0 : fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
89 0 : f.debug_struct("BuildToolVersion")
90 0 : .field("tool", &self.tool())
91 0 : .field("version", &self.version())
92 0 : .finish()
93 0 : }
94 : }
95 :
96 : impl<'a> FromFFI<ffi::MachO_BuildToolVersion> for BuildToolVersion<'a> {
97 0 : fn from_ffi(ptr: cxx::UniquePtr<ffi::MachO_BuildToolVersion>) -> Self {
98 0 : Self {
99 0 : ptr,
100 0 : _owner: PhantomData,
101 0 : }
102 0 : }
103 : }
104 :
105 : /// Structure that represents the `LC_BUILD_VERSION` command
106 : pub struct BuildVersion<'a> {
107 : ptr: cxx::UniquePtr<ffi::MachO_BuildVersion>,
108 : _owner: PhantomData<&'a ffi::MachO_Binary>,
109 : }
110 :
111 : #[allow(non_camel_case_types)]
112 1014 : #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
113 : pub enum Platform {
114 : MACOS,
115 : IOS,
116 : TVOS,
117 : WATCHOS,
118 : BRIDGEOS,
119 : MAC_CATALYST,
120 : IOS_SIMULATOR,
121 : TVOS_SIMULATOR,
122 : WATCHOS_SIMULATOR,
123 : DRIVERKIT,
124 : VISIONOS,
125 : VISIONOS_SIMULATOR,
126 : FIRMWARE,
127 : SEPOS,
128 : MACOS_EXCLAVE_CORE,
129 : MACOS_EXCLAVE_KIT,
130 : IOS_EXCLAVE_CORE,
131 : IOS_EXCLAVE_KIT,
132 : TVOS_EXCLAVE_CORE,
133 : TVOS_EXCLAVE_KIT,
134 : WATCHOS_EXCLAVE_CORE,
135 : WATCHOS_EXCLAVE_KIT,
136 : VISIONOS_EXCLAVE_CORE,
137 : VISIONOS_EXCLAVE_KIT,
138 : ANY,
139 : UNKNOWN(u32),
140 : }
141 :
142 : impl From<u32> for Platform {
143 1014 : fn from(value: u32) -> Self {
144 1014 : match value {
145 741 : 0x00000001 => Platform::MACOS,
146 117 : 0x00000002 => Platform::IOS,
147 0 : 0x00000003 => Platform::TVOS,
148 0 : 0x00000004 => Platform::WATCHOS,
149 0 : 0x00000005 => Platform::BRIDGEOS,
150 0 : 0x00000006 => Platform::MAC_CATALYST,
151 0 : 0x00000007 => Platform::IOS_SIMULATOR,
152 0 : 0x00000008 => Platform::TVOS_SIMULATOR,
153 0 : 0x00000009 => Platform::WATCHOS_SIMULATOR,
154 0 : 0x0000000A => Platform::DRIVERKIT,
155 0 : 0x0000000B => Platform::VISIONOS,
156 0 : 0x0000000C => Platform::VISIONOS_SIMULATOR,
157 0 : 0x0000000D => Platform::FIRMWARE,
158 0 : 0x0000000E => Platform::SEPOS,
159 0 : 0x0000000F => Platform::MACOS_EXCLAVE_CORE,
160 0 : 0x00000010 => Platform::MACOS_EXCLAVE_KIT,
161 0 : 0x00000011 => Platform::IOS_EXCLAVE_CORE,
162 0 : 0x00000012 => Platform::IOS_EXCLAVE_KIT,
163 0 : 0x00000013 => Platform::TVOS_EXCLAVE_CORE,
164 0 : 0x00000014 => Platform::TVOS_EXCLAVE_KIT,
165 0 : 0x00000015 => Platform::WATCHOS_EXCLAVE_CORE,
166 0 : 0x00000016 => Platform::WATCHOS_EXCLAVE_KIT,
167 0 : 0x00000017 => Platform::VISIONOS_EXCLAVE_CORE,
168 0 : 0x00000018 => Platform::VISIONOS_EXCLAVE_KIT,
169 0 : 0xFFFFFFFF => Platform::ANY,
170 156 : _ => Platform::UNKNOWN(value),
171 : }
172 1014 : }
173 : }
174 :
175 : impl BuildVersion<'_> {
176 598 : pub fn sdk(&self) -> (u64, u64, u64) {
177 598 : let vec = Vec::from(self.ptr.sdk().as_slice());
178 598 : if vec.len() != 3 {
179 0 : return (0, 0, 0);
180 598 : }
181 598 : (vec[0], vec[1], vec[2])
182 598 : }
183 :
184 598 : pub fn minos(&self) -> (u64, u64, u64) {
185 598 : let vec = Vec::from(self.ptr.sdk().as_slice());
186 598 : if vec.len() != 3 {
187 0 : return (0, 0, 0);
188 598 : }
189 598 : (vec[0], vec[1], vec[2])
190 598 : }
191 :
192 598 : pub fn platform(&self) -> Platform {
193 598 : Platform::from(self.ptr.platform())
194 598 : }
195 :
196 : /// Return an iterator over the [`BuildToolVersion`] entries
197 0 : pub fn tools(&self) -> BuildTools<'_> {
198 0 : BuildTools::new(self.ptr.tools())
199 0 : }
200 : }
201 :
202 : impl std::fmt::Debug for BuildVersion<'_> {
203 598 : fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
204 598 : let base = self as &dyn Command;
205 598 : f.debug_struct("BuildVersion")
206 598 : .field("base", &base)
207 598 : .field("sdk", &self.sdk())
208 598 : .field("minos", &self.minos())
209 598 : .field("platform", &self.platform())
210 598 : .finish()
211 598 : }
212 : }
213 :
214 : impl FromFFI<ffi::MachO_BuildVersion> for BuildVersion<'_> {
215 598 : fn from_ffi(cmd: cxx::UniquePtr<ffi::MachO_BuildVersion>) -> Self {
216 598 : Self {
217 598 : ptr: cmd,
218 598 : _owner: PhantomData,
219 598 : }
220 598 : }
221 : }
222 :
223 : impl Command for BuildVersion<'_> {
224 2392 : fn get_base(&self) -> &ffi::MachO_Command {
225 2392 : self.ptr.as_ref().unwrap().as_ref()
226 2392 : }
227 : }
228 :
229 0 : declare_iterator!(
230 0 : BuildTools,
231 0 : BuildToolVersion<'a>,
232 0 : ffi::MachO_BuildToolVersion,
233 0 : ffi::MachO_BuildVersion,
234 0 : ffi::MachO_BuildVersion_it_tools
235 0 : );
|