-
Notifications
You must be signed in to change notification settings - Fork 0
/
Rust7.html
352 lines (184 loc) · 23.8 KB
/
Rust7.html
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- iOS Safari -->
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<!-- Chrome, Firefox OS and Opera Status Bar Color -->
<meta name="theme-color" content="#FFFFFF">
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min.css">
<link rel="stylesheet" type="text/css"
href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.19.0/themes/prism.min.css">
<link rel="stylesheet" type="text/css" href="css/SourceSansPro.css">
<link rel="stylesheet" type="text/css" href="css/theme.css">
<link rel="stylesheet" type="text/css" href="css/notablog.css">
<link rel="stylesheet" type="text/css" href="css/CustomSetting.css">
<!-- Favicon -->
<link rel="shortcut icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text text-anchor=%22middle%22 dominant-baseline=%22middle%22 x=%2250%22 y=%2255%22 font-size=%2280%22>🥥</text></svg>">
<style>
:root {
font-size: 20px;
}
</style>
<title>配置 cargo workspace | 413’s Website</title>
<meta property="og:type" content="blog">
<meta property="og:title" content="配置 cargo workspace">
<meta property="og:image" content="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text text-anchor=%22middle%22 dominant-baseline=%22middle%22 x=%2250%22 y=%2255%22 font-size=%2280%22>🦀</text></svg>">
<style>
.DateTagBar {
margin-top: 1.0rem;
}
</style>
</head>
<body>
<nav class="Navbar">
<a href="index.html">
<div class="Navbar__Btn">
<span><img class="inline-img-icon" src="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text text-anchor=%22middle%22 dominant-baseline=%22middle%22 x=%2250%22 y=%2255%22 font-size=%2280%22>🥥</text></svg>"></span>
<span>Home</span>
</div>
</a>
<span class="Navbar__Delim">·</span>
<a href="blog-collection.html">
<div class="Navbar__Btn">
<span><img class="inline-img-icon" src="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text text-anchor=%22middle%22 dominant-baseline=%22middle%22 x=%2250%22 y=%2255%22 font-size=%2280%22>🥅</text></svg>"></span>
<span>blog mark</span>
</div>
</a>
<span class="Navbar__Delim">·</span>
<a href="Note.html">
<div class="Navbar__Btn">
<span><img class="inline-img-icon" src="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text text-anchor=%22middle%22 dominant-baseline=%22middle%22 x=%2250%22 y=%2255%22 font-size=%2280%22>🎶</text></svg>"></span>
<span>Note</span>
</div>
</a>
<span class="Navbar__Delim">·</span>
<a href="reference.html">
<div class="Navbar__Btn">
<span><img class="inline-img-icon" src="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text text-anchor=%22middle%22 dominant-baseline=%22middle%22 x=%2250%22 y=%2255%22 font-size=%2280%22>😷</text></svg>"></span>
<span>杂项</span>
</div>
</a>
<span class="Navbar__Delim">·</span>
<a href="About.html">
<div class="Navbar__Btn">
<span><img class="inline-img-icon" src="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text text-anchor=%22middle%22 dominant-baseline=%22middle%22 x=%2250%22 y=%2255%22 font-size=%2280%22>😀</text></svg>"></span>
<span>About</span>
</div>
</a>
</nav>
<header class="Header">
<div class="Header__Spacer Header__Spacer--NoCover">
</div>
<div class="Header__Icon">
<span><img class="inline-img-icon" src="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text text-anchor=%22middle%22 dominant-baseline=%22middle%22 x=%2250%22 y=%2255%22 font-size=%2280%22>🦀</text></svg>"></span>
</div>
<h1 class="Header__Title">配置 cargo workspace</h1>
<div class="DateTagBar">
<span class="DateTagBar__Item DateTagBar__Date">Posted on Mon, Sep 2, 2024</span>
<span class="DateTagBar__Item DateTagBar__Tag DateTagBar__Tag--purple">
<a href="tag/Rust.html">Rust</a>
</span>
<span class="DateTagBar__Item DateTagBar__Tag DateTagBar__Tag--red">
<a href="tag/单片机.html">单片机</a>
</span>
</div>
</header>
<div id="content-html"></div>
<article id="https://www.notion.so/aa7a4860f931439aa1defeaff51e1301" class="PageRoot PageRoot--FullWidth"><div id="https://www.notion.so/b4bc43cfd16e40b18ab58a6e8f576638" class="ColorfulBlock ColorfulBlock--ColorDefault Text"><p class="Text__Content"><span class="SemanticStringArray"><span class="SemanticString"><mark class="SemanticString__Fragment SemanticString__Fragment--HighlightedColor SemanticString__Fragment--ColorDefault">在 ~/code/esp32 下创建 std/non_std 两个目录,分别作为 std 和 non_std 应用的 workspace 目录, 之所以区分他们是因为 workspace 目录下的 .cargo/config.toml 文件配置不同:</mark></span></span></p></div><ol class="NumberedListWrapper"><li id="https://www.notion.so/73ca1d75cf7c4cc4868e5f47f3255aaf" class="NumberedList" value="1"><span class="SemanticStringArray"><span class="SemanticString"><mark class="SemanticString__Fragment SemanticString__Fragment--HighlightedColor SemanticString__Fragment--ColorDefault">std workspace:创建 Cargo.toml,从一个 std 应用目录拷贝.cargo/config.toml/rust-toolchain.toml/sdkconfig.defaults 文件;</mark></span></span></li><li id="https://www.notion.so/d3523f3980e84554a8603b47df043d95" class="NumberedList" value="2"><span class="SemanticStringArray"><span class="SemanticString"><mark class="SemanticString__Fragment SemanticString__Fragment--HighlightedColor SemanticString__Fragment--ColorDefault">non_std workspace: 创建 Cargo.toml,从一个 non_std 应用目录拷贝.cargo/config.toml/rust-toolchain.toml/sdkconfig.defaults 文件;</mark></span></span></li></ol><div id="https://www.notion.so/546fb1ae22c648e0b295a2c243b7b4ab" class="ColorfulBlock ColorfulBlock--ColorDefault Text"><p class="Text__Content"><span class="SemanticStringArray"><span class="SemanticString"><mark class="SemanticString__Fragment SemanticString__Fragment--HighlightedColor SemanticString__Fragment--ColorDefault">std workspace:</mark></span></span></p></div><ol class="NumberedListWrapper"><li id="https://www.notion.so/833646d59b4548ec8e9c24c8fc76c4dc" class="NumberedList" value="1"><span class="SemanticStringArray"><span class="SemanticString"><mark class="SemanticString__Fragment SemanticString__Fragment--HighlightedColor SemanticString__Fragment--ColorDefault">.cargo/config.toml 中设置最新的 ESP_IDF_VERSION = “v5.2.1”,没有指定 ESP_IDF_TOOLS_INSTALL_DIR = “global”,这样会在 workspace 目录下的 .embuild 中保存一份。</mark></span></span></li></ol><div id="https://www.notion.so/5d16efbb467e4e0cb164fb8cf9bd7044" class="ColorfulBlock ColorfulBlock--ColorDefault Text"><p class="Text__Content"><span class="SemanticStringArray"><span class="SemanticString"><mark class="SemanticString__Fragment SemanticString__Fragment--HighlightedColor SemanticString__Fragment--ColorDefault">Copy</mark></span></span></p></div><pre id="https://www.notion.so/ed9fc4a80c864f9396f7107c270500a3" class="Code Code--NoWrap"><code><span class="SemanticStringArray"><span class="SemanticString"><span>zj@a:~/code/esp32/std$ cat Cargo<span class="token punctuation">.</span>toml
<span class="token punctuation">[</span><span class="token table class-name">workspace</span><span class="token punctuation">]</span>
<span class="token key property">resolver</span> <span class="token punctuation">=</span> <span class="token string">"2"</span> <span class="token comment"># 没有指定 workspace 的 root package 时必须要指定该参数</span>
<span class="token key property">members</span> <span class="token punctuation">=</span> <span class="token punctuation">[</span> <span class="token comment"># std 应用目录列表</span>
<span class="token string">"myesp"</span><span class="token punctuation">,</span>
<span class="token string">"myespv2"</span><span class="token punctuation">,</span>
<span class="token string">"myespv3"</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span>
<span class="token key property">exclude</span> <span class="token punctuation">=</span> <span class="token punctuation">[</span> <span class="token comment"># 排除的目录列表</span>
<span class="token string">"mycmake"</span><span class="token punctuation">,</span>
<span class="token string">"old"</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token table class-name">profile.release</span><span class="token punctuation">]</span>
<span class="token key property">opt-level</span> <span class="token punctuation">=</span> <span class="token string">"s"</span>
<span class="token punctuation">[</span><span class="token table class-name">profile.dev</span><span class="token punctuation">]</span>
<span class="token key property">debug</span> <span class="token punctuation">=</span> <span class="token boolean">true</span> <span class="token comment"># Symbols are nice and they don't increase the size on Flash</span>
<span class="token key property">opt-level</span> <span class="token punctuation">=</span> <span class="token string">"z"</span>
zj@a:~/code/esp32/std$
zj@a:~/code/esp32/std$ cat <span class="token punctuation">.</span>cargo/config<span class="token punctuation">.</span>toml
<span class="token punctuation">[</span><span class="token table class-name">build</span><span class="token punctuation">]</span>
<span class="token key property">target</span> <span class="token punctuation">=</span> <span class="token string">"xtensa-esp32s3-espidf"</span>
<span class="token punctuation">[</span><span class="token table class-name">target.xtensa-esp32s3-espidf</span><span class="token punctuation">]</span>
<span class="token key property">linker</span> <span class="token punctuation">=</span> <span class="token string">"ldproxy"</span>
<span class="token comment"># runner = "espflash --monitor" # Select this runner for espflash v1.x.x</span>
<span class="token key property">runner</span> <span class="token punctuation">=</span> <span class="token string">"espflash flash --monitor"</span> <span class="token comment"># Select this runner for espflash v2.x.x</span>
<span class="token key property">rustflags</span> <span class="token punctuation">=</span> <span class="token punctuation">[</span> <span class="token string">"--cfg"</span><span class="token punctuation">,</span> <span class="token string">"espidf_time64"</span><span class="token punctuation">]</span> <span class="token comment"># Extending time_t for ESP IDF 5: https://github.com/esp-rs/rust/issues/110</span>
<span class="token punctuation">[</span><span class="token table class-name">unstable</span><span class="token punctuation">]</span>
<span class="token key property">build-std</span> <span class="token punctuation">=</span> <span class="token punctuation">[</span><span class="token string">"std"</span><span class="token punctuation">,</span> <span class="token string">"panic_abort"</span><span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token table class-name">env</span><span class="token punctuation">]</span>
<span class="token key property">MCU</span><span class="token punctuation">=</span><span class="token string">"esp32s3"</span>
<span class="token comment"># Note: this variable is not used by the pio builder (`cargo build --features pio`)</span>
<span class="token key property">ESP_IDF_VERSION</span> <span class="token punctuation">=</span> <span class="token string">"v5.2.1"</span>
<span class="token key property">ESP_IDF_SDKCONFIG_DEFAULTS</span> <span class="token punctuation">=</span> <span class="token punctuation">{</span> <span class="token key property">value</span> <span class="token punctuation">=</span> <span class="token string">"sdkconfig.defaults"</span><span class="token punctuation">,</span> <span class="token key property">relative</span> <span class="token punctuation">=</span> <span class="token boolean">true</span> <span class="token punctuation">}</span>
zj@a:~/code/esp32/std$ cat rust-toolchain<span class="token punctuation">.</span>toml
<span class="token punctuation">[</span><span class="token table class-name">toolchain</span><span class="token punctuation">]</span>
<span class="token key property">channel</span> <span class="token punctuation">=</span> <span class="token string">"esp"</span></span></span></span></code></pre><div id="https://www.notion.so/d604a4b925424ea784e50aee5aab066b" class="ColorfulBlock ColorfulBlock--ColorDefault Text"><p class="Text__Content"><span class="SemanticStringArray"><span class="SemanticString"><mark class="SemanticString__Fragment SemanticString__Fragment--HighlightedColor SemanticString__Fragment--ColorDefault">non_std workspace:</mark></span></span></p></div><div id="https://www.notion.so/c423ab789c4f4e108d73ea9577bbc117" class="ColorfulBlock ColorfulBlock--ColorDefault Text"><p class="Text__Content"><span class="SemanticStringArray"></span></p></div><pre id="https://www.notion.so/1829ef6c0c3b49669130a271dbb2f695" class="Code Code--NoWrap"><code><span class="SemanticStringArray"><span class="SemanticString"><span>zj@a:~/code/esp32/non_std$ cat Cargo<span class="token punctuation">.</span>toml
<span class="token punctuation">[</span><span class="token table class-name">workspace</span><span class="token punctuation">]</span>
<span class="token key property">resolver</span> <span class="token punctuation">=</span> <span class="token string">"2"</span>
<span class="token key property">members</span> <span class="token punctuation">=</span> <span class="token punctuation">[</span>
<span class="token string">"myesp-nonstd"</span>
<span class="token punctuation">]</span>
<span class="token punctuation">[</span><span class="token table class-name">profile.dev</span><span class="token punctuation">]</span>
<span class="token comment"># Rust debug is too slow.</span>
<span class="token comment"># For debug builds always builds with some optimization</span>
<span class="token key property">opt-level</span> <span class="token punctuation">=</span> <span class="token string">"s"</span>
<span class="token punctuation">[</span><span class="token table class-name">profile.release</span><span class="token punctuation">]</span>
<span class="token key property">codegen-units</span> <span class="token punctuation">=</span> <span class="token number">1</span> <span class="token comment"># LLVM can perform better optimizations using a single thread</span>
<span class="token key property">debug</span> <span class="token punctuation">=</span> <span class="token number">2</span>
<span class="token key property">debug-assertions</span> <span class="token punctuation">=</span> <span class="token boolean">false</span>
<span class="token key property">incremental</span> <span class="token punctuation">=</span> <span class="token boolean">false</span>
<span class="token key property">lto</span> <span class="token punctuation">=</span> <span class="token string">'fat'</span>
<span class="token key property">opt-level</span> <span class="token punctuation">=</span> <span class="token string">'s'</span>
<span class="token key property">overflow-checks</span> <span class="token punctuation">=</span> <span class="token boolean">false</span>
zj@a:~/code/esp32/non_std$ cat <span class="token punctuation">.</span>cargo/config<span class="token punctuation">.</span>toml
<span class="token punctuation">[</span><span class="token table class-name">target.xtensa-esp32s3-none-elf</span><span class="token punctuation">]</span>
<span class="token key property">runner</span> <span class="token punctuation">=</span> <span class="token string">"espflash flash --monitor"</span>
<span class="token punctuation">[</span><span class="token table class-name">env</span><span class="token punctuation">]</span>
<span class="token key property">ESP_LOGLEVEL</span><span class="token punctuation">=</span><span class="token string">"INFO"</span>
<span class="token punctuation">[</span><span class="token table class-name">build</span><span class="token punctuation">]</span>
<span class="token key property">rustflags</span> <span class="token punctuation">=</span> <span class="token punctuation">[</span>
<span class="token string">"-C"</span><span class="token punctuation">,</span> <span class="token string">"link-arg=-nostartfiles"</span><span class="token punctuation">,</span>
<span class="token punctuation">]</span>
<span class="token key property">target</span> <span class="token punctuation">=</span> <span class="token string">"xtensa-esp32s3-none-elf"</span>
<span class="token punctuation">[</span><span class="token table class-name">unstable</span><span class="token punctuation">]</span>
<span class="token key property">build-std</span> <span class="token punctuation">=</span> <span class="token punctuation">[</span><span class="token string">"core"</span><span class="token punctuation">]</span>
zj@a:~/code/esp32/non_std$ cat rust-toolchain<span class="token punctuation">.</span>toml
<span class="token punctuation">[</span><span class="token table class-name">toolchain</span><span class="token punctuation">]</span>
<span class="token key property">channel</span> <span class="token punctuation">=</span> <span class="token string">"esp"</span>
zj@a:~/code/esp32/non_std$</span></span></span></code></pre><div id="https://www.notion.so/21b4724d3ec34105a811103ac4d43edc" class="ColorfulBlock ColorfulBlock--ColorDefault Text"><p class="Text__Content"><span class="SemanticStringArray"><span class="SemanticString"><mark class="SemanticString__Fragment SemanticString__Fragment--HighlightedColor SemanticString__Fragment--ColorDefault">新增应用:</mark></span></span></p></div><ol class="NumberedListWrapper"><li id="https://www.notion.so/f584bb561569428d8a362c771c2376d7" class="NumberedList" value="1"><span class="SemanticStringArray"><span class="SemanticString"><mark class="SemanticString__Fragment SemanticString__Fragment--HighlightedColor SemanticString__Fragment--ColorDefault">在对应的 std/non_std 目录下使用 cargo generate 模板来创建应用。</mark></span></span></li><li id="https://www.notion.so/c591bc78b99640e1a6f11cdfdf90c20b" class="NumberedList" value="2"><span class="SemanticStringArray"><span class="SemanticString"><mark class="SemanticString__Fragment SemanticString__Fragment--HighlightedColor SemanticString__Fragment--ColorDefault">然后将应用名称添加到 members 列表中;</mark></span></span></li></ol><div id="https://www.notion.so/8a8e96bc88614a6dbe4be25d57a5bb8f" class="ColorfulBlock ColorfulBlock--ColorDefault Text"><p class="Text__Content"><span class="SemanticStringArray"><span class="SemanticString"><mark class="SemanticString__Fragment SemanticString__Fragment--HighlightedColor SemanticString__Fragment--ColorDefault">构建应用:</mark></span></span></p></div><ol class="NumberedListWrapper"><li id="https://www.notion.so/0bd262d4726b44b4bf1c9457c373047b" class="NumberedList" value="1"><span class="SemanticStringArray"><span class="SemanticString"><mark class="SemanticString__Fragment SemanticString__Fragment--HighlightedColor SemanticString__Fragment--ColorDefault">在 std/non_std workspace 根目录下: cargo build -p app1</mark></span></span></li><li id="https://www.notion.so/a98d0677bec84904a48f22132a1cc58e" class="NumberedList" value="2"><span class="SemanticStringArray"><span class="SemanticString"><mark class="SemanticString__Fragment SemanticString__Fragment--HighlightedColor SemanticString__Fragment--ColorDefault">在特定应用目录,如 std/myespv2 目录下: cargo build # 只构建当前应用</mark></span></span></li></ol><div id="https://www.notion.so/5a453947428b4d6490f9b6dc3cfa9dbf" class="ColorfulBlock ColorfulBlock--ColorDefault Text"><p class="Text__Content"><span class="SemanticStringArray"><span class="SemanticString"><mark class="SemanticString__Fragment SemanticString__Fragment--HighlightedColor SemanticString__Fragment--ColorDefault">当应用位于 workspace 中(members 列表中) 时,cargo build </mark></span><span class="SemanticString"><mark class="SemanticString__Fragment SemanticString__Fragment--HighlightedColor SemanticString__Fragment--ColorDefault"><code class="SemanticString__Fragment SemanticString__Fragment--Code">不再读取应用目录中的</code></mark></span><span class="SemanticString"><mark class="SemanticString__Fragment SemanticString__Fragment--HighlightedColor SemanticString__Fragment--ColorDefault"> 下列文件,而是都使用 workspaces 目录下的对应文件。</mark></span></span></p></div><ol class="NumberedListWrapper"><li id="https://www.notion.so/6b2a5885b0694dadafb8ee6ff9671d1e" class="NumberedList" value="1"><span class="SemanticStringArray"><span class="SemanticString"><mark class="SemanticString__Fragment SemanticString__Fragment--HighlightedColor SemanticString__Fragment--ColorDefault">rust-toolchain.toml</mark></span></span></li><li id="https://www.notion.so/08fe51c77d9141928dc2733340f73514" class="NumberedList" value="2"><span class="SemanticStringArray"><span class="SemanticString"><mark class="SemanticString__Fragment SemanticString__Fragment--HighlightedColor SemanticString__Fragment--ColorDefault">.cargo/config.toml</mark></span></span></li><li id="https://www.notion.so/c19f99449d4a40c2b8e2a57126d18b8a" class="NumberedList" value="3"><span class="SemanticStringArray"><span class="SemanticString"><mark class="SemanticString__Fragment SemanticString__Fragment--HighlightedColor SemanticString__Fragment--ColorDefault">sdkconfig.defaults 和 sdkconfig.defaults.esp32s3 # 相对与 workspace 目录。</mark></span></span></li></ol><div id="https://www.notion.so/627778404de7454c9afeb0abd20c6c2d" class="ColorfulBlock ColorfulBlock--ColorDefault Text"><p class="Text__Content"><span class="SemanticStringArray"><span class="SemanticString"><mark class="SemanticString__Fragment SemanticString__Fragment--HighlightedColor SemanticString__Fragment--ColorDefault">但是应用目录下的 Cargo.toml 和 build.rs 还是必须的,分别指定各应用自身的依赖和构建脚本。</mark></span></span></p></div></article>
<aside class="Aside">
<a href="#content-html"><div id="up">👆</div></a>
<a href="#message-board"><div id="down">👇</div></a>
</aside>
<div id="message-board"></div>
<script src="https://utteranc.es/client.js"
repo="syx-413/syx-413.github.io"
issue-term="pathname"
theme="boxy-light"
crossorigin="anonymous"
async>
</script>
<footer class="Footer">
<div>
© 413’s Website 2020~2024
</div>
<div>
·
</div>
<div>
Powered by
<a href="https://github.com/syx-413" target="_blank" rel="noopener noreferrer"> notablog</a>.
</div>
</footer>
</body>
</html>