mirror of
https://github.com/citra-emu/citra-nightly.git
synced 2025-10-01 15:07:08 +00:00
Compare commits
1284 commits
nightly-15
...
master
Author | SHA1 | Date | |
---|---|---|---|
|
0ff3440232 | ||
|
69e758d738 | ||
|
f4768cd26c | ||
|
e0d2c1308e | ||
|
4f9fc88bb3 | ||
|
d857743075 | ||
|
b5042a5257 | ||
|
e524542a40 | ||
|
3a4ebb1413 | ||
|
cbe8987036 | ||
|
da5aa70fc9 | ||
|
749a721aa2 | ||
|
bb003c2bd4 | ||
|
7638f87f74 | ||
|
aa6809e2a8 | ||
|
5e02be75a3 | ||
|
b9c9beeee5 | ||
|
de993dcfbd | ||
|
3c9157b1ec | ||
|
0c40c10022 | ||
|
2766118e33 | ||
|
06b26691ba | ||
|
d41ce64f7b | ||
|
1165a708d5 | ||
|
19784355f9 | ||
|
aa6a29d7e1 | ||
|
106364e01e | ||
|
d5a1bd07f3 | ||
|
8afa27718c | ||
|
8e2415f455 | ||
|
c978c074db | ||
|
cb92ec278e | ||
|
9f5d5c6ddd | ||
|
480604ec72 | ||
|
63feac6bb3 | ||
|
469f76b075 | ||
|
7a4854c519 | ||
|
d1e3dddf6a | ||
|
265e8193b9 | ||
|
e8c20fa782 | ||
|
95ae46f6a8 | ||
|
41fe75acb7 | ||
|
1744537d85 | ||
|
bea863efff | ||
|
89e13a85a7 | ||
|
549fdd0736 | ||
|
eddc4a029c | ||
|
82294425e3 | ||
|
77fce3cf82 | ||
|
8d82adb3d3 | ||
|
228f26d1e4 | ||
|
789654d7da | ||
|
ca3b2306d5 | ||
|
8e87bd606c | ||
|
f26044bb88 | ||
|
c59ef7d793 | ||
|
6a7841d4b0 | ||
|
a2d1c4a94c | ||
|
9c84721d84 | ||
|
cca8c08a9a | ||
|
72c1075402 | ||
|
30c53c9509 | ||
|
da9f382d2c | ||
|
a177769c3b | ||
|
f346949989 | ||
|
37f0a7484f | ||
|
19d5695aa3 | ||
|
6cbdc73f53 | ||
|
81ee7ad893 | ||
|
2ce0a9e899 | ||
|
015e42be05 | ||
|
57696b2c11 | ||
|
c8c2beaeff | ||
|
6069fac76d | ||
|
7bacb78ce3 | ||
|
0165012ba4 | ||
|
96aa1b3a08 | ||
|
b2c740ee0e | ||
|
bc352e8168 | ||
|
4f00eb20db | ||
|
8b6a9b0dd8 | ||
|
62409f8139 | ||
|
0df72f3873 | ||
|
f2ee9baec7 | ||
|
8e2037b3ff | ||
|
c6bcbc02de | ||
|
36db566428 | ||
|
9b147d3f9c | ||
|
7dd9174d31 | ||
|
5a7f615da1 | ||
|
811303ea54 | ||
|
5bcdcffd96 | ||
|
2bb7f89c30 | ||
|
602f4f60d8 | ||
|
3113ae6616 | ||
|
bd4ec251cd | ||
|
b6b98af105 | ||
|
60a280af24 | ||
|
178e602589 | ||
|
dccb8f6b17 | ||
|
f177433d41 | ||
|
71b88c4c1f | ||
|
c7e9f8449e | ||
|
2e369c03b8 | ||
|
a47d8a7b4d | ||
|
02ba5c652b | ||
|
762ddfd07b | ||
|
d680b79725 | ||
|
2b20082581 | ||
|
15ea0c6336 | ||
|
9a6d15ab74 | ||
|
60584e861d | ||
|
070853b465 | ||
|
24b5ffbfca | ||
|
4d9eedd0d8 | ||
|
59df319f48 | ||
|
875f5eaad5 | ||
|
ea9f522c0c | ||
|
55e0b02863 | ||
|
59beeac4c7 | ||
|
0ed909e782 | ||
|
9da78f6126 | ||
|
0842ee6d7b | ||
|
6ec079ede8 | ||
|
83b329f6e1 | ||
|
db7b929e47 | ||
|
dc8425a986 | ||
|
670e9936a4 | ||
|
c0ecdb689d | ||
|
68e6a2185d | ||
|
09b36c589b | ||
|
1dc0fa7bb5 | ||
|
85bd1be852 | ||
|
c17ec1d1aa | ||
|
33a1f27a99 | ||
|
5733c8681e | ||
|
f8ae41dfe3 | ||
|
52254537b7 | ||
|
98f17f8f04 | ||
|
ca6dae1744 | ||
|
b6acebcb11 | ||
|
ba702043f0 | ||
|
2a4c60c1dd | ||
|
a1532f813b | ||
|
26d5727b19 | ||
|
680e132318 | ||
|
90a5d989e7 | ||
|
de40153fa4 | ||
|
e9936e01c2 | ||
|
e28c2a390c | ||
|
63d1830429 | ||
|
88cc6acb4d | ||
|
3b31720c4d | ||
|
f9bbae81aa | ||
|
1c793deece | ||
|
d5b50a9fc0 | ||
|
168f168c33 | ||
|
312068eebf | ||
|
5118798c30 | ||
|
831c9c4a38 | ||
|
23ca10472a | ||
|
6f05dd9d1d | ||
|
19cc8e626b | ||
|
ceeda05798 | ||
|
222b1cc0d7 | ||
|
b74c91457e | ||
|
1c75d895fc | ||
|
271218b733 | ||
|
80213bf88f | ||
|
fa08df21a5 | ||
|
80ac6c03b5 | ||
|
d4f31bc617 | ||
|
13d02c14e0 | ||
|
84f9e9a10f | ||
|
fcc0fd671a | ||
|
ee372572a6 | ||
|
7930e1ea86 | ||
|
4dd6e12e46 | ||
|
1d4d421097 | ||
|
3f4b57635e | ||
|
86566f1c14 | ||
|
3f1f0aa7c2 | ||
|
8fe147b8f9 | ||
|
5193a5d222 | ||
|
1f6393e7d5 | ||
|
9b2a5926a6 | ||
|
e13735b624 | ||
|
3218af38d0 | ||
|
1cf64ffaef | ||
|
998b9a9525 | ||
|
27bad3a699 | ||
|
1570aeffcb | ||
|
09ee80f590 | ||
|
b10f3d96f5 | ||
|
b5d744bcae | ||
|
89d5d4a2b6 | ||
|
4284893044 | ||
|
79ea06b226 | ||
|
8d811913a5 | ||
|
ac9d72a95c | ||
|
d3ce43782d | ||
|
597a2e8ead | ||
|
b231a22ea5 | ||
|
1110c01657 | ||
|
45ef11654a | ||
|
259dbf17dc | ||
|
ec55807669 | ||
|
36146459f8 | ||
|
597297ffb4 | ||
|
4ac10c4a9d | ||
|
2416258117 | ||
|
6d4e462e42 | ||
|
ef43776c7b | ||
|
1caf569f16 | ||
|
2d83fff581 | ||
|
e49b3c75bd | ||
|
956b0868fd | ||
|
4c59443ed2 | ||
|
07839fb3ce | ||
|
3d55270de6 | ||
|
40ba5226c6 | ||
|
775a25b492 | ||
|
897d1fa957 | ||
|
1acb03b579 | ||
|
4220f69c06 | ||
|
6264b6d43c | ||
|
6cfd00e42d | ||
|
6244f9e3fd | ||
|
f5b8888686 | ||
|
2961dcf0fd | ||
|
492aa3cb10 | ||
|
7931aac3b7 | ||
|
053b3618dc | ||
|
483e877001 | ||
|
72ff0c5337 | ||
|
0ce956ba00 | ||
|
b28ade1ee8 | ||
|
9ec4954380 | ||
|
38a0a85777 | ||
|
376d33cff4 | ||
|
50f22d1f59 | ||
|
1492d73ccb | ||
|
60d815fada | ||
|
38f310f716 | ||
|
a35f8cbb78 | ||
|
6cfb8e02a8 | ||
|
5ced2c7af9 | ||
|
327a00b4d5 | ||
|
d0b8974845 | ||
|
d19fe9aa4c | ||
|
270d3eb7eb | ||
|
003a4ec09b | ||
|
279208347e | ||
|
af5202f6cb | ||
|
28c542c2c2 | ||
|
d1c16bad78 | ||
|
542209c993 | ||
|
8aee625a14 | ||
|
d2d37411bc | ||
|
43cedf59af | ||
|
30fcdc5474 | ||
|
ee3eab5054 | ||
|
dfa2fd0e0d | ||
|
8f8c54201d | ||
|
9be4fd8b91 | ||
|
bbb47cd753 | ||
|
0b0d3a4ac3 | ||
|
6aa31d6ec2 | ||
|
3e254d01ee | ||
|
928f352c94 | ||
|
e2d8eef5fa | ||
|
9e898bca06 | ||
|
cab0ad50f0 | ||
|
5ad58e0605 | ||
|
1159e4d928 | ||
|
93c7c6a995 | ||
|
81a5e2355a | ||
|
d2260bafef | ||
|
d1f600601d | ||
|
8b218e1b7d | ||
|
04aeecabcf | ||
|
df57012c50 | ||
|
61cf550d0c | ||
|
f2e0748a22 | ||
|
edf157200d | ||
|
a94297922b | ||
|
894c1c85a5 | ||
|
e129f07047 | ||
|
cf54210f42 | ||
|
b2092de871 | ||
|
6ddf4b241f | ||
|
f3d92dd3b8 | ||
|
1a6860f35c | ||
|
bc0bf4d3d2 | ||
|
1d3bf64f13 | ||
|
c3609785ff | ||
|
66404a669f | ||
|
6a1fd38063 | ||
|
a27971e723 | ||
|
eb8d2941c9 | ||
|
af78268dd5 | ||
|
baca2bfc6b | ||
|
33a2113b71 | ||
|
1f07ab8643 | ||
|
b739bd2632 | ||
|
f76165d848 | ||
|
ac78b74c45 | ||
|
a478bedb12 | ||
|
6d0cd5b00e | ||
|
5b52849f90 | ||
|
20f4677f80 | ||
|
0048e61fc7 | ||
|
aaeba6759e | ||
|
ebac2e4978 | ||
|
5b9f4d4129 | ||
|
b1b6f08926 | ||
|
7e6a761f07 | ||
|
6f7612f73d | ||
|
88ea66053e | ||
|
970f2284d8 | ||
|
baf3ea4beb | ||
|
35e208b447 | ||
|
f8b8b6e53c | ||
|
a955f02771 | ||
|
3fedc68230 | ||
|
335fb78c5c | ||
|
22c4eb86d7 | ||
|
964f9ee3cf | ||
|
bb364d9bc0 | ||
|
51996c54f0 | ||
|
539a1a0b6e | ||
|
8b21b902f2 | ||
|
19107cec4b | ||
|
a537f56766 | ||
|
b5e1a27a7e | ||
|
a9e390b1b1 | ||
|
71582a72a4 | ||
|
e783b0d4a9 | ||
|
700c00f021 | ||
|
9cb14044ec | ||
|
8b6b58a364 | ||
|
e043caac27 | ||
|
0bedb28bdc | ||
|
c10ffda91f | ||
|
5e8ae4fa8a | ||
|
7a7f485640 | ||
|
bbf833bceb | ||
|
8eebb83c2c | ||
|
d702915624 | ||
|
943d5eeddf | ||
|
f3ac6f054f | ||
|
a94af8ea62 | ||
|
6da4853360 | ||
|
b738584832 | ||
|
1cb34ea0d3 | ||
|
662bb9ba77 | ||
|
26e3f96983 | ||
|
cd3244f139 | ||
|
e5310b25d4 | ||
|
80033b84cb | ||
|
cf9bb90ae3 | ||
|
4ccd9f24fb | ||
|
753b36c6ef | ||
|
c00768d6d0 | ||
|
4383f6d80a | ||
|
dc5ca96c0f | ||
|
9d4609e29a | ||
|
df9cc1b84c | ||
|
13a8969824 | ||
|
d7b4260389 | ||
|
2126c240cd | ||
|
0b37c1da57 | ||
|
9527bfffed | ||
|
ba98bf058a | ||
|
c88acf7405 | ||
|
71aea7e571 | ||
|
3d0a3c2c45 | ||
|
9c3e2d0f50 | ||
|
0ddb095273 | ||
|
52b9007fcf | ||
|
e112421db8 | ||
|
ae6fda8638 | ||
|
197c1adcba | ||
|
fe027a96fb | ||
|
637ade3b25 | ||
|
a1443356f1 | ||
|
aa39430e2c | ||
|
8f51dd9513 | ||
|
98e9f4c32e | ||
|
a8340395a3 | ||
|
3641b9891d | ||
|
8e8ca7d9d0 | ||
|
b57773b1cf | ||
|
b559c078bc | ||
|
5c86147ef4 | ||
|
399f3d4e32 | ||
|
173b84c8ff | ||
|
b4c38372d1 | ||
|
4fd0cbebdb | ||
|
ca2d87e5e3 | ||
|
d26dcc8e31 | ||
|
0d516f6da5 | ||
|
2d6aca4563 | ||
|
2e479fcec5 | ||
|
7edc86a9bc | ||
|
9b82de6b24 | ||
|
7198243319 | ||
|
6b8a06e7b4 | ||
|
eb118b2a4c | ||
|
7616496456 | ||
|
89663e0db8 | ||
|
d8db0af1b2 | ||
|
08970e7ba0 | ||
|
d735f5c458 | ||
|
70225e92f7 | ||
|
bfb6a5b5de | ||
|
03dbdfc12f | ||
|
3faddd5e03 | ||
|
7c11b9b689 | ||
|
35d1b67fd4 | ||
|
4c8a98a321 | ||
|
982c60c67c | ||
|
7e134421d5 | ||
|
946a32d793 | ||
|
8eb89c260d | ||
|
796e8a9f24 | ||
|
c66594caf8 | ||
|
06db4ffb17 | ||
|
7f1ffa2a04 | ||
|
38435e9b3e | ||
|
d807cdfe62 | ||
|
318d55252f | ||
|
4d666b88b7 | ||
|
819d2a33c7 | ||
|
c074460f60 | ||
|
f5bb17c82e | ||
|
ccb2a7cbea | ||
|
238a574645 | ||
|
d9bf4fd8a2 | ||
|
54c499ed5b | ||
|
5b7cc76ba3 | ||
|
52f88f8fb4 | ||
|
abd949fea1 | ||
|
f1ece7c56f | ||
|
c67c648c1a | ||
|
723b662604 | ||
|
0f5ff64ae6 | ||
|
e33a8a9b26 | ||
|
b91fbf3f8e | ||
|
4ddb2116bf | ||
|
691e09473e | ||
|
b45c7188c7 | ||
|
a1d265325a | ||
|
1ede2f5b5a | ||
|
b452b61e58 | ||
|
848116b5be | ||
|
5311c939a2 | ||
|
8cada619b3 | ||
|
72b82ef6ed | ||
|
2281bf5b0b | ||
|
5c45c97ff9 | ||
|
975ee15635 | ||
|
fa8c530e10 | ||
|
7d6c14e584 | ||
|
40962c4479 | ||
|
110063aa56 | ||
|
a12058ea37 | ||
|
b89f5278ac | ||
|
0768bd8ce0 | ||
|
dc39eac916 | ||
|
7677ace5ea | ||
|
71a9981430 | ||
|
d8e74a9ff4 | ||
|
3a27603e3d | ||
|
b9d644b777 | ||
|
f9ab0b3042 | ||
|
2035433159 | ||
|
ee025174fb | ||
|
2e47afd48e | ||
|
ebac6b17b0 | ||
|
b4db9aebf2 | ||
|
2e655f73b8 | ||
|
322d7a8287 | ||
|
62792b6b0e | ||
|
2b8610fcc4 | ||
|
2273df4d70 | ||
|
70335a7f4d | ||
|
53da17b925 | ||
|
7b4e2b3c9d | ||
|
34de77d429 | ||
|
41f13456c0 | ||
|
055a58f01e | ||
|
ce553ab995 | ||
|
9dc71e3347 | ||
|
7327c334ca | ||
|
ea649263b7 | ||
|
30bf654d2f | ||
|
63bc0b59bb | ||
|
9bd8c9290b | ||
|
06f3c90cfb | ||
|
d16dce6d99 | ||
|
227926c1fa | ||
|
000a616bd9 | ||
|
2c74ed1a6d | ||
|
9ba6a90193 | ||
|
1b944f3255 | ||
|
81d24dd7fb | ||
|
7197367040 | ||
|
c9b2bd9077 | ||
|
3dd6557332 | ||
|
26d6f9d1c6 | ||
|
9414db4f65 | ||
|
89db2e323a | ||
|
0da25736d9 | ||
|
5f81940e63 | ||
|
2e23a75fac | ||
|
9aed0a14c7 | ||
|
8a3afaf9e6 | ||
|
1adf631725 | ||
|
2a2ee8bc96 | ||
|
025913a734 | ||
|
dccd89b796 | ||
|
c79acdd88d | ||
|
8e8c8fa37a | ||
|
7b8832cebb | ||
|
cdb157f58a | ||
|
e283de9b6d | ||
|
b6e73f0d49 | ||
|
8d19483b7e | ||
|
a94acde519 | ||
|
90bcf49db0 | ||
|
bc5b065abe | ||
|
563c77154e | ||
|
e4e9fb4aed | ||
|
6a0baef239 | ||
|
8b93db0841 | ||
|
9c81dc0dd8 | ||
|
287ce1e56f | ||
|
495e5dadd7 | ||
|
7d64c654cc | ||
|
4cc181e5b8 | ||
|
31cd8120b6 | ||
|
29aed69734 | ||
|
696c0904f8 | ||
|
6e45de760e | ||
|
62d58f669a | ||
|
5f90c9816d | ||
|
0d4c93d1c2 | ||
|
55c1710dd6 | ||
|
9cbefa468a | ||
|
b4ef3cdeff | ||
|
5c50a26b38 | ||
|
40849a8fa8 | ||
|
4e0f78dfa0 | ||
|
aac0e07d1e | ||
|
06c426883f | ||
|
71d4a85957 | ||
|
3846d0c2cd | ||
|
041252ba36 | ||
|
a74d7a0e6b | ||
|
387cf15719 | ||
|
215a099c4f | ||
|
351730d585 | ||
|
83138e0c63 | ||
|
33dde0d06b | ||
|
f96047f182 | ||
|
979c6d9c55 | ||
|
506644b9d6 | ||
|
ffc95eb59b | ||
|
f92f494cab | ||
|
b9c11e71d7 | ||
|
874bfebaf9 | ||
|
7de1bf3746 | ||
|
6f23ee43ae | ||
|
5346ca27b5 | ||
|
b5d6f645bd | ||
|
9ef42040af | ||
|
d9d0fc63ec | ||
|
44097c2a8d | ||
|
fdb7ab47ff | ||
|
5317c00c45 | ||
|
c7f8bc5582 | ||
|
54385a54eb | ||
|
343717e683 | ||
|
8d563d37b4 | ||
|
8c12eb4905 | ||
|
f1c282775d | ||
|
0c3fe272b6 | ||
|
8434d30768 | ||
|
fbf53686c3 | ||
|
794d051f0c | ||
|
3fb48716c5 | ||
|
359a1b3296 | ||
|
a2fd43deab | ||
|
27c280534d | ||
|
e18e30a8cc | ||
|
6fbc54b0c5 | ||
|
49acfe428a | ||
|
aa8df317af | ||
|
2cbf6fbb17 | ||
|
27be16ee31 | ||
|
c96f54f022 | ||
|
d2caf2d386 | ||
|
1cca713e3b | ||
|
976995ba08 | ||
|
07e02a1acf | ||
|
455a0198d9 | ||
|
8f2a5374c3 | ||
|
c961ecb9a4 | ||
|
c6f9fd3b65 | ||
|
3c15398f9e | ||
|
8b116aaa04 | ||
|
cc5ea21f1c | ||
|
286f750c6c | ||
|
d8c9335ef0 | ||
|
cda358443f | ||
|
bf73cb57ca | ||
|
9eb1cd2875 | ||
|
bb8dde8480 | ||
|
5aa80873e2 | ||
|
5215468ff6 | ||
|
68162c29b4 | ||
|
a8e4e11cd5 | ||
|
ab8d1c7d8b | ||
|
1ab9b60a60 | ||
|
c2903a6b9d | ||
|
849d795f0e | ||
|
a40cde7f76 | ||
|
5eb72e9489 | ||
|
6bef34852c | ||
|
691cb43871 | ||
|
f66d03dd48 | ||
|
9b49d94644 | ||
|
78cb48b23c | ||
|
3a6a17c708 | ||
|
3d3dd2d162 | ||
|
99c3eb21b0 | ||
|
bb8cb3ff82 | ||
|
0f6478a928 | ||
|
84e54a52a6 | ||
|
d704c6a3ac | ||
|
9b20bcea0f | ||
|
9c6035f254 | ||
|
a298e4969b | ||
|
bd1cabce86 | ||
|
ad2cbe2b26 | ||
|
e60a816d89 | ||
|
5d0e60a6aa | ||
|
a8848cce43 | ||
|
0e325255f3 | ||
|
21fe65c29c | ||
|
f5ed7c775d | ||
|
f18437e59f | ||
|
b588d6181b | ||
|
c8ff1d744a | ||
|
ae3d50f71f | ||
|
ccb50e7f2c | ||
|
51e252c7ed | ||
|
517e0bc342 | ||
|
812c4fa059 | ||
|
cb82ffbe20 | ||
|
9d5ae8e1c2 | ||
|
06a9f69d88 | ||
|
84eada8c50 | ||
|
016ce6c286 | ||
|
48ee112ceb | ||
|
f261daf2fa | ||
|
0fc177e268 | ||
|
d1171328c9 | ||
|
850e5bf81c | ||
|
6da59d581e | ||
|
9c0fad21db | ||
|
0f250bed89 | ||
|
7cae35024f | ||
|
f298278f37 | ||
|
2238e6c3ef | ||
|
d09f6d97f6 | ||
|
1e6507d792 | ||
|
64062162c6 | ||
|
3b6ffd9c27 | ||
|
f44c95d638 | ||
|
4f715b6718 | ||
|
664562f988 | ||
|
2967068b87 | ||
|
d89a6d491e | ||
|
95c7bac8a6 | ||
|
81bf21283f | ||
|
de1fe7e6e3 | ||
|
35f7f5e3e3 | ||
|
6dabf10009 | ||
|
cb8b72069f | ||
|
a67f205cfe | ||
|
94d0399876 | ||
|
f6320c8de9 | ||
|
a76ef97f15 | ||
|
bb05d8c12a | ||
|
38b8bf12de | ||
|
d04d71e4c9 | ||
|
b9d9ae35e4 | ||
|
bd84dbc8d3 | ||
|
c7e259366d | ||
|
92ad651890 | ||
|
3201943423 | ||
|
7801907288 | ||
|
1ddea27ac8 | ||
|
aa84022704 | ||
|
14924e9db3 | ||
|
a93d7a8d3a | ||
|
0fb792d216 | ||
|
4d684174e0 | ||
|
e14b9f7a25 | ||
|
fd7ada2a9c | ||
|
a2daef2985 | ||
|
e74b2575d7 | ||
|
ae6b7edc25 | ||
|
fbe06234b1 | ||
|
98d3b9c776 | ||
|
4a590d1fcb | ||
|
726964ff20 | ||
|
e5f30fdbf8 | ||
|
9626bdf385 | ||
|
d396944487 | ||
|
c49379442d | ||
|
67c4b87184 | ||
|
ea26f46b0d | ||
|
b05b5b3bd8 | ||
|
1759e2afc2 | ||
|
e24e2a8f8b | ||
|
2c40b2aa72 | ||
|
a427a80446 | ||
|
6f9586a1fe | ||
|
bc6e45ab3b | ||
|
76f8d08d66 | ||
|
3e692eb383 | ||
|
c6153bb32e | ||
|
7d18e36566 | ||
|
6a9d36608f | ||
|
030ecaa83c | ||
|
e5da8897cd | ||
|
b5872ea79e | ||
|
a44c77351b | ||
|
cbd5d1c15c | ||
|
90b418fd1a | ||
|
baecc18d8c | ||
|
30831e6367 | ||
|
fd0430e079 | ||
|
854fe203e8 | ||
|
ed0e9e9593 | ||
|
fd40880127 | ||
|
47c4f31c8d | ||
|
c6fc00bc77 | ||
|
a8d82a2a04 | ||
|
746609f35f | ||
|
9268b7d48e | ||
|
d38098051d | ||
|
d42cc6882f | ||
|
10c7aa402d | ||
|
926d604312 | ||
|
48d5ec5c00 | ||
|
b52ae4388b | ||
|
ddc802d2b4 | ||
|
13f38e0be5 | ||
|
64e7f5929d | ||
|
141471e38f | ||
|
24b54a9b01 | ||
|
401336c5e7 | ||
|
12f84e18dc | ||
|
ec7dc8803f | ||
|
7bcf753a21 | ||
|
6109935b73 | ||
|
31e6b553dc | ||
|
f478e3093f | ||
|
cc5a88a864 | ||
|
14aea56fa1 | ||
|
2ed89b6448 | ||
|
9b5230c60e | ||
|
1579f96397 | ||
|
fc450edd14 | ||
|
e6137d7874 | ||
|
c634c263db | ||
|
a90b0daebe | ||
|
e834f2b049 | ||
|
2726fe66db | ||
|
07a69b7c7b | ||
|
025cd31420 | ||
|
02d1fa2e0f | ||
|
17ad594a62 | ||
|
199671301d | ||
|
f6e3bb54f4 | ||
|
0fedf11be1 | ||
|
22acfe4d41 | ||
|
cb0816c987 | ||
|
6a7d601e42 | ||
|
efc2db4088 | ||
|
58d0705f0f | ||
|
9ba1d68ba3 | ||
|
b0c72c2ea7 | ||
|
5180122506 | ||
|
a51b1cd3cd | ||
|
ce07ef1821 | ||
|
87677be921 | ||
|
e65ca8b907 | ||
|
bf6e4a41d7 | ||
|
ce441237cf | ||
|
2c91bab0c5 | ||
|
ff81fb04b4 | ||
|
6764264488 | ||
|
357025dfdf | ||
|
2b2868f156 | ||
|
2d95b9946f | ||
|
353aaaf665 | ||
|
19d97e4180 | ||
|
355933218d | ||
|
243548afc4 | ||
|
d84b3d9330 | ||
|
edbe7600f5 | ||
|
84d5d62cf5 | ||
|
f71e853054 | ||
|
49c0ed297f | ||
|
bc5bf28333 | ||
|
28188f13f5 | ||
|
fa0cb52a5d | ||
|
88a4759702 | ||
|
3f16cd9c82 | ||
|
8d603032f8 | ||
|
3bb027ac12 | ||
|
f453fddbde | ||
|
b7c1c21019 | ||
|
a2cd03bccb | ||
|
6f6a9357c2 | ||
|
65611e5b51 | ||
|
a6e7a81de9 | ||
|
77ce1c8f14 | ||
|
adcc786ef2 | ||
|
0d955c452b | ||
|
de1374c1b9 | ||
|
3a43475149 | ||
|
4e73ff3978 | ||
|
1cc1c33a15 | ||
|
2223cef4d2 | ||
|
577b4fe4e9 | ||
|
67c143f971 | ||
|
0b80df25c3 | ||
|
46c6e5c4c0 | ||
|
c864bf1b0f | ||
|
44e1f2319f | ||
|
856b3d6c95 | ||
|
b6ff58a9d6 | ||
|
047e238d09 | ||
|
1382035d4d | ||
|
4a9995ab9f | ||
|
564ae346d0 | ||
|
c86c96467a | ||
|
9c695c8324 | ||
|
c800a9e44c | ||
|
46880e8d54 | ||
|
5681e91cf7 | ||
|
3adc278965 | ||
|
a273892744 | ||
|
cd4ef8611c | ||
|
0e347605e1 | ||
|
0af8406e44 | ||
|
f1c2f63aa1 | ||
|
593b0b2d8f | ||
|
ac7285c904 | ||
|
3df43f9505 | ||
|
b5ac9e4946 | ||
|
e31f5727f7 | ||
|
d65f50e512 | ||
|
ff857f0585 | ||
|
ac98458e0b | ||
|
c8a7185444 | ||
|
25ad002e6e | ||
|
db5edf549e | ||
|
c7869ff332 | ||
|
04f201ab34 | ||
|
54a36bc54f | ||
|
62753e882e | ||
|
cdbd72e79c | ||
|
bae1c31406 | ||
|
e3804a4c06 | ||
|
e9c6730866 | ||
|
e04d904b2b | ||
|
327d07d66f | ||
|
2fc7def6f6 | ||
|
f66ba43e0c | ||
|
d35a7a8e23 | ||
|
4e15823db2 | ||
|
afa7f4996f | ||
|
7fa64af3d6 | ||
|
af24f75c18 | ||
|
45a4a56264 | ||
|
8b0a6b9d5e | ||
|
7bbc94d428 | ||
|
d5a4988f9e | ||
|
80fdc3e7c8 | ||
|
95383a3d14 | ||
|
67f1e4111d | ||
|
c01dca4920 | ||
|
2670b951e1 | ||
|
4b04175c5d | ||
|
60d1def6f8 | ||
|
d6356f5e9f | ||
|
d49c946134 | ||
|
cbe1a4f50d | ||
|
de0c9f3071 | ||
|
ad1f0eed22 | ||
|
45ea8340be | ||
|
83913e68f3 | ||
|
6dfb74a8b9 | ||
|
5bd146b569 | ||
|
1079f61260 | ||
|
666787bf4d | ||
|
60235827c5 | ||
|
da3a9bfc96 | ||
|
b7a156f7c8 | ||
|
0126ecb3e2 | ||
|
e8f57d7e3c | ||
|
5a8c6990bf | ||
|
28039d39a1 | ||
|
a515df01db | ||
|
1911c9791e | ||
|
f0fd776fa2 | ||
|
64b502aad3 | ||
|
8dfd9d3445 | ||
|
5a7d80172d | ||
|
219eaabbcf | ||
|
a5d01c0c15 | ||
|
ec96ee4371 | ||
|
90192124cc | ||
|
e8269a9e36 | ||
|
6183b5d76c | ||
|
d4e85e2bb5 | ||
|
7bf0f10305 | ||
|
a2109933f6 | ||
|
80799b1e5d | ||
|
80b8d66017 | ||
|
228f648e3f | ||
|
9fbda04891 | ||
|
8a68c58070 | ||
|
703ef0e6f0 | ||
|
9ad6bc29b5 | ||
|
84844e1b24 | ||
|
e6b59cb5d8 | ||
|
fda121c25c | ||
|
b2057e1b62 | ||
|
54b8af1444 | ||
|
91f52c2fdb | ||
|
7b82883767 | ||
|
6f1c76518c | ||
|
4cc8d43fa1 | ||
|
8a06463c97 | ||
|
e028eb91c0 | ||
|
3b2b9282d3 | ||
|
5a31aa175d | ||
|
4f737c329e | ||
|
3e6fce7553 | ||
|
19617f7edb | ||
|
154181d5f5 | ||
|
853909996b | ||
|
4817b00843 | ||
|
a1b4daa9d4 | ||
|
89410c164a | ||
|
c40871f126 | ||
|
dfd7926681 | ||
|
a941547c1c | ||
|
853acce6c5 | ||
|
855d19a468 | ||
|
4439423313 | ||
|
9f4501aceb | ||
|
cddd447506 | ||
|
dd31ed60c0 | ||
|
647a6f8d82 | ||
|
f85bde3ca3 | ||
|
62236b7257 | ||
|
3e71d68b94 | ||
|
de9d640de4 | ||
|
afed4953bc | ||
|
adac0d193b | ||
|
b8f6e409f6 | ||
|
5241032fc5 | ||
|
3d8555236f | ||
|
b7f0e886d9 | ||
|
324e88d6e0 | ||
|
6d99b5d332 | ||
|
842031a2eb | ||
|
82aedb9900 | ||
|
7325f58763 | ||
|
940ec70f13 | ||
|
e7671d93b2 | ||
|
18ad3bafb6 | ||
|
e6e6f4fbe1 | ||
|
a2f34ea82b | ||
|
6e16081b6a | ||
|
350c9c8d7d | ||
|
edbd6dfe8a | ||
|
63589f4a1b | ||
|
86b775bd8f | ||
|
6a124bc317 | ||
|
48fad3a903 | ||
|
a80e566464 | ||
|
161e6a541b | ||
|
32f8a565f3 | ||
|
700fa6b96a | ||
|
05e28a53e8 | ||
|
c5094ed614 | ||
|
9ff97270cf | ||
|
24086d05bb | ||
|
78b8dfc808 | ||
|
71b8ddb8a9 | ||
|
33e5d16c89 | ||
|
b9d7181a63 | ||
|
8981ca983f | ||
|
b72e60a47f | ||
|
95529a8b1d | ||
|
d21b8fb1b1 | ||
|
7f20d8bb88 | ||
|
3be52f818a | ||
|
49c0766b73 | ||
|
b660adea0f | ||
|
a2f9fef97e | ||
|
39680264b4 | ||
|
3fb1988b5b | ||
|
981ffb5090 | ||
|
3cc559f865 | ||
|
0e2edbb0d2 | ||
|
b3cab3c450 | ||
|
f8eb4b7edc | ||
|
8e3c7674d8 | ||
|
c2d36cde9f | ||
|
e6c479f497 | ||
|
5c58620618 | ||
|
7806206e90 | ||
|
2ddecf35d2 | ||
|
5776bdda82 | ||
|
ff56fdf37d | ||
|
e770fd6e95 | ||
|
996ca25a2e | ||
|
b2531310b4 | ||
|
f8eb9a541d | ||
|
e60e20666e | ||
|
d6b64f6b09 | ||
|
1780f8b5b8 | ||
|
e188f86582 | ||
|
b6f8cc884f | ||
|
fb14bd956a | ||
|
113e0c7331 | ||
|
5a42a80f40 | ||
|
06bc37a67d | ||
|
bd88667247 | ||
|
ebaa225bcb | ||
|
8290423d16 | ||
|
2e3834f880 | ||
|
00c798991c | ||
|
611b186a97 | ||
|
6b2e7b77cc | ||
|
e2adb51494 | ||
|
a1d6396a90 | ||
|
a131f9eb74 | ||
|
2461f67a98 | ||
|
fa67789dcd | ||
|
2539215f18 | ||
|
85e9ba897d | ||
|
935e88a580 | ||
|
75f9c2cc13 | ||
|
8df502a688 | ||
|
8d2e28cf76 | ||
|
aeba818634 | ||
|
7c6d7905a4 | ||
|
e33677b021 | ||
|
10f440cb59 | ||
|
9c08409e0e | ||
|
ddb4135dea | ||
|
52fe6daa53 | ||
|
045d20e076 | ||
|
a841ce6451 | ||
|
50eb634583 | ||
|
0e534f7e61 | ||
|
c1d7ba4d60 | ||
|
251b265777 | ||
|
755393da90 | ||
|
1653ebaa45 | ||
|
9c76120a13 | ||
|
f00c4a4cf5 | ||
|
1265c37bab | ||
|
a6fbc1c9e3 | ||
|
ce16653cc8 | ||
|
6876f1aaa4 | ||
|
6f2bbbcced | ||
|
c38f7b4fa6 | ||
|
b4a6763484 | ||
|
8a67605450 | ||
|
5f1eb7146d | ||
|
e6ef00b41d | ||
|
820c288236 | ||
|
ab6c605e59 | ||
|
fb49ce462f | ||
|
987f910a86 | ||
|
39e0644993 | ||
|
3c1211e9fe | ||
|
26e8b755f0 | ||
|
b3915c23a0 | ||
|
dbd6b8adc3 | ||
|
da908a9ed1 | ||
|
94013c8e00 | ||
|
94d1f695ee | ||
|
54a95e9c58 | ||
|
20139141f7 | ||
|
fdf0825369 | ||
|
3f13e1cc24 | ||
|
f0e3637c7a | ||
|
702af87f0d | ||
|
c557b290af | ||
|
4888a14c12 | ||
|
7e19ed1309 | ||
|
981a4611a4 | ||
|
db0383fe0e | ||
|
62a69e0547 | ||
|
8e54e7cf1a | ||
|
3381a05f7c | ||
|
e4285d574a | ||
|
ecb2541a93 | ||
|
d87fee05a9 | ||
|
e331fac004 | ||
|
1df939469a | ||
|
2696add2fd | ||
|
e68aeedc3d | ||
|
c37dc23481 | ||
|
6f45b402e7 | ||
|
664f5da105 | ||
|
36780040a6 | ||
|
2f5eec3576 | ||
|
7ae0fc7338 | ||
|
8f0aebcd4f | ||
|
a13a230511 | ||
|
21fb9d63f4 | ||
|
182ffa4243 | ||
|
3fa12d43f5 | ||
|
4f058c04e8 | ||
|
2d972f91b2 | ||
|
0c9e7735f6 | ||
|
4efeace8ee | ||
|
1aaec7938f | ||
|
02d6032afb | ||
|
3115529be7 | ||
|
6772e46153 | ||
|
7a8d576164 | ||
|
a89261d397 | ||
|
eca33d2de8 | ||
|
23b67849d5 | ||
|
de3d7cf49f | ||
|
80c9f9abbb | ||
|
8b82a228f0 | ||
|
5055212063 | ||
|
5683f86ed3 | ||
|
d870651df7 | ||
|
c4ac36b9b2 | ||
|
03c002ee2a | ||
|
bf03fb83ae | ||
|
045efe8268 | ||
|
0133ebe0bc | ||
|
8f7ac4d8cc | ||
|
f2ccc8482f | ||
|
2e0ce86c9e | ||
|
652a87f210 | ||
|
33d233fffa | ||
|
1efe80bd10 | ||
|
a4f57e6910 | ||
|
1bb20571b1 | ||
|
1c8461fdea | ||
|
e12ee55faa | ||
|
51d348b087 | ||
|
aced133a3d | ||
|
1032b60d9b | ||
|
ff9c3b0531 | ||
|
a26b466ac8 | ||
|
faf9162dbd | ||
|
860ccf2a41 | ||
|
a576eb633f | ||
|
017631e51b | ||
|
df9e230d63 | ||
|
df83449d21 | ||
|
84c42bf581 | ||
|
1128f5f8ee | ||
|
e97ecdc2b8 | ||
|
316a64961c | ||
|
2ba35cab73 | ||
|
6a77547bde | ||
|
66846836bc | ||
|
2f01046f77 | ||
|
a39e0ea3b1 | ||
|
5d4a3a2d46 | ||
|
f4be733355 | ||
|
f6b543886c | ||
|
e48110bdf4 | ||
|
4135a12cb5 | ||
|
08e508e846 | ||
|
a5fd11c213 | ||
|
1255d82b67 | ||
|
855dc9f0fc | ||
|
88c0288cb1 | ||
|
550cc859b5 | ||
|
69f4aacccf | ||
|
f2d26eb73b | ||
|
2a676858be | ||
|
1e2e9e555a | ||
|
8d6927dc4c | ||
|
41f42d8df3 | ||
|
0ca0aad946 | ||
|
8164e58eab | ||
|
9a6fb16c06 | ||
|
07d2daf2f9 | ||
|
3d9d071262 | ||
|
08e4614817 | ||
|
683fb833f2 | ||
|
7bcfff4e71 | ||
|
a6efc7c1ee | ||
|
21d7c4faa8 | ||
|
9d99755d4f | ||
|
9c2986de41 | ||
|
9394724902 | ||
|
1d5d278f8d | ||
|
09ebfebc91 | ||
|
8f05bb780a | ||
|
f72be7af2d | ||
|
52470d5f60 | ||
|
57da84ba63 | ||
|
b94f21eacd | ||
|
b4ec50ba21 | ||
|
c3673ac9cd | ||
|
967f6500cf | ||
|
a34888804b | ||
|
08f3fdfaec | ||
|
7c578b0579 | ||
|
d88d22080d | ||
|
f6ced5def0 | ||
|
1722701c07 | ||
|
897e473da4 | ||
|
a83f819160 | ||
|
88edf9d62c | ||
|
97d1430ee5 | ||
|
96fa75fb93 | ||
|
f4e727cc19 | ||
|
60282f35fe | ||
|
bd7ee8c315 | ||
|
835efd321e | ||
|
add0deb3c5 | ||
|
910cc9efc1 | ||
|
265b0aa444 | ||
|
662c348b6c | ||
|
ea2584c54d | ||
|
cae4b7aaf7 | ||
|
c4a4b40b2d | ||
|
e79de3107e | ||
|
7444c95132 | ||
|
372c653ec3 | ||
|
485d64ae73 | ||
|
6d65319c85 | ||
|
3090f840a8 | ||
|
8a080146c9 | ||
|
cb44e4408d | ||
|
902cc1eb49 | ||
|
353780e1c9 | ||
|
b80c6f7534 | ||
|
d04071d6b3 | ||
|
31cb3d7a44 | ||
|
8ce81b19be | ||
|
f7aaa37bf2 | ||
|
2b031e4eaf | ||
|
11792682fb | ||
|
e79e991681 | ||
|
9645c1e1b2 | ||
|
0cc6eb3134 | ||
|
a17027783f | ||
|
37861326ce | ||
|
b34ceb89c5 | ||
|
9965ce6938 | ||
|
4918f86622 | ||
|
01b9302a28 | ||
|
fbf24e3ca4 | ||
|
950c032837 | ||
|
841522f59c | ||
|
bf1166d0ee | ||
|
1f375f2511 |
|
@ -1,39 +0,0 @@
|
|||
# Set-up Visual Studio Command Prompt environment for PowerShell
|
||||
pushd "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\"
|
||||
cmd /c "VsDevCmd.bat -arch=x64 & set" | foreach {
|
||||
if ($_ -match "=") {
|
||||
$v = $_.split("="); Set-Item -Force -Path "ENV:\$($v[0])" -Value "$($v[1])"
|
||||
}
|
||||
}
|
||||
popd
|
||||
|
||||
function Which ($search_path, $name) {
|
||||
($search_path).Split(";") | Get-ChildItem -Filter $name | Select -First 1 -Exp FullName
|
||||
}
|
||||
|
||||
function GetDeps ($search_path, $binary) {
|
||||
((dumpbin /dependents $binary).Where({ $_ -match "dependencies:"}, "SkipUntil") | Select-String "[^ ]*\.dll").Matches | foreach {
|
||||
Which $search_path $_.Value
|
||||
}
|
||||
}
|
||||
|
||||
function RecursivelyGetDeps ($search_path, $binary) {
|
||||
$final_deps = @()
|
||||
$deps_to_process = GetDeps $search_path $binary
|
||||
while ($deps_to_process.Count -gt 0) {
|
||||
$current, $deps_to_process = $deps_to_process
|
||||
if ($final_deps -contains $current) { continue }
|
||||
|
||||
# Is this a system dll file?
|
||||
# We use the same algorithm that cmake uses to determine this.
|
||||
if ($current -match "$([regex]::Escape($env:SystemRoot))\\sys") { continue }
|
||||
if ($current -match "$([regex]::Escape($env:WinDir))\\sys") { continue }
|
||||
if ($current -match "\\msvc[^\\]+dll") { continue }
|
||||
if ($current -match "\\api-ms-win-[^\\]+dll") { continue }
|
||||
|
||||
$final_deps += $current
|
||||
$new_deps = GetDeps $search_path $current
|
||||
$deps_to_process += ($new_deps | ?{-not ($final_deps -contains $_)})
|
||||
}
|
||||
return $final_deps
|
||||
}
|
|
@ -1,39 +0,0 @@
|
|||
# Generate pdb files for mingw
|
||||
if ($env:BUILD_TYPE -eq 'mingw') {
|
||||
Invoke-WebRequest -Uri https://raw.githubusercontent.com/citra-emu/ext-windows-bin/master/cv2pdb/cv2pdb.exe -OutFile cv2pdb.exe
|
||||
foreach ($exe in Get-ChildItem "$RELEASE_DIST" -Recurse -Filter "citra*.exe") {
|
||||
.\cv2pdb $exe.FullName
|
||||
}
|
||||
}
|
||||
|
||||
# Specify source locations in pdb via srcsrv.ini
|
||||
$srcsrv = "SRCSRV: ini ------------------------------------------------`r`n"
|
||||
$srcsrv += "VERSION=2`r`n"
|
||||
$srcsrv += "VERCTRL=http`r`n"
|
||||
$srcsrv += "SRCSRV: variables ------------------------------------------`r`n"
|
||||
$srcsrv += "SRCSRVTRG=https://raw.githubusercontent.com/%var2%/%var3%/%var4%`r`n"
|
||||
$srcsrv += "SRCSRV: source files ---------------------------------------`r`n"
|
||||
foreach ($repo in @{
|
||||
"citra-emu/citra" = ""
|
||||
"citra-emu/ext-boost" = "externals/boost"
|
||||
"citra-emu/ext-soundtouch" = "externals/soundtouch"
|
||||
"fmtlib/fmt" = "externals/fmt"
|
||||
"herumi/xbyak" = "externals/xbyak"
|
||||
"lsalzman/enet" = "externals/enet"
|
||||
"MerryMage/dynarmic" = "externals/dynarmic"
|
||||
"neobrain/nihstro" = "externals/nihstro"
|
||||
}.GetEnumerator()) {
|
||||
pushd
|
||||
cd $repo.Value
|
||||
$rev = git rev-parse HEAD
|
||||
$files = git ls-tree --name-only --full-tree -r HEAD
|
||||
foreach ($file in $files) {
|
||||
$srcsrv += "$(pwd)\$($file -replace '/','\')*$($repo.Name)*$rev*$file`r`n"
|
||||
}
|
||||
popd
|
||||
}
|
||||
$srcsrv += "SRCSRV: end ------------------------------------------------`r`n"
|
||||
Set-Content -Path srcsrv.ini -Value $srcsrv
|
||||
foreach ($pdb in Get-ChildItem "$RELEASE_DIST" -Recurse -Filter "*.pdb") {
|
||||
& "C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\srcsrv\pdbstr.exe" -w -i:srcsrv.ini -p:$pdb.FullName -s:srcsrv
|
||||
}
|
22
.ci/android.sh
Executable file
22
.ci/android.sh
Executable file
|
@ -0,0 +1,22 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
export NDK_CCACHE=$(which ccache)
|
||||
[ "$GITHUB_REPOSITORY" = "citra-emu/citra-canary" ] &&
|
||||
BUILD_FLAVOR=canary ||
|
||||
BUILD_FLAVOR=nightly
|
||||
|
||||
if [ ! -z "${ANDROID_KEYSTORE_B64}" ]; then
|
||||
export ANDROID_KEYSTORE_FILE="${GITHUB_WORKSPACE}/ks.jks"
|
||||
base64 --decode <<< "${ANDROID_KEYSTORE_B64}" > "${ANDROID_KEYSTORE_FILE}"
|
||||
fi
|
||||
|
||||
cd src/android
|
||||
chmod +x ./gradlew
|
||||
./gradlew assemble${BUILD_FLAVOR}Release
|
||||
./gradlew bundle${BUILD_FLAVOR}Release
|
||||
|
||||
ccache -s -v
|
||||
|
||||
if [ ! -z "${ANDROID_KEYSTORE_B64}" ]; then
|
||||
rm "${ANDROID_KEYSTORE_FILE}"
|
||||
fi
|
|
@ -1,18 +1,18 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
if grep -nrI '\s$' src *.yml *.txt *.md Doxyfile .gitignore .gitmodules .travis* dist/*.desktop \
|
||||
if grep -nrI '\s$' src *.yml *.txt *.md Doxyfile .gitignore .gitmodules .ci* dist/*.desktop \
|
||||
dist/*.svg dist/*.xml; then
|
||||
echo Trailing whitespace found, aborting
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Default clang-format points to default 3.5 version one
|
||||
CLANG_FORMAT=clang-format-6.0
|
||||
CLANG_FORMAT=clang-format-15
|
||||
$CLANG_FORMAT --version
|
||||
|
||||
if [ "$TRAVIS_EVENT_TYPE" = "pull_request" ]; then
|
||||
if [ "$GITHUB_EVENT_NAME" = "pull_request" ]; then
|
||||
# Get list of every file modified in this pull request
|
||||
files_to_lint="$(git diff --name-only --diff-filter=ACMRTUXB $TRAVIS_COMMIT_RANGE | grep '^src/[^.]*[.]\(cpp\|h\)$' || true)"
|
||||
files_to_lint="$(git diff --name-only --diff-filter=ACMRTUXB $COMMIT_RANGE | grep '^src/[^.]*[.]\(cpp\|h\)$' || true)"
|
||||
else
|
||||
# Check everything for branch pushes
|
||||
files_to_lint="$(find src/ -name '*.cpp' -or -name '*.h')"
|
15
.ci/ios.sh
Executable file
15
.ci/ios.sh
Executable file
|
@ -0,0 +1,15 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
mkdir build && cd build
|
||||
cmake .. -GNinja \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_SYSTEM_NAME=iOS \
|
||||
-DCMAKE_OSX_ARCHITECTURES=arm64 \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
-DENABLE_QT_TRANSLATION=ON \
|
||||
-DCITRA_ENABLE_COMPATIBILITY_REPORTING=ON \
|
||||
-DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON
|
||||
ninja
|
||||
|
||||
ccache -s -v
|
31
.ci/linux.sh
Executable file
31
.ci/linux.sh
Executable file
|
@ -0,0 +1,31 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
if [ "$TARGET" = "appimage" ]; then
|
||||
# Compile the AppImage we distribute with Clang.
|
||||
export EXTRA_CMAKE_FLAGS=(-DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -DCMAKE_LINKER=/etc/bin/ld.lld)
|
||||
else
|
||||
# For the linux-fresh verification target, verify compilation without PCH as well.
|
||||
export EXTRA_CMAKE_FLAGS=(-DCITRA_USE_PRECOMPILED_HEADERS=OFF)
|
||||
fi
|
||||
|
||||
mkdir build && cd build
|
||||
cmake .. -G Ninja \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
"${EXTRA_CMAKE_FLAGS[@]}" \
|
||||
-DENABLE_QT_TRANSLATION=ON \
|
||||
-DCITRA_ENABLE_COMPATIBILITY_REPORTING=ON \
|
||||
-DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON \
|
||||
-DUSE_DISCORD_PRESENCE=ON
|
||||
ninja
|
||||
|
||||
if [ "$TARGET" = "appimage" ]; then
|
||||
ninja bundle
|
||||
# TODO: Our AppImage environment currently uses an older ccache version without the verbose flag.
|
||||
ccache -s
|
||||
else
|
||||
ccache -s -v
|
||||
fi
|
||||
|
||||
ctest -VV -C Release
|
43
.ci/macos-universal.sh
Executable file
43
.ci/macos-universal.sh
Executable file
|
@ -0,0 +1,43 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
ARTIFACTS_LIST=($ARTIFACTS)
|
||||
|
||||
BUNDLE_DIR=build/bundle
|
||||
mkdir build
|
||||
|
||||
# Set up the base artifact to combine into.
|
||||
BASE_ARTIFACT=${ARTIFACTS_LIST[0]}
|
||||
BASE_ARTIFACT_ARCH="${BASE_ARTIFACT##*-}"
|
||||
mv $BASE_ARTIFACT $BUNDLE_DIR
|
||||
|
||||
# Executable binary paths that need to be combined.
|
||||
BIN_PATHS=(citra citra-room citra-qt.app/Contents/MacOS/citra-qt)
|
||||
|
||||
# Dylib paths that need to be combined.
|
||||
IFS=$'\n'
|
||||
DYLIB_PATHS=($(cd $BUNDLE_DIR && find . -name '*.dylib'))
|
||||
unset IFS
|
||||
|
||||
# Combine all of the executable binaries and dylibs.
|
||||
for OTHER_ARTIFACT in "${ARTIFACTS_LIST[@]:1}"; do
|
||||
OTHER_ARTIFACT_ARCH="${OTHER_ARTIFACT##*-}"
|
||||
|
||||
for BIN_PATH in "${BIN_PATHS[@]}"; do
|
||||
lipo -create -output $BUNDLE_DIR/$BIN_PATH $BUNDLE_DIR/$BIN_PATH $OTHER_ARTIFACT/$BIN_PATH
|
||||
done
|
||||
|
||||
for DYLIB_PATH in "${DYLIB_PATHS[@]}"; do
|
||||
# Only merge if the libraries do not have conflicting arches, otherwise it will fail.
|
||||
DYLIB_INFO=`file $BUNDLE_DIR/$DYLIB_PATH`
|
||||
OTHER_DYLIB_INFO=`file $OTHER_ARTIFACT/$DYLIB_PATH`
|
||||
if ! [[ "$DYLIB_INFO" =~ "$OTHER_ARTIFACT_ARCH" ]] && ! [[ "$OTHER_DYLIB_INFO" =~ "$BASE_ARTIFACT_ARCH" ]]; then
|
||||
lipo -create -output $BUNDLE_DIR/$DYLIB_PATH $BUNDLE_DIR/$DYLIB_PATH $OTHER_ARTIFACT/$DYLIB_PATH
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
# Re-sign executables and bundles after combining.
|
||||
APP_PATHS=(citra citra-room citra-qt.app)
|
||||
for APP_PATH in "${APP_PATHS[@]}"; do
|
||||
codesign --deep -fs - $BUNDLE_DIR/$APP_PATH
|
||||
done
|
21
.ci/macos.sh
Executable file
21
.ci/macos.sh
Executable file
|
@ -0,0 +1,21 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
mkdir build && cd build
|
||||
cmake .. -GNinja \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_OSX_ARCHITECTURES="$TARGET" \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
-DENABLE_QT_TRANSLATION=ON \
|
||||
-DCITRA_ENABLE_COMPATIBILITY_REPORTING=ON \
|
||||
-DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON \
|
||||
-DUSE_DISCORD_PRESENCE=ON
|
||||
ninja
|
||||
ninja bundle
|
||||
|
||||
ccache -s -v
|
||||
|
||||
CURRENT_ARCH=`arch`
|
||||
if [ "$TARGET" = "$CURRENT_ARCH" ]; then
|
||||
ctest -VV -C Release
|
||||
fi
|
80
.ci/pack.sh
Executable file
80
.ci/pack.sh
Executable file
|
@ -0,0 +1,80 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
# Determine the full revision name.
|
||||
GITDATE="`git show -s --date=short --format='%ad' | sed 's/-//g'`"
|
||||
GITREV="`git show -s --format='%h'`"
|
||||
REV_NAME="citra-$OS-$TARGET-$GITDATE-$GITREV"
|
||||
|
||||
# Determine the name of the release being built.
|
||||
if [[ "$GITHUB_REF_NAME" =~ ^canary- ]] || [[ "$GITHUB_REF_NAME" =~ ^nightly- ]]; then
|
||||
RELEASE_NAME=$(echo $GITHUB_REF_NAME | cut -d- -f1)
|
||||
else
|
||||
RELEASE_NAME=head
|
||||
fi
|
||||
|
||||
# Archive and upload the artifacts.
|
||||
mkdir artifacts
|
||||
|
||||
function pack_artifacts() {
|
||||
ARTIFACTS_PATH="$1"
|
||||
|
||||
# Set up root directory for archive.
|
||||
mkdir "$REV_NAME"
|
||||
if [ -f "$ARTIFACTS_PATH" ]; then
|
||||
mv "$ARTIFACTS_PATH" "$REV_NAME"
|
||||
|
||||
# Use file extension to differentiate archives.
|
||||
FILENAME=$(basename "$ARTIFACT")
|
||||
EXTENSION="${FILENAME##*.}"
|
||||
ARCHIVE_NAME="$REV_NAME.$EXTENSION"
|
||||
else
|
||||
mv "$ARTIFACTS_PATH"/* "$REV_NAME"
|
||||
|
||||
ARCHIVE_NAME="$REV_NAME"
|
||||
fi
|
||||
|
||||
# Create .zip/.tar.gz
|
||||
if [ "$OS" = "windows" ]; then
|
||||
ARCHIVE_FULL_NAME="$ARCHIVE_NAME.zip"
|
||||
powershell Compress-Archive "$REV_NAME" "$ARCHIVE_FULL_NAME"
|
||||
elif [ "$OS" = "android" ]; then
|
||||
ARCHIVE_FULL_NAME="$ARCHIVE_NAME.zip"
|
||||
zip -r "$ARCHIVE_FULL_NAME" "$REV_NAME"
|
||||
else
|
||||
ARCHIVE_FULL_NAME="$ARCHIVE_NAME.tar.gz"
|
||||
tar czvf "$ARCHIVE_FULL_NAME" "$REV_NAME"
|
||||
fi
|
||||
mv "$ARCHIVE_FULL_NAME" artifacts/
|
||||
|
||||
if [ -z "$SKIP_7Z" ]; then
|
||||
# Create .7z
|
||||
ARCHIVE_FULL_NAME="$ARCHIVE_NAME.7z"
|
||||
mv "$REV_NAME" "$RELEASE_NAME"
|
||||
7z a "$ARCHIVE_FULL_NAME" "$RELEASE_NAME"
|
||||
mv "$ARCHIVE_FULL_NAME" artifacts/
|
||||
|
||||
# Clean up created release artifacts directory.
|
||||
rm -rf "$RELEASE_NAME"
|
||||
else
|
||||
# Clean up created rev artifacts directory.
|
||||
rm -rf "$REV_NAME"
|
||||
fi
|
||||
}
|
||||
|
||||
if [ -n "$UNPACKED" ]; then
|
||||
# Copy the artifacts to be uploaded unpacked.
|
||||
for ARTIFACT in build/bundle/*; do
|
||||
FILENAME=$(basename "$ARTIFACT")
|
||||
EXTENSION="${FILENAME##*.}"
|
||||
|
||||
mv "$ARTIFACT" "artifacts/$REV_NAME.$EXTENSION"
|
||||
done
|
||||
elif [ -n "$PACK_INDIVIDUALLY" ]; then
|
||||
# Pack and upload the artifacts one-by-one.
|
||||
for ARTIFACT in build/bundle/*; do
|
||||
pack_artifacts "$ARTIFACT"
|
||||
done
|
||||
else
|
||||
# Pack all of the artifacts into a single archive.
|
||||
pack_artifacts build/bundle
|
||||
fi
|
20
.ci/source.sh
Executable file
20
.ci/source.sh
Executable file
|
@ -0,0 +1,20 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
GITDATE="`git show -s --date=short --format='%ad' | sed 's/-//g'`"
|
||||
GITREV="`git show -s --format='%h'`"
|
||||
REV_NAME="citra-unified-source-${GITDATE}-${GITREV}"
|
||||
|
||||
COMPAT_LIST='dist/compatibility_list/compatibility_list.json'
|
||||
|
||||
mkdir artifacts
|
||||
|
||||
pip3 install git-archive-all
|
||||
wget -q https://api.citra-emu.org/gamedb -O "${COMPAT_LIST}"
|
||||
git describe --abbrev=0 --always HEAD > GIT-COMMIT
|
||||
git describe --tags HEAD > GIT-TAG || echo 'unknown' > GIT-TAG
|
||||
git archive-all --include "${COMPAT_LIST}" --include GIT-COMMIT --include GIT-TAG --force-submodules artifacts/"${REV_NAME}.tar"
|
||||
|
||||
cd artifacts/
|
||||
xz -T0 -9 "${REV_NAME}.tar"
|
||||
sha256sum "${REV_NAME}.tar.xz" > "${REV_NAME}.tar.xz.sha256sum"
|
||||
cd ..
|
14
.ci/transifex.sh
Executable file
14
.ci/transifex.sh
Executable file
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
echo -e "\e[1m\e[33mBuild tools information:\e[0m"
|
||||
cmake --version
|
||||
gcc -v
|
||||
tx --version
|
||||
|
||||
mkdir build && cd build
|
||||
cmake .. -DENABLE_QT_TRANSLATION=ON -DGENERATE_QT_TRANSLATION=ON -DCMAKE_BUILD_TYPE=Release -DENABLE_SDL2=OFF
|
||||
make translation
|
||||
cd ..
|
||||
|
||||
cd dist/languages
|
||||
tx push -s
|
17
.ci/windows.sh
Normal file
17
.ci/windows.sh
Normal file
|
@ -0,0 +1,17 @@
|
|||
#!/bin/sh -ex
|
||||
|
||||
mkdir build && cd build
|
||||
cmake .. -G Ninja \
|
||||
-DCMAKE_BUILD_TYPE=Release \
|
||||
-DCMAKE_C_COMPILER_LAUNCHER=ccache \
|
||||
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
|
||||
-DENABLE_QT_TRANSLATION=ON \
|
||||
-DCITRA_ENABLE_COMPATIBILITY_REPORTING=ON \
|
||||
-DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON \
|
||||
-DUSE_DISCORD_PRESENCE=ON
|
||||
ninja
|
||||
ninja bundle
|
||||
|
||||
ccache -s -v
|
||||
|
||||
ctest -VV -C Release || echo "::error ::Test error occurred on Windows build"
|
26
.github/ISSUE_TEMPLATE.md
vendored
26
.github/ISSUE_TEMPLATE.md
vendored
|
@ -1,26 +0,0 @@
|
|||
<!---
|
||||
|
||||
Please read the FAQ:
|
||||
https://citra-emu.org/wiki/faq/
|
||||
|
||||
THIS IS NOT A SUPPORT FORUM, FOR SUPPORT GO TO:
|
||||
https://community.citra-emu.org/
|
||||
|
||||
If the FAQ does not answer your question, please go to:
|
||||
https://community.citra-emu.org/
|
||||
|
||||
====================================================
|
||||
|
||||
When submitting an issue, please check the following:
|
||||
|
||||
- You have read the above.
|
||||
- You have provided the version (commit hash) of Citra you are using.
|
||||
- You have provided sufficient detail for the issue to be reproduced.
|
||||
- You have provided system specs (if relevant).
|
||||
- Please also provide:
|
||||
- For any issues, a log file
|
||||
- For crashes, a backtrace.
|
||||
- For graphical issues, comparison screenshots with real hardware.
|
||||
- For emulation inaccuracies, a test-case (if able).
|
||||
|
||||
--->
|
10
.github/ISSUE_TEMPLATE/blank_issue_template.yml
vendored
Normal file
10
.github/ISSUE_TEMPLATE/blank_issue_template.yml
vendored
Normal file
|
@ -0,0 +1,10 @@
|
|||
name: New Issue (Developers Only)
|
||||
description: A blank issue template for developers only. If you are not a developer, do not use this issue template. Your issue WILL BE CLOSED if you do not use the appropriate issue template.
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
**If you are not a developer, do not use this issue template. Your issue WILL BE CLOSED if you do not use the appropriate issue template.**
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: "Issue"
|
64
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
64
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
|
@ -0,0 +1,64 @@
|
|||
name: Bug Report
|
||||
description: File a bug report
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: Tech support does not belong here. You should only file an issue here if you think you have experienced an actual bug with Citra.
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Is there an existing issue for this?
|
||||
description: Please search to see if an issue already exists for the bug you encountered.
|
||||
options:
|
||||
- label: I have searched the existing issues
|
||||
required: true
|
||||
- type: input
|
||||
attributes:
|
||||
label: Affected Build(s)
|
||||
description: List the affected build(s) that this issue applies to.
|
||||
placeholder: Nightly 1234 / Canary 1234
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: issue-desc
|
||||
attributes:
|
||||
label: Description of Issue
|
||||
description: A brief description of the issue encountered along with any images and/or videos.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: expected-behavior
|
||||
attributes:
|
||||
label: Expected Behavior
|
||||
description: A brief description of how it is expected to work along with any images and/or videos.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: reproduction-steps
|
||||
attributes:
|
||||
label: Reproduction Steps
|
||||
description: A brief explanation of how to reproduce this issue. If possible, provide a save file to aid in reproducing the issue.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: log
|
||||
attributes:
|
||||
label: Log File
|
||||
description: A log file will help our developers to better diagnose and fix the issue. Instructions can be found [here](https://community.citra-emu.org/t/how-to-upload-the-log-file/296).
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: system-config
|
||||
attributes:
|
||||
label: System Configuration
|
||||
placeholder: |
|
||||
CPU: Intel i5-10400 / AMD Ryzen 5 3600
|
||||
GPU/Driver: NVIDIA GeForce GTX 1060 (Driver 512.95)
|
||||
RAM: 16GB DDR4-3200
|
||||
OS: Windows 11 22H2 (Build 22621.819)
|
||||
value: |
|
||||
CPU:
|
||||
GPU/Driver:
|
||||
RAM:
|
||||
OS:
|
||||
validations:
|
||||
required: true
|
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
|
@ -0,0 +1,8 @@
|
|||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Citra Discord
|
||||
url: https://citra-emu.org/discord/
|
||||
about: If you are experiencing an issue with Citra, and you need tech support, or if you have a general question, try asking in the official Citra Discord linked here. Piracy is not allowed.
|
||||
- name: Community forums
|
||||
url: https://community.citra-emu.org
|
||||
about: This is an alternative place for tech support, however helpers there are not as active.
|
28
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
28
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
|
@ -0,0 +1,28 @@
|
|||
name: Feature Request
|
||||
description: File a feature request
|
||||
labels: "request"
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: Tech support does not belong here. You should only file an issue here if you are requesting a feature you believe would make Citra better.
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Is there an existing issue for this?
|
||||
description: Please search to see if an issue already exists for the feature you are requesting.
|
||||
options:
|
||||
- label: I have searched the existing issues
|
||||
required: true
|
||||
- type: textarea
|
||||
id: what-feature
|
||||
attributes:
|
||||
label: What feature are you suggesting?
|
||||
description: A brief description of the requested feature.
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: why-feature
|
||||
attributes:
|
||||
label: Why would this feature be useful?
|
||||
description: A brief description of why this feature would make Citra better.
|
||||
validations:
|
||||
required: true
|
270
.github/workflows/build.yml
vendored
Normal file
270
.github/workflows/build.yml
vendored
Normal file
|
@ -0,0 +1,270 @@
|
|||
name: citra-build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "*" ]
|
||||
tags: [ "*" ]
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
source:
|
||||
if: ${{ !github.head_ref }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Pack
|
||||
run: ./.ci/source.sh
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: source
|
||||
path: artifacts/
|
||||
linux:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
target: ["appimage", "fresh"]
|
||||
container:
|
||||
image: citraemu/build-environments:linux-${{ matrix.target }}
|
||||
options: -u 1001
|
||||
env:
|
||||
CCACHE_DIR: ${{ github.workspace }}/.ccache
|
||||
CCACHE_COMPILERCHECK: content
|
||||
CCACHE_SLOPPINESS: time_macros
|
||||
OS: linux
|
||||
TARGET: ${{ matrix.target }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Set up cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ env.CCACHE_DIR }}
|
||||
key: ${{ runner.os }}-${{ matrix.target }}-${{ github.sha }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-${{ matrix.target }}-
|
||||
- name: Build
|
||||
run: ./.ci/linux.sh
|
||||
- name: Pack
|
||||
run: ./.ci/pack.sh
|
||||
if: ${{ matrix.target == 'appimage' }}
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
if: ${{ matrix.target == 'appimage' }}
|
||||
with:
|
||||
name: ${{ env.OS }}-${{ env.TARGET }}
|
||||
path: artifacts/
|
||||
macos:
|
||||
runs-on: ${{ (matrix.target == 'x86_64' && 'macos-13') || 'macos-14' }}
|
||||
strategy:
|
||||
matrix:
|
||||
target: ["x86_64", "arm64"]
|
||||
env:
|
||||
CCACHE_DIR: ${{ github.workspace }}/.ccache
|
||||
CCACHE_COMPILERCHECK: content
|
||||
CCACHE_SLOPPINESS: time_macros
|
||||
OS: macos
|
||||
TARGET: ${{ matrix.target }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Set up cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ env.CCACHE_DIR }}
|
||||
key: ${{ runner.os }}-${{ matrix.target }}-${{ github.sha }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-${{ matrix.target }}-
|
||||
- name: Install tools
|
||||
run: brew install ccache ninja
|
||||
- name: Build
|
||||
run: ./.ci/macos.sh
|
||||
- name: Prepare outputs for caching
|
||||
run: mv build/bundle $OS-$TARGET
|
||||
- name: Cache outputs for universal build
|
||||
uses: actions/cache/save@v4
|
||||
with:
|
||||
path: ${{ env.OS }}-${{ env.TARGET }}
|
||||
key: ${{ runner.os }}-${{ matrix.target }}-${{ github.sha }}-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
macos-universal:
|
||||
runs-on: macos-14
|
||||
needs: macos
|
||||
env:
|
||||
OS: macos
|
||||
TARGET: universal
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Download x86_64 build from cache
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: ${{ env.OS }}-x86_64
|
||||
key: ${{ runner.os }}-x86_64-${{ github.sha }}-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
fail-on-cache-miss: true
|
||||
- name: Download ARM64 build from cache
|
||||
uses: actions/cache/restore@v4
|
||||
with:
|
||||
path: ${{ env.OS }}-arm64
|
||||
key: ${{ runner.os }}-arm64-${{ github.sha }}-${{ github.run_id }}-${{ github.run_attempt }}
|
||||
fail-on-cache-miss: true
|
||||
- name: Create universal app
|
||||
run: ./.ci/macos-universal.sh
|
||||
env:
|
||||
ARTIFACTS: ${{ env.OS }}-x86_64 ${{ env.OS }}-arm64
|
||||
- name: Pack
|
||||
run: ./.ci/pack.sh
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ env.OS }}-${{ env.TARGET }}
|
||||
path: artifacts/
|
||||
windows:
|
||||
runs-on: windows-latest
|
||||
strategy:
|
||||
matrix:
|
||||
target: ["msvc", "msys2"]
|
||||
defaults:
|
||||
run:
|
||||
shell: ${{ (matrix.target == 'msys2' && 'msys2') || 'bash' }} {0}
|
||||
env:
|
||||
CCACHE_DIR: ${{ github.workspace }}/.ccache
|
||||
CCACHE_COMPILERCHECK: content
|
||||
CCACHE_SLOPPINESS: time_macros
|
||||
OS: windows
|
||||
TARGET: ${{ matrix.target }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Set up cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ env.CCACHE_DIR }}
|
||||
key: ${{ runner.os }}-${{ matrix.target }}-${{ github.sha }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-${{ matrix.target }}-
|
||||
- name: Set up MSVC
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
if: ${{ matrix.target == 'msvc' }}
|
||||
- name: Install extra tools (MSVC)
|
||||
run: choco install ccache ninja wget
|
||||
if: ${{ matrix.target == 'msvc' }}
|
||||
- name: Set up MSYS2
|
||||
uses: msys2/setup-msys2@v2
|
||||
if: ${{ matrix.target == 'msys2' }}
|
||||
with:
|
||||
msystem: clang64
|
||||
update: true
|
||||
install: git make p7zip
|
||||
pacboy: >-
|
||||
toolchain:p ccache:p cmake:p ninja:p
|
||||
qt6-base:p qt6-multimedia:p qt6-multimedia-wmf:p qt6-tools:p qt6-translations:p
|
||||
- name: Disable line ending translation
|
||||
run: git config --global core.autocrlf input
|
||||
- name: Build
|
||||
run: ./.ci/windows.sh
|
||||
- name: Pack
|
||||
run: ./.ci/pack.sh
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ env.OS }}-${{ env.TARGET }}
|
||||
path: artifacts/
|
||||
android:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
CCACHE_DIR: ${{ github.workspace }}/.ccache
|
||||
CCACHE_COMPILERCHECK: content
|
||||
CCACHE_SLOPPINESS: time_macros
|
||||
OS: android
|
||||
TARGET: universal
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Set up cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: |
|
||||
~/.gradle/caches
|
||||
~/.gradle/wrapper
|
||||
${{ env.CCACHE_DIR }}
|
||||
key: ${{ runner.os }}-android-${{ github.sha }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-android-
|
||||
- name: Set tag name
|
||||
run: |
|
||||
if [[ "$GITHUB_REF_NAME" =~ ^canary- ]] || [[ "$GITHUB_REF_NAME" =~ ^nightly- ]]; then
|
||||
echo "GIT_TAG_NAME=$GITHUB_REF_NAME" >> $GITHUB_ENV
|
||||
fi
|
||||
echo $GIT_TAG_NAME
|
||||
- name: Deps
|
||||
run: |
|
||||
sudo add-apt-repository -y ppa:theofficialgman/gpu-tools
|
||||
sudo apt-get update -y
|
||||
sudo apt-get install ccache apksigner -y
|
||||
- name: Build
|
||||
run: JAVA_HOME=$JAVA_HOME_17_X64 ./.ci/android.sh
|
||||
env:
|
||||
ANDROID_KEYSTORE_B64: ${{ secrets.ANDROID_KEYSTORE_B64 }}
|
||||
ANDROID_KEY_ALIAS: ${{ secrets.ANDROID_KEY_ALIAS }}
|
||||
ANDROID_KEYSTORE_PASS: ${{ secrets.ANDROID_KEYSTORE_PASS }}
|
||||
- name: Pack
|
||||
run: ../../../.ci/pack.sh
|
||||
working-directory: src/android/app
|
||||
env:
|
||||
UNPACKED: 1
|
||||
- name: Upload
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ env.OS }}-${{ env.TARGET }}
|
||||
path: src/android/app/artifacts/
|
||||
ios:
|
||||
runs-on: macos-14
|
||||
if: ${{ !startsWith(github.ref, 'refs/tags/') }}
|
||||
env:
|
||||
CCACHE_DIR: ${{ github.workspace }}/.ccache
|
||||
CCACHE_COMPILERCHECK: content
|
||||
CCACHE_SLOPPINESS: time_macros
|
||||
OS: ios
|
||||
TARGET: arm64
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
- name: Set up cache
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ env.CCACHE_DIR }}
|
||||
key: ${{ runner.os }}-ios-${{ github.sha }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-ios-
|
||||
- name: Install tools
|
||||
run: brew install ccache ninja
|
||||
- name: Build
|
||||
run: ./.ci/ios.sh
|
||||
release:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [windows, linux, macos-universal, android, source]
|
||||
if: ${{ startsWith(github.ref, 'refs/tags/') }}
|
||||
steps:
|
||||
- uses: actions/download-artifact@v4
|
||||
- name: Create release
|
||||
uses: actions/create-release@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag_name: ${{ github.ref_name }}
|
||||
release_name: ${{ github.ref_name }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
- name: Upload artifacts
|
||||
uses: alexellis/upload-assets@0.4.0
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
asset_paths: '["./**/*.tar.*","./**/*.AppImage","./**/*.7z","./**/*.zip","./**/*.apk","./**/*.aab"]'
|
212
.github/workflows/ci-merge.js
vendored
Normal file
212
.github/workflows/ci-merge.js
vendored
Normal file
|
@ -0,0 +1,212 @@
|
|||
// Note: This is a GitHub Actions script
|
||||
// It is not meant to be executed directly on your machine without modifications
|
||||
|
||||
const fs = require("fs");
|
||||
// how far back in time should we consider the changes are "recent"? (default: 24 hours)
|
||||
const DETECTION_TIME_FRAME = (parseInt(process.env.DETECTION_TIME_FRAME)) || (24 * 3600 * 1000);
|
||||
|
||||
async function checkBaseChanges(github, context) {
|
||||
// query the commit date of the latest commit on this branch
|
||||
const query = `query($owner:String!, $name:String!, $ref:String!) {
|
||||
repository(name:$name, owner:$owner) {
|
||||
ref(qualifiedName:$ref) {
|
||||
target {
|
||||
... on Commit { id committedDate oid }
|
||||
}
|
||||
}
|
||||
}
|
||||
}`;
|
||||
const variables = {
|
||||
owner: context.repo.owner,
|
||||
name: context.repo.repo,
|
||||
ref: 'refs/heads/master',
|
||||
};
|
||||
const result = await github.graphql(query, variables);
|
||||
const committedAt = result.repository.ref.target.committedDate;
|
||||
console.log(`Last commit committed at ${committedAt}.`);
|
||||
const delta = new Date() - new Date(committedAt);
|
||||
if (delta <= DETECTION_TIME_FRAME) {
|
||||
console.info('New changes detected, triggering a new build.');
|
||||
return true;
|
||||
}
|
||||
console.info('No new changes detected.');
|
||||
return false;
|
||||
}
|
||||
|
||||
async function checkCanaryChanges(github, context) {
|
||||
if (checkBaseChanges(github, context)) return true;
|
||||
const query = `query($owner:String!, $name:String!, $label:String!) {
|
||||
repository(name:$name, owner:$owner) {
|
||||
pullRequests(labels: [$label], states: OPEN, first: 100) {
|
||||
nodes { number headRepository { pushedAt } }
|
||||
}
|
||||
}
|
||||
}`;
|
||||
const variables = {
|
||||
owner: context.repo.owner,
|
||||
name: context.repo.repo,
|
||||
label: "canary-merge",
|
||||
};
|
||||
const result = await github.graphql(query, variables);
|
||||
const pulls = result.repository.pullRequests.nodes;
|
||||
for (let i = 0; i < pulls.length; i++) {
|
||||
let pull = pulls[i];
|
||||
if (new Date() - new Date(pull.headRepository.pushedAt) <= DETECTION_TIME_FRAME) {
|
||||
console.info(`${pull.number} updated at ${pull.headRepository.pushedAt}`);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
console.info("No changes detected in any tagged pull requests.");
|
||||
return false;
|
||||
}
|
||||
|
||||
async function tagAndPush(github, owner, repo, execa, commit=false) {
|
||||
let altToken = process.env.ALT_GITHUB_TOKEN;
|
||||
if (!altToken) {
|
||||
throw `Please set ALT_GITHUB_TOKEN environment variable. This token should have write access to ${owner}/${repo}.`;
|
||||
}
|
||||
const query = `query ($owner:String!, $name:String!) {
|
||||
repository(name:$name, owner:$owner) {
|
||||
refs(refPrefix: "refs/tags/", orderBy: {field: TAG_COMMIT_DATE, direction: DESC}, first: 10) {
|
||||
nodes { name }
|
||||
}
|
||||
}
|
||||
}`;
|
||||
const variables = {
|
||||
owner: owner,
|
||||
name: repo,
|
||||
};
|
||||
const tags = await github.graphql(query, variables);
|
||||
let lastTag = tags.repository.refs.nodes[0].name;
|
||||
let tagNumber = /\w+-(\d+)/.exec(lastTag)[1] | 0;
|
||||
let channel = repo.split('-')[1];
|
||||
let newTag = `${channel}-${tagNumber + 1}`;
|
||||
console.log(`New tag: ${newTag}`);
|
||||
if (commit) {
|
||||
let channelName = channel[0].toUpperCase() + channel.slice(1);
|
||||
console.info(`Committing pending commit as ${channelName} #${tagNumber + 1}`);
|
||||
await execa("git", ['commit', '-m', `${channelName} #${tagNumber + 1}`]);
|
||||
}
|
||||
console.info('Pushing tags to GitHub ...');
|
||||
await execa("git", ['tag', newTag]);
|
||||
await execa("git", ['remote', 'add', 'target', `https://${altToken}@github.com/${owner}/${repo}.git`]);
|
||||
await execa("git", ['push', 'target', 'master', '-f']);
|
||||
await execa("git", ['push', 'target', 'master', '-f', '--tags']);
|
||||
console.info('Successfully pushed new changes.');
|
||||
}
|
||||
|
||||
async function generateReadme(pulls, context, mergeResults, execa) {
|
||||
let baseUrl = `https://github.com/${context.repo.owner}/${context.repo.repo}/`;
|
||||
let output =
|
||||
"| Pull Request | Commit | Title | Author | Merged? |\n|----|----|----|----|----|\n";
|
||||
for (let pull of pulls) {
|
||||
let pr = pull.number;
|
||||
let result = mergeResults[pr];
|
||||
output += `| [${pr}](${baseUrl}/pull/${pr}) | [\`${result.rev || "N/A"}\`](${baseUrl}/pull/${pr}/files) | ${pull.title} | [${pull.author.login}](https://github.com/${pull.author.login}/) | ${result.success ? "Yes" : "No"} |\n`;
|
||||
}
|
||||
output +=
|
||||
"\n\nEnd of merge log. You can find the original README.md below the break.\n\n-----\n\n";
|
||||
output += fs.readFileSync("./README.md");
|
||||
fs.writeFileSync("./README.md", output);
|
||||
await execa("git", ["add", "README.md"]);
|
||||
}
|
||||
|
||||
async function fetchPullRequests(pulls, repoUrl, execa) {
|
||||
console.log("::group::Fetch pull requests");
|
||||
for (let pull of pulls) {
|
||||
let pr = pull.number;
|
||||
console.info(`Fetching PR ${pr} ...`);
|
||||
await execa("git", [
|
||||
"fetch",
|
||||
"-f",
|
||||
"--no-recurse-submodules",
|
||||
repoUrl,
|
||||
`pull/${pr}/head:pr-${pr}`,
|
||||
]);
|
||||
}
|
||||
console.log("::endgroup::");
|
||||
}
|
||||
|
||||
async function mergePullRequests(pulls, execa) {
|
||||
let mergeResults = {};
|
||||
console.log("::group::Merge pull requests");
|
||||
await execa("git", ["config", "--global", "user.name", "citrabot"]);
|
||||
await execa("git", [
|
||||
"config",
|
||||
"--global",
|
||||
"user.email",
|
||||
"citra\x40citra-emu\x2eorg", // prevent email harvesters from scraping the address
|
||||
]);
|
||||
let hasFailed = false;
|
||||
for (let pull of pulls) {
|
||||
let pr = pull.number;
|
||||
console.info(`Merging PR ${pr} ...`);
|
||||
try {
|
||||
const process1 = execa("git", [
|
||||
"merge",
|
||||
"--squash",
|
||||
"--no-edit",
|
||||
`pr-${pr}`,
|
||||
]);
|
||||
process1.stdout.pipe(process.stdout);
|
||||
await process1;
|
||||
|
||||
const process2 = execa("git", ["commit", "-m", `Merge PR ${pr}`]);
|
||||
process2.stdout.pipe(process.stdout);
|
||||
await process2;
|
||||
|
||||
const process3 = await execa("git", ["rev-parse", "--short", `pr-${pr}`]);
|
||||
mergeResults[pr] = {
|
||||
success: true,
|
||||
rev: process3.stdout,
|
||||
};
|
||||
} catch (err) {
|
||||
console.log(
|
||||
`::error title=#${pr} not merged::Failed to merge pull request: ${pr}: ${err}`
|
||||
);
|
||||
mergeResults[pr] = { success: false };
|
||||
hasFailed = true;
|
||||
await execa("git", ["reset", "--hard"]);
|
||||
}
|
||||
}
|
||||
console.log("::endgroup::");
|
||||
if (hasFailed) {
|
||||
throw 'There are merge failures. Aborting!';
|
||||
}
|
||||
return mergeResults;
|
||||
}
|
||||
|
||||
async function mergebot(github, context, execa) {
|
||||
const query = `query ($owner:String!, $name:String!, $label:String!) {
|
||||
repository(name:$name, owner:$owner) {
|
||||
pullRequests(labels: [$label], states: OPEN, first: 100) {
|
||||
nodes {
|
||||
number title author { login }
|
||||
}
|
||||
}
|
||||
}
|
||||
}`;
|
||||
const variables = {
|
||||
owner: context.repo.owner,
|
||||
name: context.repo.repo,
|
||||
label: "canary-merge",
|
||||
};
|
||||
const result = await github.graphql(query, variables);
|
||||
const pulls = result.repository.pullRequests.nodes;
|
||||
let displayList = [];
|
||||
for (let i = 0; i < pulls.length; i++) {
|
||||
let pull = pulls[i];
|
||||
displayList.push({ PR: pull.number, Title: pull.title });
|
||||
}
|
||||
console.info("The following pull requests will be merged:");
|
||||
console.table(displayList);
|
||||
await fetchPullRequests(pulls, "https://github.com/citra-emu/citra", execa);
|
||||
const mergeResults = await mergePullRequests(pulls, execa);
|
||||
await generateReadme(pulls, context, mergeResults, execa);
|
||||
await tagAndPush(github, context.repo.owner, `${context.repo.repo}-canary`, execa, true);
|
||||
}
|
||||
|
||||
module.exports.mergebot = mergebot;
|
||||
module.exports.checkCanaryChanges = checkCanaryChanges;
|
||||
module.exports.tagAndPush = tagAndPush;
|
||||
module.exports.checkBaseChanges = checkBaseChanges;
|
22
.github/workflows/format.yml
vendored
Normal file
22
.github/workflows/format.yml
vendored
Normal file
|
@ -0,0 +1,22 @@
|
|||
name: citra-format
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "*" ]
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
clang-format:
|
||||
runs-on: ubuntu-latest
|
||||
container:
|
||||
image: citraemu/build-environments:linux-fresh
|
||||
options: -u 1001
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Build
|
||||
env:
|
||||
COMMIT_RANGE: ${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }}
|
||||
run: ./.ci/clang-format.sh
|
100
.github/workflows/publish.yml
vendored
Normal file
100
.github/workflows/publish.yml
vendored
Normal file
|
@ -0,0 +1,100 @@
|
|||
name: citra-publish
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '7 0 * * *'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
nightly:
|
||||
description: 'Whether to trigger a nightly build (true/false/auto)'
|
||||
required: false
|
||||
default: 'true'
|
||||
canary:
|
||||
description: 'Whether to trigger a canary build (true/false/auto)'
|
||||
required: false
|
||||
default: 'true'
|
||||
|
||||
jobs:
|
||||
nightly:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.event.inputs.nightly != 'false' && github.repository == 'citra-emu/citra' }}
|
||||
steps:
|
||||
# this checkout is required to make sure the GitHub Actions scripts are available
|
||||
- uses: actions/checkout@v4
|
||||
name: Pre-checkout
|
||||
with:
|
||||
submodules: false
|
||||
- uses: actions/github-script@v7
|
||||
id: check-changes
|
||||
name: 'Check for new changes'
|
||||
env:
|
||||
# 24 hours
|
||||
DETECTION_TIME_FRAME: 86400000
|
||||
with:
|
||||
result-encoding: string
|
||||
script: |
|
||||
if (context.payload.inputs && context.payload.inputs.nightly === 'true') return true;
|
||||
const checkBaseChanges = require('./.github/workflows/ci-merge.js').checkBaseChanges;
|
||||
return checkBaseChanges(github, context);
|
||||
- run: npm install execa@5
|
||||
if: ${{ steps.check-changes.outputs.result == 'true' }}
|
||||
- uses: actions/checkout@v4
|
||||
name: Checkout
|
||||
if: ${{ steps.check-changes.outputs.result == 'true' }}
|
||||
with:
|
||||
path: 'citra-merge'
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
token: ${{ secrets.ALT_GITHUB_TOKEN }}
|
||||
- uses: actions/github-script@v7
|
||||
name: 'Update and tag new commits'
|
||||
if: ${{ steps.check-changes.outputs.result == 'true' }}
|
||||
env:
|
||||
ALT_GITHUB_TOKEN: ${{ secrets.ALT_GITHUB_TOKEN }}
|
||||
with:
|
||||
script: |
|
||||
const execa = require("execa");
|
||||
const tagAndPush = require('./.github/workflows/ci-merge.js').tagAndPush;
|
||||
process.chdir('${{ github.workspace }}/citra-merge');
|
||||
tagAndPush(github, context.repo.owner, `${context.repo.repo}-nightly`, execa);
|
||||
canary:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.event.inputs.canary != 'false' && github.repository == 'citra-emu/citra' }}
|
||||
steps:
|
||||
# this checkout is required to make sure the GitHub Actions scripts are available
|
||||
- uses: actions/checkout@v4
|
||||
name: Pre-checkout
|
||||
with:
|
||||
submodules: false
|
||||
- uses: actions/github-script@v7
|
||||
id: check-changes
|
||||
name: 'Check for new changes'
|
||||
env:
|
||||
# 24 hours
|
||||
DETECTION_TIME_FRAME: 86400000
|
||||
with:
|
||||
script: |
|
||||
if (context.payload.inputs && context.payload.inputs.canary === 'true') return true;
|
||||
const checkCanaryChanges = require('./.github/workflows/ci-merge.js').checkCanaryChanges;
|
||||
return checkCanaryChanges(github, context);
|
||||
- run: npm install execa@5
|
||||
if: ${{ steps.check-changes.outputs.result == 'true' }}
|
||||
- uses: actions/checkout@v4
|
||||
name: Checkout
|
||||
if: ${{ steps.check-changes.outputs.result == 'true' }}
|
||||
with:
|
||||
path: 'citra-merge'
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
token: ${{ secrets.ALT_GITHUB_TOKEN }}
|
||||
- uses: actions/github-script@v7
|
||||
name: 'Check and merge canary changes'
|
||||
if: ${{ steps.check-changes.outputs.result == 'true' }}
|
||||
env:
|
||||
ALT_GITHUB_TOKEN: ${{ secrets.ALT_GITHUB_TOKEN }}
|
||||
with:
|
||||
script: |
|
||||
const execa = require("execa");
|
||||
const mergebot = require('./.github/workflows/ci-merge.js').mergebot;
|
||||
process.chdir('${{ github.workspace }}/citra-merge');
|
||||
mergebot(github, context, execa);
|
20
.github/workflows/transifex.yml
vendored
Normal file
20
.github/workflows/transifex.yml
vendored
Normal file
|
@ -0,0 +1,20 @@
|
|||
name: citra-transifex
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
|
||||
jobs:
|
||||
transifex:
|
||||
runs-on: ubuntu-latest
|
||||
container: citraemu/build-environments:linux-fresh
|
||||
if: ${{ github.repository == 'citra-emu/citra' }}
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
fetch-depth: 0
|
||||
- name: Update Translation
|
||||
run: ./.ci/transifex.sh
|
||||
env:
|
||||
TX_TOKEN: ${{ secrets.TRANSIFEX_API_TOKEN }}
|
13
.gitignore
vendored
13
.gitignore
vendored
|
@ -1,6 +1,7 @@
|
|||
# Build directory
|
||||
[Bb]uild/
|
||||
[Bb]uild*/
|
||||
doc-build/
|
||||
build-*/
|
||||
|
||||
# Generated source files
|
||||
src/common/scm_rev.cpp
|
||||
|
@ -8,9 +9,14 @@ src/common/scm_rev.cpp
|
|||
|
||||
# Project/editor files
|
||||
*.swp
|
||||
*.kdev4
|
||||
.idea/
|
||||
.vs/
|
||||
.vscode/
|
||||
.cache/
|
||||
.kdev4/
|
||||
cmake-build-debug/
|
||||
cmake-build-release/
|
||||
CMakeLists.txt.user*
|
||||
|
||||
# *nix related
|
||||
|
@ -37,3 +43,8 @@ Thumbs.db
|
|||
# Flatpak generated files
|
||||
.flatpak-builder/
|
||||
repo/
|
||||
|
||||
# GitHub Actions generated files
|
||||
.ccache/
|
||||
node_modules/
|
||||
VULKAN_SDK/
|
||||
|
|
62
.gitmodules
vendored
62
.gitmodules
vendored
|
@ -6,19 +6,16 @@
|
|||
url = https://github.com/neobrain/nihstro.git
|
||||
[submodule "soundtouch"]
|
||||
path = externals/soundtouch
|
||||
url = https://github.com/citra-emu/ext-soundtouch.git
|
||||
[submodule "catch"]
|
||||
path = externals/catch
|
||||
url = https://github.com/philsquared/Catch.git
|
||||
url = https://codeberg.org/soundtouch/soundtouch.git
|
||||
[submodule "catch2"]
|
||||
path = externals/catch2
|
||||
url = https://github.com/catchorg/Catch2
|
||||
[submodule "dynarmic"]
|
||||
path = externals/dynarmic
|
||||
url = https://github.com/MerryMage/dynarmic.git
|
||||
url = https://github.com/merryhime/dynarmic.git
|
||||
[submodule "xbyak"]
|
||||
path = externals/xbyak
|
||||
url = https://github.com/herumi/xbyak.git
|
||||
[submodule "cryptopp"]
|
||||
path = externals/cryptopp/cryptopp
|
||||
url = https://github.com/weidai11/cryptopp.git
|
||||
[submodule "fmt"]
|
||||
path = externals/fmt
|
||||
url = https://github.com/fmtlib/fmt.git
|
||||
|
@ -31,12 +28,15 @@
|
|||
[submodule "libressl"]
|
||||
path = externals/libressl
|
||||
url = https://github.com/citra-emu/ext-libressl-portable.git
|
||||
[submodule "libusb"]
|
||||
path = externals/libusb/libusb
|
||||
url = https://github.com/libusb/libusb.git
|
||||
[submodule "cubeb"]
|
||||
path = externals/cubeb
|
||||
url = https://github.com/kinetiknz/cubeb.git
|
||||
url = https://github.com/mozilla/cubeb
|
||||
[submodule "discord-rpc"]
|
||||
path = externals/discord-rpc
|
||||
url = https://github.com/discordapp/discord-rpc.git
|
||||
url = https://github.com/yuzu-emu/discord-rpc.git
|
||||
[submodule "cpp-jwt"]
|
||||
path = externals/cpp-jwt
|
||||
url = https://github.com/arun11299/cpp-jwt.git
|
||||
|
@ -49,3 +49,45 @@
|
|||
[submodule "zstd"]
|
||||
path = externals/zstd
|
||||
url = https://github.com/facebook/zstd.git
|
||||
[submodule "libyuv"]
|
||||
path = externals/libyuv
|
||||
url = https://github.com/lemenkov/libyuv.git
|
||||
[submodule "sdl2"]
|
||||
path = externals/sdl2/SDL
|
||||
url = https://github.com/libsdl-org/SDL
|
||||
[submodule "cryptopp-cmake"]
|
||||
path = externals/cryptopp-cmake
|
||||
url = https://github.com/abdes/cryptopp-cmake.git
|
||||
[submodule "cryptopp"]
|
||||
path = externals/cryptopp
|
||||
url = https://github.com/weidai11/cryptopp.git
|
||||
[submodule "dds-ktx"]
|
||||
path = externals/dds-ktx
|
||||
url = https://github.com/septag/dds-ktx
|
||||
[submodule "openal-soft"]
|
||||
path = externals/openal-soft
|
||||
url = https://github.com/kcat/openal-soft
|
||||
[submodule "glslang"]
|
||||
path = externals/glslang
|
||||
url = https://github.com/KhronosGroup/glslang
|
||||
[submodule "vma"]
|
||||
path = externals/vma
|
||||
url = https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator
|
||||
[submodule "vulkan-headers"]
|
||||
path = externals/vulkan-headers
|
||||
url = https://github.com/KhronosGroup/Vulkan-Headers
|
||||
[submodule "sirit"]
|
||||
path = externals/sirit
|
||||
url = https://github.com/yuzu-emu/sirit
|
||||
[submodule "faad2"]
|
||||
path = externals/faad2/faad2
|
||||
url = https://github.com/knik0/faad2
|
||||
[submodule "library-headers"]
|
||||
path = externals/library-headers
|
||||
url = https://github.com/citra-emu/ext-library-headers.git
|
||||
[submodule "libadrenotools"]
|
||||
path = externals/libadrenotools
|
||||
url = https://github.com/bylaws/libadrenotools
|
||||
[submodule "oaknut"]
|
||||
path = externals/oaknut
|
||||
url = https://github.com/merryhime/oaknut.git
|
||||
|
|
87
.travis.yml
87
.travis.yml
|
@ -1,87 +0,0 @@
|
|||
language: cpp
|
||||
matrix:
|
||||
include:
|
||||
- os: linux
|
||||
env: NAME="clang-format"
|
||||
sudo: required
|
||||
dist: trusty
|
||||
services: docker
|
||||
install: "./.travis/clang-format/deps.sh"
|
||||
script: "./.travis/clang-format/build.sh"
|
||||
- os: linux
|
||||
env: NAME="linux build"
|
||||
sudo: required
|
||||
dist: trusty
|
||||
services: docker
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- p7zip-full
|
||||
install: "./.travis/linux/deps.sh"
|
||||
script: "./.travis/linux/build.sh"
|
||||
after_success: "./.travis/linux/upload.sh"
|
||||
cache: ccache
|
||||
- if: repo = citra-emu/citra AND branch = master AND type = push
|
||||
os: linux
|
||||
env: NAME="transifex push"
|
||||
sudo: required
|
||||
dist: trusty
|
||||
services: docker
|
||||
install: "./.travis/transifex/deps.sh"
|
||||
script: "./.travis/transifex/build.sh"
|
||||
- os: osx
|
||||
env: NAME="macos build"
|
||||
sudo: false
|
||||
osx_image: xcode10.2
|
||||
install: "./.travis/macos/deps.sh"
|
||||
script: "./.travis/macos/build.sh"
|
||||
after_success: "./.travis/macos/upload.sh"
|
||||
cache: ccache
|
||||
- os: linux
|
||||
env: NAME="linux build (debug, frozen versions of dependencies, no additional CMake flags)"
|
||||
sudo: required
|
||||
dist: trusty
|
||||
services: docker
|
||||
cache: ccache
|
||||
install: "./.travis/linux-frozen/deps.sh"
|
||||
script: "./.travis/linux-frozen/build.sh"
|
||||
- os: linux
|
||||
env: NAME="MinGW build"
|
||||
sudo: required
|
||||
dist: trusty
|
||||
services: docker
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- p7zip-full
|
||||
install: "./.travis/linux-mingw/deps.sh"
|
||||
script: "./.travis/linux-mingw/build.sh"
|
||||
after_success: "./.travis/linux-mingw/upload.sh"
|
||||
cache: ccache
|
||||
- if: repo =~ ^.*\/(citra-canary|citra-nightly)$ AND tag IS present
|
||||
git:
|
||||
depth: false
|
||||
os: linux
|
||||
env: NAME="flatpak build"
|
||||
sudo: required
|
||||
dist: trusty
|
||||
services: docker
|
||||
cache: ccache
|
||||
install: "./.travis/linux-flatpak/deps.sh"
|
||||
script: "./.travis/linux-flatpak/build.sh"
|
||||
after_script: "./.travis/linux-flatpak/finish.sh"
|
||||
|
||||
deploy:
|
||||
provider: releases
|
||||
api_key:
|
||||
secure: Mck15DIWaJdxDiS3aYVlM9N3G6y8VKUI1rnwII7/iolfm1s94U+tgvbheZDmT7SSbFyaGaYO/E8HrV/uZR9Vvs7ev20sHsTN1u60OTWfDIIyHs9SqjhcGbtq95m9/dMFschOYqTOR+gAs5BsxjuoeAotHdhpQEwvkO2oo5oR0zhGy45gjFnVvtcxT/IfpZBIpVgcK3aLb9zT6ekcJbSiPmEB15iLq3xXd0nFUNtEZdX3D6Veye4n5jB6n72qN8JVoKvPZAwaC2K0pZxpcGJaXDchLsw1q+4eCvdz6UJfUemeQ/uMAmjfeQ3wrzYGXe3nCM3WmX5wosCsB0mw4zYatzl3si6CZ1W+0GkV4Rwlx03dfp7v3EeFhTsXYCaXqhwuLZnWOLUik8t9vaSoFUx4nUIRwfO9kAMUJQSpLuHNO2nT01s3GxvqxzczuLQ9he5nGSi0RRodUzDwek1qUp6I4uV3gRHKz4B07YIc1i2fK88NLXjyQ0uLVZ+7Oq1+kgDp6+N7vvXXZ5qZ17tdaysSbKEE0Y8zsoXw7Rk1tPN19vrCS+TSpomNMyQyne1k+I5iZ/qkxPTLAS5qI6Utc2dL3GJdxWRAEfGNO9AIX3GV/jmmKfdcvwGsCYP8hxqs5vLYfgacw3D8NLf1941lQUwavC17jm9EV9g5G3Pn1Cp516E=
|
||||
file_glob: true
|
||||
file: "artifacts/*"
|
||||
skip_cleanup: true
|
||||
on:
|
||||
tags: true
|
||||
|
||||
notifications:
|
||||
webhooks:
|
||||
urls:
|
||||
- https://api.citra-emu.org/code/travis/notify
|
|
@ -1,3 +0,0 @@
|
|||
#!/bin/bash -ex
|
||||
mkdir -p "$HOME/.ccache"
|
||||
docker run --env-file .travis/common/travis-ci.env -v $(pwd):/citra -v "$HOME/.ccache":/root/.ccache citraemu/build-environments:linux-clang-format /bin/bash -ex /citra/.travis/clang-format/docker.sh
|
|
@ -1,3 +0,0 @@
|
|||
#!/bin/sh -ex
|
||||
|
||||
docker pull citraemu/build-environments:linux-clang-format
|
|
@ -1,5 +0,0 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
# Run clang-format
|
||||
cd /citra
|
||||
./.travis/clang-format/script.sh
|
|
@ -1,28 +0,0 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
# Copy documentation
|
||||
cp license.txt "$REV_NAME"
|
||||
cp README.md "$REV_NAME"
|
||||
|
||||
# Copy cross-platform scripting support
|
||||
cp -r dist/scripting "$REV_NAME"
|
||||
|
||||
tar $COMPRESSION_FLAGS "$ARCHIVE_NAME" "$REV_NAME"
|
||||
|
||||
# Find out what release we are building
|
||||
if [ -z $TRAVIS_TAG ]; then
|
||||
RELEASE_NAME=head
|
||||
else
|
||||
RELEASE_NAME=$(echo $TRAVIS_TAG | cut -d- -f1)
|
||||
if [ "$NAME" = "MinGW build" ]; then
|
||||
RELEASE_NAME="${RELEASE_NAME}-mingw"
|
||||
fi
|
||||
fi
|
||||
|
||||
mv "$REV_NAME" $RELEASE_NAME
|
||||
|
||||
7z a "$REV_NAME.7z" $RELEASE_NAME
|
||||
|
||||
# move the compiled archive into the artifacts directory to be uploaded by travis releases
|
||||
mv "$ARCHIVE_NAME" artifacts/
|
||||
mv "$REV_NAME.7z" artifacts/
|
|
@ -1,6 +0,0 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
GITDATE="`git show -s --date=short --format='%ad' | sed 's/-//g'`"
|
||||
GITREV="`git show -s --format='%h'`"
|
||||
|
||||
mkdir -p artifacts
|
|
@ -1,18 +0,0 @@
|
|||
# List of environment variables to be shared with Docker containers
|
||||
CI
|
||||
TRAVIS
|
||||
CONTINUOUS_INTEGRATION
|
||||
TRAVIS_BRANCH
|
||||
TRAVIS_BUILD_ID
|
||||
TRAVIS_BUILD_NUMBER
|
||||
TRAVIS_COMMIT
|
||||
TRAVIS_COMMIT_RANGE
|
||||
TRAVIS_EVENT_TYPE
|
||||
TRAVIS_JOB_ID
|
||||
TRAVIS_JOB_NUMBER
|
||||
TRAVIS_REPO_SLUG
|
||||
TRAVIS_TAG
|
||||
|
||||
# citra specific flags
|
||||
ENABLE_COMPATIBILITY_REPORTING
|
||||
USE_DISCORD_PRESENCE
|
|
@ -1,4 +0,0 @@
|
|||
#!/bin/bash -ex
|
||||
mkdir -p "$HOME/.ccache"
|
||||
# Configure docker and call the script that generates application data and build scripts
|
||||
docker run --env-file .travis/common/travis-ci.env --env-file .travis/linux-flatpak/travis-ci-flatpak.env -v $(pwd):/citra -v "$HOME/.ccache":/root/.ccache -v "$HOME/.ssh":/root/.ssh --privileged citraemu/build-environments:linux-flatpak /bin/bash -ex /citra/.travis/linux-flatpak/generate-data.sh
|
|
@ -1,4 +0,0 @@
|
|||
#!/bin/sh -ex
|
||||
|
||||
# Download the docker image that contains flatpak build dependencies
|
||||
docker pull citraemu/build-environments:linux-flatpak
|
|
@ -1,39 +0,0 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
# Converts "citra-emu/citra-nightly" to "citra-nightly"
|
||||
REPO_NAME=$(echo $TRAVIS_REPO_SLUG | cut -d'/' -f 2)
|
||||
CITRA_SRC_DIR="/citra"
|
||||
BUILD_DIR="$CITRA_SRC_DIR/build"
|
||||
REPO_DIR="$CITRA_SRC_DIR/repo"
|
||||
STATE_DIR="$CITRA_SRC_DIR/.flatpak-builder"
|
||||
KEYS_ARCHIVE="/tmp/keys.tar"
|
||||
SSH_DIR="/upload"
|
||||
SSH_KEY="/tmp/ssh.key"
|
||||
GPG_KEY="/tmp/gpg.key"
|
||||
|
||||
# Extract keys
|
||||
openssl aes-256-cbc -K $FLATPAK_ENC_K -iv $FLATPAK_ENC_IV -in "$CITRA_SRC_DIR/keys.tar.enc" -out "$KEYS_ARCHIVE" -d
|
||||
tar -C /tmp -xvf $KEYS_ARCHIVE
|
||||
|
||||
# Configure SSH keys
|
||||
eval "$(ssh-agent -s)"
|
||||
chmod -R 600 "$HOME/.ssh"
|
||||
chown -R root "$HOME/.ssh"
|
||||
chmod 600 "$SSH_KEY"
|
||||
ssh-add "$SSH_KEY"
|
||||
echo "[$FLATPAK_SSH_HOSTNAME]:$FLATPAK_SSH_PORT,[$(dig +short $FLATPAK_SSH_HOSTNAME)]:$FLATPAK_SSH_PORT $FLATPAK_SSH_PUBLIC_KEY" > ~/.ssh/known_hosts
|
||||
|
||||
# Configure GPG keys
|
||||
gpg2 --import "$GPG_KEY"
|
||||
|
||||
# Mount our flatpak repository
|
||||
mkdir -p "$REPO_DIR"
|
||||
sshfs "$FLATPAK_SSH_USER@$FLATPAK_SSH_HOSTNAME:$SSH_DIR" "$REPO_DIR" -C -p "$FLATPAK_SSH_PORT" -o IdentityFile="$SSH_KEY"
|
||||
|
||||
# setup ccache location
|
||||
mkdir -p "$STATE_DIR"
|
||||
ln -sv /root/.ccache "$STATE_DIR/ccache"
|
||||
|
||||
# Build the citra flatpak
|
||||
flatpak-builder -v --jobs=4 --ccache --force-clean --state-dir="$STATE_DIR" --gpg-sign="$FLATPAK_GPG_PUBLIC_KEY" --repo="$REPO_DIR" "$BUILD_DIR" "/tmp/org.citra.$REPO_NAME.json"
|
||||
flatpak build-update-repo "$REPO_DIR" -v --generate-static-deltas --gpg-sign="$FLATPAK_GPG_PUBLIC_KEY"
|
|
@ -1,9 +0,0 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
CITRA_SRC_DIR="/citra"
|
||||
REPO_DIR="$CITRA_SRC_DIR/repo"
|
||||
|
||||
# When the script finishes, unmount the repository and delete sensitive files,
|
||||
# regardless of whether the build passes or fails
|
||||
umount "$REPO_DIR"
|
||||
rm -rf "$REPO_DIR" "/tmp/*"
|
|
@ -1,125 +0,0 @@
|
|||
#!/bin/bash -ex
|
||||
# This script generates the appdata.xml and org.citra.$REPO_NAME.json files
|
||||
# needed to define application metadata and build citra depending on what version
|
||||
# of citra we're building (nightly or canary)
|
||||
|
||||
# Converts "citra-emu/citra-nightly" to "citra-nightly"
|
||||
REPO_NAME=$(echo $TRAVIS_REPO_SLUG | cut -d'/' -f 2)
|
||||
# Converts "citra-nightly" to "Citra Nightly"
|
||||
REPO_NAME_FRIENDLY=$(echo $REPO_NAME | sed -e 's/-/ /g' -e 's/\b\(.\)/\u\1/g')
|
||||
|
||||
# Generate the correct appdata.xml for the version of Citra we're building
|
||||
cat > /tmp/appdata.xml <<EOF
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<application>
|
||||
<id type="desktop">org.citra.$REPO_NAME.desktop</id>
|
||||
<name>$REPO_NAME_FRIENDLY</name>
|
||||
<summary>Nintendo 3DS emulator</summary>
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>GPL-2.0</project_license>
|
||||
<description>
|
||||
<p>Citra is an experimental open-source Nintendo 3DS emulator/debugger written in C++. It is written with portability in mind, with builds actively maintained for Windows, Linux and macOS.</p>
|
||||
<p>Citra emulates a subset of 3DS hardware and therefore is useful for running/debugging homebrew applications, and it is also able to run many commercial games! Some of these do not run at a playable state, but we are working every day to advance the project forward. (Playable here means compatibility of at least "Okay" on our game compatibility list.)</p>
|
||||
</description>
|
||||
<url type="homepage">https://citra-emu.org/</url>
|
||||
<url type="donation">https://citra-emu.org/donate/</url>
|
||||
<url type="bugtracker">https://github.com/citra-emu/citra/issues</url>
|
||||
<url type="faq">https://citra-emu.org/wiki/faq/</url>
|
||||
<url type="help">https://citra-emu.org/wiki/home/</url>
|
||||
<screenshot>https://raw.githubusercontent.com/citra-emu/citra-web/master/site/static/images/screenshots/01-Super%20Mario%203D%20Land.jpg</screenshot>
|
||||
<screenshot>https://raw.githubusercontent.com/citra-emu/citra-web/master/site/static/images/screenshots/02-Mario%20Kart%207.jpg</screenshot>
|
||||
<screenshot>https://raw.githubusercontent.com/citra-emu/citra-web/master/site/static/images/screenshots/28-The%20Legend%20of%20Zelda%20Ocarina%20of%20Time%203D.jpg</screenshot>
|
||||
<screenshot>https://raw.githubusercontent.com/citra-emu/citra-web/master/site/static/images/screenshots/35-Pok%C3%A9mon%20ORAS.png</screenshot>
|
||||
<categories>
|
||||
<category>Games</category>
|
||||
<category>Emulator</category>
|
||||
</categories>
|
||||
</application>
|
||||
EOF
|
||||
|
||||
# Generate the citra flatpak manifest, appending certain variables depending on
|
||||
# whether we're building nightly or canary.
|
||||
cat > /tmp/org.citra.$REPO_NAME.json <<EOF
|
||||
{
|
||||
"app-id": "org.citra.$REPO_NAME",
|
||||
"runtime": "org.kde.Platform",
|
||||
"runtime-version": "5.13",
|
||||
"sdk": "org.kde.Sdk",
|
||||
"command": "citra-qt",
|
||||
"rename-desktop-file": "citra.desktop",
|
||||
"rename-icon": "citra",
|
||||
"rename-appdata-file": "org.citra.$REPO_NAME.appdata.xml",
|
||||
"build-options": {
|
||||
"build-args": [
|
||||
"--share=network"
|
||||
],
|
||||
"env": {
|
||||
"CI": "$CI",
|
||||
"TRAVIS": "$TRAVIS",
|
||||
"CONTINUOUS_INTEGRATION": "$CONTINUOUS_INTEGRATION",
|
||||
"TRAVIS_BRANCH": "$TRAVIS_BRANCH",
|
||||
"TRAVIS_BUILD_ID": "$TRAVIS_BUILD_ID",
|
||||
"TRAVIS_BUILD_NUMBER": "$TRAVIS_BUILD_NUMBER",
|
||||
"TRAVIS_COMMIT": "$TRAVIS_COMMIT",
|
||||
"TRAVIS_JOB_ID": "$TRAVIS_JOB_ID",
|
||||
"TRAVIS_JOB_NUMBER": "$TRAVIS_JOB_NUMBER",
|
||||
"TRAVIS_REPO_SLUG": "$TRAVIS_REPO_SLUG",
|
||||
"TRAVIS_TAG": "$TRAVIS_TAG"
|
||||
}
|
||||
},
|
||||
"finish-args": [
|
||||
"--device=all",
|
||||
"--socket=x11",
|
||||
"--socket=pulseaudio",
|
||||
"--share=network",
|
||||
"--share=ipc",
|
||||
"--filesystem=xdg-config/citra-emu:create",
|
||||
"--filesystem=xdg-data/citra-emu:create",
|
||||
"--filesystem=host:ro"
|
||||
],
|
||||
"modules": [
|
||||
{
|
||||
"name": "citra",
|
||||
"buildsystem": "cmake-ninja",
|
||||
"builddir": true,
|
||||
"config-opts": [
|
||||
"-DCMAKE_BUILD_TYPE=Release",
|
||||
"-DENABLE_QT_TRANSLATION=ON",
|
||||
"-DCITRA_ENABLE_COMPATIBILITY_REPORTING=ON",
|
||||
"-DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON",
|
||||
"-DENABLE_FFMPEG_VIDEO_DUMPER=ON"
|
||||
],
|
||||
"cleanup": [
|
||||
"/bin/citra",
|
||||
"/share/man",
|
||||
"/share/pixmaps"
|
||||
],
|
||||
"post-install": [
|
||||
"install -Dm644 ../appdata.xml /app/share/appdata/org.citra.$REPO_NAME.appdata.xml",
|
||||
"desktop-file-install --dir=/app/share/applications ../dist/citra.desktop",
|
||||
"sed -i 's/Name=Citra/Name=$REPO_NAME_FRIENDLY/g' /app/share/applications/citra.desktop",
|
||||
"echo 'StartupWMClass=citra-qt' >> /app/share/applications/citra.desktop",
|
||||
"install -Dm644 ../dist/citra.svg /app/share/icons/hicolor/scalable/apps/citra.svg",
|
||||
"install -Dm644 ../dist/icon.png /app/share/icons/hicolor/512x512/apps/citra.png",
|
||||
"mv /app/share/mime/packages/citra.xml /app/share/mime/packages/org.citra.$REPO_NAME.xml",
|
||||
"sed 's/citra/org.citra.citra-nightly/g' -i /app/share/mime/packages/org.citra.$REPO_NAME.xml"
|
||||
],
|
||||
"sources": [
|
||||
{
|
||||
"type": "git",
|
||||
"url": "https://github.com/citra-emu/$REPO_NAME.git",
|
||||
"branch": "$TRAVIS_BRANCH",
|
||||
"disable-shallow-clone": true
|
||||
},
|
||||
{
|
||||
"type": "file",
|
||||
"path": "/tmp/appdata.xml"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
EOF
|
||||
|
||||
# Call the script to build citra
|
||||
/bin/bash -ex /citra/.travis/linux-flatpak/docker.sh
|
|
@ -1,9 +0,0 @@
|
|||
# Flatpak specific environment variables
|
||||
FLATPAK_ENC_IV
|
||||
FLATPAK_ENC_K
|
||||
FLATPAK_GPG_PUBLIC_KEY
|
||||
FLATPAK_SSH_HOSTNAME
|
||||
FLATPAK_SSH_LOCATION
|
||||
FLATPAK_SSH_PORT
|
||||
FLATPAK_SSH_PUBLIC_KEY
|
||||
FLATPAK_SSH_USER
|
|
@ -1,3 +0,0 @@
|
|||
#!/bin/bash -ex
|
||||
mkdir -p "$HOME/.ccache"
|
||||
docker run --env-file .travis/common/travis-ci.env -v $(pwd):/citra -v "$HOME/.ccache":/root/.ccache citraemu/build-environments:linux-frozen /bin/bash -ex /citra/.travis/linux-frozen/docker.sh
|
|
@ -1,5 +0,0 @@
|
|||
#!/bin/sh -ex
|
||||
|
||||
sudo apt-get -y install binutils-gold
|
||||
|
||||
docker pull citraemu/build-environments:linux-frozen
|
|
@ -1,16 +0,0 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
mkdir -p ~/bin/gold
|
||||
echo '#!/bin/bash' > ~/bin/gold/ld
|
||||
echo 'gold "$@"' >> ~/bin/gold/ld
|
||||
chmod a+x ~/bin/gold/ld
|
||||
export CFLAGS="-B$HOME/bin/gold $CFLAGS"
|
||||
export CXXFLAGS="-B$HOME/bin/gold $CXXFLAGS"
|
||||
|
||||
cd /citra
|
||||
|
||||
mkdir build && cd build
|
||||
cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_C_COMPILER=/usr/lib/ccache/gcc -DCMAKE_CXX_COMPILER=/usr/lib/ccache/g++
|
||||
ninja
|
||||
|
||||
ctest -VV -C Release
|
|
@ -1,52 +0,0 @@
|
|||
#!/usr/bin/python
|
||||
|
||||
import sys
|
||||
import re
|
||||
import subprocess
|
||||
from launchpadlib.launchpad import Launchpad
|
||||
|
||||
if sys.version_info[0] > 2:
|
||||
xrange = range
|
||||
|
||||
cachedir = '/.launchpadlib/cache/'
|
||||
launchpad = Launchpad.login_anonymously(
|
||||
'grab build info', 'production', cachedir, version='devel')
|
||||
|
||||
processed_packages = []
|
||||
deb_file_list = []
|
||||
|
||||
|
||||
def get_url(pkg, distro):
|
||||
build_ref = launchpad.archives.getByReference(reference='ubuntu').getPublishedBinaries(
|
||||
binary_name=pkg[0], distro_arch_series='https://api.launchpad.net/devel/ubuntu/' + distro + '/amd64', version=pkg[1], exact_match=True, order_by_date=True).entries[0]
|
||||
build_link = build_ref['build_link']
|
||||
deb_name = '{}_{}_{}.deb'.format(pkg[0], pkg[1], 'amd64' if build_ref['architecture_specific'] else 'all')
|
||||
deb_link = build_link + '/+files/' + deb_name
|
||||
return [deb_link, deb_name]
|
||||
|
||||
|
||||
def list_dependencies(deb_file):
|
||||
t = subprocess.check_output(
|
||||
['bash', '-c', '(dpkg -I {} | grep -oP "^ Depends\: \K.*$") || true'.format(deb_file)])
|
||||
deps = [i.strip() for i in t.split(',')]
|
||||
equals_re = re.compile(r'^(.*) \(= (.*)\)$')
|
||||
return [equals_re.sub(r'\1=\2', i).split('=') for i in filter(equals_re.match, deps)]
|
||||
|
||||
|
||||
def get_package(pkg, distro):
|
||||
if pkg in processed_packages:
|
||||
return
|
||||
print('Getting {}...'.format(pkg[0]))
|
||||
url = get_url(pkg, distro)
|
||||
subprocess.check_call(['wget', '--quiet', url[0], '-O', url[1]])
|
||||
for dep in list_dependencies(url[1]):
|
||||
get_package(dep, distro)
|
||||
processed_packages.append(pkg)
|
||||
deb_file_list.append('./' + url[1])
|
||||
|
||||
|
||||
for i in xrange(1, len(sys.argv), 3):
|
||||
get_package([sys.argv[i], sys.argv[i + 1]], sys.argv[i + 2])
|
||||
|
||||
subprocess.check_call(
|
||||
['apt-get', 'install', '-y', '--force-yes'] + deb_file_list)
|
|
@ -1,3 +0,0 @@
|
|||
#!/bin/bash -ex
|
||||
mkdir "$HOME/.ccache" || true
|
||||
docker run --env-file .travis/common/travis-ci.env -v $(pwd):/citra -v "$HOME/.ccache":/root/.ccache citraemu/build-environments:linux-mingw /bin/bash -ex /citra/.travis/linux-mingw/docker.sh
|
|
@ -1,3 +0,0 @@
|
|||
#!/bin/sh -ex
|
||||
|
||||
docker pull citraemu/build-environments:linux-mingw
|
|
@ -1,30 +0,0 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
cd /citra
|
||||
# override Travis CI unreasonable ccache size
|
||||
echo 'max_size = 3.0G' > "$HOME/.ccache/ccache.conf"
|
||||
|
||||
mkdir build && cd build
|
||||
cmake .. -G Ninja -DCMAKE_TOOLCHAIN_FILE="$(pwd)/../CMakeModules/MinGWCross.cmake" -DUSE_CCACHE=ON -DCMAKE_BUILD_TYPE=Release -DENABLE_QT_TRANSLATION=ON -DCITRA_ENABLE_COMPATIBILITY_REPORTING=${ENABLE_COMPATIBILITY_REPORTING:-"OFF"} -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON -DUSE_DISCORD_PRESENCE=ON -DENABLE_MF=ON -DENABLE_FFMPEG_VIDEO_DUMPER=ON -DCMAKE_NO_SYSTEM_FROM_IMPORTED=TRUE -DCOMPILE_WITH_DWARF=OFF
|
||||
ninja
|
||||
|
||||
echo "Tests skipped"
|
||||
#ctest -VV -C Release
|
||||
|
||||
ccache -s
|
||||
|
||||
echo 'Prepare binaries...'
|
||||
cd ..
|
||||
mkdir package
|
||||
|
||||
QT_PLATFORM_DLL_PATH='/usr/x86_64-w64-mingw32/lib/qt5/plugins/platforms/'
|
||||
find build/ -name "citra*.exe" -exec cp {} 'package' \;
|
||||
|
||||
# copy Qt plugins
|
||||
mkdir package/platforms
|
||||
cp "${QT_PLATFORM_DLL_PATH}/qwindows.dll" package/platforms/
|
||||
cp -rv "${QT_PLATFORM_DLL_PATH}/../mediaservice/" package/
|
||||
cp -rv "${QT_PLATFORM_DLL_PATH}/../imageformats/" package/
|
||||
rm -f package/mediaservice/*d.dll
|
||||
|
||||
python3 .travis/linux-mingw/scan_dll.py package/*.exe package/imageformats/*.dll "package/"
|
|
@ -1,106 +0,0 @@
|
|||
import pefile
|
||||
import sys
|
||||
import re
|
||||
import os
|
||||
import queue
|
||||
import shutil
|
||||
|
||||
# constant definitions
|
||||
KNOWN_SYS_DLLS = ['WINMM.DLL', 'MSVCRT.DLL', 'VERSION.DLL', 'MPR.DLL',
|
||||
'DWMAPI.DLL', 'UXTHEME.DLL', 'DNSAPI.DLL', 'IPHLPAPI.DLL']
|
||||
# below is for Ubuntu 18.04 with specified PPA enabled, if you are using
|
||||
# other distro or different repositories, change the following accordingly
|
||||
DLL_PATH = [
|
||||
'/usr/x86_64-w64-mingw32/bin/',
|
||||
'/usr/x86_64-w64-mingw32/lib/',
|
||||
'/usr/lib/gcc/x86_64-w64-mingw32/7.3-posix/'
|
||||
]
|
||||
|
||||
missing = []
|
||||
|
||||
|
||||
def parse_imports(file_name):
|
||||
results = []
|
||||
pe = pefile.PE(file_name, fast_load=True)
|
||||
pe.parse_data_directories()
|
||||
|
||||
for entry in pe.DIRECTORY_ENTRY_IMPORT:
|
||||
current = entry.dll.decode()
|
||||
current_u = current.upper() # b/c Windows is often case insensitive
|
||||
# here we filter out system dlls
|
||||
# dll w/ names like *32.dll are likely to be system dlls
|
||||
if current_u.upper() not in KNOWN_SYS_DLLS and not re.match(string=current_u, pattern=r'.*32\.DLL'):
|
||||
results.append(current)
|
||||
|
||||
return results
|
||||
|
||||
|
||||
def parse_imports_recursive(file_name, path_list=[]):
|
||||
q = queue.Queue() # create a FIFO queue
|
||||
# file_name can be a string or a list for the convience
|
||||
if isinstance(file_name, str):
|
||||
q.put(file_name)
|
||||
elif isinstance(file_name, list):
|
||||
for i in file_name:
|
||||
q.put(i)
|
||||
full_list = []
|
||||
while q.qsize():
|
||||
current = q.get_nowait()
|
||||
print('> %s' % current)
|
||||
deps = parse_imports(current)
|
||||
# if this dll does not have any import, ignore it
|
||||
if not deps:
|
||||
continue
|
||||
for dep in deps:
|
||||
# the dependency already included in the list, skip
|
||||
if dep in full_list:
|
||||
continue
|
||||
# find the requested dll in the provided paths
|
||||
full_path = find_dll(dep)
|
||||
if not full_path:
|
||||
missing.append(dep)
|
||||
continue
|
||||
full_list.append(dep)
|
||||
q.put(full_path)
|
||||
path_list.append(full_path)
|
||||
return full_list
|
||||
|
||||
|
||||
def find_dll(name):
|
||||
for path in DLL_PATH:
|
||||
for root, _, files in os.walk(path):
|
||||
for f in files:
|
||||
if name.lower() == f.lower():
|
||||
return os.path.join(root, f)
|
||||
|
||||
|
||||
def deploy(name, dst, dry_run=False):
|
||||
dlls_path = []
|
||||
parse_imports_recursive(name, dlls_path)
|
||||
for dll_entry in dlls_path:
|
||||
if not dry_run:
|
||||
shutil.copy(dll_entry, dst)
|
||||
else:
|
||||
print('[Dry-Run] Copy %s to %s' % (dll_entry, dst))
|
||||
print('Deploy completed.')
|
||||
return dlls_path
|
||||
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 3:
|
||||
print('Usage: %s [files to examine ...] [target deploy directory]')
|
||||
return 1
|
||||
to_deploy = sys.argv[1:-1]
|
||||
tgt_dir = sys.argv[-1]
|
||||
if not os.path.isdir(tgt_dir):
|
||||
print('%s is not a directory.' % tgt_dir)
|
||||
return 1
|
||||
print('Scanning dependencies...')
|
||||
deploy(to_deploy, tgt_dir)
|
||||
if missing:
|
||||
print('Following DLLs are not found: %s' % ('\n'.join(missing)))
|
||||
return 0
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
|
@ -1,13 +0,0 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
. .travis/common/pre-upload.sh
|
||||
|
||||
REV_NAME="citra-windows-mingw-${GITDATE}-${GITREV}"
|
||||
ARCHIVE_NAME="${REV_NAME}.tar.gz"
|
||||
COMPRESSION_FLAGS="-czvf"
|
||||
|
||||
mkdir "$REV_NAME"
|
||||
# get around the permission issues
|
||||
cp -r package/* "$REV_NAME"
|
||||
|
||||
. .travis/common/post-upload.sh
|
|
@ -1,3 +0,0 @@
|
|||
#!/bin/bash -ex
|
||||
mkdir -p "$HOME/.ccache"
|
||||
docker run --env-file .travis/common/travis-ci.env -v $(pwd):/citra -v "$HOME/.ccache":/root/.ccache citraemu/build-environments:linux-fresh /bin/bash -ex /citra/.travis/linux/docker.sh
|
|
@ -1,3 +0,0 @@
|
|||
#!/bin/sh -ex
|
||||
|
||||
docker pull citraemu/build-environments:linux-fresh
|
|
@ -1,9 +0,0 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
cd /citra
|
||||
|
||||
mkdir build && cd build
|
||||
cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=/usr/lib/ccache/gcc -DCMAKE_CXX_COMPILER=/usr/lib/ccache/g++ -DENABLE_QT_TRANSLATION=ON -DCITRA_ENABLE_COMPATIBILITY_REPORTING=${ENABLE_COMPATIBILITY_REPORTING:-"OFF"} -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON -DUSE_DISCORD_PRESENCE=ON -DENABLE_FFMPEG_VIDEO_DUMPER=ON
|
||||
ninja
|
||||
|
||||
ctest -VV -C Release
|
|
@ -1,19 +0,0 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
. .travis/common/pre-upload.sh
|
||||
|
||||
REV_NAME="citra-linux-${GITDATE}-${GITREV}"
|
||||
ARCHIVE_NAME="${REV_NAME}.tar.xz"
|
||||
COMPRESSION_FLAGS="-cJvf"
|
||||
|
||||
mkdir "$REV_NAME"
|
||||
|
||||
cp build/bin/citra "$REV_NAME"
|
||||
cp build/bin/citra-room "$REV_NAME"
|
||||
cp build/bin/citra-qt "$REV_NAME"
|
||||
|
||||
# We need icons on Linux for .desktop entries
|
||||
mkdir "$REV_NAME/dist"
|
||||
cp dist/icon.png "$REV_NAME/dist/citra.png"
|
||||
|
||||
. .travis/common/post-upload.sh
|
|
@ -1,13 +0,0 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
set -o pipefail
|
||||
|
||||
export MACOSX_DEPLOYMENT_TARGET=10.13
|
||||
export Qt5_DIR=$(brew --prefix)/opt/qt5
|
||||
export PATH="/usr/local/opt/ccache/libexec:$PATH"
|
||||
|
||||
mkdir build && cd build
|
||||
cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_QT_TRANSLATION=ON -DCITRA_ENABLE_COMPATIBILITY_REPORTING=${ENABLE_COMPATIBILITY_REPORTING:-"OFF"} -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON -DUSE_DISCORD_PRESENCE=ON -DENABLE_FFMPEG_AUDIO_DECODER=ON -DENABLE_FFMPEG_VIDEO_DUMPER=ON
|
||||
make -j4
|
||||
|
||||
ctest -VV -C Release
|
|
@ -1,6 +0,0 @@
|
|||
#!/bin/sh -ex
|
||||
|
||||
brew update
|
||||
brew unlink python@2
|
||||
brew install qt5 sdl2 p7zip ccache ffmpeg
|
||||
pip3 install macpack
|
|
@ -1,29 +0,0 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
. .travis/common/pre-upload.sh
|
||||
|
||||
REV_NAME="citra-osx-${GITDATE}-${GITREV}"
|
||||
ARCHIVE_NAME="${REV_NAME}.tar.gz"
|
||||
COMPRESSION_FLAGS="-czvf"
|
||||
|
||||
mkdir "$REV_NAME"
|
||||
|
||||
cp build/bin/citra "$REV_NAME"
|
||||
cp -r build/bin/citra-qt.app "$REV_NAME"
|
||||
cp build/bin/citra-room "$REV_NAME"
|
||||
|
||||
# move libs into folder for deployment
|
||||
macpack "${REV_NAME}/citra-qt.app/Contents/MacOS/citra-qt" -d "../Frameworks"
|
||||
# move qt frameworks into app bundle for deployment
|
||||
$(brew --prefix)/opt/qt5/bin/macdeployqt "${REV_NAME}/citra-qt.app" -executable="${REV_NAME}/citra-qt.app/Contents/MacOS/citra-qt"
|
||||
|
||||
# move libs into folder for deployment
|
||||
macpack "${REV_NAME}/citra" -d "libs"
|
||||
|
||||
# Make the launching script executable
|
||||
chmod +x ${REV_NAME}/citra-qt.app/Contents/MacOS/citra-qt
|
||||
|
||||
# Verify loader instructions
|
||||
find "$REV_NAME" -exec otool -L {} \;
|
||||
|
||||
. .travis/common/post-upload.sh
|
|
@ -1,3 +0,0 @@
|
|||
#!/bin/bash -e
|
||||
|
||||
docker run -e TRANSIFEX_API_TOKEN="${TRANSIFEX_API_TOKEN}" -v "$(pwd)":/citra citraemu/build-environments:linux-transifex /bin/sh -e /citra/.travis/transifex/docker.sh
|
|
@ -1,3 +0,0 @@
|
|||
#!/bin/bash -ex
|
||||
|
||||
docker pull citraemu/build-environments:linux-transifex
|
|
@ -1,40 +0,0 @@
|
|||
#!/bin/bash -e
|
||||
|
||||
# Setup RC file for tx
|
||||
cat << EOF > ~/.transifexrc
|
||||
[https://www.transifex.com]
|
||||
hostname = https://www.transifex.com
|
||||
username = api
|
||||
password = $TRANSIFEX_API_TOKEN
|
||||
EOF
|
||||
|
||||
|
||||
set -x
|
||||
|
||||
cat << 'EOF' > /usr/bin/tx
|
||||
#!/usr/bin/python3
|
||||
|
||||
# -*- coding: utf-8 -*-
|
||||
import re
|
||||
import sys
|
||||
|
||||
from txclib.cmdline import main
|
||||
|
||||
if __name__ == '__main__':
|
||||
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
|
||||
sys.exit(main())
|
||||
EOF
|
||||
|
||||
echo -e "\e[1m\e[33mBuild tools information:\e[0m"
|
||||
cmake --version
|
||||
gcc -v
|
||||
tx --version
|
||||
|
||||
cd /citra
|
||||
mkdir build && cd build
|
||||
cmake .. -DENABLE_QT_TRANSLATION=ON -DGENERATE_QT_TRANSLATION=ON -DCMAKE_BUILD_TYPE=Release -DENABLE_SDL2=OFF
|
||||
make translation
|
||||
cd ..
|
||||
|
||||
cd dist/languages
|
||||
tx push -s
|
389
CMakeLists.txt
389
CMakeLists.txt
|
@ -1,47 +1,107 @@
|
|||
# CMake 3.8 required for 17 to be a valid value for CXX_STANDARD
|
||||
cmake_minimum_required(VERSION 3.8)
|
||||
if (${CMAKE_VERSION} VERSION_GREATER_EQUAL 3.15)
|
||||
# Don't override the warning flags in MSVC:
|
||||
cmake_policy(SET CMP0092 NEW)
|
||||
endif ()
|
||||
# CMake 3.12 required for 20 to be a valid value for CXX_STANDARD
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
|
||||
# Don't override the warning flags in MSVC:
|
||||
cmake_policy(SET CMP0092 NEW)
|
||||
# Enforce new LTO setting
|
||||
cmake_policy(SET CMP0069 NEW)
|
||||
# Honor visibility properties for all targets
|
||||
# Set the default so subdirectory cmake_minimum_required calls won't unset the policy.
|
||||
cmake_policy(SET CMP0063 NEW)
|
||||
set(CMAKE_POLICY_DEFAULT_CMP0063 NEW)
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
|
||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules")
|
||||
include(DownloadExternals)
|
||||
include(CMakeDependentOption)
|
||||
|
||||
project(citra)
|
||||
project(citra LANGUAGES C CXX ASM)
|
||||
|
||||
# Set bundled sdl2/qt as dependent options.
|
||||
# OFF by default, but if ENABLE_SDL2 and MSVC are true then ON
|
||||
option(ENABLE_SDL2 "Enable the SDL2 frontend" ON)
|
||||
CMAKE_DEPENDENT_OPTION(CITRA_USE_BUNDLED_SDL2 "Download bundled SDL2 binaries" ON "ENABLE_SDL2;MSVC" OFF)
|
||||
|
||||
option(ENABLE_QT "Enable the Qt frontend" ON)
|
||||
option(ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF)
|
||||
CMAKE_DEPENDENT_OPTION(CITRA_USE_BUNDLED_QT "Download bundled Qt binaries" ON "ENABLE_QT;MSVC" OFF)
|
||||
|
||||
option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
|
||||
|
||||
option(ENABLE_CUBEB "Enables the cubeb audio backend" ON)
|
||||
|
||||
option(ENABLE_FFMPEG_AUDIO_DECODER "Enable FFmpeg audio (AAC) decoder" OFF)
|
||||
option(ENABLE_FFMPEG_VIDEO_DUMPER "Enable FFmpeg video dumper" OFF)
|
||||
|
||||
if (ENABLE_FFMPEG_AUDIO_DECODER OR ENABLE_FFMPEG_VIDEO_DUMPER)
|
||||
set(ENABLE_FFMPEG ON)
|
||||
# Some submodules like to pick their own default build type if not specified.
|
||||
# Make sure we default to Release build type always, unless the generator has custom types.
|
||||
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build." FORCE)
|
||||
endif()
|
||||
|
||||
CMAKE_DEPENDENT_OPTION(CITRA_USE_BUNDLED_FFMPEG "Download bundled FFmpeg binaries" ON "ENABLE_FFMPEG;MSVC" OFF)
|
||||
if (APPLE)
|
||||
# Silence warnings on empty objects, for example when platform-specific code is #ifdef'd out.
|
||||
set(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>")
|
||||
set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>")
|
||||
set(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
|
||||
set(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>")
|
||||
|
||||
if (IOS)
|
||||
# Minimum iOS 14
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "14.0")
|
||||
|
||||
# Enable searching CMAKE_PREFIX_PATH for bundled dependencies.
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH)
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
|
||||
else()
|
||||
# Minimum macOS 11
|
||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "11.0")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (CMAKE_BUILD_TYPE STREQUAL Debug)
|
||||
set(IS_DEBUG_BUILD ON)
|
||||
set(IS_RELEASE_BUILD OFF)
|
||||
else()
|
||||
set(IS_DEBUG_BUILD OFF)
|
||||
set(IS_RELEASE_BUILD ON)
|
||||
endif()
|
||||
|
||||
# LTO takes too much memory and time using MSVC.
|
||||
if (NOT MSVC AND IS_RELEASE_BUILD)
|
||||
set(DEFAULT_ENABLE_LTO ON)
|
||||
else()
|
||||
set(DEFAULT_ENABLE_LTO OFF)
|
||||
endif()
|
||||
|
||||
option(ENABLE_SDL2 "Enable using SDL2" ON)
|
||||
CMAKE_DEPENDENT_OPTION(ENABLE_SDL2_FRONTEND "Enable the SDL2 frontend" ON "ENABLE_SDL2;NOT ANDROID AND NOT IOS" OFF)
|
||||
option(USE_SYSTEM_SDL2 "Use the system SDL2 lib (instead of the bundled one)" OFF)
|
||||
|
||||
# Set bundled qt as dependent options.
|
||||
option(ENABLE_QT "Enable the Qt frontend" ON)
|
||||
option(ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF)
|
||||
CMAKE_DEPENDENT_OPTION(ENABLE_QT_UPDATER "Enable built-in updater for the Qt frontend" ON "NOT IOS" OFF)
|
||||
|
||||
CMAKE_DEPENDENT_OPTION(ENABLE_TESTS "Enable generating tests executable" ON "NOT IOS" OFF)
|
||||
CMAKE_DEPENDENT_OPTION(ENABLE_DEDICATED_ROOM "Enable generating dedicated room executable" ON "NOT ANDROID AND NOT IOS" OFF)
|
||||
|
||||
option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
|
||||
option(ENABLE_SCRIPTING "Enable RPC server for scripting" ON)
|
||||
|
||||
CMAKE_DEPENDENT_OPTION(ENABLE_CUBEB "Enables the cubeb audio backend" ON "NOT IOS" OFF)
|
||||
option(ENABLE_OPENAL "Enables the OpenAL audio backend" ON)
|
||||
|
||||
CMAKE_DEPENDENT_OPTION(ENABLE_LIBUSB "Enable libusb for GameCube Adapter support" ON "NOT IOS" OFF)
|
||||
|
||||
CMAKE_DEPENDENT_OPTION(ENABLE_SOFTWARE_RENDERER "Enables the software renderer" ON "NOT ANDROID" OFF)
|
||||
CMAKE_DEPENDENT_OPTION(ENABLE_OPENGL "Enables the OpenGL renderer" ON "NOT APPLE" OFF)
|
||||
option(ENABLE_VULKAN "Enables the Vulkan renderer" ON)
|
||||
|
||||
option(USE_DISCORD_PRESENCE "Enables Discord Rich Presence" OFF)
|
||||
|
||||
CMAKE_DEPENDENT_OPTION(ENABLE_MF "Use Media Foundation decoder (preferred over FFmpeg)" ON "WIN32" OFF)
|
||||
# Compile options
|
||||
CMAKE_DEPENDENT_OPTION(COMPILE_WITH_DWARF "Add DWARF debugging information" ${IS_DEBUG_BUILD} "MINGW" OFF)
|
||||
option(ENABLE_LTO "Enable link time optimization" ${DEFAULT_ENABLE_LTO})
|
||||
option(CITRA_USE_PRECOMPILED_HEADERS "Use precompiled headers" ON)
|
||||
option(CITRA_WARNINGS_AS_ERRORS "Enable warnings as errors" ON)
|
||||
|
||||
CMAKE_DEPENDENT_OPTION(COMPILE_WITH_DWARF "Add DWARF debugging information" ON "MINGW" OFF)
|
||||
include(CitraHandleSystemLibs)
|
||||
|
||||
option(USE_SYSTEM_BOOST "Use the system Boost libs (instead of the bundled ones)" OFF)
|
||||
if (CITRA_USE_PRECOMPILED_HEADERS)
|
||||
message(STATUS "Using Precompiled Headers.")
|
||||
set(CMAKE_PCH_INSTANTIATE_TEMPLATES ON)
|
||||
|
||||
CMAKE_DEPENDENT_OPTION(ENABLE_FDK "Use FDK AAC decoder" OFF "NOT ENABLE_FFMPEG_AUDIO_DECODER;NOT ENABLE_MF" OFF)
|
||||
# This ensures that pre-compiled headers won't invalidate build caches for every fresh checkout.
|
||||
if(NOT MSVC AND CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
||||
list(APPEND CMAKE_CXX_COMPILE_OPTIONS_CREATE_PCH -Xclang -fno-pch-timestamp)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(NOT EXISTS ${PROJECT_SOURCE_DIR}/.git/hooks/pre-commit)
|
||||
message(STATUS "Copying pre-commit hook")
|
||||
|
@ -49,6 +109,30 @@ if(NOT EXISTS ${PROJECT_SOURCE_DIR}/.git/hooks/pre-commit)
|
|||
DESTINATION ${PROJECT_SOURCE_DIR}/.git/hooks)
|
||||
endif()
|
||||
|
||||
# Use ccache for android if available
|
||||
# =======================================================================
|
||||
if (NOT $ENV{NDK_CCACHE} EQUAL "")
|
||||
set(CCACHE_EXE $ENV{NDK_CCACHE})
|
||||
set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_EXE})
|
||||
set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_EXE})
|
||||
endif()
|
||||
|
||||
# Check for LTO support
|
||||
# =======================================================================
|
||||
if (ENABLE_LTO)
|
||||
include(CheckIPOSupported)
|
||||
check_ipo_supported(RESULT supported OUTPUT error_msg)
|
||||
|
||||
if (supported)
|
||||
message(STATUS "LTO enabled")
|
||||
else()
|
||||
message(STATUS "LTO enabled but is unavailable, disabling: ${error_msg}")
|
||||
set(ENABLE_LTO OFF)
|
||||
endif()
|
||||
else()
|
||||
message(STATUS "LTO disabled")
|
||||
endif()
|
||||
|
||||
# Sanity check : Check that all submodules are present
|
||||
# =======================================================================
|
||||
|
||||
|
@ -63,7 +147,10 @@ function(check_submodules_present)
|
|||
endif()
|
||||
endforeach()
|
||||
endfunction()
|
||||
check_submodules_present()
|
||||
if (EXISTS "${PROJECT_SOURCE_DIR}/.git/objects")
|
||||
# only check submodules when source is obtained via Git
|
||||
check_submodules_present()
|
||||
endif()
|
||||
|
||||
configure_file(${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.qrc
|
||||
${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.qrc
|
||||
|
@ -74,6 +161,10 @@ if (ENABLE_COMPATIBILITY_LIST_DOWNLOAD AND NOT EXISTS ${PROJECT_BINARY_DIR}/dist
|
|||
https://api.citra-emu.org/gamedb/
|
||||
"${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json" SHOW_PROGRESS)
|
||||
endif()
|
||||
if (EXISTS ${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.json)
|
||||
file(COPY "${PROJECT_SOURCE_DIR}/dist/compatibility_list/compatibility_list.json"
|
||||
DESTINATION "${PROJECT_BINARY_DIR}/dist/compatibility_list/")
|
||||
endif()
|
||||
if (NOT EXISTS ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json)
|
||||
file(WRITE ${PROJECT_BINARY_DIR}/dist/compatibility_list/compatibility_list.json "")
|
||||
endif()
|
||||
|
@ -92,29 +183,27 @@ function(detect_architecture symbol arch)
|
|||
# CMake's crazy scope rules will keep it defined
|
||||
if (ARCHITECTURE_${arch})
|
||||
set(ARCHITECTURE "${arch}" PARENT_SCOPE)
|
||||
set(ARCHITECTURE_${arch} 1 PARENT_SCOPE)
|
||||
add_definitions(-DARCHITECTURE_${arch}=1)
|
||||
endif()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
if (NOT ENABLE_GENERIC)
|
||||
if (MSVC)
|
||||
if (CMAKE_OSX_ARCHITECTURES)
|
||||
set(ARCHITECTURE "${CMAKE_OSX_ARCHITECTURES}")
|
||||
elseif (MSVC)
|
||||
detect_architecture("_M_AMD64" x86_64)
|
||||
detect_architecture("_M_IX86" x86)
|
||||
detect_architecture("_M_ARM" ARM)
|
||||
detect_architecture("_M_ARM64" ARM64)
|
||||
detect_architecture("_M_ARM" arm)
|
||||
detect_architecture("_M_ARM64" arm64)
|
||||
else()
|
||||
detect_architecture("__x86_64__" x86_64)
|
||||
detect_architecture("__i386__" x86)
|
||||
detect_architecture("__arm__" ARM)
|
||||
detect_architecture("__aarch64__" ARM64)
|
||||
detect_architecture("__arm__" arm)
|
||||
detect_architecture("__aarch64__" arm64)
|
||||
endif()
|
||||
endif()
|
||||
if (NOT DEFINED ARCHITECTURE)
|
||||
set(ARCHITECTURE "GENERIC")
|
||||
set(ARCHITECTURE_GENERIC 1)
|
||||
add_definitions(-DARCHITECTURE_GENERIC=1)
|
||||
endif()
|
||||
message(STATUS "Target architecture: ${ARCHITECTURE}")
|
||||
|
||||
|
@ -122,11 +211,19 @@ message(STATUS "Target architecture: ${ARCHITECTURE}")
|
|||
# Configure C++ standard
|
||||
# ===========================
|
||||
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
# boost asio's concept usage doesn't play nicely with some compilers yet.
|
||||
add_definitions(-DBOOST_ASIO_DISABLE_CONCEPTS)
|
||||
# boost can have issues compiling with C++17 and up on newer versions of Clang.
|
||||
add_definitions(-DBOOST_NO_CXX98_FUNCTION_BASE)
|
||||
set(CMAKE_CXX_STANDARD 20)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
# Apply consistent visibility settings.
|
||||
set(CMAKE_CXX_VISIBILITY_PRESET default)
|
||||
set(CMAKE_VISIBILITY_INLINES_HIDDEN NO)
|
||||
|
||||
# set up output paths for executable binaries
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
|
||||
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin/$<CONFIG>)
|
||||
|
||||
|
||||
# System imported libraries
|
||||
|
@ -136,107 +233,66 @@ set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
|
|||
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
if (ENABLE_SDL2)
|
||||
if (CITRA_USE_BUNDLED_SDL2)
|
||||
# Detect toolchain and platform
|
||||
if ((MSVC_VERSION GREATER_EQUAL 1910 AND MSVC_VERSION LESS 1930) AND ARCHITECTURE_x86_64)
|
||||
set(SDL2_VER "SDL2-2.0.12")
|
||||
else()
|
||||
message(FATAL_ERROR "No bundled SDL2 binaries for your toolchain. Disable CITRA_USE_BUNDLED_SDL2 and provide your own.")
|
||||
endif()
|
||||
|
||||
if (DEFINED SDL2_VER)
|
||||
download_bundled_external("sdl2/" ${SDL2_VER} SDL2_PREFIX)
|
||||
endif()
|
||||
|
||||
set(SDL2_FOUND YES)
|
||||
set(SDL2_INCLUDE_DIR "${SDL2_PREFIX}/include" CACHE PATH "Path to SDL2 headers")
|
||||
set(SDL2_LIBRARY "${SDL2_PREFIX}/lib/x64/SDL2.lib" CACHE PATH "Path to SDL2 library")
|
||||
set(SDL2_DLL_DIR "${SDL2_PREFIX}/lib/x64/" CACHE PATH "Path to SDL2.dll")
|
||||
else()
|
||||
find_package(SDL2 REQUIRED)
|
||||
endif()
|
||||
|
||||
if (SDL2_FOUND)
|
||||
# TODO(yuriks): Make FindSDL2.cmake export an IMPORTED library instead
|
||||
add_library(SDL2 INTERFACE)
|
||||
target_link_libraries(SDL2 INTERFACE "${SDL2_LIBRARY}")
|
||||
target_include_directories(SDL2 INTERFACE "${SDL2_INCLUDE_DIR}")
|
||||
endif()
|
||||
else()
|
||||
set(SDL2_FOUND NO)
|
||||
endif()
|
||||
|
||||
if (ENABLE_QT)
|
||||
if (CITRA_USE_BUNDLED_QT)
|
||||
if ((MSVC_VERSION GREATER_EQUAL 1910 AND MSVC_VERSION LESS 1930) AND ARCHITECTURE_x86_64)
|
||||
set(QT_VER qt-5.10.0-msvc2017_64)
|
||||
else()
|
||||
message(FATAL_ERROR "No bundled Qt binaries for your toolchain. Disable CITRA_USE_BUNDLED_QT and provide your own.")
|
||||
endif()
|
||||
|
||||
if (DEFINED QT_VER)
|
||||
download_bundled_external("qt/" ${QT_VER} QT_PREFIX)
|
||||
endif()
|
||||
|
||||
set(QT_PREFIX_HINT HINTS "${QT_PREFIX}")
|
||||
else()
|
||||
# Passing an empty HINTS seems to cause default system paths to get ignored in CMake 2.8 so
|
||||
# make sure to not pass anything if we don't have one.
|
||||
set(QT_PREFIX_HINT)
|
||||
if (NOT USE_SYSTEM_QT)
|
||||
download_qt(6.6.0)
|
||||
endif()
|
||||
|
||||
find_package(Qt5 REQUIRED COMPONENTS Widgets OpenGL Multimedia ${QT_PREFIX_HINT})
|
||||
find_package(Qt6 REQUIRED COMPONENTS Widgets Multimedia Concurrent)
|
||||
|
||||
if (UNIX AND NOT APPLE)
|
||||
find_package(Qt6 REQUIRED COMPONENTS DBus)
|
||||
endif()
|
||||
|
||||
if (ENABLE_QT_TRANSLATION)
|
||||
find_package(Qt5 REQUIRED COMPONENTS LinguistTools ${QT_PREFIX_HINT})
|
||||
find_package(Qt6 REQUIRED COMPONENTS LinguistTools)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (ENABLE_FFMPEG)
|
||||
if (CITRA_USE_BUNDLED_FFMPEG)
|
||||
if ((MSVC_VERSION GREATER_EQUAL 1910 AND MSVC_VERSION LESS 1930) AND ARCHITECTURE_x86_64)
|
||||
set(FFmpeg_VER "ffmpeg-4.1-win64")
|
||||
if (NOT DEFINED QT_TARGET_PATH)
|
||||
# Determine the location of the compile target's Qt.
|
||||
get_target_property(qtcore_path Qt6::Core LOCATION_Release)
|
||||
string(FIND "${qtcore_path}" "/bin/" qtcore_path_bin_pos REVERSE)
|
||||
string(FIND "${qtcore_path}" "/lib/" qtcore_path_lib_pos REVERSE)
|
||||
if (qtcore_path_bin_pos GREATER qtcore_path_lib_pos)
|
||||
string(SUBSTRING "${qtcore_path}" 0 ${qtcore_path_bin_pos} QT_TARGET_PATH)
|
||||
else()
|
||||
message(FATAL_ERROR "No bundled FFmpeg binaries for your toolchain. Disable CITRA_USE_BUNDLED_FFMPEG and provide your own.")
|
||||
endif()
|
||||
|
||||
if (DEFINED FFmpeg_VER)
|
||||
download_bundled_external("ffmpeg/" ${FFmpeg_VER} FFmpeg_PREFIX)
|
||||
set(FFMPEG_DIR "${FFmpeg_PREFIX}")
|
||||
string(SUBSTRING "${qtcore_path}" 0 ${qtcore_path_lib_pos} QT_TARGET_PATH)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if (ENABLE_FFMPEG_VIDEO_DUMPER)
|
||||
find_package(FFmpeg REQUIRED COMPONENTS avcodec avformat avutil swscale swresample)
|
||||
else()
|
||||
find_package(FFmpeg REQUIRED COMPONENTS avcodec)
|
||||
endif()
|
||||
if ("${FFmpeg_avcodec_VERSION}" VERSION_LESS "57.48.101")
|
||||
message(FATAL_ERROR "Found version for libavcodec is too low. The required version is at least 57.48.101 (included in FFmpeg 3.1 and later).")
|
||||
if (NOT DEFINED QT_HOST_PATH)
|
||||
# Use the same for host Qt if none is defined.
|
||||
set(QT_HOST_PATH "${QT_TARGET_PATH}")
|
||||
endif()
|
||||
|
||||
message(STATUS "Using target Qt at ${QT_TARGET_PATH}")
|
||||
message(STATUS "Using host Qt at ${QT_HOST_PATH}")
|
||||
endif()
|
||||
|
||||
if (ENABLE_FFMPEG_VIDEO_DUMPER)
|
||||
add_definitions(-DENABLE_FFMPEG_VIDEO_DUMPER)
|
||||
endif()
|
||||
# Use system tsl::robin_map if available (otherwise we fallback to version bundled with dynarmic)
|
||||
find_package(tsl-robin-map QUIET)
|
||||
|
||||
if (ENABLE_FDK)
|
||||
find_library(FDK_AAC fdk-aac DOC "The path to fdk_aac library")
|
||||
if(FDK_AAC STREQUAL "FDK_AAC-NOTFOUND")
|
||||
message(FATAL_ERROR "fdk_aac library not found.")
|
||||
endif()
|
||||
endif()
|
||||
# Platform-specific library requirements
|
||||
# ======================================
|
||||
|
||||
if (APPLE)
|
||||
# Umbrella framework for everything GUI-related
|
||||
find_library(COCOA_LIBRARY Cocoa)
|
||||
set(PLATFORM_LIBRARIES ${COCOA_LIBRARY} ${IOKIT_LIBRARY} ${COREVIDEO_LIBRARY})
|
||||
if (NOT IOS)
|
||||
# Umbrella framework for everything GUI-related
|
||||
find_library(COCOA_LIBRARY Cocoa REQUIRED)
|
||||
endif()
|
||||
find_library(AVFOUNDATION_LIBRARY AVFoundation REQUIRED)
|
||||
find_library(IOSURFACE_LIBRARY IOSurface REQUIRED)
|
||||
set(PLATFORM_LIBRARIES ${COCOA_LIBRARY} ${AVFOUNDATION_LIBRARY} ${IOSURFACE_LIBRARY} ${MOLTENVK_LIBRARY})
|
||||
|
||||
if (ENABLE_VULKAN)
|
||||
if (NOT USE_SYSTEM_MOLTENVK)
|
||||
download_moltenvk()
|
||||
endif()
|
||||
find_library(MOLTENVK_LIBRARY MoltenVK REQUIRED)
|
||||
message(STATUS "Using MoltenVK at ${MOLTENVK_LIBRARY}.")
|
||||
set(PLATFORM_LIBRARIES ${PLATFORM_LIBRARIES} ${MOLTENVK_LIBRARY})
|
||||
endif()
|
||||
elseif (WIN32)
|
||||
# WSAPoll and SHGetKnownFolderPath (AppData/Roaming) didn't exist before WinNT 6.x (Vista)
|
||||
add_definitions(-D_WIN32_WINNT=0x0600 -DWINVER=0x0600)
|
||||
set(PLATFORM_LIBRARIES winmm ws2_32)
|
||||
if (MINGW)
|
||||
# PSAPI is the Process Status API
|
||||
|
@ -250,7 +306,7 @@ endif()
|
|||
# against all the src files. This should be used before making a pull request.
|
||||
# =======================================================================
|
||||
|
||||
set(CLANG_FORMAT_POSTFIX "-6.0")
|
||||
set(CLANG_FORMAT_POSTFIX "-15")
|
||||
find_program(CLANG_FORMAT
|
||||
NAMES clang-format${CLANG_FORMAT_POSTFIX}
|
||||
clang-format
|
||||
|
@ -261,7 +317,7 @@ if (NOT CLANG_FORMAT)
|
|||
message(STATUS "Clang format not found! Downloading...")
|
||||
set(CLANG_FORMAT "${PROJECT_BINARY_DIR}/externals/clang-format${CLANG_FORMAT_POSTFIX}.exe")
|
||||
file(DOWNLOAD
|
||||
https://github.com/yuzu-emu/ext-windows-bin/raw/master/clang-format${CLANG_FORMAT_POSTFIX}.exe
|
||||
https://github.com/citra-emu/ext-windows-bin/raw/master/clang-format${CLANG_FORMAT_POSTFIX}.exe
|
||||
"${CLANG_FORMAT}" SHOW_PROGRESS
|
||||
STATUS DOWNLOAD_SUCCESS)
|
||||
if (NOT DOWNLOAD_SUCCESS EQUAL 0)
|
||||
|
@ -278,16 +334,18 @@ if (CLANG_FORMAT)
|
|||
set(SRCS ${PROJECT_SOURCE_DIR}/src)
|
||||
set(CCOMMENT "Running clang format against all the .h and .cpp files in src/")
|
||||
if (WIN32)
|
||||
add_custom_target(clang-format
|
||||
COMMAND powershell.exe -Command "Get-ChildItem '${SRCS}/*' -Include *.cpp,*.h -Recurse | Foreach {&'${CLANG_FORMAT}' -i $_.fullname}"
|
||||
COMMENT ${CCOMMENT})
|
||||
elseif(MINGW)
|
||||
add_custom_target(clang-format
|
||||
COMMAND find `cygpath -u ${SRCS}` -iname *.h -o -iname *.cpp | xargs `cygpath -u ${CLANG_FORMAT}` -i
|
||||
COMMENT ${CCOMMENT})
|
||||
if(MINGW)
|
||||
add_custom_target(clang-format
|
||||
COMMAND find `cygpath -u ${SRCS}` -iname *.h -o -iname *.cpp -o -iname *.mm | xargs `cygpath -u ${CLANG_FORMAT}` -i
|
||||
COMMENT ${CCOMMENT})
|
||||
else()
|
||||
add_custom_target(clang-format
|
||||
COMMAND powershell.exe -Command "Get-ChildItem '${SRCS}/*' -Include *.cpp,*.h,*.mm -Recurse | Foreach {&'${CLANG_FORMAT}' -i $_.fullname}"
|
||||
COMMENT ${CCOMMENT})
|
||||
endif()
|
||||
else()
|
||||
add_custom_target(clang-format
|
||||
COMMAND find ${SRCS} -iname *.h -o -iname *.cpp | xargs ${CLANG_FORMAT} -i
|
||||
COMMAND find ${SRCS} -iname *.h -o -iname *.cpp -o -iname *.mm | xargs ${CLANG_FORMAT} -i
|
||||
COMMENT ${CCOMMENT})
|
||||
endif()
|
||||
unset(SRCS)
|
||||
|
@ -321,13 +379,6 @@ function(get_timestamp _var)
|
|||
set(${_var} "${timestamp}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
# Prevent boost from linking against libs when building
|
||||
add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY
|
||||
-DBOOST_SYSTEM_NO_LIB
|
||||
-DBOOST_DATE_TIME_NO_LIB
|
||||
-DBOOST_REGEX_NO_LIB
|
||||
)
|
||||
|
||||
# generate git/build information
|
||||
include(GetGitRevisionDescription)
|
||||
get_git_head_revision(GIT_REF_SPEC GIT_REV)
|
||||
|
@ -335,19 +386,48 @@ git_describe(GIT_DESC --always --long --dirty)
|
|||
git_branch_name(GIT_BRANCH)
|
||||
get_timestamp(BUILD_DATE)
|
||||
|
||||
if (NOT USE_SYSTEM_BOOST)
|
||||
add_definitions( -DBOOST_ALL_NO_LIB )
|
||||
# Boost
|
||||
# Prevent boost from linking against libs when building
|
||||
add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY
|
||||
-DBOOST_SYSTEM_NO_LIB
|
||||
-DBOOST_DATE_TIME_NO_LIB
|
||||
-DBOOST_REGEX_NO_LIB
|
||||
)
|
||||
if (USE_SYSTEM_BOOST)
|
||||
find_package(Boost 1.70.0 COMPONENTS container locale serialization iostreams REQUIRED)
|
||||
endif()
|
||||
|
||||
enable_testing()
|
||||
add_subdirectory(externals)
|
||||
|
||||
# Boost
|
||||
if (USE_SYSTEM_BOOST)
|
||||
find_package(Boost 1.70.0 QUIET REQUIRED)
|
||||
else()
|
||||
# Boost (bundled)
|
||||
if (NOT USE_SYSTEM_BOOST)
|
||||
add_definitions( -DBOOST_ALL_NO_LIB )
|
||||
add_library(Boost::boost ALIAS boost)
|
||||
add_library(Boost::serialization ALIAS boost_serialization)
|
||||
add_library(Boost::iostreams ALIAS boost_iostreams)
|
||||
endif()
|
||||
|
||||
# SDL2
|
||||
if (ENABLE_SDL2 AND USE_SYSTEM_SDL2)
|
||||
find_package(SDL2 REQUIRED)
|
||||
add_library(SDL2 INTERFACE)
|
||||
target_link_libraries(SDL2 INTERFACE "${SDL2_LIBRARY}")
|
||||
target_include_directories(SDL2 INTERFACE "${SDL2_INCLUDE_DIR}")
|
||||
add_library(SDL2::SDL2 ALIAS SDL2)
|
||||
endif()
|
||||
|
||||
if (ENABLE_LIBUSB AND USE_SYSTEM_LIBUSB)
|
||||
include(FindPkgConfig)
|
||||
find_package(LibUSB)
|
||||
endif()
|
||||
|
||||
if (USE_SYSTEM_SOUNDTOUCH)
|
||||
include(FindPkgConfig)
|
||||
find_package(SoundTouch REQUIRED)
|
||||
add_library(SoundTouch INTERFACE)
|
||||
target_link_libraries(SoundTouch INTERFACE "${SOUNDTOUCH_LIBRARIES}")
|
||||
target_include_directories(SoundTouch INTERFACE "${SOUNDTOUCH_INCLUDE_DIRS}")
|
||||
endif()
|
||||
|
||||
add_subdirectory(src)
|
||||
|
@ -361,6 +441,21 @@ else()
|
|||
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT citra)
|
||||
endif()
|
||||
|
||||
# Create target for outputting distributable bundles.
|
||||
# Not supported for mobile platforms as distributables are built differently.
|
||||
if (NOT ANDROID AND NOT IOS)
|
||||
include(BundleTarget)
|
||||
if (ENABLE_SDL2_FRONTEND)
|
||||
bundle_target(citra)
|
||||
endif()
|
||||
if (ENABLE_QT)
|
||||
bundle_target(citra-qt)
|
||||
endif()
|
||||
if (ENABLE_DEDICATED_ROOM)
|
||||
bundle_target(citra-room)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Installation instructions
|
||||
# =========================
|
||||
|
||||
|
@ -369,7 +464,7 @@ endif()
|
|||
# http://standards.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html
|
||||
# http://standards.freedesktop.org/shared-mime-info-spec/shared-mime-info-spec-latest.html
|
||||
if(ENABLE_QT AND UNIX AND NOT APPLE)
|
||||
install(FILES "${PROJECT_SOURCE_DIR}/dist/citra.desktop"
|
||||
install(FILES "${PROJECT_SOURCE_DIR}/dist/citra-qt.desktop"
|
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/applications")
|
||||
install(FILES "${PROJECT_SOURCE_DIR}/dist/citra.svg"
|
||||
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/scalable/apps")
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
# To use this as a script, make sure you pass in the variables SRC_DIR BUILD_DIR and TARGET_FILE
|
||||
# To use this as a script, make sure you pass in the variables BASE_DIR, SRC_DIR, BUILD_DIR, and TARGET_FILE
|
||||
cmake_minimum_required(VERSION 3.15)
|
||||
|
||||
if(WIN32)
|
||||
set(PLATFORM "windows")
|
||||
|
@ -10,29 +11,16 @@ else()
|
|||
message(FATAL_ERROR "Cannot build installer for this unsupported platform")
|
||||
endif()
|
||||
|
||||
set(DIST_DIR "${BUILD_DIR}/dist")
|
||||
set(ARCHIVE "${PLATFORM}.7z")
|
||||
list(APPEND CMAKE_MODULE_PATH "${BASE_DIR}/CMakeModules")
|
||||
include(DownloadExternals)
|
||||
download_qt(tools_ifw)
|
||||
get_external_prefix(qt QT_PREFIX)
|
||||
|
||||
file(MAKE_DIRECTORY ${BUILD_DIR})
|
||||
file(MAKE_DIRECTORY ${DIST_DIR})
|
||||
file(DOWNLOAD https://github.com/citra-emu/ext-windows-bin/raw/master/qtifw/${ARCHIVE}
|
||||
"${BUILD_DIR}/${ARCHIVE}" SHOW_PROGRESS)
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${BUILD_DIR}/${ARCHIVE}"
|
||||
WORKING_DIRECTORY "${BUILD_DIR}/")
|
||||
file(GLOB_RECURSE INSTALLER_BASE "${QT_PREFIX}/**/installerbase*")
|
||||
file(GLOB_RECURSE BINARY_CREATOR "${QT_PREFIX}/**/binarycreator*")
|
||||
|
||||
set(TARGET_NAME "citra-setup-${PLATFORM}")
|
||||
set(CONFIG_FILE "${SRC_DIR}/config/config_${PLATFORM}.xml")
|
||||
set(INSTALLER_BASE "${BUILD_DIR}/installerbase_${PLATFORM}")
|
||||
set(BINARY_CREATOR "${BUILD_DIR}/binarycreator_${PLATFORM}")
|
||||
set(PACKAGES_DIR "${BUILD_DIR}/packages")
|
||||
file(MAKE_DIRECTORY ${PACKAGES_DIR})
|
||||
|
||||
if (UNIX OR APPLE)
|
||||
execute_process(COMMAND chmod 744 ${BINARY_CREATOR})
|
||||
endif()
|
||||
|
||||
execute_process(COMMAND ${BINARY_CREATOR} -t ${INSTALLER_BASE} -n -c ${CONFIG_FILE} -p ${PACKAGES_DIR} ${TARGET_FILE})
|
||||
|
||||
if (APPLE)
|
||||
execute_process(COMMAND chmod 744 ${TARGET_FILE}.app/Contents/MacOS/${TARGET_NAME})
|
||||
endif()
|
||||
|
|
374
CMakeModules/BundleTarget.cmake
Normal file
374
CMakeModules/BundleTarget.cmake
Normal file
|
@ -0,0 +1,374 @@
|
|||
|
||||
if (BUNDLE_TARGET_EXECUTE)
|
||||
# --- Bundling method logic ---
|
||||
|
||||
function(symlink_safe_copy from to)
|
||||
if (WIN32)
|
||||
# Use cmake copy for maximum compatibility.
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E copy "${from}" "${to}"
|
||||
RESULT_VARIABLE cp_result)
|
||||
else()
|
||||
# Use native copy to turn symlinks into normal files.
|
||||
execute_process(COMMAND cp -L "${from}" "${to}"
|
||||
RESULT_VARIABLE cp_result)
|
||||
endif()
|
||||
if (NOT cp_result EQUAL "0")
|
||||
message(FATAL_ERROR "cp \"${from}\" \"${to}\" failed: ${cp_result}")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(bundle_qt executable_path)
|
||||
if (WIN32)
|
||||
# Perform standalone bundling first to copy over all used libraries, as windeployqt does not do this.
|
||||
bundle_standalone("${executable_path}" "${EXECUTABLE_PATH}" "${BUNDLE_LIBRARY_PATHS}")
|
||||
|
||||
get_filename_component(executable_parent_dir "${executable_path}" DIRECTORY)
|
||||
|
||||
# Create a qt.conf file pointing to the app directory.
|
||||
# This ensures Qt can find its plugins.
|
||||
file(WRITE "${executable_parent_dir}/qt.conf" "[Paths]\nPrefix = .")
|
||||
|
||||
find_program(windeployqt_executable windeployqt6 PATHS "${QT_HOST_PATH}/bin")
|
||||
find_program(qtpaths_executable qtpaths6 PATHS "${QT_HOST_PATH}/bin")
|
||||
|
||||
# TODO: Hack around windeployqt's poor cross-compilation support by
|
||||
# TODO: making a local copy with a prefix pointing to the target Qt.
|
||||
if (NOT "${QT_HOST_PATH}" STREQUAL "${QT_TARGET_PATH}")
|
||||
set(windeployqt_dir "${BINARY_PATH}/windeployqt_copy")
|
||||
file(MAKE_DIRECTORY "${windeployqt_dir}")
|
||||
symlink_safe_copy("${windeployqt_executable}" "${windeployqt_dir}/windeployqt.exe")
|
||||
symlink_safe_copy("${qtpaths_executable}" "${windeployqt_dir}/qtpaths.exe")
|
||||
symlink_safe_copy("${QT_HOST_PATH}/bin/Qt6Core.dll" "${windeployqt_dir}")
|
||||
|
||||
if (EXISTS "${QT_TARGET_PATH}/share")
|
||||
# Unix-style Qt; we need to wire up the paths manually.
|
||||
file(WRITE "${windeployqt_dir}/qt.conf" "\
|
||||
[Paths]\n
|
||||
Prefix = ${QT_TARGET_PATH}\n \
|
||||
ArchData = ${QT_TARGET_PATH}/share/qt6\n \
|
||||
Binaries = ${QT_TARGET_PATH}/bin\n \
|
||||
Data = ${QT_TARGET_PATH}/share/qt6\n \
|
||||
Documentation = ${QT_TARGET_PATH}/share/qt6/doc\n \
|
||||
Headers = ${QT_TARGET_PATH}/include/qt6\n \
|
||||
Libraries = ${QT_TARGET_PATH}/lib\n \
|
||||
LibraryExecutables = ${QT_TARGET_PATH}/share/qt6/bin\n \
|
||||
Plugins = ${QT_TARGET_PATH}/share/qt6/plugins\n \
|
||||
QmlImports = ${QT_TARGET_PATH}/share/qt6/qml\n \
|
||||
Translations = ${QT_TARGET_PATH}/share/qt6/translations\n \
|
||||
")
|
||||
else()
|
||||
# Windows-style Qt; the defaults should suffice.
|
||||
file(WRITE "${windeployqt_dir}/qt.conf" "[Paths]\nPrefix = ${QT_TARGET_PATH}")
|
||||
endif()
|
||||
|
||||
set(windeployqt_executable "${windeployqt_dir}/windeployqt.exe")
|
||||
set(qtpaths_executable "${windeployqt_dir}/qtpaths.exe")
|
||||
endif()
|
||||
|
||||
message(STATUS "Executing windeployqt for executable ${executable_path}")
|
||||
execute_process(COMMAND "${windeployqt_executable}" "${executable_path}"
|
||||
--qtpaths "${qtpaths_executable}"
|
||||
--no-compiler-runtime --no-system-d3d-compiler --no-opengl-sw --no-translations
|
||||
--plugindir "${executable_parent_dir}/plugins"
|
||||
RESULT_VARIABLE windeployqt_result)
|
||||
if (NOT windeployqt_result EQUAL "0")
|
||||
message(FATAL_ERROR "windeployqt failed: ${windeployqt_result}")
|
||||
endif()
|
||||
|
||||
# Remove the FFmpeg multimedia plugin as we don't include FFmpeg.
|
||||
# We want to use the Windows media plugin instead, which is also included.
|
||||
file(REMOVE "${executable_parent_dir}/plugins/multimedia/ffmpegmediaplugin.dll")
|
||||
elseif (APPLE)
|
||||
get_filename_component(executable_name "${executable_path}" NAME_WE)
|
||||
find_program(macdeployqt_executable macdeployqt6 PATHS "${QT_HOST_PATH}/bin")
|
||||
|
||||
message(STATUS "Executing macdeployqt at \"${macdeployqt_executable}\" for executable \"${executable_path}\"")
|
||||
execute_process(
|
||||
COMMAND "${macdeployqt_executable}"
|
||||
"${executable_path}"
|
||||
"-executable=${executable_path}/Contents/MacOS/${executable_name}"
|
||||
-always-overwrite
|
||||
RESULT_VARIABLE macdeployqt_result)
|
||||
if (NOT macdeployqt_result EQUAL "0")
|
||||
message(FATAL_ERROR "macdeployqt failed: ${macdeployqt_result}")
|
||||
endif()
|
||||
|
||||
# Bundling libraries can rewrite path information and break code signatures of system libraries.
|
||||
# Perform an ad-hoc re-signing on the whole app bundle to fix this.
|
||||
execute_process(COMMAND codesign --deep -fs - "${executable_path}"
|
||||
RESULT_VARIABLE codesign_result)
|
||||
if (NOT codesign_result EQUAL "0")
|
||||
message(FATAL_ERROR "codesign failed: ${codesign_result}")
|
||||
endif()
|
||||
else()
|
||||
message(FATAL_ERROR "Unsupported OS for Qt bundling.")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(bundle_appimage bundle_dir executable_path source_path binary_path linuxdeploy_executable enable_qt)
|
||||
get_filename_component(executable_name "${executable_path}" NAME_WE)
|
||||
set(appdir_path "${binary_path}/AppDir-${executable_name}")
|
||||
|
||||
if (enable_qt)
|
||||
# Find qmake to make sure the plugin uses the right version of Qt.
|
||||
find_program(qmake_executable qmake6 PATHS "${QT_HOST_PATH}/bin")
|
||||
|
||||
set(extra_linuxdeploy_env "QMAKE=${qmake_executable}")
|
||||
set(extra_linuxdeploy_args --plugin qt)
|
||||
endif()
|
||||
|
||||
message(STATUS "Creating AppDir for executable ${executable_path}")
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E env
|
||||
${extra_linuxdeploy_env}
|
||||
"${linuxdeploy_executable}"
|
||||
${extra_linuxdeploy_args}
|
||||
--plugin checkrt
|
||||
--executable "${executable_path}"
|
||||
--icon-file "${source_path}/dist/citra.svg"
|
||||
--desktop-file "${source_path}/dist/${executable_name}.desktop"
|
||||
--appdir "${appdir_path}"
|
||||
RESULT_VARIABLE linuxdeploy_appdir_result)
|
||||
if (NOT linuxdeploy_appdir_result EQUAL "0")
|
||||
message(FATAL_ERROR "linuxdeploy failed to create AppDir: ${linuxdeploy_appdir_result}")
|
||||
endif()
|
||||
|
||||
if (enable_qt)
|
||||
set(qt_hook_file "${appdir_path}/apprun-hooks/linuxdeploy-plugin-qt-hook.sh")
|
||||
file(READ "${qt_hook_file}" qt_hook_contents)
|
||||
# Add Cinnamon to list of DEs for GTK3 theming.
|
||||
string(REPLACE
|
||||
"*XFCE*"
|
||||
"*X-Cinnamon*|*XFCE*"
|
||||
qt_hook_contents "${qt_hook_contents}")
|
||||
# Wayland backend crashes due to changed schemas in Gnome 40.
|
||||
string(REPLACE
|
||||
"export QT_QPA_PLATFORMTHEME=gtk3"
|
||||
"export QT_QPA_PLATFORMTHEME=gtk3; export GDK_BACKEND=x11"
|
||||
qt_hook_contents "${qt_hook_contents}")
|
||||
file(WRITE "${qt_hook_file}" "${qt_hook_contents}")
|
||||
endif()
|
||||
|
||||
message(STATUS "Creating AppImage for executable ${executable_path}")
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E env
|
||||
"OUTPUT=${bundle_dir}/${executable_name}.AppImage"
|
||||
"${linuxdeploy_executable}"
|
||||
--output appimage
|
||||
--appdir "${appdir_path}"
|
||||
RESULT_VARIABLE linuxdeploy_appimage_result)
|
||||
if (NOT linuxdeploy_appimage_result EQUAL "0")
|
||||
message(FATAL_ERROR "linuxdeploy failed to create AppImage: ${linuxdeploy_appimage_result}")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
function(bundle_standalone executable_path original_executable_path bundle_library_paths)
|
||||
get_filename_component(executable_parent_dir "${executable_path}" DIRECTORY)
|
||||
|
||||
# Resolve dependent library files if they were not passed in.
|
||||
message(STATUS "Determining runtime dependencies of ${executable_path} using library paths ${bundle_library_paths}")
|
||||
file(GET_RUNTIME_DEPENDENCIES
|
||||
EXECUTABLES ${original_executable_path}
|
||||
RESOLVED_DEPENDENCIES_VAR resolved_deps
|
||||
UNRESOLVED_DEPENDENCIES_VAR unresolved_deps
|
||||
DIRECTORIES ${bundle_library_paths}
|
||||
POST_EXCLUDE_REGEXES ".*system32.*")
|
||||
|
||||
if (WIN32)
|
||||
# Same directory since we don't have rpath.
|
||||
set(lib_dir "${executable_parent_dir}")
|
||||
else()
|
||||
set(lib_dir "${executable_parent_dir}/libs")
|
||||
endif()
|
||||
|
||||
# Copy files to bundled output.
|
||||
if (resolved_deps)
|
||||
file(MAKE_DIRECTORY ${lib_dir})
|
||||
foreach (lib_file IN LISTS resolved_deps)
|
||||
message(STATUS "Bundling library ${lib_file}")
|
||||
symlink_safe_copy("${lib_file}" "${lib_dir}")
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
# Add libs directory to executable rpath where applicable.
|
||||
if (APPLE)
|
||||
execute_process(COMMAND install_name_tool -add_rpath "@loader_path/libs" "${executable_path}"
|
||||
RESULT_VARIABLE install_name_tool_result)
|
||||
if (NOT install_name_tool_result EQUAL "0")
|
||||
message(FATAL_ERROR "install_name_tool failed: ${install_name_tool_result}")
|
||||
endif()
|
||||
elseif (UNIX)
|
||||
execute_process(COMMAND patchelf --set-rpath '$ORIGIN/../libs' "${executable_path}"
|
||||
RESULT_VARIABLE patchelf_result)
|
||||
if (NOT patchelf_result EQUAL "0")
|
||||
message(FATAL_ERROR "patchelf failed: ${patchelf_result}")
|
||||
endif()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# --- Root bundling logic ---
|
||||
|
||||
set(bundle_dir ${BINARY_PATH}/bundle)
|
||||
|
||||
# On Linux, always bundle an AppImage.
|
||||
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
|
||||
if (IN_PLACE)
|
||||
message(FATAL_ERROR "Cannot bundle for Linux in-place.")
|
||||
endif()
|
||||
|
||||
bundle_appimage("${bundle_dir}" "${EXECUTABLE_PATH}" "${SOURCE_PATH}" "${BINARY_PATH}" "${LINUXDEPLOY}" ${BUNDLE_QT})
|
||||
else()
|
||||
if (IN_PLACE)
|
||||
message(STATUS "Bundling dependencies in-place")
|
||||
set(bundled_executable_path "${EXECUTABLE_PATH}")
|
||||
else()
|
||||
message(STATUS "Copying base executable ${EXECUTABLE_PATH} to output directory ${bundle_dir}")
|
||||
file(COPY ${EXECUTABLE_PATH} DESTINATION ${bundle_dir})
|
||||
get_filename_component(bundled_executable_name "${EXECUTABLE_PATH}" NAME)
|
||||
set(bundled_executable_path "${bundle_dir}/${bundled_executable_name}")
|
||||
endif()
|
||||
|
||||
if (BUNDLE_QT)
|
||||
bundle_qt("${bundled_executable_path}")
|
||||
else()
|
||||
bundle_standalone("${bundled_executable_path}" "${EXECUTABLE_PATH}" "${BUNDLE_LIBRARY_PATHS}")
|
||||
endif()
|
||||
endif()
|
||||
elseif (BUNDLE_TARGET_DOWNLOAD_LINUXDEPLOY)
|
||||
# --- linuxdeploy download logic ---
|
||||
|
||||
# Downloads and extracts a linuxdeploy component.
|
||||
function(download_linuxdeploy_component base_dir name executable_name)
|
||||
set(executable_file "${base_dir}/${executable_name}")
|
||||
if (NOT EXISTS "${executable_file}")
|
||||
message(STATUS "Downloading ${executable_name}")
|
||||
file(DOWNLOAD
|
||||
"https://github.com/${name}/releases/download/continuous/${executable_name}"
|
||||
"${executable_file}" SHOW_PROGRESS)
|
||||
file(CHMOD "${executable_file}" PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE)
|
||||
|
||||
get_filename_component(executable_ext "${executable_file}" LAST_EXT)
|
||||
if (executable_ext STREQUAL ".AppImage")
|
||||
message(STATUS "Extracting ${executable_name}")
|
||||
execute_process(
|
||||
COMMAND "${executable_file}" --appimage-extract
|
||||
WORKING_DIRECTORY "${base_dir}"
|
||||
RESULT_VARIABLE extract_result)
|
||||
if (NOT extract_result EQUAL "0")
|
||||
message(FATAL_ERROR "AppImage extract failed: ${extract_result}")
|
||||
endif()
|
||||
else()
|
||||
message(STATUS "Copying ${executable_name}")
|
||||
file(COPY "${executable_file}" DESTINATION "${base_dir}/squashfs-root/usr/bin/")
|
||||
endif()
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# Download plugins first so they don't overwrite linuxdeploy's AppRun file.
|
||||
download_linuxdeploy_component("${LINUXDEPLOY_PATH}" "linuxdeploy/linuxdeploy-plugin-qt" "linuxdeploy-plugin-qt-${LINUXDEPLOY_ARCH}.AppImage")
|
||||
download_linuxdeploy_component("${LINUXDEPLOY_PATH}" "darealshinji/linuxdeploy-plugin-checkrt" "linuxdeploy-plugin-checkrt.sh")
|
||||
download_linuxdeploy_component("${LINUXDEPLOY_PATH}" "linuxdeploy/linuxdeploy" "linuxdeploy-${LINUXDEPLOY_ARCH}.AppImage")
|
||||
else()
|
||||
# --- Bundling target creation logic ---
|
||||
|
||||
# Creates the base bundle target with common files and pre-bundle steps.
|
||||
function(create_base_bundle_target)
|
||||
message(STATUS "Creating base bundle target")
|
||||
|
||||
add_custom_target(bundle)
|
||||
add_custom_command(
|
||||
TARGET bundle
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/bundle/")
|
||||
add_custom_command(
|
||||
TARGET bundle
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_BINARY_DIR}/bundle/dist/")
|
||||
add_custom_command(
|
||||
TARGET bundle
|
||||
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/dist/icon.png" "${CMAKE_BINARY_DIR}/bundle/dist/citra.png")
|
||||
add_custom_command(
|
||||
TARGET bundle
|
||||
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/license.txt" "${CMAKE_BINARY_DIR}/bundle/")
|
||||
add_custom_command(
|
||||
TARGET bundle
|
||||
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_SOURCE_DIR}/README.md" "${CMAKE_BINARY_DIR}/bundle/")
|
||||
add_custom_command(
|
||||
TARGET bundle
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_directory "${CMAKE_SOURCE_DIR}/dist/scripting" "${CMAKE_BINARY_DIR}/bundle/scripting")
|
||||
|
||||
# On Linux, add a command to prepare linuxdeploy and any required plugins before any bundling occurs.
|
||||
if (CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
|
||||
add_custom_command(
|
||||
TARGET bundle
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
"-DBUNDLE_TARGET_DOWNLOAD_LINUXDEPLOY=1"
|
||||
"-DLINUXDEPLOY_PATH=${CMAKE_BINARY_DIR}/externals/linuxdeploy"
|
||||
"-DLINUXDEPLOY_ARCH=${CMAKE_HOST_SYSTEM_PROCESSOR}"
|
||||
-P "${CMAKE_SOURCE_DIR}/CMakeModules/BundleTarget.cmake"
|
||||
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# Adds a target to the bundle target, packing in required libraries.
|
||||
# If in_place is true, the bundling will be done in-place as part of the specified target.
|
||||
function(bundle_target_internal target_name in_place)
|
||||
# Create base bundle target if it does not exist.
|
||||
if (NOT in_place AND NOT TARGET bundle)
|
||||
create_base_bundle_target()
|
||||
endif()
|
||||
|
||||
set(bundle_executable_path "$<TARGET_FILE:${target_name}>")
|
||||
if (target_name MATCHES ".*qt")
|
||||
set(bundle_qt ON)
|
||||
if (APPLE)
|
||||
# For Qt targets on Apple, expect an app bundle.
|
||||
set(bundle_executable_path "$<TARGET_BUNDLE_DIR:${target_name}>")
|
||||
endif()
|
||||
else()
|
||||
set(bundle_qt OFF)
|
||||
endif()
|
||||
|
||||
# Build a list of library search paths from prefix paths.
|
||||
foreach(prefix_path IN LISTS CMAKE_FIND_ROOT_PATH CMAKE_PREFIX_PATH CMAKE_SYSTEM_PREFIX_PATH)
|
||||
if (WIN32)
|
||||
list(APPEND bundle_library_paths "${prefix_path}/bin")
|
||||
endif()
|
||||
list(APPEND bundle_library_paths "${prefix_path}/lib")
|
||||
endforeach()
|
||||
foreach(library_path IN LISTS CMAKE_SYSTEM_LIBRARY_PATH)
|
||||
list(APPEND bundle_library_paths "${library_path}")
|
||||
endforeach()
|
||||
|
||||
if (in_place)
|
||||
message(STATUS "Adding in-place bundling to ${target_name}")
|
||||
set(dest_target ${target_name})
|
||||
else()
|
||||
message(STATUS "Adding ${target_name} to bundle target")
|
||||
set(dest_target bundle)
|
||||
add_dependencies(bundle ${target_name})
|
||||
endif()
|
||||
|
||||
add_custom_command(TARGET ${dest_target} POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
"-DQT_HOST_PATH=\"${QT_HOST_PATH}\""
|
||||
"-DQT_TARGET_PATH=\"${QT_TARGET_PATH}\""
|
||||
"-DBUNDLE_TARGET_EXECUTE=1"
|
||||
"-DTARGET=${target_name}"
|
||||
"-DSOURCE_PATH=${CMAKE_SOURCE_DIR}"
|
||||
"-DBINARY_PATH=${CMAKE_BINARY_DIR}"
|
||||
"-DEXECUTABLE_PATH=${bundle_executable_path}"
|
||||
"-DBUNDLE_LIBRARY_PATHS=\"${bundle_library_paths}\""
|
||||
"-DBUNDLE_QT=${bundle_qt}"
|
||||
"-DIN_PLACE=${in_place}"
|
||||
"-DLINUXDEPLOY=${CMAKE_BINARY_DIR}/externals/linuxdeploy/squashfs-root/AppRun"
|
||||
-P "${CMAKE_SOURCE_DIR}/CMakeModules/BundleTarget.cmake"
|
||||
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}")
|
||||
endfunction()
|
||||
|
||||
# Adds a target to the bundle target, packing in required libraries.
|
||||
function(bundle_target target_name)
|
||||
bundle_target_internal("${target_name}" OFF)
|
||||
endfunction()
|
||||
|
||||
# Bundles the target in-place, packing in required libraries.
|
||||
function(bundle_target_in_place target_name)
|
||||
bundle_target_internal("${target_name}" ON)
|
||||
endfunction()
|
||||
endif()
|
|
@ -1,11 +0,0 @@
|
|||
function(copy_citra_FFmpeg_deps target_dir)
|
||||
include(WindowsCopyFiles)
|
||||
set(DLL_DEST "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/")
|
||||
windows_copy_files(${target_dir} ${FFMPEG_DIR}/bin ${DLL_DEST}
|
||||
avcodec*.dll
|
||||
avformat*.dll
|
||||
avutil*.dll
|
||||
swresample*.dll
|
||||
swscale*.dll
|
||||
)
|
||||
endfunction(copy_citra_FFmpeg_deps)
|
|
@ -1,47 +0,0 @@
|
|||
function(copy_citra_Qt5_deps target_dir)
|
||||
include(WindowsCopyFiles)
|
||||
set(DLL_DEST "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/")
|
||||
set(Qt5_DLL_DIR "${Qt5_DIR}/../../../bin")
|
||||
set(Qt5_PLATFORMS_DIR "${Qt5_DIR}/../../../plugins/platforms/")
|
||||
set(Qt5_MEDIASERVICE_DIR "${Qt5_DIR}/../../../plugins/mediaservice/")
|
||||
set(Qt5_STYLES_DIR "${Qt5_DIR}/../../../plugins/styles/")
|
||||
set(Qt5_IMAGEFORMATS_DIR "${Qt5_DIR}/../../../plugins/imageformats/")
|
||||
set(PLATFORMS ${DLL_DEST}plugins/platforms/)
|
||||
set(MEDIASERVICE ${DLL_DEST}plugins/mediaservice/)
|
||||
set(STYLES ${DLL_DEST}plugins/styles/)
|
||||
set(IMAGEFORMATS ${DLL_DEST}plugins/imageformats/)
|
||||
windows_copy_files(${target_dir} ${Qt5_DLL_DIR} ${DLL_DEST}
|
||||
icudt*.dll
|
||||
icuin*.dll
|
||||
icuuc*.dll
|
||||
Qt5Core$<$<CONFIG:Debug>:d>.*
|
||||
Qt5Gui$<$<CONFIG:Debug>:d>.*
|
||||
Qt5OpenGL$<$<CONFIG:Debug>:d>.*
|
||||
Qt5Widgets$<$<CONFIG:Debug>:d>.*
|
||||
Qt5Multimedia$<$<CONFIG:Debug>:d>.*
|
||||
Qt5Network$<$<CONFIG:Debug>:d>.*
|
||||
)
|
||||
windows_copy_files(citra-qt ${Qt5_PLATFORMS_DIR} ${PLATFORMS} qwindows$<$<CONFIG:Debug>:d>.*)
|
||||
windows_copy_files(citra-qt ${Qt5_MEDIASERVICE_DIR} ${MEDIASERVICE}
|
||||
dsengine$<$<CONFIG:Debug>:d>.*
|
||||
wmfengine$<$<CONFIG:Debug>:d>.*
|
||||
)
|
||||
windows_copy_files(citra-qt ${Qt5_STYLES_DIR} ${STYLES} qwindowsvistastyle$<$<CONFIG:Debug>:d>.*)
|
||||
windows_copy_files(${target_dir} ${Qt5_IMAGEFORMATS_DIR} ${IMAGEFORMATS}
|
||||
qgif$<$<CONFIG:Debug>:d>.dll
|
||||
qicns$<$<CONFIG:Debug>:d>.dll
|
||||
qico$<$<CONFIG:Debug>:d>.dll
|
||||
qjpeg$<$<CONFIG:Debug>:d>.dll
|
||||
qsvg$<$<CONFIG:Debug>:d>.dll
|
||||
qtga$<$<CONFIG:Debug>:d>.dll
|
||||
qtiff$<$<CONFIG:Debug>:d>.dll
|
||||
qwbmp$<$<CONFIG:Debug>:d>.dll
|
||||
qwebp$<$<CONFIG:Debug>:d>.dll
|
||||
)
|
||||
|
||||
# Create an empty qt.conf file. Qt will detect that this file exists, and use the folder that its in as the root folder.
|
||||
# This way it'll look for plugins in the root/plugins/ folder
|
||||
add_custom_command(TARGET citra-qt POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E touch ${DLL_DEST}qt.conf
|
||||
)
|
||||
endfunction(copy_citra_Qt5_deps)
|
|
@ -1,5 +0,0 @@
|
|||
function(copy_citra_SDL_deps target_dir)
|
||||
include(WindowsCopyFiles)
|
||||
set(DLL_DEST "${CMAKE_BINARY_DIR}/bin/$<CONFIG>/")
|
||||
windows_copy_files(${target_dir} ${SDL2_DLL_DIR} ${DLL_DEST} SDL2.dll)
|
||||
endfunction(copy_citra_SDL_deps)
|
|
@ -1,18 +1,198 @@
|
|||
|
||||
# This function downloads a binary library package from our external repo.
|
||||
set(CURRENT_MODULE_DIR ${CMAKE_CURRENT_LIST_DIR})
|
||||
|
||||
# Determines parameters based on the host and target for downloading the right Qt binaries.
|
||||
function(determine_qt_parameters target host_out type_out arch_out arch_path_out host_type_out host_arch_out host_arch_path_out)
|
||||
if (target MATCHES "tools_.*")
|
||||
set(tool ON)
|
||||
else()
|
||||
set(tool OFF)
|
||||
endif()
|
||||
|
||||
# Determine installation parameters for OS, architecture, and compiler
|
||||
if (WIN32)
|
||||
set(host "windows")
|
||||
set(type "desktop")
|
||||
|
||||
if (NOT tool)
|
||||
if (MINGW)
|
||||
set(arch "win64_mingw")
|
||||
set(arch_path "mingw_64")
|
||||
elseif (MSVC)
|
||||
if ("arm64" IN_LIST ARCHITECTURE)
|
||||
set(arch_path "msvc2019_arm64")
|
||||
elseif ("x86_64" IN_LIST ARCHITECTURE)
|
||||
set(arch_path "msvc2019_64")
|
||||
else()
|
||||
message(FATAL_ERROR "Unsupported bundled Qt architecture. Enable USE_SYSTEM_QT and provide your own.")
|
||||
endif()
|
||||
set(arch "win64_${arch_path}")
|
||||
|
||||
# In case we're cross-compiling, prepare to also fetch the correct host Qt tools.
|
||||
if (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "AMD64")
|
||||
set(host_arch_path "msvc2019_64")
|
||||
elseif (CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "ARM64")
|
||||
# TODO: msvc2019_arm64 doesn't include some of the required tools for some reason,
|
||||
# TODO: so until it does, just use msvc2019_64 under x86_64 emulation.
|
||||
# set(host_arch_path "msvc2019_arm64")
|
||||
set(host_arch_path "msvc2019_64")
|
||||
endif()
|
||||
set(host_arch "win64_${host_arch_path}")
|
||||
else()
|
||||
message(FATAL_ERROR "Unsupported bundled Qt toolchain. Enable USE_SYSTEM_QT and provide your own.")
|
||||
endif()
|
||||
endif()
|
||||
elseif (APPLE)
|
||||
set(host "mac")
|
||||
set(type "desktop")
|
||||
set(arch "clang_64")
|
||||
set(arch_path "macos")
|
||||
|
||||
if (IOS AND NOT tool)
|
||||
set(host_type "${type}")
|
||||
set(host_arch "${arch}")
|
||||
set(host_arch_path "${arch_path}")
|
||||
|
||||
set(type "ios")
|
||||
set(arch "ios")
|
||||
set(arch_path "ios")
|
||||
endif()
|
||||
else()
|
||||
set(host "linux")
|
||||
set(type "desktop")
|
||||
set(arch "gcc_64")
|
||||
set(arch_path "linux")
|
||||
endif()
|
||||
|
||||
set(${host_out} "${host}" PARENT_SCOPE)
|
||||
set(${type_out} "${type}" PARENT_SCOPE)
|
||||
set(${arch_out} "${arch}" PARENT_SCOPE)
|
||||
set(${arch_path_out} "${arch_path}" PARENT_SCOPE)
|
||||
if (DEFINED host_type)
|
||||
set(${host_type_out} "${host_type}" PARENT_SCOPE)
|
||||
else()
|
||||
set(${host_type_out} "${type}" PARENT_SCOPE)
|
||||
endif()
|
||||
if (DEFINED host_arch)
|
||||
set(${host_arch_out} "${host_arch}" PARENT_SCOPE)
|
||||
else()
|
||||
set(${host_arch_out} "${arch}" PARENT_SCOPE)
|
||||
endif()
|
||||
if (DEFINED host_arch_path)
|
||||
set(${host_arch_path_out} "${host_arch_path}" PARENT_SCOPE)
|
||||
else()
|
||||
set(${host_arch_path_out} "${arch_path}" PARENT_SCOPE)
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
# Download Qt binaries for a specifc configuration.
|
||||
function(download_qt_configuration prefix_out target host type arch arch_path base_path)
|
||||
if (target MATCHES "tools_.*")
|
||||
set(tool ON)
|
||||
else()
|
||||
set(tool OFF)
|
||||
endif()
|
||||
|
||||
set(install_args -c "${CURRENT_MODULE_DIR}/aqt_config.ini")
|
||||
if (tool)
|
||||
set(prefix "${base_path}/Tools")
|
||||
set(install_args ${install_args} install-tool --outputdir ${base_path} ${host} desktop ${target})
|
||||
else()
|
||||
set(prefix "${base_path}/${target}/${arch_path}")
|
||||
set(install_args ${install_args} install-qt --outputdir ${base_path} ${host} ${type} ${target} ${arch}
|
||||
-m qtmultimedia --archives qttranslations qttools qtsvg qtbase)
|
||||
endif()
|
||||
|
||||
if (NOT EXISTS "${prefix}")
|
||||
message(STATUS "Downloading Qt binaries for ${target}:${host}:${type}:${arch}:${arch_path}")
|
||||
set(AQT_PREBUILD_BASE_URL "https://github.com/miurahr/aqtinstall/releases/download/v3.1.9")
|
||||
if (WIN32)
|
||||
set(aqt_path "${base_path}/aqt.exe")
|
||||
if (NOT EXISTS "${aqt_path}")
|
||||
file(DOWNLOAD
|
||||
${AQT_PREBUILD_BASE_URL}/aqt.exe
|
||||
${aqt_path} SHOW_PROGRESS)
|
||||
endif()
|
||||
execute_process(COMMAND ${aqt_path} ${install_args}
|
||||
WORKING_DIRECTORY ${base_path})
|
||||
elseif (APPLE)
|
||||
set(aqt_path "${base_path}/aqt-macos")
|
||||
if (NOT EXISTS "${aqt_path}")
|
||||
file(DOWNLOAD
|
||||
${AQT_PREBUILD_BASE_URL}/aqt-macos
|
||||
${aqt_path} SHOW_PROGRESS)
|
||||
endif()
|
||||
execute_process(COMMAND chmod +x ${aqt_path})
|
||||
execute_process(COMMAND ${aqt_path} ${install_args}
|
||||
WORKING_DIRECTORY ${base_path})
|
||||
else()
|
||||
# aqt does not offer binary releases for other platforms, so download and run from pip.
|
||||
set(aqt_install_path "${base_path}/aqt")
|
||||
file(MAKE_DIRECTORY "${aqt_install_path}")
|
||||
|
||||
execute_process(COMMAND python3 -m pip install --target=${aqt_install_path} aqtinstall
|
||||
WORKING_DIRECTORY ${base_path})
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${aqt_install_path} python3 -m aqt ${install_args}
|
||||
WORKING_DIRECTORY ${base_path})
|
||||
endif()
|
||||
|
||||
message(STATUS "Downloaded Qt binaries for ${target}:${host}:${type}:${arch}:${arch_path} to ${prefix}")
|
||||
endif()
|
||||
|
||||
set(${prefix_out} "${prefix}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
# This function downloads Qt using aqt.
|
||||
# The path of the downloaded content will be added to the CMAKE_PREFIX_PATH.
|
||||
# QT_TARGET_PATH is set to the Qt for the compile target platform.
|
||||
# QT_HOST_PATH is set to a host-compatible Qt, for running tools.
|
||||
# Params:
|
||||
# remote_path: path to the file to download, relative to the remote repository root
|
||||
# prefix_var: name of a variable which will be set with the path to the extracted contents
|
||||
function(download_bundled_external remote_path lib_name prefix_var)
|
||||
set(prefix "${CMAKE_BINARY_DIR}/externals/${lib_name}")
|
||||
if (NOT EXISTS "${prefix}")
|
||||
message(STATUS "Downloading binaries for ${lib_name}...")
|
||||
file(DOWNLOAD
|
||||
https://github.com/citra-emu/ext-windows-bin/raw/master/${remote_path}${lib_name}.7z
|
||||
"${CMAKE_BINARY_DIR}/externals/${lib_name}.7z" SHOW_PROGRESS)
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${CMAKE_BINARY_DIR}/externals/${lib_name}.7z"
|
||||
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals")
|
||||
endif()
|
||||
message(STATUS "Using bundled binaries at ${prefix}")
|
||||
set(${prefix_var} "${prefix}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
# target: Qt dependency to install. Specify a version number to download Qt, or "tools_(name)" for a specific build tool.
|
||||
function(download_qt target)
|
||||
determine_qt_parameters("${target}" host type arch arch_path host_type host_arch host_arch_path)
|
||||
|
||||
get_external_prefix(qt base_path)
|
||||
file(MAKE_DIRECTORY "${base_path}")
|
||||
|
||||
download_qt_configuration(prefix "${target}" "${host}" "${type}" "${arch}" "${arch_path}" "${base_path}")
|
||||
if (DEFINED host_arch_path AND NOT "${host_arch_path}" STREQUAL "${arch_path}")
|
||||
download_qt_configuration(host_prefix "${target}" "${host}" "${host_type}" "${host_arch}" "${host_arch_path}" "${base_path}")
|
||||
else()
|
||||
set(host_prefix "${prefix}")
|
||||
endif()
|
||||
|
||||
set(QT_TARGET_PATH "${prefix}" CACHE STRING "")
|
||||
set(QT_HOST_PATH "${host_prefix}" CACHE STRING "")
|
||||
|
||||
# Add the target Qt prefix path so CMake can locate it.
|
||||
list(APPEND CMAKE_PREFIX_PATH "${prefix}")
|
||||
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
function(download_moltenvk)
|
||||
if (IOS)
|
||||
set(MOLTENVK_PLATFORM "iOS")
|
||||
else()
|
||||
set(MOLTENVK_PLATFORM "macOS")
|
||||
endif()
|
||||
|
||||
set(MOLTENVK_DIR "${CMAKE_BINARY_DIR}/externals/MoltenVK")
|
||||
set(MOLTENVK_TAR "${CMAKE_BINARY_DIR}/externals/MoltenVK.tar")
|
||||
if (NOT EXISTS ${MOLTENVK_DIR})
|
||||
if (NOT EXISTS ${MOLTENVK_TAR})
|
||||
file(DOWNLOAD https://github.com/KhronosGroup/MoltenVK/releases/download/v1.2.7-rc2/MoltenVK-all.tar
|
||||
${MOLTENVK_TAR} SHOW_PROGRESS)
|
||||
endif()
|
||||
|
||||
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${MOLTENVK_TAR}"
|
||||
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals")
|
||||
endif()
|
||||
|
||||
# Add the MoltenVK library path to the prefix so find_library can locate it.
|
||||
list(APPEND CMAKE_PREFIX_PATH "${MOLTENVK_DIR}/MoltenVK/dylib/${MOLTENVK_PLATFORM}")
|
||||
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
function(get_external_prefix lib_name prefix_var)
|
||||
set(${prefix_var} "${CMAKE_BINARY_DIR}/externals/${lib_name}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
|
65
CMakeModules/GenerateBuildInfo.cmake
Normal file
65
CMakeModules/GenerateBuildInfo.cmake
Normal file
|
@ -0,0 +1,65 @@
|
|||
# Gets a UTC timstamp and sets the provided variable to it
|
||||
function(get_timestamp _var)
|
||||
string(TIMESTAMP timestamp UTC)
|
||||
set(${_var} "${timestamp}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
get_timestamp(BUILD_DATE)
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH "${SRC_DIR}/externals/cmake-modules")
|
||||
|
||||
if (EXISTS "${SRC_DIR}/.git/objects")
|
||||
# Find the package here with the known path so that the GetGit commands can find it as well
|
||||
find_package(Git QUIET PATHS "${GIT_EXECUTABLE}")
|
||||
|
||||
# only use Git to check revision info when source is obtained via Git
|
||||
include(GetGitRevisionDescription)
|
||||
get_git_head_revision(GIT_REF_SPEC GIT_REV)
|
||||
git_describe(GIT_DESC --always --long --dirty)
|
||||
git_branch_name(GIT_BRANCH)
|
||||
elseif (EXISTS "${SRC_DIR}/GIT-COMMIT" AND EXISTS "${SRC_DIR}/GIT-TAG")
|
||||
# unified source archive
|
||||
file(READ "${SRC_DIR}/GIT-COMMIT" GIT_REV_RAW LIMIT 64)
|
||||
string(STRIP "${GIT_REV_RAW}" GIT_REV)
|
||||
string(SUBSTRING "${GIT_REV_RAW}" 0 9 GIT_DESC)
|
||||
set(GIT_BRANCH "HEAD")
|
||||
else()
|
||||
# self-packed archive?
|
||||
set(GIT_REV "UNKNOWN")
|
||||
set(GIT_DESC "UNKNOWN")
|
||||
set(GIT_BRANCH "UNKNOWN")
|
||||
endif()
|
||||
string(SUBSTRING "${GIT_REV}" 0 7 GIT_SHORT_REV)
|
||||
|
||||
# Generate cpp with Git revision from template
|
||||
# Also if this is a CI build, add the build name (ie: Nightly, Canary) to the scm_rev file as well
|
||||
set(REPO_NAME "")
|
||||
set(BUILD_VERSION "0")
|
||||
set(BUILD_FULLNAME "${GIT_SHORT_REV}")
|
||||
if (DEFINED ENV{CI})
|
||||
if (DEFINED ENV{GITHUB_ACTIONS})
|
||||
set(BUILD_REPOSITORY $ENV{GITHUB_REPOSITORY})
|
||||
set(BUILD_TAG $ENV{GITHUB_REF_NAME})
|
||||
endif()
|
||||
|
||||
# regex capture the string nightly or canary into CMAKE_MATCH_1
|
||||
string(REGEX MATCH "citra-emu/citra-?(.*)" OUTVAR ${BUILD_REPOSITORY})
|
||||
if ("${CMAKE_MATCH_COUNT}" GREATER 0)
|
||||
# capitalize the first letter of each word in the repo name.
|
||||
string(REPLACE "-" ";" REPO_NAME_LIST ${CMAKE_MATCH_1})
|
||||
foreach(WORD ${REPO_NAME_LIST})
|
||||
string(SUBSTRING ${WORD} 0 1 FIRST_LETTER)
|
||||
string(SUBSTRING ${WORD} 1 -1 REMAINDER)
|
||||
string(TOUPPER ${FIRST_LETTER} FIRST_LETTER)
|
||||
set(REPO_NAME "${REPO_NAME}${FIRST_LETTER}${REMAINDER}")
|
||||
endforeach()
|
||||
string(REGEX MATCH "${CMAKE_MATCH_1}-([0-9]+)" OUTVAR ${BUILD_TAG})
|
||||
if (${CMAKE_MATCH_COUNT} GREATER 0)
|
||||
set(BUILD_VERSION ${CMAKE_MATCH_1})
|
||||
endif()
|
||||
if (BUILD_VERSION)
|
||||
set(BUILD_FULLNAME "${REPO_NAME} ${BUILD_VERSION}")
|
||||
else()
|
||||
set(BUILD_FULLNAME "")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
|
@ -1,85 +1,39 @@
|
|||
# Gets a UTC timstamp and sets the provided variable to it
|
||||
function(get_timestamp _var)
|
||||
string(TIMESTAMP timestamp UTC)
|
||||
set(${_var} "${timestamp}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH "${SRC_DIR}/externals/cmake-modules")
|
||||
|
||||
# Find the package here with the known path so that the GetGit commands can find it as well
|
||||
find_package(Git QUIET PATHS "${GIT_EXECUTABLE}")
|
||||
|
||||
# generate git/build information
|
||||
include(GetGitRevisionDescription)
|
||||
get_git_head_revision(GIT_REF_SPEC GIT_REV)
|
||||
git_describe(GIT_DESC --always --long --dirty)
|
||||
git_branch_name(GIT_BRANCH)
|
||||
get_timestamp(BUILD_DATE)
|
||||
|
||||
# Generate cpp with Git revision from template
|
||||
# Also if this is a CI build, add the build name (ie: Nightly, Canary) to the scm_rev file as well
|
||||
set(REPO_NAME "")
|
||||
set(BUILD_VERSION "0")
|
||||
if (DEFINED ENV{CI})
|
||||
if (DEFINED ENV{TRAVIS})
|
||||
set(BUILD_REPOSITORY $ENV{TRAVIS_REPO_SLUG})
|
||||
set(BUILD_TAG $ENV{TRAVIS_TAG})
|
||||
elseif(DEFINED ENV{APPVEYOR})
|
||||
set(BUILD_REPOSITORY $ENV{APPVEYOR_REPO_NAME})
|
||||
set(BUILD_TAG $ENV{APPVEYOR_REPO_TAG_NAME})
|
||||
elseif(DEFINED ENV{BITRISE_IO})
|
||||
set(BUILD_REPOSITORY "$ENV{BITRISEIO_GIT_REPOSITORY_OWNER}/$ENV{BITRISEIO_GIT_REPOSITORY_SLUG}")
|
||||
set(BUILD_TAG $ENV{BITRISE_GIT_TAG})
|
||||
endif()
|
||||
|
||||
# regex capture the string nightly or canary into CMAKE_MATCH_1
|
||||
string(REGEX MATCH "citra-emu/citra-?(.*)" OUTVAR ${BUILD_REPOSITORY})
|
||||
if ("${CMAKE_MATCH_COUNT}" GREATER 0)
|
||||
# capitalize the first letter of each word in the repo name.
|
||||
string(REPLACE "-" ";" REPO_NAME_LIST ${CMAKE_MATCH_1})
|
||||
foreach(WORD ${REPO_NAME_LIST})
|
||||
string(SUBSTRING ${WORD} 0 1 FIRST_LETTER)
|
||||
string(SUBSTRING ${WORD} 1 -1 REMAINDER)
|
||||
string(TOUPPER ${FIRST_LETTER} FIRST_LETTER)
|
||||
set(REPO_NAME "${REPO_NAME}${FIRST_LETTER}${REMAINDER}")
|
||||
endforeach()
|
||||
if (BUILD_TAG)
|
||||
string(REGEX MATCH "${CMAKE_MATCH_1}-([0-9]+)" OUTVAR ${BUILD_TAG})
|
||||
if (${CMAKE_MATCH_COUNT} GREATER 0)
|
||||
set(BUILD_VERSION ${CMAKE_MATCH_1})
|
||||
endif()
|
||||
if (BUILD_VERSION)
|
||||
# This leaves a trailing space on the last word, but we actually want that
|
||||
# because of how it's styled in the title bar.
|
||||
set(BUILD_FULLNAME "${REPO_NAME} ${BUILD_VERSION} ")
|
||||
else()
|
||||
set(BUILD_FULLNAME "")
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
list(APPEND CMAKE_MODULE_PATH "${SRC_DIR}/CMakeModules")
|
||||
include(GenerateBuildInfo)
|
||||
|
||||
# The variable SRC_DIR must be passed into the script (since it uses the current build directory for all values of CMAKE_*_DIR)
|
||||
set(VIDEO_CORE "${SRC_DIR}/src/video_core")
|
||||
set(HASH_FILES
|
||||
"${VIDEO_CORE}/renderer_opengl/gl_shader_decompiler.cpp"
|
||||
"${VIDEO_CORE}/renderer_opengl/gl_shader_decompiler.h"
|
||||
"${VIDEO_CORE}/renderer_opengl/gl_shader_disk_cache.cpp"
|
||||
"${VIDEO_CORE}/renderer_opengl/gl_shader_disk_cache.h"
|
||||
"${VIDEO_CORE}/renderer_opengl/gl_shader_gen.cpp"
|
||||
"${VIDEO_CORE}/renderer_opengl/gl_shader_gen.h"
|
||||
"${VIDEO_CORE}/renderer_opengl/gl_shader_util.cpp"
|
||||
"${VIDEO_CORE}/renderer_opengl/gl_shader_util.h"
|
||||
"${VIDEO_CORE}/renderer_vulkan/vk_shader_util.cpp"
|
||||
"${VIDEO_CORE}/renderer_vulkan/vk_shader_util.h"
|
||||
"${VIDEO_CORE}/shader/generator/glsl_fs_shader_gen.cpp"
|
||||
"${VIDEO_CORE}/shader/generator/glsl_fs_shader_gen.h"
|
||||
"${VIDEO_CORE}/shader/generator/glsl_shader_decompiler.cpp"
|
||||
"${VIDEO_CORE}/shader/generator/glsl_shader_decompiler.h"
|
||||
"${VIDEO_CORE}/shader/generator/glsl_shader_gen.cpp"
|
||||
"${VIDEO_CORE}/shader/generator/glsl_shader_gen.h"
|
||||
"${VIDEO_CORE}/shader/generator/pica_fs_config.cpp"
|
||||
"${VIDEO_CORE}/shader/generator/pica_fs_config.h"
|
||||
"${VIDEO_CORE}/shader/generator/shader_gen.cpp"
|
||||
"${VIDEO_CORE}/shader/generator/shader_gen.h"
|
||||
"${VIDEO_CORE}/shader/generator/shader_uniforms.cpp"
|
||||
"${VIDEO_CORE}/shader/generator/shader_uniforms.h"
|
||||
"${VIDEO_CORE}/shader/generator/spv_fs_shader_gen.cpp"
|
||||
"${VIDEO_CORE}/shader/generator/spv_fs_shader_gen.h"
|
||||
"${VIDEO_CORE}/shader/shader.cpp"
|
||||
"${VIDEO_CORE}/shader/shader.h"
|
||||
"${VIDEO_CORE}/pica.cpp"
|
||||
"${VIDEO_CORE}/pica.h"
|
||||
"${VIDEO_CORE}/regs_framebuffer.h"
|
||||
"${VIDEO_CORE}/regs_lighting.h"
|
||||
"${VIDEO_CORE}/regs_pipeline.h"
|
||||
"${VIDEO_CORE}/regs_rasterizer.h"
|
||||
"${VIDEO_CORE}/regs_shader.h"
|
||||
"${VIDEO_CORE}/regs_texturing.h"
|
||||
"${VIDEO_CORE}/regs.cpp"
|
||||
"${VIDEO_CORE}/regs.h"
|
||||
"${VIDEO_CORE}/pica/regs_framebuffer.h"
|
||||
"${VIDEO_CORE}/pica/regs_lighting.h"
|
||||
"${VIDEO_CORE}/pica/regs_pipeline.h"
|
||||
"${VIDEO_CORE}/pica/regs_rasterizer.h"
|
||||
"${VIDEO_CORE}/pica/regs_shader.h"
|
||||
"${VIDEO_CORE}/pica/regs_texturing.h"
|
||||
"${VIDEO_CORE}/pica/regs_internal.cpp"
|
||||
"${VIDEO_CORE}/pica/regs_internal.h"
|
||||
)
|
||||
set(COMBINED "")
|
||||
foreach (F IN LISTS HASH_FILES)
|
||||
|
|
|
@ -1,54 +0,0 @@
|
|||
SET(MINGW_PREFIX /usr/x86_64-w64-mingw32/)
|
||||
SET(CMAKE_SYSTEM_NAME Windows)
|
||||
SET(CMAKE_SYSTEM_PROCESSOR x86_64)
|
||||
# Actually a hack, w/o this will cause some strange errors
|
||||
SET(CMAKE_HOST_WIN32 TRUE)
|
||||
|
||||
|
||||
SET(CMAKE_FIND_ROOT_PATH ${MINGW_PREFIX})
|
||||
SET(SDL2_PATH ${MINGW_PREFIX})
|
||||
SET(MINGW_TOOL_PREFIX ${CMAKE_SYSTEM_PROCESSOR}-w64-mingw32-)
|
||||
|
||||
# Specify the cross compiler
|
||||
SET(CMAKE_C_COMPILER ${MINGW_TOOL_PREFIX}gcc-posix)
|
||||
SET(CMAKE_CXX_COMPILER ${MINGW_TOOL_PREFIX}g++-posix)
|
||||
SET(CMAKE_RC_COMPILER ${MINGW_TOOL_PREFIX}windres)
|
||||
|
||||
# Mingw tools
|
||||
SET(STRIP ${MINGW_TOOL_PREFIX}strip)
|
||||
SET(WINDRES ${MINGW_TOOL_PREFIX}windres)
|
||||
SET(ENV{PKG_CONFIG} ${MINGW_TOOL_PREFIX}pkg-config)
|
||||
|
||||
# ccache wrapper
|
||||
OPTION(USE_CCACHE "Use ccache for compilation" OFF)
|
||||
IF(USE_CCACHE)
|
||||
FIND_PROGRAM(CCACHE ccache)
|
||||
IF (CCACHE)
|
||||
MESSAGE(STATUS "Using ccache found in PATH")
|
||||
SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE})
|
||||
SET_PROPERTY(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE})
|
||||
ELSE(CCACHE)
|
||||
MESSAGE(WARNING "USE_CCACHE enabled, but no ccache found")
|
||||
ENDIF(CCACHE)
|
||||
ENDIF(USE_CCACHE)
|
||||
|
||||
# Search for programs in the build host directories
|
||||
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||
|
||||
|
||||
# Echo modified cmake vars to screen for debugging purposes
|
||||
IF(NOT DEFINED ENV{MINGW_DEBUG_INFO})
|
||||
MESSAGE("")
|
||||
MESSAGE("Custom cmake vars: (blank = system default)")
|
||||
MESSAGE("-----------------------------------------")
|
||||
MESSAGE("* CMAKE_C_COMPILER : ${CMAKE_C_COMPILER}")
|
||||
MESSAGE("* CMAKE_CXX_COMPILER : ${CMAKE_CXX_COMPILER}")
|
||||
MESSAGE("* CMAKE_RC_COMPILER : ${CMAKE_RC_COMPILER}")
|
||||
MESSAGE("* WINDRES : ${WINDRES}")
|
||||
MESSAGE("* ENV{PKG_CONFIG} : $ENV{PKG_CONFIG}")
|
||||
MESSAGE("* STRIP : ${STRIP}")
|
||||
MESSAGE("* USE_CCACHE : ${USE_CCACHE}")
|
||||
MESSAGE("")
|
||||
# So that the debug info only appears once
|
||||
SET(ENV{MINGW_DEBUG_INFO} SHOWN)
|
||||
ENDIF()
|
29
CMakeModules/aqt_config.ini
Normal file
29
CMakeModules/aqt_config.ini
Normal file
|
@ -0,0 +1,29 @@
|
|||
[aqt]
|
||||
concurrency: 2
|
||||
|
||||
[mirrors]
|
||||
trusted_mirrors:
|
||||
https://download.qt.io
|
||||
blacklist:
|
||||
https://qt.mirror.constant.com
|
||||
https://mirrors.ocf.berkeley.edu
|
||||
https://mirrors.ustc.edu.cn
|
||||
https://mirrors.tuna.tsinghua.edu.cn
|
||||
https://mirrors.geekpie.club
|
||||
https://mirrors-wan.geekpie.club
|
||||
https://mirrors.sjtug.sjtu.edu.cn
|
||||
fallbacks:
|
||||
https://qtproject.mirror.liquidtelecom.com/
|
||||
https://mirrors.aliyun.com/qt/
|
||||
https://ftp.jaist.ac.jp/pub/qtproject/
|
||||
https://ftp.yz.yamagata-u.ac.jp/pub/qtproject/
|
||||
https://qt-mirror.dannhauer.de/
|
||||
https://ftp.fau.de/qtproject/
|
||||
https://mirror.netcologne.de/qtproject/
|
||||
https://mirrors.dotsrc.org/qtproject/
|
||||
https://www.nic.funet.fi/pub/mirrors/download.qt-project.org/
|
||||
https://master.qt.io/
|
||||
https://mirrors.ukfast.co.uk/sites/qt.io/
|
||||
https://ftp2.nluug.nl/languages/qt/
|
||||
https://ftp1.nluug.nl/languages/qt/
|
||||
|
90
README.md
90
README.md
|
@ -1,44 +1,98 @@
|
|||
**BEFORE FILING AN ISSUE, READ THE RELEVANT SECTION IN THE [CONTRIBUTING](https://github.com/citra-emu/citra/wiki/Contributing#reporting-issues) FILE!!!**
|
||||
<h1 align="center">
|
||||
<br>
|
||||
<a href="https://citra-emu.org/"><img src="https://raw.githubusercontent.com/citra-emu/citra-assets/master/Main/citra_logo.svg" alt="Citra" width="200"></a>
|
||||
<br>
|
||||
<b>Citra</b>
|
||||
<br>
|
||||
</h1>
|
||||
|
||||
Citra
|
||||
==============
|
||||
[](https://travis-ci.com/citra-emu/citra)
|
||||
[](https://ci.appveyor.com/project/bunnei/citra)
|
||||
[](https://app.bitrise.io/app/4ccd8e5720f0d13b)
|
||||
[](https://discord.gg/FAXfZV9)
|
||||
<h4 align="center"><b>Citra</b> is the world's most popular, open-source, Nintendo 3DS emulator.
|
||||
<br>
|
||||
It is written in C++ with portability in mind and builds are actively maintained for Windows, Linux, Android and macOS.
|
||||
</h4>
|
||||
|
||||
Citra is an experimental open-source Nintendo 3DS emulator/debugger written in C++. It is written with portability in mind, with builds actively maintained for Windows, Linux and macOS.
|
||||
<p align="center">
|
||||
<a href="https://github.com/citra-emu/citra/actions/">
|
||||
<img src="https://github.com/citra-emu/citra/workflows/citra-ci/badge.svg"
|
||||
alt="GitHub Actions Build Status">
|
||||
</a>
|
||||
<a href="https://discord.gg/FAXfZV9">
|
||||
<img src="https://img.shields.io/discord/220740965957107713?color=%237289DA&label=Citra&logo=discord&logoColor=white"
|
||||
alt="Discord">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
Citra emulates a subset of 3DS hardware and therefore is useful for running/debugging homebrew applications, and it is also able to run many commercial games! Some of these do not run at a playable state, but we are working every day to advance the project forward. (Playable here means compatibility of at least "Okay" on our [game compatibility list](https://citra-emu.org/game).)
|
||||
<p align="center">
|
||||
<a href="#compatibility">Compatibility</a> |
|
||||
<a href="#releases">Releases</a> |
|
||||
<a href="#development">Development</a> |
|
||||
<a href="#building">Building</a> |
|
||||
<a href="#support">Support</a> |
|
||||
<a href="#license">License</a>
|
||||
</p>
|
||||
|
||||
Citra is licensed under the GPLv2 (or any later version). Refer to the license.txt file included. Please read the [FAQ](https://citra-emu.org/wiki/faq/) before getting started with the project.
|
||||
|
||||
Check out our [website](https://citra-emu.org/)!
|
||||
## Compatibility
|
||||
|
||||
The emulator is capable of running most commercial games at full speed, provided you meet the necessary hardware requirements.
|
||||
|
||||
For a full list of games Citra supports, please visit our [Compatibility page](https://citra-emu.org/game/)
|
||||
|
||||
Check out our [website](https://citra-emu.org/) for the latest news on exciting features, progress reports, and more!
|
||||
Please read the [FAQ](https://citra-emu.org/wiki/faq/) before getting started with the project.
|
||||
|
||||
Need help? Check out our [asking for help](https://citra-emu.org/help/reference/asking/) guide.
|
||||
|
||||
For development discussion, please join us on our [Discord server](https://citra-emu.org/discord/) or at #citra-dev on freenode.
|
||||
## Releases
|
||||
|
||||
### Development
|
||||
Citra has two main release channels: Nightly and Canary.
|
||||
|
||||
The [Nightly](https://github.com/citra-emu/citra-nightly) build is based on the master branch, and contains already reviewed and tested features.
|
||||
|
||||
The [Canary](https://github.com/citra-emu/citra-canary) build is based on the master branch, but with additional features still under review. PRs tagged `canary-merge` are merged only into the Canary builds.
|
||||
|
||||
Both builds can be installed with the installer provided on the [website](https://citra-emu.org/download/), but those looking for specific versions or standalone releases can find them in the release tabs of the [Nightly](https://github.com/citra-emu/citra-nightly/releases) and [Canary](https://github.com/citra-emu/citra-canary/releases) repositories.
|
||||
|
||||
Android builds can be downloaded from the Google Play Store.
|
||||
|
||||
A Flatpak for Citra is available on [Flathub](https://flathub.org/apps/details/org.citra_emu.citra). Details on the build process can be found in [our Flathub repository](https://github.com/flathub/org.citra_emu.citra).
|
||||
|
||||
## Development
|
||||
|
||||
Most of the development happens on GitHub. It's also where [our central repository](https://github.com/citra-emu/citra) is hosted.
|
||||
For development discussion, please join us on our [Discord server](https://citra-emu.org/discord/) or at #citra-dev on libera.
|
||||
|
||||
If you want to contribute please take a look at the [Contributor's Guide](https://github.com/citra-emu/citra/wiki/Contributing) and [Developer Information](https://github.com/citra-emu/citra/wiki/Developer-Information). You should also contact any of the developers in the forum in order to know about the current state of the emulator because the [TODO list](https://docs.google.com/document/d/1SWIop0uBI9IW8VGg97TAtoT_CHNoP42FzYmvG1F4QDA) isn't maintained anymore.
|
||||
If you want to contribute please take a look at the [Contributor's Guide](https://github.com/citra-emu/citra/wiki/Contributing) and [Developer Information](https://github.com/citra-emu/citra/wiki/Developer-Information). You can also contact any of the developers on Discord in order to know about the current state of the emulator.
|
||||
|
||||
If you want to contribute to the user interface translation, please checkout [citra project on transifex](https://www.transifex.com/citra/citra). We centralize the translation work there, and periodically upstream translation.
|
||||
If you want to contribute to the user interface translation, please check out the [Citra project on transifex](https://www.transifex.com/citra/citra). We centralize the translation work there, and periodically upstream translations.
|
||||
|
||||
### Building
|
||||
## Building
|
||||
|
||||
* __Windows__: [Windows Build](https://github.com/citra-emu/citra/wiki/Building-For-Windows)
|
||||
* __Linux__: [Linux Build](https://github.com/citra-emu/citra/wiki/Building-For-Linux)
|
||||
* __macOS__: [macOS Build](https://github.com/citra-emu/citra/wiki/Building-for-macOS)
|
||||
* __Android__: [Android Build](https://github.com/citra-emu/citra/wiki/Building-for-Android)
|
||||
|
||||
|
||||
### Support
|
||||
We happily accept monetary donations or donated games and hardware. Please see our [donations page](https://citra-emu.org/donate/) for more information on how you can contribute to Citra. Any donations received will go towards things like:
|
||||
## Support
|
||||
|
||||
If you enjoy the project and want to support us financially, check out our Patreon!
|
||||
|
||||
<a href="https://www.patreon.com/citraemu">
|
||||
<img src="https://c5.patreon.com/external/logo/become_a_patron_button@2x.png" width="160">
|
||||
</a>
|
||||
|
||||
We also happily accept donated games and hardware.
|
||||
Please see our [donations page](https://citra-emu.org/donate/) for more information on how you can contribute to Citra.
|
||||
Any donations received will go towards things like:
|
||||
* 3DS consoles for developers to explore the hardware
|
||||
* 3DS games for testing
|
||||
* Any equipment required for homebrew
|
||||
* Infrastructure setup
|
||||
|
||||
We also more than gladly accept used 3DS consoles! If you would like to give yours away, don't hesitate to join our [Discord server](https://citra-emu.org/discord/) and talk to bunnei.
|
||||
|
||||
|
||||
## License
|
||||
|
||||
Citra is licensed under the GPLv2 (or any later version). Refer to the [LICENSE.txt](https://github.com/citra-emu/citra/blob/master/license.txt) file.
|
||||
|
|
173
appveyor.yml
173
appveyor.yml
|
@ -1,173 +0,0 @@
|
|||
# shallow clone
|
||||
clone_depth: 10
|
||||
|
||||
cache:
|
||||
- C:\ProgramData\chocolatey\bin -> appveyor.yml
|
||||
- C:\ProgramData\chocolatey\lib -> appveyor.yml
|
||||
|
||||
os: Visual Studio 2017
|
||||
|
||||
environment:
|
||||
# Tell msys2 to add mingw64 to the path
|
||||
MSYSTEM: MINGW64
|
||||
# Tell msys2 to inherit the current directory when starting the shell
|
||||
CHERE_INVOKING: 1
|
||||
matrix:
|
||||
- BUILD_TYPE: mingw
|
||||
- BUILD_TYPE: msvc
|
||||
|
||||
platform:
|
||||
- x64
|
||||
|
||||
configuration:
|
||||
- Release
|
||||
|
||||
install:
|
||||
- git submodule update --init --recursive
|
||||
- ps: |
|
||||
if ($env:BUILD_TYPE -eq 'mingw') {
|
||||
$dependencies = "mingw64/mingw-w64-x86_64-cmake mingw64/mingw-w64-x86_64-qt5 mingw64/mingw-w64-x86_64-ffmpeg"
|
||||
C:\msys64\usr\bin\bash -lc "pacman --noconfirm -U http://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-SDL2-2.0.12-1-any.pkg.tar.xz"
|
||||
C:\msys64\usr\bin\bash -lc "pacman --noconfirm -S $dependencies"
|
||||
# (HACK) ignore errors
|
||||
0
|
||||
}
|
||||
|
||||
before_build:
|
||||
- mkdir %BUILD_TYPE%_build
|
||||
- cd %BUILD_TYPE%_build
|
||||
- ps: |
|
||||
$COMPAT = if ($env:ENABLE_COMPATIBILITY_REPORTING -eq $null) {0} else {$env:ENABLE_COMPATIBILITY_REPORTING}
|
||||
if ($env:BUILD_TYPE -eq 'msvc') {
|
||||
# redirect stderr and change the exit code to prevent powershell from cancelling the build if cmake prints a warning
|
||||
cmd /C 'cmake -G "Visual Studio 15 2017 Win64" -DCITRA_USE_BUNDLED_QT=1 -DCITRA_USE_BUNDLED_SDL2=1 -DCITRA_ENABLE_COMPATIBILITY_REPORTING=${COMPAT} -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON -DUSE_DISCORD_PRESENCE=ON -DENABLE_MF=ON -DENABLE_FFMPEG_VIDEO_DUMPER=ON .. 2>&1 && exit 0'
|
||||
} else {
|
||||
C:\msys64\usr\bin\bash.exe -lc "cmake -G 'MSYS Makefiles' -DCMAKE_BUILD_TYPE=Release -DENABLE_QT_TRANSLATION=ON -DCITRA_ENABLE_COMPATIBILITY_REPORTING=${COMPAT} -DENABLE_COMPATIBILITY_LIST_DOWNLOAD=ON -DUSE_DISCORD_PRESENCE=ON -DENABLE_MF=ON -DENABLE_FFMPEG_VIDEO_DUMPER=ON .. 2>&1"
|
||||
}
|
||||
- cd ..
|
||||
|
||||
build_script:
|
||||
- ps: |
|
||||
if ($env:BUILD_TYPE -eq 'msvc') {
|
||||
# https://www.appveyor.com/docs/build-phase
|
||||
msbuild msvc_build/citra.sln /maxcpucount /logger:"C:\Program Files\AppVeyor\BuildAgent\Appveyor.MSBuildLogger.dll"
|
||||
} else {
|
||||
C:\msys64\usr\bin\bash.exe -lc 'mingw32-make -j4 -C mingw_build/ 2>&1'
|
||||
}
|
||||
|
||||
after_build:
|
||||
- ps: |
|
||||
$GITDATE = $(git show -s --date=short --format='%ad') -replace "-",""
|
||||
$GITREV = $(git show -s --format='%h')
|
||||
|
||||
# Find out which kind of release we are producing by tag name
|
||||
if ($env:APPVEYOR_REPO_TAG_NAME) {
|
||||
$RELEASE_DIST, $RELEASE_VERSION = $env:APPVEYOR_REPO_TAG_NAME.split('-')
|
||||
} else {
|
||||
# There is no repo tag - make assumptions
|
||||
$RELEASE_DIST = "head"
|
||||
}
|
||||
|
||||
if ($env:BUILD_TYPE -eq 'msvc') {
|
||||
# Where are these spaces coming from? Regardless, let's remove them
|
||||
$MSVC_BUILD_ZIP = "citra-windows-msvc-$GITDATE-$GITREV.zip" -replace " ", ""
|
||||
$MSVC_BUILD_PDB = "citra-windows-msvc-$GITDATE-$GITREV-debugsymbols.zip" -replace " ", ""
|
||||
$MSVC_SEVENZIP = "citra-windows-msvc-$GITDATE-$GITREV.7z" -replace " ", ""
|
||||
|
||||
# set the build names as env vars so the artifacts can upload them
|
||||
$env:BUILD_ZIP = $MSVC_BUILD_ZIP
|
||||
$env:BUILD_SYMBOLS = $MSVC_BUILD_PDB
|
||||
$env:BUILD_UPDATE = $MSVC_SEVENZIP
|
||||
|
||||
mkdir $RELEASE_DIST
|
||||
Copy-Item .\msvc_build\bin\release\* -Destination $RELEASE_DIST -Recurse
|
||||
Copy-Item .\license.txt -Destination $RELEASE_DIST
|
||||
Copy-Item .\README.md -Destination $RELEASE_DIST
|
||||
|
||||
# process PDBs
|
||||
. "./.appveyor/ProcessPdb.ps1"
|
||||
7z a -tzip $MSVC_BUILD_PDB $RELEASE_DIST\*.pdb
|
||||
rm $RELEASE_DIST\*.pdb
|
||||
|
||||
7z a -tzip $MSVC_BUILD_ZIP $RELEASE_DIST\*
|
||||
7z a $MSVC_SEVENZIP $RELEASE_DIST
|
||||
} else {
|
||||
$MINGW_BUILD_ZIP = "citra-windows-mingw-$GITDATE-$GITREV.zip" -replace " ", ""
|
||||
$MINGW_BUILD_PDB = "citra-windows-mingw-$GITDATE-$GITREV-debugsymbols.zip" -replace " ", ""
|
||||
$MINGW_SEVENZIP = "citra-windows-mingw-$GITDATE-$GITREV.7z" -replace " ", ""
|
||||
|
||||
# store the build information in env vars so we can use them as artifacts
|
||||
$env:BUILD_ZIP = $MINGW_BUILD_ZIP
|
||||
$env:BUILD_SYMBOLS = $MINGW_BUILD_PDB
|
||||
$env:BUILD_UPDATE = $MINGW_SEVENZIP
|
||||
|
||||
$CMAKE_SOURCE_DIR = "$env:APPVEYOR_BUILD_FOLDER"
|
||||
$CMAKE_BINARY_DIR = "$CMAKE_SOURCE_DIR/mingw_build"
|
||||
$RELEASE_DIST = $RELEASE_DIST + "-mingw"
|
||||
|
||||
mkdir $RELEASE_DIST
|
||||
mkdir $RELEASE_DIST/platforms
|
||||
mkdir $RELEASE_DIST/mediaservice
|
||||
mkdir $RELEASE_DIST/styles
|
||||
mkdir $RELEASE_DIST/imageformats
|
||||
|
||||
# copy the compiled binaries and other release files to the release folder
|
||||
Get-ChildItem "$CMAKE_BINARY_DIR" -Recurse -Filter "citra*.exe" | Copy-Item -destination $RELEASE_DIST
|
||||
Copy-Item -path "$CMAKE_SOURCE_DIR/license.txt" -destination $RELEASE_DIST
|
||||
Copy-Item -path "$CMAKE_SOURCE_DIR/README.md" -destination $RELEASE_DIST
|
||||
|
||||
# copy the qt windows plugin dll to platforms
|
||||
Copy-Item -path "C:/msys64/mingw64/share/qt5/plugins/platforms/qwindows.dll" -force -destination "$RELEASE_DIST/platforms"
|
||||
|
||||
# copy the qt mediaservice plugin dll
|
||||
Copy-Item -path "C:/msys64/mingw64/share/qt5/plugins/mediaservice/dsengine.dll" -force -destination "$RELEASE_DIST/mediaservice"
|
||||
|
||||
# copy the qt windows vista style dll to platforms
|
||||
Copy-Item -path "C:/msys64/mingw64/share/qt5/plugins/styles/qwindowsvistastyle.dll" -force -destination "$RELEASE_DIST/styles"
|
||||
|
||||
# copy the qt imageformats plugin dlls to imageformats
|
||||
Get-ChildItem "C:/msys64/mingw64/share/qt5/plugins/imageformats" -Exclude "*d.dll" | Copy-Item -force -destination "$RELEASE_DIST/imageformats"
|
||||
|
||||
# copy all the dll dependencies to the release folder
|
||||
. "./.appveyor/FindDependencies.ps1"
|
||||
$DLLSearchPath = "C:\msys64\mingw64\bin;$env:PATH"
|
||||
$MingwDLLs = RecursivelyGetDeps $DLLSearchPath "$RELEASE_DIST\citra.exe"
|
||||
$MingwDLLs += RecursivelyGetDeps $DLLSearchPath "$RELEASE_DIST\citra-qt.exe"
|
||||
$MingwDLLs += RecursivelyGetDeps $DLLSearchPath "$RELEASE_DIST\imageformats\qjpeg.dll"
|
||||
Write-Host "Detected the following dependencies:"
|
||||
Write-Host $MingwDLLs
|
||||
foreach ($file in $MingwDLLs) {
|
||||
Copy-Item -path "$file" -force -destination "$RELEASE_DIST"
|
||||
}
|
||||
|
||||
# process PDBs
|
||||
. "./.appveyor/ProcessPdb.ps1"
|
||||
7z a -tzip $MINGW_BUILD_PDB $RELEASE_DIST\*.pdb
|
||||
rm $RELEASE_DIST\*.pdb
|
||||
|
||||
7z a -tzip $MINGW_BUILD_ZIP $RELEASE_DIST\*
|
||||
7z a $MINGW_SEVENZIP $RELEASE_DIST
|
||||
}
|
||||
|
||||
test_script:
|
||||
- cd %BUILD_TYPE%_build
|
||||
- ps: |
|
||||
if ($env:BUILD_TYPE -eq 'msvc') {
|
||||
ctest -VV -C Release
|
||||
} else {
|
||||
C:\msys64\usr\bin\bash.exe -lc "ctest -VV -C Release"
|
||||
}
|
||||
- cd ..
|
||||
|
||||
artifacts:
|
||||
- path: $(BUILD_ZIP)
|
||||
name: build
|
||||
type: zip
|
||||
- path: $(BUILD_SYMBOLS)
|
||||
name: debugsymbols
|
||||
- path: $(BUILD_UPDATE)
|
||||
name: update
|
||||
|
||||
notifications:
|
||||
- provider: Webhook
|
||||
url: https://api.citra-emu.org/code/appveyor/notify
|
135
bitrise.yml
135
bitrise.yml
|
@ -1,135 +0,0 @@
|
|||
---
|
||||
format_version: '6'
|
||||
default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git
|
||||
project_type: android
|
||||
trigger_map:
|
||||
- push_branch: "*"
|
||||
workflow: primary
|
||||
- pull_request_source_branch: "*"
|
||||
workflow: primary
|
||||
workflows:
|
||||
deploy:
|
||||
description: |
|
||||
## How to get a signed APK
|
||||
|
||||
This workflow contains the **Sign APK** step. To sign your APK all you have to do is to:
|
||||
|
||||
1. Click on **Code Signing** tab
|
||||
1. Find the **ANDROID KEYSTORE FILE** section
|
||||
1. Click or drop your file on the upload file field
|
||||
1. Fill the displayed 3 input fields:
|
||||
1. **Keystore password**
|
||||
1. **Keystore alias**
|
||||
1. **Private key password**
|
||||
1. Click on **[Save metadata]** button
|
||||
|
||||
That's it! From now on, **Sign APK** step will receive your uploaded files.
|
||||
|
||||
## To run this workflow
|
||||
|
||||
If you want to run this workflow manually:
|
||||
|
||||
1. Open the app's build list page
|
||||
2. Click on **[Start/Schedule a Build]** button
|
||||
3. Select **deploy** in **Workflow** dropdown input
|
||||
4. Click **[Start Build]** button
|
||||
|
||||
Or if you need this workflow to be started by a GIT event:
|
||||
|
||||
1. Click on **Triggers** tab
|
||||
2. Setup your desired event (push/tag/pull) and select **deploy** workflow
|
||||
3. Click on **[Done]** and then **[Save]** buttons
|
||||
|
||||
The next change in your repository that matches any of your trigger map event will start **deploy** workflow.
|
||||
steps:
|
||||
- cache-pull@2.0.1: {}
|
||||
- script@1.1.5:
|
||||
title: Install newer cmake
|
||||
inputs:
|
||||
- content: |-
|
||||
#!/bin/bash
|
||||
set -ex
|
||||
sudo apt remove cmake -y
|
||||
sudo apt purge --auto-remove cmake -y
|
||||
sudo apt install ninja-build -y
|
||||
version=3.10
|
||||
build=2
|
||||
mkdir ~/temp
|
||||
cd ~/temp
|
||||
wget https://cmake.org/files/v$version/cmake-$version.$build-Linux-x86_64.sh
|
||||
sudo mkdir /opt/cmake
|
||||
sudo sh cmake-$version.$build-Linux-x86_64.sh --prefix=/opt/cmake --skip-license --exclude-subdir
|
||||
envman add --key PATH --value "/opt/cmake/bin:$PATH"
|
||||
- install-missing-android-tools@2.3.3:
|
||||
inputs:
|
||||
- gradlew_path: "$PROJECT_LOCATION/gradlew"
|
||||
- change-android-versioncode-and-versionname@1.1.1:
|
||||
inputs:
|
||||
- build_gradle_path: "$PROJECT_LOCATION/$MODULE/build.gradle"
|
||||
- android-lint@0.9.5:
|
||||
inputs:
|
||||
- project_location: "$PROJECT_LOCATION"
|
||||
- module: "$MODULE"
|
||||
- variant: "$TEST_VARIANT"
|
||||
- android-unit-test@0.9.3:
|
||||
inputs:
|
||||
- project_location: "$PROJECT_LOCATION"
|
||||
- module: "$MODULE"
|
||||
- variant: "$TEST_VARIANT"
|
||||
- android-build@0.9.5:
|
||||
inputs:
|
||||
- project_location: "$PROJECT_LOCATION"
|
||||
- module: "$MODULE"
|
||||
- variant: "$BUILD_VARIANT"
|
||||
- sign-apk@1.2.3:
|
||||
run_if: '{{getenv "BITRISEIO_ANDROID_KEYSTORE_URL" | ne ""}}'
|
||||
- deploy-to-bitrise-io@1.3.18: {}
|
||||
- cache-push@2.0.5: {}
|
||||
primary:
|
||||
steps:
|
||||
- cache-pull@2.0.1: {}
|
||||
- script@1.1.5:
|
||||
title: Install newer cmake
|
||||
inputs:
|
||||
- content: |-
|
||||
#!/bin/bash
|
||||
set -ex
|
||||
sudo apt remove cmake -y
|
||||
sudo apt purge --auto-remove cmake -y
|
||||
sudo apt install ninja-build -y
|
||||
version=3.10
|
||||
build=2
|
||||
mkdir ~/temp
|
||||
cd ~/temp
|
||||
wget https://cmake.org/files/v$version/cmake-$version.$build-Linux-x86_64.sh
|
||||
sudo mkdir /opt/cmake
|
||||
sudo sh cmake-$version.$build-Linux-x86_64.sh --prefix=/opt/cmake --skip-license --exclude-subdir
|
||||
envman add --key PATH --value "/opt/cmake/bin:$PATH"
|
||||
- install-missing-android-tools@2.3.3:
|
||||
inputs:
|
||||
- gradlew_path: "$PROJECT_LOCATION/gradlew"
|
||||
- android-lint@0.9.5:
|
||||
inputs:
|
||||
- project_location: "$PROJECT_LOCATION"
|
||||
- module: "$MODULE"
|
||||
- variant: "$TEST_VARIANT"
|
||||
- android-build@0.9.5:
|
||||
inputs:
|
||||
- variant: Debug
|
||||
- project_location: "$PROJECT_LOCATION"
|
||||
- deploy-to-bitrise-io@1.3.18: {}
|
||||
- cache-push@2.0.5: {}
|
||||
app:
|
||||
envs:
|
||||
- opts:
|
||||
is_expand: false
|
||||
PROJECT_LOCATION: src/android
|
||||
- opts:
|
||||
is_expand: false
|
||||
MODULE: app
|
||||
- opts:
|
||||
is_expand: false
|
||||
BUILD_VARIANT: Release
|
||||
- opts:
|
||||
is_expand: false
|
||||
TEST_VARIANT: Debug
|
84
dist/apple/Info.plist.in
vendored
Normal file
84
dist/apple/Info.plist.in
vendored
Normal file
|
@ -0,0 +1,84 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<!-- Templated data -->
|
||||
<key>CFBundleName</key>
|
||||
<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>${MACOSX_BUNDLE_GUI_IDENTIFIER}</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
|
||||
<key>CFBundleLongVersionString</key>
|
||||
<string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleIconFile</key>
|
||||
<string>${MACOSX_BUNDLE_ICON_FILE}</string>
|
||||
<key>CFBundleGetInfoString</key>
|
||||
<string>${MACOSX_BUNDLE_INFO_STRING}</string>
|
||||
<key>NSHumanReadableCopyright</key>
|
||||
<string>${MACOSX_BUNDLE_COPYRIGHT}</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
<string>${CMAKE_OSX_DEPLOYMENT_TARGET}</string>
|
||||
<!-- Fixed -->
|
||||
<key>LSApplicationCategoryType</key>
|
||||
<string>public.app-category.games</string>
|
||||
<key>CFBundleDocumentTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>3ds</string>
|
||||
<string>3dsx</string>
|
||||
<string>cci</string>
|
||||
<string>cxi</string>
|
||||
<string>cia</string>
|
||||
</array>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>Nintendo 3DS File</string>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
<key>LSHandlerRank</key>
|
||||
<string>Default</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CFBundleTypeExtensions</key>
|
||||
<array>
|
||||
<string>elf</string>
|
||||
<string>axf</string>
|
||||
</array>
|
||||
<key>CFBundleTypeName</key>
|
||||
<string>Unix Executable and Linkable Format</string>
|
||||
<key>CFBundleTypeRole</key>
|
||||
<string>Viewer</string>
|
||||
<key>LSHandlerRank</key>
|
||||
<string>Alternate</string>
|
||||
</dict>
|
||||
</array>
|
||||
<key>NSCameraUsageDescription</key>
|
||||
<string>This app requires camera access to emulate the 3DS's cameras.</string>
|
||||
<key>NSMicrophoneUsageDescription</key>
|
||||
<string>This app requires microphone access to emulate the 3DS's microphone.</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CSResourcesFileMapped</key>
|
||||
<true/>
|
||||
<key>LSSupportsOpeningDocumentsInPlace</key>
|
||||
<true/>
|
||||
<key>NSHighResolutionCapable</key>
|
||||
<string>True</string>
|
||||
<key>UIFileSharingEnabled</key>
|
||||
<true/>
|
||||
<key>UILaunchStoryboardName</key>
|
||||
<string>LaunchScreen</string>
|
||||
</dict>
|
||||
</plist>
|
42
dist/apple/LaunchScreen.storyboard
vendored
Normal file
42
dist/apple/LaunchScreen.storyboard
vendored
Normal file
|
@ -0,0 +1,42 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" initialViewController="Y6W-OH-hqX">
|
||||
<dependencies>
|
||||
<deployment identifier="iOS"/>
|
||||
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
|
||||
</dependencies>
|
||||
<scenes>
|
||||
<!--View Controller-->
|
||||
<scene sceneID="s0d-6b-0kx">
|
||||
<objects>
|
||||
<viewController id="Y6W-OH-hqX" sceneMemberID="viewController">
|
||||
<view key="view" contentMode="scaleToFill" id="5EZ-qb-Rvc">
|
||||
<rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="launch_logo.png" translatesAutoresizingMaskIntoConstraints="NO" id="yrZ-hu-Uge">
|
||||
<rect key="frame" x="-59.666666666666657" y="306" width="512.33333333333337" height="240"/>
|
||||
<constraints>
|
||||
<constraint firstAttribute="height" constant="240" id="VhL-hA-Bwr"/>
|
||||
</constraints>
|
||||
</imageView>
|
||||
</subviews>
|
||||
<viewLayoutGuide key="safeArea" id="vDu-zF-Fre"/>
|
||||
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
|
||||
<constraints>
|
||||
<constraint firstItem="yrZ-hu-Uge" firstAttribute="centerX" secondItem="5EZ-qb-Rvc" secondAttribute="centerX" id="1y3-Mx-a65"/>
|
||||
<constraint firstItem="yrZ-hu-Uge" firstAttribute="centerY" secondItem="5EZ-qb-Rvc" secondAttribute="centerY" id="vNO-xV-EPD"/>
|
||||
</constraints>
|
||||
</view>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="Ief-a0-LHa" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="219" y="18"/>
|
||||
</scene>
|
||||
</scenes>
|
||||
<resources>
|
||||
<image name="launch_logo.png" width="512" height="512"/>
|
||||
<systemColor name="systemBackgroundColor">
|
||||
<color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
|
||||
</systemColor>
|
||||
</resources>
|
||||
</document>
|
0
dist/citra.icns → dist/apple/citra.icns
vendored
0
dist/citra.icns → dist/apple/citra.icns
vendored
BIN
dist/apple/launch_logo.png
vendored
Normal file
BIN
dist/apple/launch_logo.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 88 KiB |
15
dist/citra-qt.desktop
vendored
Normal file
15
dist/citra-qt.desktop
vendored
Normal file
|
@ -0,0 +1,15 @@
|
|||
[Desktop Entry]
|
||||
Version=1.0
|
||||
Type=Application
|
||||
Name=Citra
|
||||
GenericName=3DS Emulator
|
||||
GenericName[fr]=Émulateur 3DS
|
||||
Comment=Nintendo 3DS video game console emulator
|
||||
Comment[fr]=Émulateur de console de jeu Nintendo 3DS
|
||||
Icon=citra
|
||||
TryExec=citra-qt
|
||||
Exec=citra-qt %f
|
||||
Categories=Game;Emulator;Qt;
|
||||
MimeType=application/x-ctr-3dsx;application/x-ctr-cci;application/x-ctr-cia;application/x-ctr-cxi;
|
||||
Keywords=3DS;Nintendo;
|
||||
PrefersNonDefaultGPU=true
|
10
dist/citra-room.desktop
vendored
Normal file
10
dist/citra-room.desktop
vendored
Normal file
|
@ -0,0 +1,10 @@
|
|||
[Desktop Entry]
|
||||
Version=1.0
|
||||
Type=Application
|
||||
Name=Citra Room
|
||||
Comment=Multiplayer room host for Citra
|
||||
Icon=citra
|
||||
TryExec=citra-room
|
||||
Exec=citra-room %f
|
||||
Categories=Game;Emulator;
|
||||
Keywords=3DS;Nintendo
|
7
dist/citra.desktop
vendored
7
dist/citra.desktop
vendored
|
@ -7,8 +7,9 @@ GenericName[fr]=Émulateur 3DS
|
|||
Comment=Nintendo 3DS video game console emulator
|
||||
Comment[fr]=Émulateur de console de jeu Nintendo 3DS
|
||||
Icon=citra
|
||||
TryExec=citra-qt
|
||||
Exec=citra-qt %f
|
||||
Categories=Game;Emulator;Qt;
|
||||
TryExec=citra
|
||||
Exec=citra %f
|
||||
Categories=Game;Emulator;
|
||||
MimeType=application/x-ctr-3dsx;application/x-ctr-cci;application/x-ctr-cia;application/x-ctr-cxi;
|
||||
Keywords=3DS;Nintendo;
|
||||
PrefersNonDefaultGPU=true
|
||||
|
|
80
dist/citra.manifest
vendored
80
dist/citra.manifest
vendored
|
@ -1,24 +1,58 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<security>
|
||||
<requestedPrivileges>
|
||||
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
|
||||
</requestedPrivileges>
|
||||
</security>
|
||||
</trustInfo>
|
||||
<application xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<windowsSettings>
|
||||
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True/PM</dpiAware>
|
||||
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
|
||||
</windowsSettings>
|
||||
</application>
|
||||
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||
<application>
|
||||
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
|
||||
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
|
||||
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
|
||||
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
|
||||
</application>
|
||||
</compatibility>
|
||||
</assembly>
|
||||
<assembly manifestVersion="1.0"
|
||||
xmlns="urn:schemas-microsoft-com:asm.v1"
|
||||
xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
|
||||
<asmv3:application>
|
||||
<asmv3:windowsSettings>
|
||||
<!-- Windows 7/8/8.1/10 -->
|
||||
<dpiAware
|
||||
xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
|
||||
true/pm
|
||||
</dpiAware>
|
||||
<!-- Windows 10, version 1607 or later -->
|
||||
<dpiAwareness
|
||||
xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
|
||||
PerMonitorV2
|
||||
</dpiAwareness>
|
||||
<!-- Windows 10, version 1703 or later -->
|
||||
<gdiScaling
|
||||
xmlns="http://schemas.microsoft.com/SMI/2017/WindowsSettings">
|
||||
true
|
||||
</gdiScaling>
|
||||
<ws2:longPathAware
|
||||
xmlns:ws3="http://schemas.microsoft.com/SMI/2016/WindowsSettings">
|
||||
true
|
||||
</ws2:longPathAware>
|
||||
</asmv3:windowsSettings>
|
||||
</asmv3:application>
|
||||
<compatibility
|
||||
xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||
<application>
|
||||
<!-- Windows 10 -->
|
||||
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
|
||||
<!-- Windows 8.1 -->
|
||||
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
|
||||
<!-- Windows 8 -->
|
||||
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
|
||||
<!-- Windows 7 -->
|
||||
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
|
||||
</application>
|
||||
</compatibility>
|
||||
<trustInfo
|
||||
xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<security>
|
||||
<requestedPrivileges>
|
||||
<!--
|
||||
UAC settings:
|
||||
- app should run at same integrity level as calling process
|
||||
- app does not need to manipulate windows belonging to
|
||||
higher-integrity-level processes
|
||||
-->
|
||||
<requestedExecutionLevel
|
||||
level="asInvoker"
|
||||
uiAccess="false"
|
||||
/>
|
||||
</requestedPrivileges>
|
||||
</security>
|
||||
</trustInfo>
|
||||
</assembly>
|
||||
|
|
299
dist/dumpkeys/DumpKeys.gm9
vendored
Normal file
299
dist/dumpkeys/DumpKeys.gm9
vendored
Normal file
|
@ -0,0 +1,299 @@
|
|||
set PREVIEW_MODE "Key Dumper\n \nWorking..."
|
||||
|
||||
# Boot9
|
||||
|
||||
set BOOT9_BIN "M:/boot9.bin"
|
||||
|
||||
fget $[BOOT9_BIN]@D9D0:10 KEYX_2C
|
||||
set KEYX_2D $[KEYX_2C]
|
||||
set KEYX_2E $[KEYX_2C]
|
||||
set KEYX_2F $[KEYX_2C]
|
||||
fget $[BOOT9_BIN]@D9E0:10 KEYX_30
|
||||
set KEYX_31 $[KEYX_30]
|
||||
set KEYX_32 $[KEYX_30]
|
||||
set KEYX_33 $[KEYX_30]
|
||||
fget $[BOOT9_BIN]@D9F0:10 KEYX_34
|
||||
set KEYX_35 $[KEYX_34]
|
||||
set KEYX_36 $[KEYX_34]
|
||||
set KEYX_37 $[KEYX_34]
|
||||
fget $[BOOT9_BIN]@DA00:10 KEYX_38
|
||||
set KEYX_39 $[KEYX_38]
|
||||
set KEYX_3A $[KEYX_38]
|
||||
set KEYX_3B $[KEYX_38]
|
||||
fget $[BOOT9_BIN]@DA10:10 KEYX_3C
|
||||
fget $[BOOT9_BIN]@DA20:10 KEYX_3D
|
||||
fget $[BOOT9_BIN]@DA30:10 KEYX_3E
|
||||
fget $[BOOT9_BIN]@DA40:10 KEYX_3F
|
||||
|
||||
fget $[BOOT9_BIN]@DA50:10 KEYY_04
|
||||
fget $[BOOT9_BIN]@DA60:10 KEYY_05
|
||||
fget $[BOOT9_BIN]@DA70:10 KEYY_06
|
||||
fget $[BOOT9_BIN]@DA80:10 KEYY_07
|
||||
fget $[BOOT9_BIN]@DA90:10 KEYY_08
|
||||
fget $[BOOT9_BIN]@DAA0:10 KEYY_09
|
||||
fget $[BOOT9_BIN]@DAB0:10 KEYY_0A
|
||||
fget $[BOOT9_BIN]@DAC0:10 KEYY_0B
|
||||
|
||||
fget $[BOOT9_BIN]@DAD0:10 KEYN_0D
|
||||
fget $[BOOT9_BIN]@DBA0:10 KEYN_2D
|
||||
fget $[BOOT9_BIN]@DBB0:10 KEYN_32
|
||||
fget $[BOOT9_BIN]@DBC0:10 KEYN_36
|
||||
fget $[BOOT9_BIN]@DBD0:10 KEYN_38
|
||||
|
||||
# NATIVE_FIRM
|
||||
|
||||
if chk $[ONTYPE] "N3DS"
|
||||
if not find 1:/title/00040138/20000002/content/????????.app NATIVE_FIRM_APP
|
||||
echo "New 3DS NATIVE_FIRM not found."
|
||||
goto Exit
|
||||
end
|
||||
set EXPECTED_NATIVE_FIRM_VER "1F00"
|
||||
set KEYY_2E_OFFSET "66504"
|
||||
set KEYY_39_NFC_OFFSET "66524"
|
||||
set COMMON_0_OFFSET "6CE51"
|
||||
set COMMON_1_OFFSET "6CE65"
|
||||
set COMMON_2_OFFSET "6CE79"
|
||||
set COMMON_3_OFFSET "6CE8D"
|
||||
set COMMON_4_OFFSET "6CEA1"
|
||||
set COMMON_5_OFFSET "6CEB5"
|
||||
else
|
||||
if not find 1:/title/00040138/00000002/content/????????.app NATIVE_FIRM_APP
|
||||
echo "Old 3DS NATIVE_FIRM not found."
|
||||
goto Exit
|
||||
end
|
||||
set EXPECTED_NATIVE_FIRM_VER "1F00"
|
||||
set KEYY_2E_OFFSET "66488"
|
||||
set KEYY_39_NFC_OFFSET "664A8"
|
||||
set COMMON_0_OFFSET "6CDC1"
|
||||
set COMMON_1_OFFSET "6CDD5"
|
||||
set COMMON_2_OFFSET "6CDE9"
|
||||
set COMMON_3_OFFSET "6CDFD"
|
||||
set COMMON_4_OFFSET "6CE11"
|
||||
set COMMON_5_OFFSET "6CE25"
|
||||
end
|
||||
set NATIVE_FIRM_EXTHEADER "G:/extheader.bin"
|
||||
set NATIVE_FIRM_ENCRYPTED "G:/exefs/.firm"
|
||||
set NATIVE_FIRM_DECRYPTED "$[GM9OUT]/native.firm"
|
||||
set PROCESS9_CODE "G:/0004013000003000.Process9/exefs/.code"
|
||||
|
||||
imgmount $[NATIVE_FIRM_APP]
|
||||
|
||||
fget $[NATIVE_FIRM_EXTHEADER]@E:2 NATIVE_FIRM_VER
|
||||
if not chk $[NATIVE_FIRM_VER] $[EXPECTED_NATIVE_FIRM_VER]
|
||||
echo "Unsupported NATIVE_FIRM version.\nThis script requires the latest 3DS firmware.\n\nExpected $[EXPECTED_NATIVE_FIRM_VER], got $[NATIVE_FIRM_VER]"
|
||||
goto Exit
|
||||
end
|
||||
|
||||
cp -w $[NATIVE_FIRM_ENCRYPTED] $[NATIVE_FIRM_DECRYPTED]
|
||||
decrypt $[NATIVE_FIRM_DECRYPTED]
|
||||
|
||||
imgumount
|
||||
|
||||
imgmount $[NATIVE_FIRM_DECRYPTED]
|
||||
|
||||
fget $[PROCESS9_CODE]@$[KEYY_2E_OFFSET]:10 KEYY_2E
|
||||
set KEYY_31 $[KEYY_2E]
|
||||
set KEYY_39_DLP $[KEYY_2E]
|
||||
fget $[PROCESS9_CODE]@$[KEYY_39_NFC_OFFSET]:10 KEYY_39_NFC
|
||||
fget $[PROCESS9_CODE]@$[COMMON_0_OFFSET]:10 COMMON_0
|
||||
fget $[PROCESS9_CODE]@$[COMMON_1_OFFSET]:10 COMMON_1
|
||||
fget $[PROCESS9_CODE]@$[COMMON_2_OFFSET]:10 COMMON_2
|
||||
fget $[PROCESS9_CODE]@$[COMMON_3_OFFSET]:10 COMMON_3
|
||||
fget $[PROCESS9_CODE]@$[COMMON_4_OFFSET]:10 COMMON_4
|
||||
fget $[PROCESS9_CODE]@$[COMMON_5_OFFSET]:10 COMMON_5
|
||||
|
||||
imgumount
|
||||
rm -o -s $[NATIVE_FIRM_DECRYPTED]
|
||||
|
||||
# NFC
|
||||
|
||||
if chk $[ONTYPE] "N3DS"
|
||||
if not find 1:/title/00040130/20004002/content/????????.app NFC_APP
|
||||
echo "New 3DS NFC not found."
|
||||
goto Exit
|
||||
end
|
||||
set EXPECTED_NFC_VER "0700"
|
||||
set NFC_PHRASE_0_OFFSET "355EE"
|
||||
set NFC_SEED_0_OFFSET "355FC"
|
||||
set NFC_HMAC_KEY_0_OFFSET "3560A"
|
||||
set NFC_PHRASE_1_OFFSET "3561A"
|
||||
set NFC_SEED_1_OFFSET "35628"
|
||||
set NFC_HMAC_KEY_1_OFFSET "35638"
|
||||
set NFC_IV_OFFSET "35648"
|
||||
else
|
||||
if not find 1:/title/00040130/00004002/content/????????.app NFC_APP
|
||||
echo "Old 3DS NFC not found."
|
||||
goto Exit
|
||||
end
|
||||
set EXPECTED_NFC_VER "0800"
|
||||
set NFC_PHRASE_0_OFFSET "17382"
|
||||
set NFC_SEED_0_OFFSET "17390"
|
||||
set NFC_HMAC_KEY_0_OFFSET "1739E"
|
||||
set NFC_PHRASE_1_OFFSET "173AE"
|
||||
set NFC_SEED_1_OFFSET "173BC"
|
||||
set NFC_HMAC_KEY_1_OFFSET "173CC"
|
||||
set NFC_IV_OFFSET "173DC"
|
||||
end
|
||||
set NFC_EXTHEADER "G:/extheader.bin"
|
||||
set NFC_CODE "$[GM9OUT]/nfc_code.bin"
|
||||
|
||||
imgmount $[NFC_APP]
|
||||
|
||||
fget $[NFC_EXTHEADER]@E:2 NFC_VER
|
||||
if not chk $[NFC_VER] $[EXPECTED_NFC_VER]
|
||||
echo "Unsupported NFC module version.\nThis script requires the latest 3DS firmware.\n\nExpected $[EXPECTED_NFC_VER], got $[NFC_VER]"
|
||||
goto Exit
|
||||
end
|
||||
|
||||
imgumount
|
||||
|
||||
extrcode $[NFC_APP] $[NFC_CODE]
|
||||
|
||||
fget $[NFC_CODE]@$[NFC_PHRASE_0_OFFSET]:E NFC_PHRASE_0
|
||||
fget $[NFC_CODE]@$[NFC_SEED_0_OFFSET]:E NFC_SEED_0
|
||||
fget $[NFC_CODE]@$[NFC_HMAC_KEY_0_OFFSET]:10 NFC_HMAC_KEY_0
|
||||
|
||||
fget $[NFC_CODE]@$[NFC_PHRASE_1_OFFSET]:E NFC_PHRASE_1
|
||||
fget $[NFC_CODE]@$[NFC_SEED_1_OFFSET]:10 NFC_SEED_1
|
||||
fget $[NFC_CODE]@$[NFC_HMAC_KEY_1_OFFSET]:10 NFC_HMAC_KEY_1
|
||||
|
||||
fget $[NFC_CODE]@$[NFC_IV_OFFSET]:10 NFC_IV
|
||||
|
||||
rm -o -s $[NFC_CODE]
|
||||
|
||||
# GodMode9 Key Database
|
||||
|
||||
set KEY_DB "V:/aeskeydb.bin"
|
||||
set KEY_DB_18X "K:/slot0x18KeyX.ret.bin"
|
||||
set KEY_DB_19X "K:/slot0x19KeyX.ret.bin"
|
||||
set KEY_DB_1AX "K:/slot0x1AKeyX.ret.bin"
|
||||
set KEY_DB_1BX "K:/slot0x1BKeyX.ret.bin"
|
||||
set KEY_DB_1CX "K:/slot0x1CKeyX.ret.bin"
|
||||
set KEY_DB_1DX "K:/slot0x1DKeyX.ret.bin"
|
||||
set KEY_DB_1EX "K:/slot0x1EKeyX.ret.bin"
|
||||
set KEY_DB_1FX "K:/slot0x1FKeyX.ret.bin"
|
||||
set KEY_DB_25X "K:/slot0x25KeyX.ret.bin"
|
||||
set KEY_DB_24Y "K:/slot0x24KeyY.bin"
|
||||
set KEY_DB_2FY "K:/slot0x2FKeyY.ret.bin"
|
||||
|
||||
imgmount $[KEY_DB]
|
||||
|
||||
fget $[KEY_DB_18X]@0:10 KEYX_18
|
||||
fget $[KEY_DB_19X]@0:10 KEYX_19
|
||||
fget $[KEY_DB_1AX]@0:10 KEYX_1A
|
||||
fget $[KEY_DB_1BX]@0:10 KEYX_1B
|
||||
fget $[KEY_DB_1CX]@0:10 KEYX_1C
|
||||
fget $[KEY_DB_1DX]@0:10 KEYX_1D
|
||||
fget $[KEY_DB_1EX]@0:10 KEYX_1E
|
||||
fget $[KEY_DB_1FX]@0:10 KEYX_1F
|
||||
fget $[KEY_DB_25X]@0:10 KEYX_25
|
||||
|
||||
fget $[KEY_DB_24Y]@0:10 KEYY_24
|
||||
fget $[KEY_DB_2FY]@0:10 KEYY_2F
|
||||
|
||||
imgumount
|
||||
|
||||
# Write Keys To File
|
||||
|
||||
set OUT "0:/gm9/aes_keys.txt"
|
||||
|
||||
dumptxt $[OUT] "# KeyX"
|
||||
dumptxt -p $[OUT] ""
|
||||
|
||||
dumptxt -p $[OUT] "slot0x18KeyX=$[KEYX_18]"
|
||||
dumptxt -p $[OUT] "slot0x19KeyX=$[KEYX_19]"
|
||||
dumptxt -p $[OUT] "slot0x1AKeyX=$[KEYX_1A]"
|
||||
dumptxt -p $[OUT] "slot0x1BKeyX=$[KEYX_1B]"
|
||||
dumptxt -p $[OUT] "slot0x1CKeyX=$[KEYX_1C]"
|
||||
dumptxt -p $[OUT] "slot0x1DKeyX=$[KEYX_1D]"
|
||||
dumptxt -p $[OUT] "slot0x1EKeyX=$[KEYX_1E]"
|
||||
dumptxt -p $[OUT] "slot0x1FKeyX=$[KEYX_1F]"
|
||||
dumptxt -p $[OUT] "slot0x25KeyX=$[KEYX_25]"
|
||||
dumptxt -p $[OUT] "slot0x2CKeyX=$[KEYX_2C]"
|
||||
dumptxt -p $[OUT] "slot0x2DKeyX=$[KEYX_2D]"
|
||||
dumptxt -p $[OUT] "slot0x2EKeyX=$[KEYX_2E]"
|
||||
dumptxt -p $[OUT] "slot0x2FKeyX=$[KEYX_2F]"
|
||||
dumptxt -p $[OUT] "slot0x30KeyX=$[KEYX_30]"
|
||||
dumptxt -p $[OUT] "slot0x31KeyX=$[KEYX_31]"
|
||||
dumptxt -p $[OUT] "slot0x32KeyX=$[KEYX_32]"
|
||||
dumptxt -p $[OUT] "slot0x33KeyX=$[KEYX_33]"
|
||||
dumptxt -p $[OUT] "slot0x34KeyX=$[KEYX_34]"
|
||||
dumptxt -p $[OUT] "slot0x35KeyX=$[KEYX_35]"
|
||||
dumptxt -p $[OUT] "slot0x36KeyX=$[KEYX_36]"
|
||||
dumptxt -p $[OUT] "slot0x37KeyX=$[KEYX_37]"
|
||||
dumptxt -p $[OUT] "slot0x38KeyX=$[KEYX_38]"
|
||||
dumptxt -p $[OUT] "slot0x39KeyX=$[KEYX_39]"
|
||||
dumptxt -p $[OUT] "slot0x3AKeyX=$[KEYX_3A]"
|
||||
dumptxt -p $[OUT] "slot0x3BKeyX=$[KEYX_3B]"
|
||||
dumptxt -p $[OUT] "slot0x3CKeyX=$[KEYX_3C]"
|
||||
dumptxt -p $[OUT] "slot0x3DKeyX=$[KEYX_3D]"
|
||||
dumptxt -p $[OUT] "slot0x3EKeyX=$[KEYX_3E]"
|
||||
dumptxt -p $[OUT] "slot0x3FKeyX=$[KEYX_3F]"
|
||||
|
||||
dumptxt -p $[OUT] ""
|
||||
dumptxt -p $[OUT] "# KeyY"
|
||||
dumptxt -p $[OUT] ""
|
||||
|
||||
dumptxt -p $[OUT] "slot0x04KeyY=$[KEYY_04]"
|
||||
dumptxt -p $[OUT] "slot0x05KeyY=$[KEYY_05]"
|
||||
dumptxt -p $[OUT] "slot0x06KeyY=$[KEYY_06]"
|
||||
dumptxt -p $[OUT] "slot0x07KeyY=$[KEYY_07]"
|
||||
dumptxt -p $[OUT] "slot0x08KeyY=$[KEYY_08]"
|
||||
dumptxt -p $[OUT] "slot0x09KeyY=$[KEYY_09]"
|
||||
dumptxt -p $[OUT] "slot0x0AKeyY=$[KEYY_0A]"
|
||||
dumptxt -p $[OUT] "slot0x0BKeyY=$[KEYY_0B]"
|
||||
dumptxt -p $[OUT] "slot0x24KeyY=$[KEYY_24]"
|
||||
dumptxt -p $[OUT] "slot0x2EKeyY=$[KEYY_2E]"
|
||||
dumptxt -p $[OUT] "slot0x2FKeyY=$[KEYY_2F]"
|
||||
dumptxt -p $[OUT] "slot0x31KeyY=$[KEYY_31]"
|
||||
|
||||
dumptxt -p $[OUT] ""
|
||||
dumptxt -p $[OUT] "# DLP/NFC KeyY (slot 0x39)"
|
||||
dumptxt -p $[OUT] ""
|
||||
|
||||
dumptxt -p $[OUT] "dlpKeyY=$[KEYY_39_DLP]"
|
||||
dumptxt -p $[OUT] "nfcKeyY=$[KEYY_39_NFC]"
|
||||
|
||||
dumptxt -p $[OUT] ""
|
||||
dumptxt -p $[OUT] "# Ticket Common KeyY (slot 0x3D)"
|
||||
dumptxt -p $[OUT] ""
|
||||
|
||||
dumptxt -p $[OUT] "common0=$[COMMON_0]"
|
||||
dumptxt -p $[OUT] "common1=$[COMMON_1]"
|
||||
dumptxt -p $[OUT] "common2=$[COMMON_2]"
|
||||
dumptxt -p $[OUT] "common3=$[COMMON_3]"
|
||||
dumptxt -p $[OUT] "common4=$[COMMON_4]"
|
||||
dumptxt -p $[OUT] "common5=$[COMMON_5]"
|
||||
|
||||
dumptxt -p $[OUT] ""
|
||||
dumptxt -p $[OUT] "# KeyN"
|
||||
dumptxt -p $[OUT] ""
|
||||
|
||||
dumptxt -p $[OUT] "slot0x0DKeyN=$[KEYN_0D]"
|
||||
dumptxt -p $[OUT] "slot0x2DKeyN=$[KEYN_2D]"
|
||||
dumptxt -p $[OUT] "slot0x32KeyN=$[KEYN_32]"
|
||||
dumptxt -p $[OUT] "slot0x36KeyN=$[KEYN_36]"
|
||||
dumptxt -p $[OUT] "slot0x38KeyN=$[KEYN_38]"
|
||||
|
||||
dumptxt -p $[OUT] ""
|
||||
dumptxt -p $[OUT] "# NFC Secrets"
|
||||
dumptxt -p $[OUT] ""
|
||||
|
||||
dumptxt -p $[OUT] "nfcSecret0Phrase=$[NFC_PHRASE_0]"
|
||||
dumptxt -p $[OUT] "nfcSecret0Seed=$[NFC_SEED_0]"
|
||||
dumptxt -p $[OUT] "nfcSecret0HmacKey=$[NFC_HMAC_KEY_0]"
|
||||
dumptxt -p $[OUT] "nfcSecret1Phrase=$[NFC_PHRASE_1]"
|
||||
dumptxt -p $[OUT] "nfcSecret1Seed=$[NFC_SEED_1]"
|
||||
dumptxt -p $[OUT] "nfcSecret1HmacKey=$[NFC_HMAC_KEY_1]"
|
||||
dumptxt -p $[OUT] "nfcIv=$[NFC_IV]"
|
||||
|
||||
# Dump seeddb.bin as well
|
||||
|
||||
set SEEDDB_IN "0:/gm9/out/seeddb.bin"
|
||||
set SEEDDB_OUT "0:/gm9/seeddb.bin"
|
||||
|
||||
sdump -w seeddb.bin
|
||||
cp -w $[SEEDDB_IN] $[SEEDDB_OUT]
|
||||
|
||||
@Exit
|
||||
|
10
dist/dumpkeys/README.md
vendored
Normal file
10
dist/dumpkeys/README.md
vendored
Normal file
|
@ -0,0 +1,10 @@
|
|||
# DumpKeys
|
||||
|
||||
This is a GodMode9 script that dumps all the keys and other related secrets that Citra needs from a real 3DS.
|
||||
|
||||
Usage:
|
||||
1. Copy "DumpKeys.gm9" into the "gm9/scripts/" directory on your SD card.
|
||||
2. Launch GodMode9, press the HOME button, select Scripts, and select "DumpKeys" from the list of scripts that appears.
|
||||
3. Wait for the script to complete and return you to the GodMode9 main menu.
|
||||
4. Power off your system and copy the "gm9/aes_keys.txt" and "gm9/seeddb.bin" files off of your SD card into "(Citra directory)/sysdata/".
|
||||
|
12
dist/installer/CMakeLists.txt
vendored
12
dist/installer/CMakeLists.txt
vendored
|
@ -5,18 +5,26 @@ elseif(APPLE)
|
|||
set(PLATFORM "mac")
|
||||
elseif(UNIX)
|
||||
set(PLATFORM "linux")
|
||||
else()
|
||||
message(FATAL_ERROR "Cannot build installer for this unsupported platform")
|
||||
endif()
|
||||
|
||||
set(BUILD_DIR "${CMAKE_BINARY_DIR}/installer")
|
||||
set(DIST_DIR "${BUILD_DIR}/dist")
|
||||
set(TARGET_FILE "${DIST_DIR}/citra-setup-${PLATFORM}")
|
||||
file(MAKE_DIRECTORY ${BUILD_DIR})
|
||||
|
||||
file(MAKE_DIRECTORY "${BUILD_DIR}" "${DIST_DIR}")
|
||||
|
||||
# Adds a custom target that will run the BuildInstaller.cmake file
|
||||
# CMake can't just run a cmake function as a custom command, so this is a way around it.
|
||||
# Calls the cmake command and runs a cmake file in "scripting" mode passing in variables with -D
|
||||
add_custom_command(OUTPUT "${TARGET_FILE}"
|
||||
COMMAND ${CMAKE_COMMAND} -DSRC_DIR=${CMAKE_CURRENT_SOURCE_DIR} -D BUILD_DIR=${BUILD_DIR} -D TARGET_FILE=${TARGET_FILE} -P ${CMAKE_SOURCE_DIR}/CMakeModules/BuildInstaller.cmake
|
||||
COMMAND ${CMAKE_COMMAND}
|
||||
-DBASE_DIR=${CMAKE_SOURCE_DIR}
|
||||
-DSRC_DIR=${CMAKE_CURRENT_SOURCE_DIR}
|
||||
-DBUILD_DIR=${BUILD_DIR}
|
||||
-DTARGET_FILE=${TARGET_FILE}
|
||||
-P ${CMAKE_SOURCE_DIR}/CMakeModules/BuildInstaller.cmake
|
||||
WORKING_DIRECTORY ${BUILD_DIR}
|
||||
)
|
||||
|
||||
|
|
23
dist/languages/.tx/config
vendored
23
dist/languages/.tx/config
vendored
|
@ -1,9 +1,14 @@
|
|||
[main]
|
||||
host = https://www.transifex.com
|
||||
|
||||
[citra.emulator]
|
||||
file_filter = <lang>.ts
|
||||
source_file = en.ts
|
||||
source_lang = en
|
||||
type = QT
|
||||
|
||||
[main]
|
||||
host = https://www.transifex.com
|
||||
|
||||
[o:citra:p:citra:r:emulator]
|
||||
file_filter = <lang>.ts
|
||||
source_file = en.ts
|
||||
source_lang = en
|
||||
type = QT
|
||||
|
||||
[o:citra:p:citra:r:android]
|
||||
file_filter = ../../src/android/app/src/main/res/values-<lang>/strings.xml
|
||||
source_file = ../../src/android/app/src/main/res/values/strings.xml
|
||||
type = ANDROID
|
||||
lang_map = es_ES:es, hu_HU:hu, ru_RU:ru, pt_BR:pt, zh_CN:zh
|
||||
|
|
4616
dist/languages/da_DK.ts
vendored
4616
dist/languages/da_DK.ts
vendored
File diff suppressed because it is too large
Load diff
5016
dist/languages/de.ts
vendored
5016
dist/languages/de.ts
vendored
File diff suppressed because it is too large
Load diff
6355
dist/languages/fi_FI.ts → dist/languages/el.ts
vendored
6355
dist/languages/fi_FI.ts → dist/languages/el.ts
vendored
File diff suppressed because it is too large
Load diff
4588
dist/languages/es_ES.ts
vendored
4588
dist/languages/es_ES.ts
vendored
File diff suppressed because it is too large
Load diff
4759
dist/languages/fi.ts
vendored
4759
dist/languages/fi.ts
vendored
File diff suppressed because it is too large
Load diff
4956
dist/languages/fr.ts
vendored
4956
dist/languages/fr.ts
vendored
File diff suppressed because it is too large
Load diff
5172
dist/languages/hu_HU.ts
vendored
5172
dist/languages/hu_HU.ts
vendored
File diff suppressed because it is too large
Load diff
4618
dist/languages/id.ts
vendored
4618
dist/languages/id.ts
vendored
File diff suppressed because it is too large
Load diff
5286
dist/languages/it.ts
vendored
5286
dist/languages/it.ts
vendored
File diff suppressed because it is too large
Load diff
4678
dist/languages/ja_JP.ts
vendored
4678
dist/languages/ja_JP.ts
vendored
File diff suppressed because it is too large
Load diff
5095
dist/languages/ko_KR.ts
vendored
5095
dist/languages/ko_KR.ts
vendored
File diff suppressed because it is too large
Load diff
4608
dist/languages/lt_LT.ts
vendored
4608
dist/languages/lt_LT.ts
vendored
File diff suppressed because it is too large
Load diff
4667
dist/languages/nb.ts
vendored
4667
dist/languages/nb.ts
vendored
File diff suppressed because it is too large
Load diff
5030
dist/languages/nl.ts
vendored
5030
dist/languages/nl.ts
vendored
File diff suppressed because it is too large
Load diff
4842
dist/languages/pl_PL.ts
vendored
4842
dist/languages/pl_PL.ts
vendored
File diff suppressed because it is too large
Load diff
4888
dist/languages/pt_BR.ts
vendored
4888
dist/languages/pt_BR.ts
vendored
File diff suppressed because it is too large
Load diff
4711
dist/languages/ro_RO.ts
vendored
4711
dist/languages/ro_RO.ts
vendored
File diff suppressed because it is too large
Load diff
5394
dist/languages/ru_RU.ts
vendored
5394
dist/languages/ru_RU.ts
vendored
File diff suppressed because it is too large
Load diff
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue